ไปที่มุมตรงข้ามของรูปสี่เหลี่ยมผืนผ้าในทุกทิศทาง - ยากขึ้น


17

นี่เป็นสิ่งเดียวกับคำถามนี้ยกเว้นยากกว่า คุณเป็นอีกครั้งที่จะเขียนโปรแกรมที่ได้รับจากมุมซ้ายล่างของรูปสี่เหลี่ยมผืนผ้าไปที่มุมบนขวา อย่างไรก็ตามในครั้งนี้อนุญาตให้มีการเคลื่อนไหวในแนวทแยง

โปรแกรมจะยอมรับคู่ที่สั่งซื้อ(width, height)และใช้สิ่งเหล่านี้เป็นส่วนข้อมูลสำหรับสี่เหลี่ยมผืนผ้า โปรแกรมของคุณจะสร้าง ASCII-art ของโซลูชัน (ใช้.สำหรับช่องว่างเปล่า#สำหรับส่วนหนึ่งของโซลูชันและXสำหรับสี่เหลี่ยมเริ่มต้น) และนับจำนวนการเคลื่อนไหวที่ใช้เพื่อไปยังจุดสิ้นสุด

ตัวอย่าง

การป้อนข้อมูล: (5, 6)

เอาท์พุท:

....#
....#
...#.
..#..
.#...
X....
Move count: 5

คำตอบที่สั้นที่สุดในการชนะไบต์!


7
มันไม่ได้แก้ปัญหาจะต้องมีการแก้ไขมากมาย
Blue

4
ความท้าทายนี้เช่นเดียวกับข้อเสนอแนะที่ซ้ำกันเป็นปัญหาง่ายๆที่ไม่สำคัญกับการเล่นกอล์ฟซึ่งเป็นการผสมผสานที่ยอดเยี่ยม แม้จะมีความคล้ายคลึงกันความท้าทายนี้ต้องการวิธีการที่แตกต่างกันและวิธีแก้ไขปัญหาที่ดีสำหรับความท้าทายก่อนหน้านี้ไม่สามารถแก้ไขได้เล็กน้อยเพื่อให้สามารถแข่งขันได้ที่นี่
trichoplax

มันสามารถทำได้ด้วยชื่อที่แตกต่างกันมากขึ้น ...
trichoplax

ใช่ความคิดใด ๆ
ericw31415

1
@LuisMendo ขั้นต่ำคือกริดที่เล็กที่สุดเท่าที่จะเป็นไปได้ 1 โดย 1.
ericw31415

คำตอบ:


1

MATL , 38 ไบต์

'.#X'!iSPXytf0)Jh1w(tzqDQI1()Gd0<?!]XP

ลองออนไลน์!

คำอธิบาย

ให้mและnเป็นปัจจัยการผลิตเรียงเช่นว่ามากกว่าหรือเท่ากับm nรหัสเริ่มต้นสร้างเมทริกซ์mx nดังนี้

  • ค่า 2 ตามแนวทแยงมุมหลักและที่ส่วนล่างของคอลัมน์สุดท้าย #สอดคล้องกับตัวละครตัวนี้ จำนวนรายการเหล่านี้ลบ 1 คือการนับการย้าย
  • ราคา 3 รายการ (1,1) Xซึ่งสอดคล้องกับ
  • รายการที่เหลือประกอบด้วย 1 สอดคล้องกับตัวละคร .

ถ้าจำเป็นเมทริกซ์จะถูกย้ายในขณะนี้เพื่อให้มีรูปร่างที่ต้องการ โปรดทราบว่ามิติแรกของเมทริกซ์คือความสูงไม่ใช่ความกว้างดังนั้นจึงสอดคล้องกับอินพุตที่สอง

เมทริกซ์จะพลิกกลับด้านเพื่อให้Xปรากฏที่ด้านล่างของคอลัมน์แรกและรายการจะถูกใช้เป็นดัชนีในสตริง'.#X'เพื่อสร้างอาร์เรย์ถ่าน 2D ที่ต้องการ

'.#X'    % push this string
!        % transpose into a column
i        % input array
SP       % sort it in non-increasing order
Xy       % identity matrix with that size: fill diagonal with 1, rest entries are 0
tf0)     % linear index of last 1
Jh       % append 1j (imaginary unit): linear index of lowest part of last column
1w(      % fill those entries with 1
tzq      % duplicate. Number of nonzero entries minus 1: this is the move count
D        % display move count (and remove it from the stack)
Q        % add 1. Matrix now contains values 1 and 2
I1(      % set first entry (in linear order) to value 3
)        % use matrix as index into the initial string. Gives 2D char array
Gd0<     % push input array again. Is it decreasing?
?        % if so
  !      %   transpose char array
]        % end
XP       % flip upside down. Implicitly display

1
ไม่ได้บอกว่าการนับเคลื่อนไหว ... ?
ericw31415

@ ericw31415 ขออภัย แก้ไขได้แล้ว
หลุยส์เมนโด

5

Pyth, 46 45 44 ไบต์

eSKtMQjsM_mm?sJ,kd?q#J.umtWbbNeSKK\#\.\XhQeQ

ลองที่นี่

คำอธิบาย:

move-count-printing:

  K     assign K to...
     Q  the input, a 2-length array...
   tM   with each element decremented
eS      take the max and output it (this is the number of moves)


main path-finding logic:

    mm                     hQeQ  map over x-values and y-values...
        J,kd                     assign J to [x,y]
      ?s                         if both x and y are NOT zero (sum is truthy)...
            ?q#J[...]              if [x,y] is present in [...] (see below)...
                     \#            ... put a # at this position in the output
                       \.          ... else, put a . at this position
                         \X      ... else, put the X here (at [0,0])
jsM_                             reverse and output in the proper format


the [...] part in the code above, which finds positions where #s go:

.u      eSKK  cumulative reduce on <number of moves> elements, starting at K,
                which is [max_x, max_y] as assigned at the beginning
  m    N      map over x and y...
   tWbb       decrement, only if the value is > 0

2

JavaScript (ES6), 132

แก้ไข 2 ไบต์ที่บันทึกไว้ขอบคุณ @Neil

(w,h)=>[...Array(--h)].map((_,i)=>R(w-i)+'#'+R(i),--w,R=(n,c='.')=>c.repeat(n>w?w:n>0&&n)).join`
`+`
x${R(w-h,'#')+R(h)}
`+(h>w?h:w)

ทดสอบ

f=(w,h)=>[...Array(--h)].map((_,i)=>R(w-i)+'#'+R(i),--w,R=(n,c='.')=>c.repeat(n>w?w:n>0&&n)).join`
`+`
x${R(w-h,'#')+R(h)}
`+(h>w?h:w)

function test() {
  var w,h
  [w,h]=I.value.match(/\d+/g)
  O.textContent=f(w,h)
}  

test()
Test <input id=I value="4 5"><button onclick="test()">-></button>
<pre id=O></pre>


บันทึก 2 ไบต์โดยการย้ายw--,R=... map()เข้าสู่
Neil

0

Javascript (ใช้ไลบรารีภายนอก) (235 ไบต์)

Jeez นี่มันยาก! ดี ... ห้องสมุดของฉันไม่ใช่งานที่ถูกต้องสำหรับฮ่า ๆ ๆ แต่ฉันชอบความท้าทาย

(x,y)=>{r=x-1;s=y-1;m=Math.max(r,s);n=Math.min(r,s);l=_.RangeDown(s,y).WriteLine(z=>_.Range(0,x).Write("",w=>z==0&&w==0?"X":(z==w||(z==s&&w>=n)||(w==r&&z>=n))?"#":"."));return l+"\r\nMove count: "+(l.length-l.split("#").join("").length)}

ลิงก์ไปยัง lib: https://github.com/mvegh1/Enumerable

คำอธิบายรหัส: สร้างฟังก์ชั่นของ 2 ตัวแปร เก็บ x-1 และ y-1 ไว้ในตัวแปร เก็บ max และ min ของเหล่านั้นลงในตัวแปร สร้างช่วงของตัวเลขจาก (y-1) ในแนวตั้งจากมากไปหาน้อยสำหรับ y สำหรับแต่ละองค์ประกอบในช่วงแนวตั้งให้เขียนบรรทัดสำหรับองค์ประกอบปัจจุบันตามเพรดิเคตที่ซับซ้อน เพรดิเคตนั้นสร้างช่วงจำนวนเต็มจาก 0 ขึ้นไปสำหรับนับ x สำหรับแต่ละองค์ประกอบในช่วงดังกล่าวให้ต่อกันเป็น 1 สตริงตามเพรดิเคตที่ซับซ้อน เพรดิเคตนั้นตรวจสอบว่าที่มุมล่างซ้ายหรือไม่ตรวจสอบอีกว่าในแนวทแยงมุมตรวจสอบอีกครั้งว่าเราอยู่ที่ขอบ X หรือ Y ในที่สุดทั้งหมดนั้นถูกเก็บไว้ในตัวแปร จากนั้นเพื่อให้นับการเคลื่อนไหวเราเพียงแค่นับจำนวน # จากนั้นเชื่อมต่อกับตัวแปรที่เก็บไว้และส่งคืนผลลัพธ์

นั่นคือคำหนึ่งฮ่าฮ่า ภาพหน้าจอมีจำนวนไบต์ผิดเนื่องจากฉันพบวิธีบันทึก 4 ไบต์ในขณะที่โพสต์สิ่งนี้

แก้ไข: ฉันเห็นคำตอบอื่น ๆ ที่ไม่ได้ใส่ "ย้ายนับ:" ในการส่งออกของพวกเขา แต่ฉันเป็น หากนั่นไม่ใช่ความต้องการนั่นจะทำให้เป็นจำนวนไบต์ ...

ป้อนคำอธิบายรูปภาพที่นี่


0

Python 3, 161 156 ไบต์

def f(w,h):
 x=[['.']*w for i in[0]*h];i=0
 while i<w or i<h:x[~min(i,h-1)][min(i,w-1)]=['#','X'][i<1];i+=1
 for i in x:print(''.join(i))
 print(max(w,h)-1)

ฟังก์ชั่นที่รับอินพุตผ่านการโต้แย้งและพิมพ์ ascii-art ตามด้วยการย้ายนับเป็น STDOUT

มันทำงานอย่างไร

.โปรแกรมแรกที่สร้างรายชื่อของรายการซึ่งแต่ละรายการเป็นหนึ่งในแถวของตารางและองค์ประกอบของรายการแต่ละองค์ประกอบคือ แต่ละองค์ประกอบที่ควรจะ#มีคุณสมบัติที่ถ้าตารางผลลัพธ์เป็นตารางพิกัดที่แสดงตำแหน่งของมันจะเท่ากัน ดังนั้นการวนซ้ำดัชนีiและการแทรก#ที่ตำแหน่ง(i, i)จะให้ผลลัพธ์ที่ต้องการ อย่างไรก็ตามกริดไม่ได้เป็นรูปสี่เหลี่ยมจัตุรัสเสมอไปดังนั้นดัชนีจะถูกยึดเข้ากับกริดโดยใช้ดัชนีขั้นต่ำและความกว้าง / ความสูง (ลดลงเนื่องจากการทำดัชนีเป็นศูนย์) ตามต้องการ หากดัชนีเป็นศูนย์ตำแหน่งปัจจุบันจะต้องเป็นรายการด้านล่างซ้ายและทำให้Xถูกแทรกแทน ถัดไปองค์ประกอบในแต่ละบรรทัดจะถูกต่อกันและแต่ละบรรทัดจะถูกพิมพ์ไปยัง STDOUT จำนวนการเคลื่อนไหวคือจำนวนสูงสุดของการลดความกว้าง / ความสูง สิ่งนี้จะถูกพิมพ์

ลองใช้กับ Ideone

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.