Toter Frosch zu Fuß

17

Einführung

Jonny will Frogger spielen. Er ist jedoch nicht sehr gut. Tatsächlich wird er nur versuchen, sich vorwärts zu bewegen, und zwar erst, nachdem sich die Plattformen bewegt haben.

Finde heraus, ob Jonnys Frosch das Ende des Weges erreicht oder ob er auf seinem Weg stirbt.

Herausforderung

Das Programm empfängt als Eingabe ein Frogger-Gitter, das aus 0s und 1s besteht und das das folgende Format aufweist:

  • Das Gitter hat eine zufällige Breite und Länge und mindestens 3x3
  • 1 repräsentiert Plattformen
  • 0 steht für Wasser
  • F repräsentiert die Startposition des Frosches
  • Jede erste und letzte Zeile des Gitters besteht nur aus 1s und bewegt sich nicht. Der Frosch Fwird in der letzten Zeile zufällig platziert
  • Jede Zwischenebene ist immer in Bewegung und hat ein <oder >am Ende jeder Zeile, das angibt, ob sie sich nach links oder rechts bewegt

Das Ersetzen dieser Symbole durch Ihre eigenen ist zulässig, sofern sie alle unterschiedlich sind und Sie die Ersetzungen in Ihrer Antwort angeben.

Die Eingabe kann in jedem kompatiblen Format erfolgen (Zeichenfolge mit Zeilenumbrüchen, Zeichenfolge, Zeichenfolge, ...).

Herausforderungsregeln

  • In jeder Runde bewegen sich alle Plattformen um ein Feld, basierend auf der Richtung, die durch das <oder >-Zeichen angezeigt wird
  • Plattformen erscheinen wieder auf der anderen Seite des Gitters, wenn sie vom "Bildschirm" gestoßen werden
  • Befindet sich der Frosch auf einer sich bewegenden Plattform, bewegt er sich mit
  • Danach springt der Frosch ein Feld in Richtung oberste Reihe. Der Frosch wird sich jede Runde bewegen.
  • Der Frosch stirbt, wenn er ins Wasser springt ( 0) oder zusammen mit einer sich bewegenden Plattform die Seite des Gitters berührt

Ihr Programm muss einen Wahrheitswert ausgeben, wenn der Frosch überlebt, und einen falschen Wert, wenn er nicht überlebt.

Das ist , also gewinnt die kürzeste Antwort in Bytes. Es gelten Standardlücken.

Beispiele

Beispiel 1

Eingang

11111
00111>
00101<
1F111

Ausgabe

1

Ausführung

Abbiegung 1:

11111
10011
01010
1F111

11111
10011
0F010
11111

Turn 2:

11111
11001
F0100
11111

11111
F1001
10100
11111

Wende 3:

11111
1F100
01001
11111

1F111
11100
01001
11111

Beispiel 2

Eingang

11111
00100<
00100<
1F111

Ausgabe

0

Ausführung

Abbiegung 1:

11111
01000
01000
1F111

11111
01000
0F000
11111

Turn 2:

11111
10000
F0000
11111

11111
F0000
10000
11111

Wende 3:

11111
00001
00001
11111
BgrWorker
quelle
Werden sich Zwischenlinien immer bewegen? Können wir eine Liste von Zeilen als Eingabe nehmen? Wenn sich eine Linie nicht bewegt, können wir davon ausgehen, dass sie mit einem anderen Zeichen endet, <oder >können wir rechteckige Arrays als Eingabe verwenden? Übrigens schöne Herausforderung!
Dylnan
@dylnan Ich habe es im Aufforderungstext klargestellt. Zwischenebenen bewegen sich immer und haben immer ein <oder >am Ende.
BgrWorker
Bewegt sich der Frosch in jeder Runde vorwärts, auch wenn sich ein Frosch 0davor befindet, oder wartet er auf den nächsten 1? Wenn es warten kann, geht es dann bei jedem vorwärts 1oder kann es intelligent warten? Dh mit dem Testfall 11111 00001< 00011< 11F11wird es falsch sein, weil es ins Wasser springt ( Pastebin of Steps ); wird es falsch sein, weil es sich aus dem Rahmen bewegt ( Pastebin of Steps ); oder ist es wahr, weil es intelligent auf die zweite Plattform wartet, bevor es vorwärts springt ( Pastebin of Steps )?
Kevin Cruijssen
@ KevinCruijssen es bewegt sich jede Runde, und wird glücklich Selbstmord (wie gesagt, Jonny ist kein sehr guter Spieler)
BgrWorker
@BgrWorker Ok, das macht die Herausforderung tatsächlich machbarer. :) Vielleicht bearbeitest du es in der Herausforderungsbeschreibung, dass der Frosch sich jede Runde vorwärts bewegt, auch wenn er in eine Richtung springen würde 0.
Kevin Cruijssen

Antworten:

4

Python 2 , 168 165 152 145 137 129 Bytes

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

Probieren Sie es online!

Das Eingabeformat ist eine Liste von Zeichenfolgen. Zeichen mit den in der Problemstellung angegebenen Bedeutungen.

Erläuterung:

iist die Zugnummer (beginnend mit Zug 1); xist die Position des Froggers zu Beginn dieses Zuges.

Die Reihe, auf die der Frogger gerade tritt, ist die Schnur l(beachten Sie, dass diese durch das Schneiden von unten nach oben sortiert werden). d=('<'in l)%-2|1ergibt -1oder 1abhängig von der Richtung, in die sich die Reihe bewegt.

Da dies der idritte Zug ist, hat sich diese Zeile von ihrer ursprünglichen Position um iBytes verschoben . und so ist das Zeichen, auf das der Frogger springen wird, l[(x-d*i)%L]wo Ldie Breite der Reihe ist, also wollen wir, dass dieses Zeichen gleich ist '1'; dh >'0'.

Außerdem möchten wir sicherstellen, dass der Frogger zu Beginn der nächsten Abbiegung nicht von der Kante verschoben wird . das ist die Funktion des Ausdrucks -1<x+d<L.

Diese Bedingungen sind verkettet (da '0'>-1ist immer True); und wenn der resultierende Ausdruck zu irgendeinem Zeitpunkt falsch ist, kwird er (und bleibt dann) 0.

In jedem Fall aktualisieren wir die Position des Froggers x+=dund erhöhen die Zeilennummer. dann aufschäumen, ausspülen, wiederholen.

Chas Brown
quelle
1

Python 2 , 246 245 244 242 Bytes

-3 Byte dank Mr. Xcoder
-1 Byte dank 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]

Probieren Sie es online!

Erläuterung

  • d ist die Richtung, in die sich jede Ebene bewegen wird
  • q ist das Zeichen, um das herum gewickelt wird
    • [q,' '][q<'L'] Lässt den Frosch vom Bildschirm fallen
  • sum([r[d+1:d-1],[[q,' '][q<'L']]][::d-~d],[])+r[-1:]Entfernt das letzte Zeichen (die Richtung), dann das erste Zeichen und hängt es an oder entfernt das vorletzte und stellt es voran (basierend auf d) und hängt die Richtung zurück, wodurch die gesamte Zeile nach links / rechts verschoben wird.
  • if'F'in r:j=r.index('F');r[j]='L';m[i-1][j]=min('F',m[i-1][j]) wird den Frosch nach vorne springen lassen
  • min('F',m[i-1][j]) wird den Frosch ins Wasser fallen lassen
  • Der Zeichenvergleich ( minund <) folgt der Reihenfolge' ' < '0' < '1' < 'F' < 'L'

Die Eingabe ist eine Liste mit Zeichen:
' '- Wasser
'F'- Frosch
'L'- Plattform
'0'- verschiebe die Ebene nach links
'1'- verschiebe die Ebene nach rechts

Stange
quelle
if i<len(m)-1könnte möglicherweise sein if~-len(m)>i.
Jonathan Frech
0

Java 8, 293 277 Bytes

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

Verwendet die in der Challenge-Beschreibung ( 01F<>) angegebenen Standardzeichen .

Probieren Sie es online aus.

Erläuterung:

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
Kevin Cruijssen
quelle