หลบหนีจากเขาวงกต!


20

คุณถูกขังอยู่ในเขาวงกต 5x5 นี้ - แต่ละห้องมีเลเบลตั้งแต่ 1 ถึง 25 และทางออกอยู่ในห้อง 1

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

คุณจะได้รับเป็นอินพุตห้องที่คุณอยู่ในปัจจุบันงานของคุณคือการส่งลำดับการเคลื่อนไหวที่สั้นที่สุด (เหนือ, ตะวันออก, ใต้, ตะวันตก) ที่จำเป็นในการเข้าถึงห้อง 1

การเคลื่อนไหวสามารถส่งออกในรูปแบบใดที่คุณต้องการ (รายการสตริงอาร์เรย์ ... ) n,w,e,sตราบใดที่คุณใช้ตัวอักษร

นี่คือกรณีทดสอบทั้งหมด:

1 => empty string/list
2 => w
3 => ww
4 => swwnw
5 => wswwnw
6 => seenwnw
7 => nw
8 => wnw
9 => wwnw
10 => swwnwnw
11 => eenwnw
12 => enwnw
13 => nwnw
14 => wnwnw
15 => wwnwnw
16 => enenwnw
17 => nenwnw
18 => wnenwnw
19 => nwnwnw
20 => wnwnwnw
21 => nenenwnw
22 => enwnenwnw
23 => nwnenwnw
24 => wnwnenwnw
25 => nwnwnwnw

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


3
การติดฉลาก / อินพุตห้องมีความยืดหยุ่นเพียงใด? เราสามารถ 0 ดัชนีแทน 1 ดัชนีได้หรือไม่ เราสามารถใช้หมายเลขห้องเป็นตัวละคร (คิดในฐาน 36) ได้ไหม?
Chas Brown

2
@Therandomguy ไม่คุณต้องจัดการเขาวงกตนี้โดยเฉพาะ
Arnaud

6
เนื่องจากเป็นไปได้ฉันคิดว่าควรรวมกรณีที่เป็นไปได้ทั้งหมดไว้ในกรณีทดสอบ
Jonathan Frech

1
@ UnrelatedString คำถามนี้ใช้เวลา 1 อินพุตและให้เส้นทางที่แตกต่างกันตามอินพุต ฉันเชื่อว่าข้อกำหนดนี้ไม่ตรงกับแท็กkolmogorov-complex
tsh

2
คนต้องการที่จะให้คำตอบในเขาวงกต
Draco18s

คำตอบ:


20

Python 2 , 64 ไบต์

def f(n):d=0x1211252b5375>>2*n-4&3;print"nwes"[d];f(n+d*3+d%2-5)

ลองออนไลน์!

ฟังก์ชั่นที่พิมพ์หนึ่งทิศทางต่อบรรทัดโดยยกเลิกข้อผิดพลาด

ค่าคงที่0x1211252b5375เข้ารหัสในฐาน 4 ทิศทางที่dเราเดินทางจากแต่ละหมายเลขห้องเป็นหมายเลข 0 ถึง 3 หลักการแยก>>2*n-4&3ถูกออกแบบมาเพื่อให้เกิดข้อผิดพลาดในการลบเชิงลบเมื่อn=1สิ้นสุดรหัส เราอัปเดตจำนวนห้องพักnผ่านทางชดเชยว่าคำนวณจากทิศทางที่dเป็นd*3+d%2-5ที่แผนที่:

d   d*3+d%2-5
0  -> -5
1  -> -1
2  ->  1
3  ->  5 

1
ฉันไม่แน่ใจว่าสิ่งนี้ถูกต้องตามที่เป็นจริงหรือไม่ฟังก์ชั่นจะต้องสามารถนำมาใช้ซ้ำได้และคุณต้องมีข้อผิดพลาดในการดักจับ ( try/ except) เพื่อให้สามารถดำเนินการต่อได้หลังจากเรียกใช้ฟังก์ชันนี้
Erik the Outgolfer


6

05AB1E , 30 29 ไบต์

-1 ไบต์ต้องขอบคุณความบังเอิญอันน่าอัศจรรย์ที่มีจำนวนเฉพาะ

[Ð#•θzƶ‰`Ó•4вsè<DˆØ·5-+}'‹™¯è

ลองออนไลน์!

[                      }    # infinite loop:
 Ð                          #  triplicate the room number (initially, the input)
  #                         #  break if room number == 1
   •θzƶ‰`Ó•4в               #  compressed list 202232302231102210202010
             sè             #  use the room number to index into that list
               <            #  decrement
                Dˆ          #  add a copy to the global array
                  Ø         #  nth prime (-1 => 0, 0 => 2, 1 => 3, 2 => 5)
                   ·        #  double
                    5-      #  subtract 5
                      +     #  add that to the room number
'‹™                         # dictionary string "western"
   ¯                        # push the global array
    è                       # index (wraps around, so -1 => n, 0 => w, 1 => e, 2 => s)

1
เอาต์พุตนี้1สำหรับอินพุต1แทนที่จะเป็นสตริงว่าง (การแก้ไขแบบง่ายจะเป็นการเพิ่มการนำหน้าõ?) นอกจากนั้นคำตอบที่ดี!
Kevin Cruijssen

1
@KevinCruijssen ขอบคุณที่ชี้ให้เห็นความผิดพลาดนั้น! ฉันพบการแก้ไขไบต์เดียว
Grimmy

5

Ruby , 72 62 ไบต์

f=->n{n<2?'':' en  sw'[x=4*18139004[n]+6*4267088[n]-5]+f[n+x]}

ลองออนไลน์!

อย่างไร?

เคล็ดลับที่นี่คือการใช้ค่าคงที่ 2 เพื่อสร้างขั้นตอนต่อไปสำหรับแต่ละเซลล์จากนั้นแก้ปัญหาซ้ำ ๆ

ค่าคงที่ 2 18139004 และ 4267088 เป็นสตริงไบนารี่ที่บอกทิศทางของการเคลื่อนที่ครั้งต่อไปโดยการดึงเพียงเล็กน้อยจากทั้งสองสำหรับแต่ละเซลล์เราจะได้รับ:

"n" = 4*0+6*0-5 = -5
"w" = 4*1+6*0-5 = -1
"e" = 4*0+6*1-5 = +1
"s" = 4*1+6*1-5 = +5

ง่ายกว่าการขยับไปมาและสวมหน้ากากเลขฐานสองขนาดใหญ่ IMHO

เมื่อเราได้รับทิศทางเราจะแยกจดหมายที่เกี่ยวข้องจากสตริง "en sw":

  1   5
  |   |
" en  sw"
   |   |
  -5  -1

และดำเนินการซ้ำกับเซลล์ [n + x]



3

Perl 5 ( -n), 94 ไบต์

-5 ไบต์ขอบคุณ Grimy

@A=map/./g,__wwswsnwwseenwwenwnwnenwn;%H=(n,-5,s=>5,e,1,w,-1);$_+=$H{$,=$A[$_]},say$,until$_<2

TIO





1
คุณหมายถึงฉันควรโพสต์เป็นคำตอบแยกต่างหากหรือไม่?
Grimmy

1
ใช่เพราะดูเหมือนว่าคุณทำงานได้มากที่สุดมันน่าสนใจที่จะดูว่าเราสามารถประหยัดพื้นที่ได้อย่างไร
Nahuel Fouilleul


2

JavaScript, 80 73 71 ไบต์

ดัดแปลงมาจากสารละลายของ Chas 'Pythonดังนั้นโปรด+1ได้เช่นกัน

f=n=>--n?(d=" wwswsnwwseenwwenwnwnenwn"[n])+f(n+~~{n:-4,s:6,e:2}[d]):``

ลองออนไลน์!

1 ไบต์บันทึกขอบคุณที่Arnauld


ขอบคุณ @Arnauld :) เพิ่งเห็นตัวเองเช่นกัน
ขนปุย

2

ถ่าน , 43 40 ไบต์

NθW⊖θ«≔I§”)“⊞x⟧∧⎚⁵2”ιι§nwesι≧⁺⁻⁺﹪ι²×³ι⁵θ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด ขึ้นอยู่กับคำตอบของ @ ChasBrown และ @ xnor คำอธิบาย:

Nθ

ใส่ห้อง

W⊖θ«

ตั้งค่าตัวแปรลูปiเป็นหนึ่งน้อยกว่าหมายเลขห้องและทำซ้ำในขณะที่มันไม่ใช่ศูนย์

«≔I§”)“⊞x⟧∧⎚⁵2”ιι

0113130113220112010102010สารสกัดจากทิศทางจากสตริงบีบอัด (ผู้นำ0คือตัวเลขหลักที่เติมเท่านั้น)

§nwesι

พิมพ์ทิศทาง

≧⁺⁻⁺﹪ι²×³ι⁵θ

ใช้สูตรของ @ xnor เพื่อคำนวณหมายเลขห้องใหม่


2

เจลลี่ , 30 29 ไบต์

“þ&ƊĿñ÷°e’b6Ḥ_5Ż⁸+ị¥ƬI‘ị“®ȯẹ»

ลองออนไลน์!

ลิงก์ monadic ที่ใช้เซลล์เริ่มต้นและส่งคืนสตริงที่มีทิศทาง

ฉันรักความจริงที่ว่าพจนานุกรมวุ้นมีคำเช่น 'เคนเนซอร์' A (ทิศตะวันตกเฉียงเหนือของเมืองแอตแลนตา, จอร์เจีย) ใช้ที่นี่เพราะการจัดทำดัชนีลงไปด้วย[5, 1, -5, -1] + 1จะช่วยให้nesw!

คำอธิบาย

“þ...e’                    | Base-250 integer 1962789844189344852  
       b6                  | Convert to base 6 (2, 2, 5, 2, 5, 0, 2, 2, 5, 3, 3, 0, 2, 2, 3, 0, 2, 0, 2, 0, 3, 0, 2, 0)
         Ḥ                 | Double
          _5               | Subtract 5
            Ż              | Prepend 0
             ⁸  ¥Ƭ         | Using this as the right argument and the original link argument as the left argument, loop the following as a dyad until there is no change, collecting up results
              +            | - Add the left argument to:
               ị           |   - The left argument indexed into the right argument
                  I        | Differences between consecutive numbers
                   ‘       | Increment by 1
                    ị“®ȯẹ» | Index into "Kennesaw"

2

PHP , 110 ไบต์

วิธีการแก้ปัญหาซึ่งไม่ได้เป็นพอร์ตของคำตอบที่ดี Chas บราวน์หรือXNOR ของคำตอบที่ดี ฉันรู้ว่ามันนานกว่านี้ แต่ฉันต้องการมีวิธีแก้ไขปัญหาอื่น

for($n=$argn;$n>1;$n=ord($s[$n*2+1])%30)echo($s='0000w<w sEw"s)n w%w&s-e*e+n&w+w,e/n*w/n,w1n.e5n0w5n2')[$n*2];

ลองออนไลน์!

ฉันสร้างสตริงการแมปซึ่งมี 2 ตัวอักษรสำหรับทุกเซลล์ในกระดาน อักขระตัวแรกสำหรับแต่ละเซลล์คือการย้าย (n / e / s / w) หรือ0และรหัส ASCII ของตัวละครตัวที่สอง 30 จะส่งคืนจำนวนเซลล์อื่นซึ่งเราควรติดตามการเคลื่อนไหวในโหมดแบบเรียกซ้ำจนกว่าเราจะออกจากเซลล์ ( cell < 2)

ตัวอย่างเช่นอินพุต 8:

  • 2 ตัวอักษรสำหรับเซลล์8คือ:w%
  • มันหมายถึงการพิมพ์wและดำเนินการต่อกับเซลล์ของ%
  • รหัส ASCII ของ%37 ซึ่ง mod 30 จะเป็น 7 7ดังนั้นเซลล์ถัดไปที่จะปฏิบัติตามคือ
  • 2 ตัวอักษรสำหรับเซลล์7คือ: n (อักขระตัวสุดท้ายคือช่องว่างรหัส ASCII = 32)
  • มันหมายถึงการพิมพ์nและยังคงมีการเคลื่อนไหวสำหรับเซลล์ 32 สมัยที่ 30 2ซึ่งเป็น
  • 2 ตัวอักษรสำหรับเซลล์2คือ: w<(อักขระตัวสุดท้ายรหัส ASCII = 60)
  • มันหมายถึงการพิมพ์wและยังคงมีการเคลื่อนไหวสำหรับเซลล์ 60 สมัยที่ 30 0ซึ่งเป็น
  • ถ้าจำนวนเซลล์น้อยกว่า2ลูปจะหยุด!
  • ผลการพิมพ์ครั้งสุดท้าย: wnw

PHP , 75 ไบต์

รุ่นนี้เขียนโดยGrimyมันสั้นกว่าคำตอบเดิมของฉัน 35 ไบต์เพราะเขา / เธอฉลาดขึ้น! ความคิดเห็นของ Grimy: "4 * 25 <256 ดังนั้นคุณต้องการเพียง 1 ไบต์ต่อเซลล์ไม่ใช่ 2"

for($n=$argn;$n=ord("0\0~f;6o4R:s%ql&rup*@^tIDbx"[$n%25]);)echo news[$n%4];

ลองออนไลน์!


PHP , 71 ไบต์

พอร์ตนี้เป็นคำตอบของ Arnauldซึ่งเป็นพอร์ตของคำตอบของ xnorแต่เป็น loop แทนที่จะเป็นฟังก์ชันแบบเรียกซ้ำเนื่องจากมันกลายเป็นshortใน PHP

for($n=$argn;--$n;$n+=$d*3+$d%2-4)echo nwes[$d=79459389361621/4**$n&3];

ลองออนไลน์!


2
4 * 25 <256 ดังนั้นคุณต้องการเพียง 1 ไบต์ต่อเซลล์ไม่ใช่ 2: ลองออนไลน์!
Grimmy

1
@Grimy น่าอัศจรรย์ฉันคิดว่าคุณต้องโพสต์มันเป็นคำตอบที่แยกต่างหากมันแตกต่างกันพอ
กลางคืน 2

1
ฉันจะไม่ทำเช่นนั้นดังนั้นคุณเลือกได้ว่าจะรวมไว้ในคำตอบของคุณหรือไม่หรือแสดงความคิดเห็น
Grimmy

1
@Grimy เพิ่มเวอร์ชันของคุณด้วยชื่อของคุณ ขอบคุณมาก
กลางคืน 2

2

C (เสียงดังกราว) , 81 ไบต์

v;f(p){p-1&&putchar(v="00wwswsnwwseenwwenwnwnenwn"[p])+f(p+=v%5?6-v%8:v%2?5:-5);}

ลองออนไลน์!

ขอบคุณ @ Tommylee2k ข้อเสนอแนะ -8! + การโทรซ้ำ

C (เสียงดังกราว) , 90 ไบต์

v;f(p){for(char*l="00wwswsnwwseenwwenwnwnenwn";p-1;p+=v%5?6-v%8:v%2?5:-5)putchar(v=l[p]);}

ลองออนไลน์!

คล้ายกับโซลูชันที่ไม่บีบอัดทั้งหมด


1
สามารถทำให้สั้นลงได้:v;f(p){for(;p-1;p+=v%5?6-v%8:v%2?5:-5)putchar(v="00wwswsnwwseenwwenwnwnenwn"[p]);}
Tommylee2k

1

05AB1E , 45 43 ไบต์

õ?[Ð#.•DUo¢ê`Ω÷‰₂¡)R€ûK•¦sè©?Ž₁9₂в6-'€Ã®kè+

ท่าเรือ@ChasBrown 's งูหลาม 2 คำตอบ

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

õ?               # Output an empty string
                 # (to overwrite the implicit output if the input is 1)
[                # Start an infinite loop:
 Ð               #  Triplicate the top of the stack
                 #  (which is the (implicit) input in the first iteration)
  #              #  If it's exactly 1: stop the infinite loop
  .•DUo¢ê`Ω÷‰₂¡)R€ûK
                 #  Push compressed string "a  wwswsnwwseenwwenwnwnenwn"
   ¦             #  Remove the first character
    sè           #  Swap to get the number, and use it to index into the string
      ©          #  Store it in variable `®` (without popping)
       ?         #  Print it without trailing newline
  Ž₁9            #  Push compressed integer 22449
     ₂в          #  Convert to base-26 as list: [1,7,5,11]
       6-        #  Subtract 6 from each: [-5,1,-1,5]
         '€Ã    '#  Push dictionary string "news"
            ®k   #  Get the index in this string of character `®`
              è  #  And use that to index into the integer-list
               + #  And add it to the originally triplicated integer

ดู 05AB1E ส่วนปลายของฉัน (ทั้งสี่ส่วน)เพื่อทำความเข้าใจว่าทำไมจึง.•DUo¢ê`Ω÷‰₂¡)R€ûK•เป็น"a wwswsnwwseenwwenwnwnenwn"; Ž₁9คือ22449; Ž₁9₂вคือ[1,7,5,11]; และเป็น'€Ã"news"


1
สตริงพจนานุกรมที่สะดวกต้องเป็นข่าวดี!
Neil

@ นิลแน่นอน :) ถึงแม้ว่าพจนานุกรมสตริงwesternจะดีกว่า ; p
Kevin Cruijssen

1

Bashขนาด 120 ไบต์

S=__wwswsnwwseenwwenwnwnenwn
N=n-5w-1s05e01
for((i=$1;$i>1;i+=$j)){ d=${S:$i:1};j=${N:`expr index $N $d`:2};printf $d; }

ลองออนไลน์!

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

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

S=__wwswsnwwseenwwenwnwnenwn

String $ S ถืออักขระเดี่ยว (n, w, s, e) สำหรับแต่ละห้องที่แสดงทิศทางที่จะย้ายห้องหนึ่งไปทางทางออกโดยข้ามห้อง 0 และ 1

N=n-5w-1s05e01

สตริง $ N มีเดลต้าเพื่อเพิ่ม / ลบออกจากหมายเลขห้องปัจจุบันสำหรับการเปลี่ยนทิศทางแต่ละครั้ง (n: -5, w: -1, s: +5, e: +1)

for((i=$1;$i>1;i+=$j)){ d=${S:$i:1};j=${N:`expr index $N $d`:2};printf $d; }

เริ่มต้นด้วย $ i เท่ากับจำนวนห้องที่กำหนดในบรรทัดคำสั่ง ($ 1) กำหนดอักขระที่ดัชนี $ i ในสตริง $ S ถึง $ d ดึงค่าของเดลต้าจาก $ N สำหรับทิศทางที่จะไปยังห้องถัดไปกำหนดให้กับ $ j

พิมพ์ทิศทางต่อไปเพื่อรับ $ d

เพิ่ม / ลบเดลต้าใน $ j ถึง / จาก $ i

วนซ้ำจนกว่าเราจะออกจากห้อง # 2 (ในขณะที่ $ i> 1)



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