Merci à cette question pour une certaine inspiration
Dans ce défi, nous représenterons une ligne de dominos sous la forme d'une chaîne de |
, /
et \
. Vous recevrez une chaîne de dominos en entrée et vous devez déterminer à quoi ils ressemblent lorsqu'ils se sont installés. Voici les règles de chute des dominos
Un domino debout
|
, à gauche d'un domino tombé à gauche\
, deviendra également un domino tombé à gauche.Un domino debout
|
, à droite d'un domino tombé à droite/
, deviendra également un domino tombé à droite.Si un domino debout se trouve entre un domino tombé à gauche
\
et un/
domino tombé à droite , il restera debout.
Ces règles sont appliquées à plusieurs reprises jusqu'à ce que l'arrangement ne change plus.
Voici un exemple de la façon dont une seule entrée peut arriver à sa conclusion
|||||||\/|||||||\||\|||/||||||\|||||
||||||\\//|||||\\|\\|||//||||\\|||||
|||||\\\///|||\\\\\\|||///||\\\|||||
||||\\\\////|\\\\\\\|||////\\\\|||||
|||\\\\\////|\\\\\\\|||////\\\\|||||
||\\\\\\////|\\\\\\\|||////\\\\|||||
|\\\\\\\////|\\\\\\\|||////\\\\|||||
\\\\\\\\////|\\\\\\\|||////\\\\|||||
Votre tâche consiste à écrire du code qui trouve et génère le résultat final d'une entrée. Vous pouvez supposer que l'entrée est toujours valide et contient au moins 2 caractères.
Il s'agit de code-golf, donc les réponses seront notées en octets, moins d'octets seront meilleurs.
Cas de test
|||/|||| -> |||/////
|||\|||| -> \\\\||||
|/||||\| -> |///\\\|
||/|||\| -> ||//|\\|
||\|||/| -> \\\|||//
la source
Réponses:
Rétine , 32 octets
Essayez-le en ligne!
Explication
Le
+
indique à Retina d'exécuter le remplacement dans une boucle jusqu'à ce qu'il ne parvienne pas à changer la chaîne. Chaque remplacement calcule une étape les dominos tombants. Le remplacement lui-même est en réalité trois remplacements en un, mais cela garantit qu'ils se produisent simultanément:Cela correspond juste
/|\
(ainsi que/\\
et/\\
, mais cela n'a pas d'importance) et le réinsère inchangé. Le but de ceci est de sauter|
avec des dominos tombés des deux côtés, car cela est plus court que d'exclure ces cas avec des contournements séparés dans les deux autres cas.Cela correspond
/|
et le transforme en//
.Cela correspond
|\
et le transforme en\\
.la source
$1$2$2$3$3
pour battre les langues du golf.Python 2 ,
1151141111089895 octets-1 octet grâce aux ovs
Essayez-le en ligne!
la source
b=0;
et remplacer les occurrences deb
byid
pour économiser deux octets!V , 23 octets
Essayez-le en ligne!
Vraiment, c'est très similaire à la réponse de la rétine, juste qu'elle semble plus moche. Utilise la compression regex.
Hexdump:
Explication:
ò
indique à V de s'exécuter jusqu'à ce que la chaîne ne change pas. Le reste est une expression rationnelle compressée. Convertissons-le en équivalent vim ...la source
SNOBOL4 (CSNOBOL4) ,
117115112111 octetsEssayez-le en ligne!
Mention de la réponse de Rod en python pour l'idée de la condition d'arrêt avec une deuxième variable pour voir les changements plutôt que de tester
D '/|' | '|\'
.la source
Haskell ,
114107 octetsEssayez-le en ligne! La première ligne définit une fonction anonyme.
Explication:
until=<<((==)=<<)$g
est une fonction de point fixe (voir ici pour une explication) qui applique la fonctiong
à la chaîne d'entrée jusqu'à ce que le résultat ne change plus.zip3('|':s)s(tail s++"|")
crée pour chaque domino, c'est-à-dire le caractère de la chaînes
, un triple avec le domino pré- et suivant, le rembourrage avec|
sur les bords. Par exemple,/\|
devient[(|,/,\),(/,\,|),(\,|,|)]
(en ignorant la fuite).t
est appliquée à chacun des triplets pour calculer la nouvelle position de la pièce centrale du triplet.la source
Perl 5 , 39 + 1 (
-p
) = 40 octetsEssayez-le en ligne!
la source
Prolog (SWI) , 132 octets
Essayez-le en ligne!
Ce programme définit un prédicat
+/2
qui est vrai si le deuxième argument est la version réglée du premier. Les deux arguments sont des listes de codes de caractères.Explication
Cette solution utilise un DCG pour déterminer quelle est l'étape suivante, puis calcule à plusieurs reprises l'étape suivante jusqu'à ce que l'étape suivante soit la même que l'étape en cours.
Le DCG
Ces cinq lignes de code définissent une règle DCG (Definite Clause Grammar)
+
utilisée dans le programme pour calculer une seule étape de basculement des dominos. Les DCG dans Prolog fonctionnent en trouvant le premier cas de la règle dont le côté droit correspond à la chaîne et en déterminant l'argument de la règle du côté gauche à travers ce processus. Si un cas ne correspond pas, il reviendra en arrière et tentera un cas plus tard.Cette ligne représente le cas de base du
+
règle. Il indique simplement que s'il n'y a pas de dominos actuellement, à l'étape suivante, il n'y aura toujours pas de dominos.Depuis que ce programme traite exclusivement des listes de codes de caractères , il est important de noter que les codes de caractères pour
/
,\
et|
sont 47, 92 et 124 respectivement. Ce cas de la+
règle gère le/|\
chaîne.Cet étui gère un domino tombant à droite renversant le domino à sa droite. Puisqu'il vient après le cas pour la manipulation
/|\
il ne sera pas utilisé pour cette possibilité.Gère le boîtier pour un domino tombant à gauche renversant le domino à sa gauche.
C'est le cas des caractères génériques. Étant donné que rien d'autre ne change en dehors de ce qui est décrit ci-dessus, tant qu'il reste du texte dans la chaîne d'entrée, il le copiera simplement vers la sortie tant qu'il ne correspond à aucun des cas ci-dessus.
Le prédicat
Le prédicat principal prend deux arguments, le premier est la configuration initiale des dominos, le second les dominos installés. Comme il s'agit de Prolog, le second peut être indéterminé et le programme le calculera. Le prédicat en soi est assez simple
+(N,X,[])
appelle le DCG et calcule la prochaine étape des dominos qui le stockentN
.(X=N,Y=N;N+Y)
vérifie si la prochaine étape des dominos est la même que l'actuelle et si elle l'est,Y
car les dominos doivent s'être installés et si ce n'est pas le cas, elle se reproduit, en appelant le même prédicat à l'étape suivante des dominosN
au lieu deX
.la source
APL (Dyalog) , 36 octets
Essayez-le en ligne!
-3 en partie grâce à Cows Quack .
Se sent si non golfé ... :(
la source
face , 166 octets
Prend l'entrée en tant qu'argument de ligne de commande et renvoie à STDOUT. Cela ne fonctionne que dans le commit 86494f6 et au-delà en raison d'un bug corrigé dans ce commit.
Enveloppé pour l'esthétique:
Et non golfé / commenté:
Il y a quelques astuces subtiles ici qui rasent quelques octets supplémentaires, tels que
la dénomination des variables | et /, dont les valeurs ASCII sont accessibles via l'introspection plus loin dans le code
le
'|
sur la première ligne de la boucle principale, qui y est appelée au lieu de sur la deuxième ligne afin de définir le | pointeur à utiliser dans la deuxième section de la boucle principalela source
Perl 5 , 52 + 1 (-p) = 53 octets
-6 octets grâce à mik
Probablement pas le meilleur possible pour Perl, mais c'est ce que j'ai pu trouver.
Explication
Essayez-le en ligne!
la source
-p
au lieu d'-a
éliminer le besoin deprint;
; utiliserwhile
comme suffixe pour une expression fictive (par exemple0
) permettra d'économiser encore 2 octetsPerl 5 , 44 (code) + 1 (
-p
) = 45 octetsEssayez-le en ligne!
Explication
la source
Nettoyer , 98 octets
Essayez-le en ligne!
la source
Rubis , 83 octets
Techniquement cheatable avec
9.times
, ou même juste999.times
mais je n'ai pas envie d'être bon marché :)Possède toujours un énorme potentiel de golf. (Remarque:
y while undone
est beaucoup plus long quex.size.times
)Essayez-le en ligne!
la source
R , 114 octets
Essayez-le en ligne!
Renvoie une chaîne d'échappement.
la source
C (gcc) , 183 octets
Essayez-le en ligne!
la source