Récemment, il y a eu quelques défis de serpent de compagnie ASCII (par exemple ici )
0 0
0 0 0 000
00 0 00 000 0 0
000 0 0 0 00
0 000
Ce défi consiste à prendre un serpent de compagnie horizontal généré aléatoirement (hauteur de cinq lignes, longueur de 30) et vérifier que:
- Chaque colonne n'en a qu'une
0
- Chacun
0
est "connecté" à l'0
avant et à la suite (espacés verticalement de 0 ou 1 ligne uniquement)
La sortie finale peut être true
ou 1
si le serpent est valide, ou false
ou 0
si le serpent n'est pas valide
Modifier — Clarification
Supposons l'entrée:
- Est une chaîne
- Contient uniquement '', '0' et '\ n'
- A exactement 30 caractères par ligne
- A exactement 5 lignes
C'est à dire vérifier si le serpent est connecté, et qu'il n'y a pas de caractères errants. Pas besoin de valider la "toile" sur laquelle le serpent est imprimé.
code-golf
ascii-art
decision-problem
Mirror318
la source
la source
truthy/falsey
plutôt quetrue/false
?Réponses:
JavaScript (ES2018),
6254 octetsL'entrée est une chaîne unique:
Flag
s
signifie qu'un point correspond à n'importe quoi (y compris '\ n'). Cette fonctionnalité est actuellement prise en charge par Chrome 63+, Opera 50+, Safari 11.1+, basé sur compat-table . Vous pouvez tester cette fonction avec ces navigateurs pris en charge. Vous obtiendrez une exception lors du chargement de la page si votre navigateur ne prend pas en charge cette fonctionnalité.Comment ça marche:
0
:/( .{30}){4} /
0
s dans une colonne:/0.{30}(.{31})*0/
0
pas se connecter à ses voisins:/0.{60}(.{31})*0/
,/0.{62}(.{31})*0/
Fusionnez tous ces regex, et vous obtiendrez enfin celui-ci.
Afficher l'extrait de code
Merci à Martin Ender de souligner que faire un seul
!
opérateur peut économiser 8 octets.la source
SnakeEx , 51 octets
C'est évidemment le bon langage pour la tâche. : ^ D
Correspond à l'entrée entière s'il s'agit d'un serpent valide; ne correspond pas si ce n'est pas le cas. Essayez-le ici!
Explication
SnakeEx est un langage de correspondance de motifs 2D . Un programme se compose d'une liste de définitions de «serpents», qui rampent autour des caractères correspondants en entrée, changent de direction et engendrent d'autres serpents. Dans notre programme, nous définissons deux serpents,
s
etc
.Nous allons commencer par
c
parce que c'est plus simple. Sa définition est0 *$
, ce qui devrait être assez lisible si vous connaissez regex: match0
, suivi de zéro ou plusieurs espaces, suivi du bord de la grille. Le principal hic ici: cet appariement peut se faire dans n'importe quelle direction. Nous allons utiliser à lac
fois vers le haut et vers le bas à partir du serpent, pour vérifier qu'il n'y a pas de supplément0
s dans chaque colonne.Maintenant pour le serpent principal,
s
. Il prend la forme(...)%{30}
, ce qui signifie «faire correspondre le contenu des parenthèses 30 fois» - une fois pour chacune0
chez le serpent. Jusqu'ici tout va bien. Qu'y a-t-il entre les parenthèses?Cela engendre un nouveau
c
serpent, tourné à gauche de 90 degrés. La direction est relative à las
direction du serpent, donc le nouveau serpent se déplace vers le haut de la grille (le serpent principal se déplace vers la droite). Lec
serpent vérifie que la cellule de grille actuelle est un0
et que chaque cellule au-dessus est un espace. S'il échoue, la correspondance entière échoue. S'il réussit, nous continuons avecqui fait la même chose, seulement tourné à droite (vers le bas de la grille).
Notez que ces apparitions n'affectent pas la position du pointeur de correspondance dans le serpent principal. Ils sont un peu comme des lookaheads en regex. (Peut-être que nous pourrions les appeler ici "lookbesides"?) Donc, après avoir vérifié que nous pointons sur un
0
et que le reste de la colonne ne contient que des espaces, nous devons réellement faire correspondre le0
:Maintenant, le pointeur de correspondance se trouve sur le caractère à droite de la
0
. Nous devons vérifier trois options différentes: le serpent s'incline vers le bas, le serpent s'incline vers le haut ou le serpent va droit. Pour cela, nous pouvons utiliser une expression OR:À l'intérieur de notre salle d'opération, nous avons trois possibilités:
Tournez à droite, faites correspondre un espace et tournez à gauche à nouveau (angles de serpent vers le bas).
Tournez à gauche, faites correspondre un espace et tournez à nouveau à droite (angles de serpent vers le haut).
Faites correspondre zéro ou un trait de soulignement. Puisqu'il n'y a pas de soulignement dans l'entrée, ce sera toujours une correspondance vide (le serpent va droit).
Après avoir correspondu à l'une des trois options ci-dessus, le pointeur de correspondance doit pointer vers
0
dans la colonne suivante, prêt à correspondre à nouveau à l'expression entre parenthèses.la source
CJam ,
3534 octetsEssayez-le en ligne! L'entrée est un tableau rectangulaire de tableaux de caractères. Suppose que l'entrée ne contient
et
0
.Explication:
la source
05AB1E , 18 octets
Essayez-le en ligne!
Explication
la source
Husk , 12 octets
Selon les clarifications des règles, peut être de 11 octets ou 13 octets .
Essayez-le en ligne!
L'entrée est une liste de lignes contenant uniquement des espaces et des 0; si une seule chaîne est requise, ajoutez-la
¶
au programme pour la diviser en lignes. Le lien TIO le fait déjà pour plus de clarté. La sortie est 0 ou 1; si des valeurs fausses et véridiques sont correctes,±
peuvent être supprimées.Explication
L'idée est d'utiliser
×≈
pour garantir que (a) toutes les colonnes contiennent précisément un 0, et (b) leurs positions diffèrent d'au plus un. À titre d'exemple, considérons l'entrée à 8 colonnesTout d'abord, le
mηfT
transforme en liste de listes d'indexẊ×≈
Donne ensuiteChacun
1
correspond à une paire d'indices qui diffèrent d'au plus 1, et chacun0
correspond à une paire qui ne le fait pas. Chaque résultat est égal[1]
précisément lorsque les deux listes ont un indice et que les indices diffèrent d'au plus 1.la source
Python 2 , 71 octets
Essayez-le en ligne!
Prend l'entrée comme une chaîne multiligne. Cas de test de Bubbler .
La première colonne est extraite en tant que
s[::31]
et la seconde en tant ques[1::31]
, et leur validité est vérifiée. Nous recurse surs
suppression du premier caractère, provoquant la vérification des paires de colonnes successives.La vérification pour deux colonnes utilise le chaînage de comparaison de Python pour
in
combiner plusieurs vérifications:'0'in s[::31]
vérifie que la première colonne a au moins un0
s[::31]in' %s '%s[1::31]
vérifie que la première colonne est une sous-chaîne des sandwichs de la deuxième colonne entre deux espaces, ce qui garantit que la position de la0
a décalé au plus d'un espace' %s '%s[1::31]in'%6s'%0*2
vérifie que la deuxième colonne en contient au plus un0
.La fin
*f(s[1:])
force également le cas récursif à être vrai.la source
C (gcc) ,
246245232215212 octetsEssayez-le en ligne!
Je pensais que j'apporterais ma langue préférée à cela (même si comme je peux le voir dans les nombreuses autres entrées plus petites, c'est probablement loin d'être idéal pour ce genre de défi) et C ce que je pourrais gérer. L'approche du programme au problème est relativement simple, juste avec beaucoup de pincement de penny d'octet; il prend le serpent sur stdin et donne son résultat dans la valeur de retour de main (donc le code de sortie;
comme demandé dans le problème 0 indique un serpent invalide et 1 valide même si pour un code de sortie qui est bizarrecomme pour les codes de sortie, 0 est un serpent valide et 1 est un serpent invalide). Avec les macros étendues et de beaux espaces, cela ressemble plus à ce qui suit:Les lignes d'entrée sont lues dans la première ligne de la mémoire tampon, les cinq suivantes servent à suivre les endroits qui doivent (lire: doivent) avoir des zéros dans la ligne après chaque courant, et le dernier est pour suivre si un zéro a déjà été lu dans une colonne donnée, dans une ligne. Le programme traite tour à tour chaque ligne.
Ce n'est pas du tout robuste (ce
gets()
n'est que le début) et l'entrée doit contenir tous les espaces pertinents (pas d'espace blanc de fin laissé par exemple), et gcc émet des avertissements et des notes sur la fonctionnalité stdlib laissés implicitement déclarés et ainsi de suite, mais, C la vie.Il suppose également que la tête de serpent n'a pas besoin d'être dans la ligne centrale et qu'un serpent valide doit avoir au moins un zéro dans chaque ligne (c'est-à-dire aucune ligne de tous les espaces dans les 5 lignes d'entrée). Si ce dernier n'est pas une exigence, il peut être un peu plus court - tout ce qui concerne
k
etl
dans le programme peut être analysé ou remplacé par moins d'octets de code dans ce cas.Merci à l'utilisateur 202729 pour env. 26 octets enregistrés.
la source
#define F
et)
pour -1 octet.\n
(10),<space>
(32) et0
(48), vous pouvez vérifier==48
avec>47
(-1 octet). / Vous pouvez supprimer l'={0}
initialisationb
lorsque la variable est globale. De même fairek
globale eti
un (typées ->int
) paramètremain
(à la place de ceargc
qui est1
).i
comme leargc
génie). Les premières versions de ce document dépassaient largement les 400 octets; il m'a fallu assez de temps pour le ramener à mes objectifs personnels de 300 puis 256, donc il pourrait bien y avoir plus de façons de le réduire, je l'ai manqué.k
,j
etl
tous les globaux pour économiser sur lesint
déclarations séparées , puis réalisé que les valeurs par défaut me permettraient de laisser le type complètement. Merci encore!MATL ,
1817 octetsL'entrée est un tableau de caractères 2D. Tout caractère non spatial peut être utilisé pour le serpent.
Essayez-le en ligne!
Explication
la source
un30=
pour vérifier que tous les indices de colonne sont différents et qu'aucune des 30 colonnes n'est vide. Je peux peut-être tester cela plus directement, mais je ne vois pas commentSlip , 28 octets
Testez-le ici.
la source
Gelée , 19 octets
Essayez-le en ligne!
-2 octets grâce à M. Xcoder
Explication
L'entrée est une liste de chaînes
la source
Gelée , (14? *) 13 octets
Un lien monadique prenant une liste de cinq chaînes *, chacune de longueur 30 composée d'espaces et de tout autre caractère (par exemple
0
s), et retournant un entier (1 si un serpent tel que défini, 0 sinon)* Si l'entrée doit être une seule chaîne (liste de caractères), ajoutez un
Ỵ
pour séparer la chaîne au niveau des sauts de ligne.Essayez-le en ligne!
Comment?
la source
Stax , 20 octets CP437
24 octets une fois déballés,
Exécutez et déboguez en ligne!
Ce n'est peut-être pas le meilleur golfeur mais je pense que la méthode est nouvelle et intéressante.
Explication
la source
J ,
38, 3730 octets-8 octets grâce à FrownyFrog
Essayez-le en ligne!
la source
[:(-:*)2-/\
-vous, vérifiez si toutes les différences sont -1, 0 ou 1.[:(#@{.=[:(-:*)2-/\])@:I.'0'=|:
[:($e.~[:(-:*)2-/\])@:I.'0'=|:
Gelée , 16 octets
Essayez-le en ligne!
Suppose que la chaîne d'entrée ne contiendra toujours que des espaces et des zéros. Prend l'entrée comme une liste de chaînes (chacune représentant une ligne), et sort 1 si vrai, 0 sinon.
Explication
la source
Python 2 , 141 octets
Essayez-le en ligne!
L'entrée est une grille de caractères.
la source
Python 2 et Python 3 ,
122120119 119 octetsEssayez-le en ligne!
Le format d'entrée est une chaîne de longueur 154 (5 x 30 caractères, 4 sauts de ligne):
Si la tête ne doit pas être la rangée centrale
L'exigence de la ligne centrale était dans le défi d'origine, mais j'ai trouvé que ce n'était pas le cas ici (au moins, ce n'est pas explicitement mentionné).
Python 2 et Python 3 ,
124123 octetsEssayez-le en ligne!
Modifier:
==
) en inégalités pour chaque code.all()
astuce vide de sens dans Py3, a donc fusionné les deux versions.la source
Excel (VBA), 68 octets
Utilisation de la fenêtre immédiate,
Cell[A6]
en sortie.la source
Escargots , 18 octets
Essayez-le en ligne!
la source
Grime ,
302623 octetsMerci à Zgarb pour avoir économisé 7 octets et signalé un bug.
Essayez-le en ligne!
la source
Rubis , 93 octets
Essayez-le en ligne!
la source
JavaScript (Node.js) ,
128126 octetsModifié après clarification de l'entrée indiquant que l'entrée est "une chaîne".
Essayez-le en ligne!
la source
Python 3 ,
197185 octetsDans l'invite de commande do
verify.py<snake.txt
ou dans bash docat snake.txt | python verify.py
. Où sesnake.txt
trouve un fichier contenant un serpent à vérifier.Si le serpent est correct, rien ne sera émis. S'il n'est pas correct, Python déclenchera une erreur d'index.
la source