กบเดินตาย


17

บทนำ

จอนนี่ต้องการเล่น Frogger อย่างไรก็ตามเขาไม่ดีมาก ในความเป็นจริงเขาจะพยายามก้าวไปข้างหน้าและหลังจากแพลตฟอร์มได้ย้าย

ค้นหาว่ากบของจอนนี่สามารถไปถึงจุดสิ้นสุดของเส้นทางหรือว่ามันตายไปแล้วหรือไม่

ท้าทาย

โปรแกรมจะได้รับเป็นอินพุตของตาราง Frogger ที่ประกอบด้วย0s และ1s ด้วยรูปแบบต่อไปนี้:

  • ตารางจะมีความกว้างและความยาวแบบสุ่มและอย่างน้อย 3x3
  • 1 แสดงถึงแพลตฟอร์ม
  • 0 แสดงถึงน้ำ
  • F แสดงถึงตำแหน่งเริ่มต้นของกบ
  • ทุกบรรทัดแรกและสุดท้ายของกริดจะถูกแต่งโดย1s เท่านั้นและจะไม่ย้ายและกบFจะถูกวางที่สุ่มในบรรทัดสุดท้าย
  • เลเยอร์กลางทุกอันจะมีการเคลื่อนไหวอยู่เสมอและจะมี<หรือ>ในตอนท้ายของทุกบรรทัดที่ระบุว่ามันเลื่อนไปทางซ้ายหรือขวา

อนุญาตให้ใช้การแทนที่สัญลักษณ์เหล่านี้ด้วยของคุณเองตราบใดที่สัญลักษณ์เหล่านี้มีความแตกต่างกันและคุณระบุการแทนที่ในคำตอบของคุณ

อินพุตอาจอยู่ในรูปแบบที่เข้ากันได้ (สตริงที่มีตัวแบ่งบรรทัดอาร์เรย์ของสตริงอาร์เรย์ของอักขระ ... )

กฏท้าทาย

  • ทุกเทิร์นทุกแพลทฟอร์มจะเลื่อนหนึ่งช่องขึ้นอยู่กับทิศทางที่ระบุโดย<หรือ>เครื่องหมาย
  • แพลตฟอร์มปรากฏขึ้นอีกครั้งที่อีกด้านหนึ่งของตารางถ้าพวกเขาถูกผลักออกจาก "หน้าจอ"
  • หากกบอยู่บนแท่นเคลื่อนที่มันจะเคลื่อนที่ไปพร้อมกับมัน
  • หลังจากนั้นกบจะกระโดดหนึ่งตารางไปยังแถวบนสุด กบจะย้ายทุกเทิร์น
  • กบจะตายหากมันกระโดดในน้ำ ( 0) หรือสัมผัสกับด้านข้างของตารางพร้อมกับแท่นเคลื่อนที่

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

นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ ช่องโหว่มาตรฐานใช้

ตัวอย่าง

ตัวอย่างที่ 1

อินพุต

11111
00111>
00101<
1F111

เอาท์พุต

1

การกระทำ

ครบ 1:

11111
10011
01010
1F111

11111
10011
0F010
11111

เทิร์น 2:

11111
11001
F0100
11111

11111
F1001
10100
11111

ครบรอบ 3:

11111
1F100
01001
11111

1F111
11100
01001
11111

ตัวอย่างที่ 2

อินพุต

11111
00100<
00100<
1F111

เอาท์พุต

0

การกระทำ

ครบ 1:

11111
01000
01000
1F111

11111
01000
0F000
11111

เทิร์น 2:

11111
10000
F0000
11111

11111
F0000
10000
11111

ครบรอบ 3:

11111
00001
00001
11111

เส้นกลางจะเคลื่อนที่ตลอดเวลาหรือไม่? เราสามารถใส่รายการบรรทัดเป็นอินพุตได้หรือไม่? หากบรรทัดไม่เคลื่อนไหวเราสามารถสรุปได้ว่ามันจบลงด้วยอักขระอื่นที่ไม่ใช่<หรือ>เพื่อให้เราสามารถใช้อาร์เรย์สี่เหลี่ยมเป็นอินพุตได้? อย่างไรก็ตามความท้าทายที่ดี!
dylnan

@dylnan ฉันชี้แจงในข้อความท้าทาย เลเยอร์กลางจะเคลื่อนไหวตลอดเวลาและจะมี<หรือ>ในตอนท้าย
BgrWorker

กบเคลื่อนไปข้างหน้าทุกเทิร์นแม้ว่าจะมี0ด้านหน้าหรือมันจะรอต่อไป1หรือไม่ ถ้ามันสามารถรอมันจะไปข้างหน้าในทุก ๆ1หรือจะรออย่างชาญฉลาด? เช่นกับกรณีทดสอบ11111 00001< 00011< 11F11จะเป็นเท็จเพราะมันกระโดดในน้ำ ( pastebin ของขั้นตอน ); มันจะเท็จเพราะมันเคลื่อนออกจากกรอบ ( pastebin ของขั้นตอน ); หรือจะเป็นความจริงเพราะมันรออย่างชาญฉลาดสำหรับแพลตฟอร์มที่สองก่อนที่จะกระโดดไปข้างหน้า ( pastebin ของขั้นตอน )?
Kevin Cruijssen

@KevinCruijssen มันเคลื่อนไหวทุกเทิร์นและจะฆ่าตัวตายอย่างมีความสุข (อย่างที่ฉันบอกว่าจอนนี่ไม่ใช่ผู้เล่นที่เก่งมาก)
BgrWorker

@BgrWorker ตกลงนั่นทำให้ความท้าทายเป็นไปได้มากขึ้น :) 0อาจจะแก้ไขมันในคำอธิบายของความท้าทายที่กบจะก้าวไปข้างหน้าทุกครั้งที่เลี้ยวถึงแม้ว่ามันจะกระโดดลงไป
Kevin Cruijssen

คำตอบ:


4

Python 2 , 168 165 152 145 137 129 ไบต์

s=input();x=s[-1].find('F');L=len(s[0]);i=k=1
for l in s[-2:0:-1]:d=('<'in l)%-2|1;k*=l[(x-d*i)%L]>'0'>-1<x+d<L;x+=d;i+=1
print k

ลองออนไลน์!

รูปแบบอินพุตเป็นรายการของสตริง อักขระที่มีความหมายตามที่กำหนดในคำสั่งปัญหา

คำอธิบาย:

iคือหมายเลขเทิร์น (เริ่มจากเทิร์น 1); xคือตำแหน่งของ frogger เมื่อเริ่มต้นเทิร์นนั้น

แถวที่ frogger กำลังจะไปถึงคือสตริงl(โปรดทราบว่าผ่านการแบ่งส่วนข้อมูลเหล่านี้จะเรียงตามลำดับจากบนลงล่าง) d=('<'in l)%-2|1อัตราผลตอบแทน-1หรือ1ขึ้นอยู่กับทิศทางที่แถวกำลังเคลื่อนที่

เนื่องจากนี่เป็นiเทิร์นที่แล้วแถวนั้นจะเปลี่ยนจากตำแหน่งเดิมเป็นiไบต์ และเพื่อให้ตัวละคร frogger เป็นเรื่องเกี่ยวกับที่จะกระโดดขึ้นไปบนเป็นl[(x-d*i)%L]ที่Lคือความกว้างของแถวดังนั้นเราจึงต้องการตัวอักษรที่จะเท่ากับ'1'; เช่น>'0'.

นอกจากนี้เราต้องการตรวจสอบว่า frogger จะไม่ถูกย้ายออกจากขอบเมื่อเริ่มต้นเทิร์นถัดไป -1<x+d<Lที่มีฟังก์ชั่นของการแสดงออก

เงื่อนไขเหล่านี้ถูกล่ามโซ่ (เนื่องจาก'0'>-1เป็นเสมอTrue); และถ้าในเวลาใด ๆ ที่เกิดการแสดงออกเป็นเท็จkจะกลายเป็น 0(และแล้วอยู่)

ไม่ว่าในกรณีใดเราจะอัพเดทตำแหน่งของผู้สร้างx+=dและกระแทกหมายเลขแถว จากนั้นล้างออกให้ทำซ้ำ


1

Python 2 , 246 245 244 242 ไบต์

-3 ไบต์ขอบคุณ Mr. Xcoder
-1 ไบต์ขอบคุณ Jonathan Frech

m=input()
exec"""for i,r in enumerate(m):
 d=-int(min('1',r[-1]));q=r[d*2]
 if m[i+1:]:r=sum([r[d+1:d-1],[[q,' '][q<'L']]][::d-~d],[])+r[-1:]
 if'F'in r:j=r.index('F');r[j]='L';m[i-1][j]=min('F',m[i-1][j])
 m[i]=r
"""*~-len(m)
print'F'in m[0]

ลองออนไลน์!

คำอธิบาย

  • d เป็นทิศทางที่แต่ละชั้นจะเคลื่อนที่
  • q เป็นตัวละครที่จะถูกพันไว้
    • [q,' '][q<'L'] จะวางกบปิดหน้าจอ
  • sum([r[d+1:d-1],[[q,' '][q<'L']]][::d-~d],[])+r[-1:]จะลบตัวอักษรตัวสุดท้าย (ทิศทาง) จากนั้นลบตัวอักษรตัวแรกและต่อท้ายหรือลบตัวอักษรตัวที่สองและต่อท้าย (ตามd) และต่อท้ายทิศทางกลับด้านอย่างมีประสิทธิภาพย้ายทั้งแถวไปทางซ้าย / ขวา
  • if'F'in r:j=r.index('F');r[j]='L';m[i-1][j]=min('F',m[i-1][j]) จะทำให้กบกระโดดไปข้างหน้า
  • min('F',m[i-1][j]) จะทำให้กบตกลงไปในน้ำ
  • การเปรียบเทียบอักขระ ( minและ<) ทำตามคำสั่ง' ' < '0' < '1' < 'F' < 'L'

ข้อมูลที่ป้อนจะเป็นรายการของตัวละคร:
' '- น้ำ
'F'- กบ
'L'- plataform
'0'- เลื่อนเลเยอร์ไปทางซ้าย
'1'- เลื่อนเลเยอร์ไปทางขวา


if i<len(m)-1if~-len(m)>iอาจจะเป็น
Jonathan Frech

0

Java 8, 293 277 ไบต์

a->{for(int l=a.length-1,x=a[l].indexOf('F'),y=l,i,t=a[0].length()-1,b;y>0;y--){for(i=l;i-->1;a[i]=a[i].endsWith("<")?a[i].substring(1,t+1)+a[i].charAt(0*(x-=b))+"<":a[i].charAt(t)+a[i].substring(0*(x+=b),t)+">")b=i==y?1:0;if(x<0|x>t||a[y].charAt(x)<49)return 0>1;}return 1>0;}

ใช้อักขระเริ่มต้นตามที่ระบุในคำอธิบายการท้าทาย ( 01F<>)

ลองออนไลน์

คำอธิบาย:

a->{                         // Method with String-array parameter & boolean return-type
  for(int l=a.length-1,      //  Amount of rows minus 1
       x=a[l].indexOf('F'),  //  Start x-position of the frog
       y=l,                  //  Start y-position of the frog
       i,                    //  Index-integer
       t=a[0].length()-1,    //  Length of the rows minus 1
       b;                    //  Temp integer
       y>0;                  //  Loop as long as the frog hasn't reached the other side
       y--){                 //    Jump forward once after every turn
    for(i=l;l-->1;           //   Inner loop over all the moving rows
        ;a[i]=               //     After every iteration: Change the moving row to:
         a[i].endsWith("<")? //      If the current platform moves to the left:
          a[i].substring(1,t+1)
                             //       Last part of the platform
                             //        i.e. "00101<" → "0101"
          +a[i].charAt(0     //       Appended with the first character
                             //        i.e. "00101<" → '0'
            *(x-=b))         //       We are moving left, so subtract `b` from `x`      
          +"<"               //       And append the direction "<" again
                             //        so "00101<" becomes "01010<"
         :                   //      Else (the platform moves to the right):
          a[i].charAt(t)     //       Take the last character
                             //        i.e. "00111>" → '1'
          +a[i].substring(0  //       And append the first part of the platform
                             //        i.e. "00111>" → "0011"
            *(x+=b),t)       //       We are moving right, so add `b` to `x`
          +">")              //       And append the direction "<" again
                             //        so "00111>" becomes "10011>"
      b=i==y?                //    If the frog is on the current row:
         1                   //     Set `b` to 1
        :                    //    Else:
         0;                  //     Set `b` to 0
    if(x<0|x>t               //   If the Frog is out of bounds
       ||a[y].charAt(x)<49)  //   Or jumped into the water
      return 0>1;}           //    Return false
  return 1>0;}               //  If the loop ended the frog made it to the other side,
                             //  so return true
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.