Dead Frog Walking


17

pengantar

Jonny ingin bermain Frogger. Namun, dia tidak terlalu baik. Faktanya, dia hanya akan mencoba untuk bergerak maju, dan hanya setelah platform telah bergerak.

Cari tahu apakah katak Jonny berhasil mencapai ujung jalan atau jika mati di jalan.

Tantangan

Program akan menerima sebagai masukan kisi Frogger yang disusun oleh 0s dan 1s, dengan format berikut:

  • Kotak akan memiliki lebar dan panjang acak, dan setidaknya 3x3
  • 1 mewakili platform
  • 0 mewakili air
  • F mewakili posisi awal katak
  • Setiap baris pertama dan terakhir dari grid akan disusun oleh hanya 1s, dan tidak akan bergerak, dan katak Fakan ditempatkan secara acak di baris terakhir
  • Setiap lapisan menengah akan selalu bergerak, dan akan memiliki <atau >di akhir setiap baris yang menunjukkan apakah itu bergerak ke kiri atau ke kanan

Mengganti simbol-simbol ini dengan simbol Anda diperbolehkan, asalkan semuanya berbeda dan Anda menentukan penggantian dalam jawaban Anda.

Input dapat dalam format apa pun yang kompatibel (string dengan jeda baris, larik string, larik karakter, ...).

Aturan Tantangan

  • Setiap belokan, semua platform akan bergerak satu kotak, berdasarkan arah yang ditunjukkan oleh tanda <atau>
  • Platform muncul kembali di sisi lain grid jika terdesak "layar"
  • Jika katak berada di platform bergerak, ia akan bergerak bersamanya
  • Setelah itu, katak akan melompat satu kotak ke arah baris atas. Katak akan bergerak setiap belokan.
  • Katak mati jika melompat di air ( 0) atau menyentuh sisi grid bersama dengan platform yang bergerak

Program Anda harus menampilkan nilai kebenaran jika katak bertahan dan nilai palsu sebaliknya.

Ini adalah , jadi jawaban tersingkat dalam byte menang. Celah standar berlaku.

Contohnya

Contoh 1

Memasukkan

11111
00111>
00101<
1F111

Keluaran

1

Eksekusi

Putar 1:

11111
10011
01010
1F111

11111
10011
0F010
11111

Putar 2:

11111
11001
F0100
11111

11111
F1001
10100
11111

Belok 3:

11111
1F100
01001
11111

1F111
11100
01001
11111

Contoh 2

Memasukkan

11111
00100<
00100<
1F111

Keluaran

0

Eksekusi

Putar 1:

11111
01000
01000
1F111

11111
01000
0F000
11111

Putar 2:

11111
10000
F0000
11111

11111
F0000
10000
11111

Belok 3:

11111
00001
00001
11111

Apakah garis tengah selalu bergerak? Bisakah kita mengambil daftar baris sebagai input? Jika suatu garis tidak bergerak, dapatkah kita menganggapnya diakhiri dengan karakter selain <atau >jadi kita dapat mengambil array persegi panjang sebagai input? Ngomong-ngomong, tantangan bagus!
dylnan

@ Dylnan saya mengklarifikasi dalam teks tantangan. Lapisan menengah akan selalu bergerak dan akan selalu memiliki <atau >di akhir.
BgrWorker

Apakah katak bergerak maju setiap belokan bahkan ketika ada 0di depannya, atau akankah ia menunggu yang berikutnya 1? Jika itu bisa menunggu, apakah akan maju pada setiap 1, atau dapatkah itu menunggu dengan cerdas? Yaitu dengan test case 11111 00001< 00011< 11F11, apakah itu palsu karena melompat di air ( pastebin langkah ); apakah itu palsu karena ia bergerak keluar dari bingkai ( pastebin langkah ); atau akankah itu benar karena ia menunggu dengan cerdas untuk platform kedua sebelum melompat maju ( pastebin langkah )?
Kevin Cruijssen

@KevinCruijssen bergerak setiap belokan, dan dengan senang hati akan bunuh diri (seperti yang saya katakan, Jonny bukan pemain yang sangat baik)
BgrWorker

@ BgrWorker Ok, itu membuat tantangan memang lebih bisa dilakukan. :) Mungkin edit dalam deskripsi tantangan, bahwa katak akan bergerak maju setiap belokan, bahkan jika itu akan melompat ke 0.
Kevin Cruijssen

Jawaban:


4

Python 2 , 168 165 152 145 137 129 byte

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

Cobalah online!

Format input adalah daftar string; karakter yang memiliki makna seperti yang diberikan dalam pernyataan masalah.

Penjelasan:

iadalah nomor belokan (dimulai dengan Belok 1); xadalah posisi katak pada awal belokan itu.

Baris yang akan dilangkahi oleh sang katak adalah string l(perhatikan bahwa melalui slicing, ini berada di urutan bawah ke atas). d=('<'in l)%-2|1menghasilkan -1atau 1tergantung pada arah baris bergerak.

Karena ini adalah itikungan ke - th, baris itu akan bergeser dari posisi aslinya oleh ibyte; jadi karakter yang hendak dilompati si katak adalah di l[(x-d*i)%L]mana Llebar baris, jadi kita ingin agar karakter itu sama dengan '1'; yaitu >'0',.

Selain itu, kami ingin memeriksa bahwa katak tidak akan bergeser dari tepi pada awal belokan berikutnya ; itu adalah fungsi ekspresi -1<x+d<L.

Kondisi ini dirantai (karena '0'>-1selalu True); dan jika suatu saat ekspresi yang dihasilkan salah, kakan menjadi (dan kemudian tinggal) 0.

Bagaimanapun, kami memperbarui posisi katak x+=ddan menabrak nomor baris; lalu busa, bilas, ulangi.


1

Python 2 , 246 245 244 242 byte

-3 byte terima kasih kepada Tn. Xcoder
-1 byte terima kasih kepada 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]

Cobalah online!

Penjelasan

  • d adalah arah setiap lapisan akan bergerak
  • q adalah karakter yang akan dililitkan
    • [q,' '][q<'L'] akan menjatuhkan katak di layar
  • sum([r[d+1:d-1],[[q,' '][q<'L']]][::d-~d],[])+r[-1:]akan menghapus karakter terakhir (arah), kemudian menghapus karakter pertama dan menambahkannya atau menghapus kedua terakhir dan menambahkannya (berdasarkan d), dan menambahkan arah kembali, secara efektif memindahkan seluruh baris ke kiri / kanan.
  • if'F'in r:j=r.index('F');r[j]='L';m[i-1][j]=min('F',m[i-1][j]) akan membuat katak melompat maju
  • min('F',m[i-1][j]) akan membuat katak jatuh di air
  • Perbandingan karakter ( mindan <) mengikuti urutan' ' < '0' < '1' < 'F' < 'L'

Input akan menjadi daftar daftar karakter:
' '- air
'F'- katak
'L'- plataform
'0'- pindahkan layer ke kiri
'1'- pindahkan layer ke kanan


if i<len(m)-1mungkin saja if~-len(m)>i.
Jonathan Frech

0

Java 8, 293 277 byte

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;}

Menggunakan karakter default seperti yang ditentukan dalam deskripsi tantangan ( 01F<>).

Cobalah online.

Penjelasan:

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.