Dead Frog Walking


17

Wprowadzenie

Jonny chce grać w Frogger. Jednak nie jest bardzo dobry. W rzeczywistości będzie próbował ruszyć do przodu i dopiero po przesunięciu platform.

Dowiedz się, czy żaba Jonny'ego dotrze do końca ścieżki, czy też umrze na swojej drodze.

Wyzwanie

Program będzie odbierał jako dane wejściowe siatkę Frogger złożoną z 0s i 1s, w następującym formacie:

  • Siatka będzie miała losową szerokość i długość oraz co najmniej 3x3
  • 1 reprezentuje platformy
  • 0 reprezentuje wodę
  • F przedstawia pozycję początkową żaby
  • Każda pierwsza i ostatnia linia siatki będzie się składać tylko z 1s i nie będzie się ruszać, a żaba Fzostanie losowo umieszczona w ostatniej linii
  • Każda warstwa pośrednia zawsze będzie się poruszać i będzie miała znak <lub >na końcu każdej linii wskazujący, czy porusza się w lewo, czy w prawo

Zastępowanie tych symboli własnymi symbolami jest dozwolone, o ile wszystkie są odrębne, a Ty podajesz zamienniki w swojej odpowiedzi.

Dane wejściowe mogą być w dowolnym kompatybilnym formacie (ciąg znaków z podziałem wiersza, tablica ciągów, tablica znaków, ...).

Zasady Wyzwania

  • W każdej turze wszystkie platformy poruszają się o jedno pole, zgodnie z kierunkiem wskazanym przez znak <lub>
  • Platformy pojawiają się ponownie po drugiej stronie siatki, jeśli zostaną wypchnięte z „ekranu”
  • Jeśli żaba znajduje się na ruchomej platformie, będzie się poruszać wraz z nią
  • Następnie żaba przeskoczy o jeden kwadrat w kierunku górnego rzędu. Żaba będzie się poruszać co turę.
  • Żaba umiera, jeśli wskoczy do wody ( 0) lub dotknie boku siatki wraz z ruchomą platformą

Twój program musi wyprowadzić prawdziwą wartość, jeśli żaba przeżyje, aw przeciwnym razie wartość fałsz.

To jest , więc wygrywa najkrótsza odpowiedź w bajtach. Obowiązują standardowe luki.

Przykłady

Przykład 1

Wejście

11111
00111>
00101<
1F111

Wynik

1

Wykonanie

Turn 1:

11111
10011
01010
1F111

11111
10011
0F010
11111

Turn 2:

11111
11001
F0100
11111

11111
F1001
10100
11111

Turn 3:

11111
1F100
01001
11111

1F111
11100
01001
11111

Przykład 2

Wejście

11111
00100<
00100<
1F111

Wynik

0

Wykonanie

Turn 1:

11111
01000
01000
1F111

11111
01000
0F000
11111

Turn 2:

11111
10000
F0000
11111

11111
F0000
10000
11111

Turn 3:

11111
00001
00001
11111

Czy linie pośrednie zawsze będą się poruszać? Czy możemy wziąć listę wierszy jako dane wejściowe? Jeśli linia się nie porusza, czy możemy założyć, że kończy się ona znakiem innym niż, <czy też >możemy przyjąć tablice prostokątne jako dane wejściowe? Nawiasem mówiąc, miłe wyzwanie!
dylnan

@dylnan Wyjaśniłem to w tekście wyzwania. Warstwy pośrednie zawsze będą się poruszać i zawsze będą miały koniec <lub >koniec.
BgrWorker

Czy żaba porusza się do przodu co turę, nawet jeśli jest 0przed nią, czy będzie czekać na następny 1? Jeśli może poczekać, czy pójdzie naprzód na każdym 1, czy może będzie mądrze czekać? Tj. Z przypadkiem testowym 11111 00001< 00011< 11F11, czy będzie falsey, ponieważ wskakuje do wody ( pastebin kroków ); czy będzie falsey, ponieważ przesuwa się poza ramkę ( pastebin kroków ); czy będzie to prawdą, ponieważ elegancko czeka na drugą platformę, zanim skoczy do przodu ( pastebin kroków )?
Kevin Cruijssen

@KevinCruijssen porusza się co turę i chętnie samobójstwo (jak powiedziałem, Jonny nie jest bardzo dobrym graczem)
BgrWorker

@BgrWorker Ok, to czyni wyzwanie naprawdę wykonalnym. :) Może edytuj to w opisie wyzwania, aby żaba poruszała się do przodu co turę, nawet jeśli wskoczyłaby w0 .
Kevin Cruijssen

Odpowiedzi:


4

Python 2 , 168 165 152 145 137 129 129 bajtów

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

Wypróbuj online!

Format wejściowy to lista ciągów; znaki o znaczeniu podanym w opisie problemu.

Wyjaśnienie:

ijest numerem tury (zaczynając od tury 1); xjest pozycją żabki na początku tej tury.

Rzędem, na który ma wejść żaba, jest sznurek l(zwróć uwagę, że poprzez krojenie są one uporządkowane od dołu do góry). d=('<'in l)%-2|1daje -1lub w 1zależności od kierunku, w którym rząd się porusza.

Ponieważ jest to itura, rząd ten zostanie przesunięty z oryginalnej pozycji o ibajty; a więc postać Frogger ma zamiar wskoczyć to l[(x-d*i)%L]gdzie Ljest szerokość rzędu, więc chcemy, że postać będzie równa '1'; tj >'0'.

Ponadto chcemy sprawdzić, czy żaba nie zostanie przesunięta poza krawędź na początku następnego zakrętu; taka jest funkcja wyrażania -1<x+d<L.

Warunki te są powiązane (ponieważ '0'>-1zawsze tak jest True); a jeśli w dowolnym momencie wynikowe wyrażenie będzie fałszywe, kstanie się (a następnie pozostanie) 0.

W każdym razie aktualizujemy pozycję żabki x+=di podbijamy numer wiersza; następnie spienić, spłukać, powtórzyć.


1

Python 2 , 246 245 244 242 bajtów

-3 bajt dzięki Mr. Xcoder
-1 bajt dzięki 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]

Wypróbuj online!

Wyjaśnienie

  • d to kierunek, w którym przesunie się każda warstwa
  • q to postać, która zostanie otoczona
    • [q,' '][q<'L'] upuści żabę poza ekranem
  • sum([r[d+1:d-1],[[q,' '][q<'L']]][::d-~d],[])+r[-1:]usunie ostatni znak (kierunek), a następnie usunie pierwszy znak i doda go lub usunie drugi znak i poprzedzi go (na podstawie d), i doda kierunek do tyłu, skutecznie przesuwając cały rząd w lewo / prawo.
  • if'F'in r:j=r.index('F');r[j]='L';m[i-1][j]=min('F',m[i-1][j]) sprawi, że żaba skoczy do przodu
  • min('F',m[i-1][j]) sprawi, że żaba spadnie do wody
  • Porównanie znaków ( mini <) jest zgodne z kolejnością' ' < '0' < '1' < 'F' < 'L'

Wejściowa będzie lista znaków:
' '- woda
'F'- żaba
'L'- platforma
'0'- przesuń warstwę w lewo
'1'- przesuń warstwę w prawo


if i<len(m)-1może być if~-len(m)>i.
Jonathan Frech,

0

Java 8, 293 277 bajtów

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

Wykorzystuje znaki domyślne określone w opisie wyzwania ( 01F<>).

Wypróbuj online.

Wyjaśnienie:

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.