Gravity Guy est un jeu où la seule entrée utilisateur est une seule touche qui inverse le sens de la gravité. Étant donné un niveau d'art ASCII, déterminez s'il est possible que Gravity Guy atteigne la fin.
Règles
- La direction de gravité initiale est en baisse .
- La première colonne de l'entrée ne contiendra toujours qu'une seule
#
, que Gravity Guy démarre par- dessus. - Chaque itération, il se déplace vers le personnage directement à sa droite .
- Si son chemin est bloqué et qu'il entre dans un
#
, le joueur perd . - Après avoir bougé, le joueur peut éventuellement basculer la gravité de bas en haut ou de haut en bas.
- Gravity Guy tombe
#
ensuite sur le suivant (dans le sens de la gravité actuel). - S'il n'y a personne
#
sur qui tomber et qu'il tombe de la grille , le joueur perd . - Si Gravity Guy s'écarte du côté droit de la grille d'entrée, le joueur gagne .
Exemple
S'il s'agissait de la grille d'entrée:
###
# # #
###
Gravity Guy commencerait à x
et à ces positions après chaque itération. ^
= changer la gravité vers le haut et v
= changer la gravité vers le bas.
v ^ v
-------------------------------------------------------------
### | ### | ### | ### | ### | ###
x | | x | x | x |
# # | #x # | # # | # # | # # | # # x
### # | ### # | ### # | ### # | ### # | ### #
Comme vous pouvez le voir, en changeant la gravité à ces moments, Gravity Guy atteint la fin, donc cette entrée retournerait une valeur vraie.
Caractéristiques
- La grille d'entrée peut être dans n'importe quel format de "grille" approprié (chaîne multiligne remplie d'espaces, tableau de chaînes de ligne, tableau de tableau de caractères, etc.).
- S'il est possible pour le joueur de gagner le niveau, affichez une
truthy
valeur. Sinon, sortez unefalsey
valeur. - La largeur et la hauteur de la grille seront
50
au maximum des caractères. - C'est le code-golf , que le code le plus court en octets gagne!
Cas de test
(chaque cas séparé par ----------
, toutes les lignes vides doivent également être complétées par des espaces)
Vrai
######### ######## ###### ######
# # # # # # #
### # # # # # # # # #
# ## # # ## # # # # # ##
# # # # # # # # # #######
# # # # # ### # #
# ## # ## # # # #
# # # # # #
# #################################### #
# #
#############################################
----------
###
----------
#####
####
----------
#####
# # #
# # #
#####
----------
############
###### ######
############
----------
### ###
# #
#### # ####
# #
# #
#
----------
######
#
##
#######
### #
# #
#####
----------
#####
# #
## #
#######
###
#
######
----------
###
# # #
###
----------
### ###
### ##
# #
#####
----------
#
# #
#
# # #
#
#
#
#
----------
##### ####
# # #
# # # ## #
# #
##### #### #
#
#########
----------
###########################
# # # # # # #
# # # # # # # # # #
# # # ######### ###########
# # # # # # # #
# # # ## ##### ### #
## # # # ## ###
# ##### #### ########### #
# # # # # ## #
# # ##### ### # # # # # #
# # # # ##
###########################
Faux
###
#
####
----------
### ###
----------
#
### ###
#### ###
#
----------
### ###
# # #
#### # # ####
# #
# #
# #
#
----------
#######
# #
## #####
### ######
# #
#######
----------
###########################
# # # # # # # #
# # # # # # # # # #
# # # ######### ###########
# # # # # # # #
# # # ## ##### ### #
## # # # ## ###
# ##### #### ########### #
# # # # # ## #
# # ##### ### # # # # # #
# # # # ##
###########################
code-golf
ascii-art
decision-problem
user81655
la source
la source
column
type spécial , ce serait OK à utiliser, je suppose.#
première colonne soit dans la première ligne?Réponses:
Escargots , 15 octets
L'essayer en ligne?
0.
^
est une option qui nécessite que le motif commence en haut à gauche.\
: espace de correspondancen
: Tournez de 90 degrés dans les deux sens\ ,
: correspond à l'espace zéro ou plusieurs fois=\#
vérifiez qu'il y a un#
devant nousr
: définir la direction vers la droite}+
: répéter toutes les opérations précédentes une ou plusieurs fois~
correspondre à une cellule qui est hors des limites de la grillela source
Perl,
93898177767574 octetsComprend +2 pour
-0p
Exécutez avec le modèle d'entrée (avec toutes les lignes d'espace remplies à la même longueur) sur STDIN:
gravity.pl
:Cette version basée sur un fichier a besoin de la nouvelle ligne finale, ce qui fait vraiment 75 octets. Mais la version basée sur la ligne de commande n'a pas besoin de cette nouvelle ligne supplémentaire, donc cela compte comme 74 octets:
Explication:
Cela va construire une chaîne avec un
w
gars de gravité dans chaque position peut atteindre. Donc, pour l'avant-dernier exemple véridique, il construira:Donc, le gars de la gravité peut le faire si et seulement s'il y en a un
w
dans la dernière colonne. La chaîne sera construite en remplaçant un espace accessible parw
à chaque tour.Chaque remplacement sera de la forme
ce qui exigera que l'espace soit précédé d'un préfixe et suivi d'un suffixe mais ne remplacera que l'espace
w
sans nécessiter beaucoup de regroupement avancé.Supposons qu'il
$n
contient une expression régulière qui progressera juste assez pour que les côtés gauche et droit soient exactement en dessous l'un de l'autre. Ensuite, les expressions rationnelles pertinentes sont:Avec cela hors de la façon dont le programme est facile:
la source
JavaScript (ES6), 174 octets
Prend un tableau horizontal de chaînes et renvoie le nombre de points de sortie. La transposition du tableau me coûte 29 octets. Non golfé:
la source
Pip ,
85686259 + 1 = 60 octetsUtilise l'
-r
indicateur pour lire toutes les lignes de stdin.Essayez-le en ligne!
Brève explication
La stratégie est essentiellement une recherche en largeur. Nous transposons l'entrée et la boucle sur les lignes (colonnes), en conservant une liste des positions y que le joueur pourrait atteindre dans cette colonne. La sortie après la dernière colonne est une liste non vide si le joueur peut gagner, ou une liste vide (qui s'imprime comme une simple nouvelle ligne) si le joueur perd.
Explication complète
Intégré variables utilisées dans ce programme:
i == 0
,l == []
,s == " "
.L'
-r
indicateur met une liste des lignes d'entrée dansg
.FcZg{...}
zipsg
et boucles sur chaque colonnec
. (UnaryZ
, lorsqu'il est appliqué à une liste d'itérables, agit comme Pythonzip(*g)
, transposant proprement un tableau 2D.) Notez que cec
sera une liste, pas une chaîne.À l'intérieur de la boucle de colonne, nous réinitialisons
y
la liste vide enY
cliquantl
.Fxi
bouclei
. Dans les versions ultérieures,i
sera une liste des coordonnées y que le joueur a pu atteindre dans la colonne précédente. La première fois, nous voulons commencer par juste0
(coin supérieur gauche). La variable est préinitialisée en un scalaire0
, pas en une liste[0]
, mais Pip l'itère très bien de toute façon.Pour chacune des positions valides dans la dernière colonne,
Ic@xQs
vérifie s'il y a un espace à cette position dans la colonne actuelle. Sinon, le joueur vient de se heurter à un mur et nous essayons la prochaine possibilité. Si c'est le cas, nous voulons trouver les positions auxquelles le joueur tombera dans cette colonne pour chaque direction de gravité, et les ajouter à la liste eny
utilisant l' opérateurP
ushB
ack.La gravité monte (à gauche, dans la version transposée):
Gravité descendante (à droite, dans la version transposée):
Si le joueur tombe de la grille dans une direction particulière, l'
@?
opération respective ne trouvera pas de#
et donnera zéro. Ce n'est pas un index valide et générera des avertissements lors de la prochaine itération - qui, cependant, ne seront pas visibles sans l'-w
indicateur. Pour nos besoins, ces cas sont essentiellement éliminés de la considération.Après la boucle interne,
i:UQy
prend la listey
des positions que nous avons construites, élimine les doublons et l'assigne ài
. (L'élimination des doublons est nécessaire car sinon la liste des bulles exponentiellement.) Nous passons ensuite à la colonne suivante. Lorsque nous avons parcouru toutes les colonnes, s'il y avait un chemin valide, il yi
aura une liste non vide de positions (véridique); sinon, ce sera une liste vide (falsey).la source