Spiel des Lebens Pfeile

26

Hintergrund

Diese Herausforderung ist zu Ehren von Apsillern , die mit ihrer Herausforderung die Kategorie Nicht so einfach wie es aussieht in Best of PPCG 2016 gewonnen haben. Kann meine 4-Noten-Spieluhr dieses Lied spielen? Herzliche Glückwünsche!

Auf ihrer "Über mich" -Seite hat dieser Benutzer einen wirklich tollen Simulator für den Game of Life- Zellularautomaten. (Im Ernst, probieren Sie es aus.) Auf der anderen Seite ist das Wort Aspillera spanisch für "pfeilbeleuchtet". In Anbetracht dieser Tatsachen geht es bei dieser Herausforderung um Pfeile im Spiel des Lebens.

Spiel des Lebens Pfeile

In GoL repräsentieren wir einen Pfeil durch einen Gleiter und eine Wand durch eine Folge von Blöcken . Ein einzelnes Segelflugzeug nähert sich der Wand von oben und versucht, durch eine Lücke in der Wand zu fliegen (das Pfeillicht). Ihre Aufgabe ist es, zu überprüfen, ob der Schirm durch das Pfeillicht geht oder gegen die Wand stößt.

Eingang

Ihre Eingabe ist ein Bitgitter, das eine GoL-Konfiguration darstellt. Sie können es in jedem vernünftigen Format verwenden (mehrzeilige Zeichenfolge aus zwei beliebigen druckbaren ASCII-Zeichen, Liste der Zeichenfolgen, 2D-Array von Ganzzahlen, 2D-Array von Booleschen Werten usw.). Der Übersichtlichkeit halber werde ich .#im Folgenden mehrzeilige Zeichenfolgen verwenden .

Die Eingabe hat garantiert mehrere Eigenschaften. Erstens beträgt seine Höhe 2N für einige N ≥ 6 und seine Breite mindestens 2N + 2 . Die Eingabe ist alles .s, außer dass sich irgendwo in den oberen drei Reihen ein Segelflugzeug befindet und in den beiden mittleren Reihen eine Wand aus Blöcken. Der Schirm bewegt sich nach Südwesten oder Südosten, und seine Position ist so, dass er, wenn die Wände entfernt werden, eine Seitenkante nicht passiert, bevor er die Unterkante erreicht (er kann jedoch eine Ecke des Gitters erreichen). Der Schirm ist anfänglich von der linken und rechten Kante durch mindestens eine Stufe von .s getrennt. Es kann in jeder Phase sein.

Die Wand besteht aus Blöcken, die durch eine Spalte von .s getrennt sind, außer an einer Stelle, wo sie durch mindestens zwei Spalten von .s getrennt sind. Wie beim Segelflugzeug sind auch die Blöcke ganz links und ganz rechts durch einen Schritt von .s von den Kanten getrennt . Es wird immer mindestens einen Block am linken Rand und einen Block am rechten Rand geben.

Hier ist ein Beispiel für ein gültiges Eingaberaster:

....#......................
..#.#......................
...##......................
...........................
...........................
...........................
.##.##............##.##.##.
.##.##............##.##.##.
...........................
...........................
...........................
...........................
...........................
...........................

Ausgabe

Wie bereits erwähnt, müssen Sie feststellen, ob der Schirm gegen die Wand stößt oder bis zur Südkante vordringt. Für die Zwecke dieser Herausforderung tritt ein Absturz auf, wenn die Konfiguration nicht mehr aus einem einzelnen Segelflugzeug und der Wand aus Blöcken besteht, unabhängig davon, was später in der Simulation passiert. Die folgenden Diagramme zeigen die kleinsten Lücken, die ein Südostgleiter ohne Absturz in den beiden unterschiedlichen Phasen überwinden kann (die Bedingung für Südostgleiter ist symmetrisch).

...#...........
.#.#...........
..##...........
...............
...............
##...........##
##...........##

...#...........
....#..........
..###..........
...............
...............
##...........##
##...........##

Wenn der Schirm durch die Wand fliegt, müssen Sie einen Wahrheitswert und ansonsten einen falschen Wert ausgeben. Für das obige Beispiel ist die korrekte Ausgabe falsch, da der Schirm in den linken Teil der Wand stürzt.

Für die Zwecke dieser Herausforderung können Sie davon ausgehen, dass, wenn Sie GoL auf der Eingabe für 2 * (Höhe - 3) Schritte simulieren , sich der Gleitschirm in der unteren Reihe in der erwarteten Position befindet und die Wand intakt ist, die Ausgabe wahr ist .

Regeln und Wertung

Sie können ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt.

Testfälle

Ich habe die Testfälle in einem GitHub-Repository gesammelt , da sie ziemlich groß sind. Hier sind Links zu den einzelnen Dateien:

Zgarb
quelle
Gibt es einen Grund, die leeren Zeilen unter der Wand in die Eingabe aufzunehmen?
Martin Ender
@MartinEnder Sie machen Lösungen, bei denen Sie tatsächlich GoL auf dem Eingang simulieren, praktikabler (zumindest hoffe ich das).
Zgarb
Der Schirm startet immer in der obersten Reihe?
Rod
@ Rod Ja, es wird in der obersten Reihe in Richtung Südwesten oder Südosten sein.
Zgarb
Ein weiteres Spiel des Lebens: P
Christopher

Antworten:

15

Python 2 , 142 136 135 Bytes

-6 Bytes dank ElPedro
-1 Bytes dank TuukkaX

p=input()
z=p[2].index(1)
m=(p[1][z]-p[1][z+1]<1)*2-1
k=i=0
for b in p[3:]:x=p[2][::m].index(1)+i;k|=1in b[::m][x-2:x+8];i+=1
print 1-k

Probieren Sie es online! oder Überprüfen Sie alle Testfälle

Ausrichtung prüfen (Ost / West):

West Ost
Verwenden Sie z=p[2].index(1), um das erste Quadrat in der 3. Reihe (dargestellt durch das rote Quadrat) zu erhalten und dann m=(p[1][z]-p[1][z+1]<1)*2-1den Wert rechts (grün) von dem Wert links (blau) zu subtrahieren, um auf diese Weise alle 4 Segelflugzustände zu erhalten, die anstehen Südwesten führen zu 1(obere Reihe im Bild), während diejenigen, die nach Südosten gehen, zu 0oder führen -1.
Dann konvertiere: 1 -> -1und 0,-1 -> 1verwende den Parameter, um die Listen umzukehren, wenn es sich um westliche handelt. Auf diese Weise sind die nach Südwesten fliegenden Segelflugzeuge genauso bedroht wie die nach Südosten.

Segelflugbewegung

gleiten
Dies ist die Bewegung, die der nach Südosten fliegende Segelflugzeug macht, er hat ein "Leitermuster" und der am weitesten links stehende Block in der dritten Zeile ist für jedes Muster konstant. Wenn Sie es als Ausgangspunkt verwenden, werden die umliegenden 3 Blöcke links und rechts und die mittleren 4 Blöcke auf das Vorhandensein von 1s (das wäre die Wand) überprüft .
Pfeiltasten
Pfeiltasten_Pfad

Stange
quelle
Ich glaube , Sie 4 Bytes , indem eine Variable verlieren kann iauf 0die äußere forSchleife dann 1 Hinzufügen , um sie jedem Durchgang und so loswerden enumerate. Scheint zu funktionieren, als ich es mit deinem TIO ausprobiert habe. +1 für eine coole Antwort, ob ich richtig oder falsch bin.
ElPedro
Nett! Sie können ein Byte speichern, indem Sie das Leerzeichen von entfernen 1 in. +1.
Yytsi
2
+1 für "weast"
JungHwan Min
4

Oktave, 123 122 108 Bytes

Dank @LuisMendo konnten 2 Bytes eingespart werden

B=A=input("");B(1:3,:)=0;do;until nnz((A=A&(s=conv2(A,(m=-1:1)|m','same'))>1&s<4|~A&s==3)-B)-5;any(A(end,:))

Probieren Sie es online!

Oder

Überprüfen Sie alle Testfälle

Dank Rod Testfälle vorbereiten.

B=A=input("");
B(1:3,:)=0;
do
until nnz((A=A&(s=conv2(A,(m=-1:1)|m','same'))>1&s<4|~A&s==3)-B)-5
any(A(end,:))

Vorherige Antwort:

B=A=input("");
B(1:3,:)=0;
while nnz(A~=B)==5
    s=conv2(A,(m=-1:1)|m','same');
    x=~A;
    A&=~A|~(s<2|s>3);
    A|=x&s==3;
end;
any(A(end,:))

Zuerst Wandmuster als Variable extrahieren B.
Führen Sie eine GoL-Simulation durch, bis das Wandmuster und das simulierte Muster mehr oder weniger als 5 verschiedene Zellen aufweisen.
Wenn der Schirm die letzte Zeile erhalten hat, gibt die Funktion true zurück.

rahnema1
quelle
1
bis das Wandmuster und das simulierte Muster mehr / weniger als 5 verschiedene Zellen haben. Das ist schlau!
Luis Mendo
@ LuisMendo Danke, gespeichert ein Byted
rahnema1
3

Retina , 101 93 91 Bytes

Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.

O$#^`.(?=(.*¶)*(?<=#_.\2.+##.(.*¶)\D+))
$#1
¶(?>_(_)*#+_+¶_+¶(?<1>_+¶)*)(?>(?<-1>.)+)_{11}

Probieren Sie es online!

Sicher noch nicht optimal.

Martin Ender
quelle