Gravity Guy ist ein Spiel, bei dem die einzige Benutzereingabe eine einzelne Taste ist, die die Richtung der Schwerkraft umdreht. Bestimmen Sie bei einem vorgegebenen ASCII-Kunstlevel, ob es Gravity Guy möglich ist, das Ende zu erreichen.
Regeln
- Die anfängliche Richtung der Schwerkraft ist nach unten .
- Die erste Spalte der Eingabe enthält immer nur eine
#
, auf der Gravity Guy beginnt . - Bei jeder Iteration bewegt er sich zu der Figur rechts von ihm .
- Wenn sein Weg blockiert ist und er sich in ein bewegt
#
, verliert der Spieler . - Nach dem Bewegen kann der Spieler die Schwerkraft wahlweise von unten nach oben oder von oben nach unten umschalten .
- Gravity Guy fällt
#
dann auf den nächsten (in der aktuellen Richtung der Schwerkraft). - Wenn es keinen gibt,
#
auf den man fallen kann und der vom Gitter fällt , verliert der Spieler . - Wenn sich Gravity Guy von der rechten Seite des Eingaberasters entfernt, gewinnt der Spieler .
Beispiel
Wenn dies das Eingaberaster war:
###
# # #
###
Gravity Guy begann x
nach jeder Iteration an diesen Positionen. ^
= Schwerkraft nach oben und v
= Schwerkraft nach unten schalten.
v ^ v
-------------------------------------------------------------
### | ### | ### | ### | ### | ###
x | | x | x | x |
# # | #x # | # # | # # | # # | # # x
### # | ### # | ### # | ### # | ### # | ### #
Wie Sie sehen, erreicht Gravity Guy durch das Umschalten der Schwerkraft zu diesen Zeiten das Ende, sodass diese Eingabe einen Wahrheitswert zurückgeben würde.
Spezifikationen
- Das Eingaberaster kann in jedem geeigneten "Raster" -Format vorliegen (mehrzeilige Zeichenfolge, die mit Leerzeichen aufgefüllt ist, eine Reihe von Zeilenfolgen, eine Reihe von Zeichenfolgen usw.).
- Wenn es dem Spieler möglich ist, das Level zu gewinnen, geben Sie einen
truthy
Wert aus. Wenn nicht, geben Sie einenfalsey
Wert aus. - Die Breite und Höhe des Rasters sind
50
maximal Zeichen. - Das ist Code-Golf , möge der kürzeste Code in Bytes gewinnen!
Testfälle
(durch jeweils getrennte ----------
Leerzeilen sollten ebenfalls mit Leerzeichen aufgefüllt werden)
Wahr
######### ######## ###### ######
# # # # # # #
### # # # # # # # # #
# ## # # ## # # # # # ##
# # # # # # # # # #######
# # # # # ### # #
# ## # ## # # # #
# # # # # #
# #################################### #
# #
#############################################
----------
###
----------
#####
####
----------
#####
# # #
# # #
#####
----------
############
###### ######
############
----------
### ###
# #
#### # ####
# #
# #
#
----------
######
#
##
#######
### #
# #
#####
----------
#####
# #
## #
#######
###
#
######
----------
###
# # #
###
----------
### ###
### ##
# #
#####
----------
#
# #
#
# # #
#
#
#
#
----------
##### ####
# # #
# # # ## #
# #
##### #### #
#
#########
----------
###########################
# # # # # # #
# # # # # # # # # #
# # # ######### ###########
# # # # # # # #
# # # ## ##### ### #
## # # # ## ###
# ##### #### ########### #
# # # # # ## #
# # ##### ### # # # # # #
# # # # ##
###########################
Falsch
###
#
####
----------
### ###
----------
#
### ###
#### ###
#
----------
### ###
# # #
#### # # ####
# #
# #
# #
#
----------
#######
# #
## #####
### ######
# #
#######
----------
###########################
# # # # # # # #
# # # # # # # # # #
# # # ######### ###########
# # # # # # # #
# # # ## ##### ### #
## # # # ## ###
# ##### #### ########### #
# # # # # ## #
# # ##### ### # # # # # #
# # # # ##
###########################
code-golf
ascii-art
decision-problem
user81655
quelle
quelle
column
Typ hat, wäre das, denke ich, in Ordnung.#
in der ersten Spalte in der ersten Zeile steht?Antworten:
Schnecken , 15 Bytes
Online ausprobieren?
0.
^
Bei dieser Option muss das Muster oben links beginnen.\
: Spielraumn
: 90 Grad in beide Richtungen drehen\ ,
: stimmen null oder mehrmals mit dem Leerzeichen überein=\#
Überprüfen Sie, ob ein#
vor uns liegtr
: Richten Sie die Richtung nach rechts}+
: Mindestens einmal alle vorhergehenden Schritte ausführen~
stimmen Sie mit einer Zelle überein, die außerhalb der Gittergrenzen liegtquelle
Perl,
93898177767574 BytesBeinhaltet +2 für
-0p
Führen Sie mit dem Eingabemuster (mit allen Zeilenabständen auf die gleiche Länge aufgefüllt) auf STDIN aus:
gravity.pl
:Diese dateibasierte Version benötigt den letzten Zeilenumbruch, das sind also wirklich 75 Bytes. Die kommandozeilenbasierte Version benötigt diese zusätzliche Zeile jedoch nicht, sodass dies 74 Bytes sind:
Erläuterung:
Dadurch wird eine Saite konstruiert, die von einem
w
Schwerkraftmann in jeder Position erreicht werden kann. Für das vorletzte wahrheitsgemäße Beispiel wird also konstruiert:So kann es der Schwerkraftmensch genau dann schaffen, wenn es
w
in der letzten Spalte einen gibt. Die Zeichenfolge wird erstellt, indemw
in jeder Runde ein erreichbarer Bereich durch ersetzt wird .Jede Ersetzung hat die Form
Dies
w
erfordert, dass dem Leerzeichen ein Präfix und anschließend ein Postfix vorangestellt wird, ersetzt jedoch nur das Leerzeichen, ohne dass viele erweiterte Gruppierungen erforderlich sind.Angenommen, es
$n
gibt einen regulären Ausdruck, der gerade so weit fortgeschritten ist, dass die linke und die rechte Seite genau untereinander liegen. Dann sind die relevanten regulären Ausdrücke:Damit ist das Programm einfach:
quelle
JavaScript (ES6), 174 Byte
Nimmt ein horizontales Array von Zeichenfolgen und gibt die Anzahl der Austrittspunkte zurück. Das Vertauschen des Arrays kostet mich 29 Bytes. Ungolfed:
quelle
Pip ,
85686259 + 1 = 60 BytesVerwendet das
-r
Flag, um alle Zeilen von stdin zu lesen.Probieren Sie es online!
Kurze Erklärung
Die Strategie ist im Wesentlichen eine Breitensuche. Wir transponieren die Eingabe und durchlaufen die Zeilen (Spalten) mit einer Liste der y-Positionen, die der Spieler in dieser Spalte erreichen könnte. Die Ausgabe nach der letzten Spalte ist eine nicht leere Liste, wenn der Spieler gewinnen kann, oder eine leere Liste (die nur als abschließende Zeile gedruckt wird), wenn der Spieler verliert.
Vollständige Erklärung
Integrierte Variablen in diesem Programm verwendet:
i == 0
,l == []
,s == " "
.Das
-r
Flag fügt eine Liste der Eingabezeilen eing
.FcZg{...}
Reißverschlüsseg
und Schleifen über jeder Spaltec
. (Unary verhältZ
sich auf eine Liste von Iterables angewendet wie Pythonzip(*g)
und transponiert ein 2D-Array sauber.) Beachten Sie, dassc
dies eine Liste und keine Zeichenfolge ist.Innerhalb der Spaltenschleife werden wir von
y
auf die leere Liste zurückgesetztY
Ankreuzen zurückl
.Fxi
Schleifen vorbeii
. In späteren Iterationeni
wird eine Liste der Y-Koordinaten angezeigt, die der Spieler in der vorherigen Spalte erreichen konnte. Beim ersten Mal wollen wir mit nur0
(obere linke Ecke) beginnen. Die Variable ist für einen Skalar vorinitialisiert0
, nicht für eine Liste[0]
, aber Pip iteriert in beiden Fällen problemlos darüber .Ic@xQs
Überprüft für jede der gültigen Positionen in der letzten Spalte, ob an dieser Position in der aktuellen Spalte ein Leerzeichen vorhanden ist. Wenn nicht, ist der Spieler einfach gegen eine Wand gelaufen und wir probieren die nächste Möglichkeit aus. In diesem Fall möchten wir für jede Richtung der Schwerkraft die Positionen ermitteln, auf die der Spieler fällt, und siey
mit dem OperatorP
ushB
ack zur Liste hinzufügen .Schwerkraft steigt (links in der transponierten Fassung):
Die Schwerkraft sinkt (rechts in der transponierten Fassung):
Fällt der Spieler in einer bestimmten Richtung vom Gitter, wird der jeweilige
@?
Operation kein#
und gibt Null. Dies ist kein gültiger Index und generiert in der nächsten Iteration einige Warnungen, die jedoch ohne das-w
Flag nicht sichtbar sind . Für unsere Zwecke werden diese Fälle im Wesentlichen außer Betracht gelassen.Nimmt nach der inneren Schleife
i:UQy
die Listey
der Positionen, die wir erstellt haben, beseitigt Duplikate und weist sie zui
. (Das Eliminieren von Duplikaten ist notwendig, da sonst die Liste exponentiell aufbläht.) Wir gehen dann zur nächsten Spalte. Wenn wir alle Spalten durchlaufen haben und ein gültiger Pfad vorhanden ist,i
wird eine nicht leere Liste von Positionen angezeigt (wahrheitsgemäß). Wenn nicht, wird es eine leere Liste (Falsey) sein.quelle