Le puzzle
- Imprimer 0 si un labyrinthe n * m ne peut pas être résolu
- Imprimer 1 si un labyrinthe n * m peut être résolu (de 1 ou plusieurs façons)
(donc je ne demande pas de chemins mais s'il est possible de les résoudre !!!)
Tableau d'entrée (2d):
[[0,0,0,0,0,0,1],[0,0,0,0,0,1,0],[0,0,0,0,1,0,0],[1,0,0,0,0,0,0]]
XXXXXXXXX
XS XX
X X X
X X X
XX FX
XXXXXXXXX
0 = can pass through
1 = can not pass trough
[0][n] is the last block of the first line
[m][0] is the first block of the last line
Règle La position de départ est 0,0 et la position de fin est n, m Vous ne pouvez vous déplacer qu'horizontalement et verticalement Les gains de code les plus courts
Réponses:
CJam,
4241393635 octetsBasé sur les idées de cette réponse .
4 octets grâce à l'Optimizer.
Format d'entrée:
la source
q2Wts~_s,{{[{_2$+0<{e<_}*}*]}%z}*sW=
- 36. Bien qu'il suppose que les trois premiers caractères de l'entrée seront[[0
Dyalog APL, 27 caractères
⊃⌽∨.∧⍨⍣≡1≥+/¨|∘.-⍨,(~×⍳∘⍴)⎕
⎕
entrée évaluée. APL fait la distinction entre une matrice et un vecteur de vecteurs. Ce programme suppose que l'entrée est une matrice.(~×⍳∘⍴)A
est un fork équivalent à(~A) × ⍳⍴A
. Il faut éviter de mentionner⎕
deux fois ou d'introduire une variable.⍴A
est la forme deA
. Pour une matrice 4 x 7, la forme est4 7
.⍳
est le générateur d'index.⍳4
est1 2 3 4
.⍳4 7
est les vecteurs(1 1)(1 2)...(4 7)
disposés dans une matrice 4 x 7.~A
retourne les morceaux deA
.×
en multipliant⍳⍴A
par les bits inversés, nous préservons les coordonnées de toutes les cellules libres et transformons tous les murs en0 0
.,
défile la matrice de paires de coordonnées, c'est-à-dire la linéarise en un vecteur. Dans ce cas, le vecteur sera composé de paires.∘.-⍨A
ouA∘.-A
soustrait des éléments deA
paire. Notez qu'ici les éléments deA
sont eux-mêmes des paires.|
valeur absolue+/¨
additionner chaque paire de valeurs absolues. Cela nous donne les distances de grille entre chaque paire de cellules dans le labyrinthe, à l'exception des murs.1≥
nous ne sommes intéressés que par des voisins à une distance ne dépassant pas 1, cela exclut également les murs. Nous avons maintenant une matrice d'adjacence de graphe.∨.∧⍨⍣≡
Floyd - L'algorithme de fermeture transitive de Warshall(f⍣n)A
(non utilisé ici) oùn
est un entier est l'opérateur de puissance. Il appliquef
àA
n
temps:f f ... f A
.(f⍣g)A
oùg
est une fonction, est l'opérateur à virgule fixe, alias "limite de puissance". Il continue à calculer la sérieA
,f A
,f f A
, ... jusqu'à ce que le((f⍣i)A) g ((f⍣(i+1))A)
rendement vrai pour certainsi
. Dans ce cas, nous utilisons match (≡
) asg
.∨.∧⍨A
ouA∨.∧A
est une étape dans l'algorithme de Floyd.f.g
est une généralisation de la multiplication matricielle (+.×
), nous utilisons ici la conjonction (∧
) et la disjonction (∨
) à la place de+
et×
.⊃⌽
Après⍣≡
avoir appliqué l'étape suffisamment de fois et atteint un état stable, nous devons rechercher le coin supérieur droit de la matrice pour obtenir le résultat.Nous le retournons donc (⌽
) et prenons le premier élément supérieur gauche (⊃
).Visualisation des
⍣≡
étapes dela source
Python, 164 octets
J'étais réticent à poster ceci parce que c'est pratiquement la façon dont je fais normalement le remplissage des inondations, juste un peu au golf. Mais le voici quand même.
la source
Perl, 73 octets
69 octets de code + 4 octets pour
-n0E
(je ne sais pas comment les balises ont été comptées en 2014, donc je les ai comptées pour 4 au lieu de 2, mais cela n'a pas beaucoup d'importance).Essayez-le en ligne! (et si vous remplacez la
1111011
ligne par1111111
, le labyrinthe n'est plus résoluble et la sortie sera à la0
place de1
: Essayez-le en ligne! )Explications:
Ce code trouvera toutes les cellules accessibles du labyrinthe (et les marquera avec un
A
): si une cellule touche une cellule marquée avec unA
, elle est accessible et nous la marquons avec unA
aussi; et nous recommençons (redo
). Cela se fait grâce à deux expressions régulières:s/(^0|A)(.{@{+}})?0/A$2A/s
vérifie si un espace est à droite ou en bas de aA
, tandis ques/0(.{@{+}})?A/A$1A/s
vérifie si un espace est à gauche ou en haut de aA
. À la fin, si la dernière cellule contient un,A
il est accessible, sinon ce n'est pas le cas (c'est ce quisay/A$/+0
vérifie; le+0
est là pour s'assurer que le résultat sera0
ou1
au lieu d' une chaîne vide et1
).Notez que
/.*/
correspondra à une ligne entière, définissant ainsi@+
à l'index de la fin de la première ligne, qui se trouve être la taille d'une ligne, ce qui permet à use.{@{+}}
de correspondre exactement à autant de caractères qu'il y en a sur une ligne. (@{+}
est équivalent à@+
, mais seul le premier peut être utilisé dans l'expression régulière)la source
1
.Ruby,
133130129 caractèresEntrée sur STDIN, sorties
1
ou0
sur STDOUT.Longtemps ennuyeux. Il effectue simplement un remplissage de
1
s de(0, 0)
, puis vérifie si le carré "de fin" est un1
.la source
Java, 418 octets
Mon premier golf de code. Je ne sais pas pourquoi j'ai choisi Java - c'est si mauvais pour le golf xD
Exemple de labyrinthe serait entré via stdin comme ceci:
la source
String[]
eta
, et prenez les entrées des arguments de ligne de commande plutôt que StdIn, ce qui est autorisé.Python 184
188Cela a pris beaucoup plus de temps que je ne le pensais :( Quoi qu'il en soit, j'ajouterai une explication une fois que je ne pourrai plus jouer au golf.
la source
J, 75 caractères
Alimentation de la matrice d'adjacence (très temps et mémoire inefficaces). (Est-ce que cela s'appelle pouvoir en anglais?)
Quelques cas de test:
la source
Python 3 , 147 octets
Essayez-le en ligne!
Port de ma réponse à Trouver l'itinéraire le plus court sur une route ASCII .
la source
Python 3 , 184 octets
Essayez-le en ligne!
la source