Une forme est chirale si aucune rotation ne peut lui donner l’image miroir. Dans ce puzzle, nous allons écrire des programmes informatiques chiraux.
Pour ce casse-tête, nous allons considérer un programme comme une matrice rectangulaire de caractères. En tant que telles, toutes les solutions à ce défi doivent être rectangulaires (c’est-à-dire que toutes les lignes doivent être de la même longueur). Nous pouvons effectuer une rotation de ces programmes par incréments d'un quart de tour. Par exemple le programme
The quickish fish
lept deftly
rightwards
Lorsque tourné d'un quart de tour dans le sens des aiguilles d'une montre ressemble à
T
h
r e
i
glq
heu
tpi
wtc
a k
rdi
des
sfh
t
lf
yi
s
h
Nous pouvons également refléter ces programmes. Voici le même programme reflété sur un axe vertical:
hsif hsikciuq ehT
yltfed tpel
sdrawthgir
Un programme chiral est un programme qui, lorsqu'il est pivoté, génère toujours " left
". Cependant, lorsque reflété, produit un programme qui génère " right
" peu importe le nombre de rotations.
Votre tâche est d’écrire un programme chiral avec le moins d’octets possible.
Règles supplémentaires
La sortie n'est pas sensible à la casse mais doit être cohérente. (Par exemple, vous pouvez éditer "
LEFT
" et "rIgHt
" mais ce boîtier doit être cohérent sous les rotations)Les lignes doivent être divisées sur une nouvelle ligne ou une nouvelle ligne et un saut de ligne.
Votre programme doit être un rectangle, vous pouvez le remplir avec des espaces ou des commentaires mais chaque ligne doit avoir la même longueur.
Vous pouvez éventuellement avoir une nouvelle ligne de fin (ou une nouvelle ligne et un saut de ligne) sur tous vos programmes si vous le souhaitez.
la source
:set virtualedit=all
mode de Vim . LaBool
sortie initiale vérifie si l'entrée est égale à sa propre rotation, ce qui simplifie les choses. Le fait de supprimer{-
permet d’imprimer l’entrée réfléchie.Réponses:
Pascal (FPC) ,
2161755349 octetsEssayer à gauche
Essayer juste
@tsh m'a motivé à réessayer quand j'ai vu son programme (en commentaire) et le voici!
Précédent avec 755 octets:
Essayer à gauche
Essayer juste
Si vous avez vu ma soumission précédente, oubliez-la :)
Toutes les rotations des programmes gauche et droit sont identiques.
la source
Klein (000) ,
10987 octetsEssayez-le en ligne!
Devrait être possible d'obtenir une version plus courte de cette réponse, alors bonne chance!
Cette réponse est inspirée par des spirales. En particulier, l'idée est deux spirales imbriquées, une pour la gauche et une pour la droite. Il a une double symétrie, nous pouvons donc vérifier les programmes suivants pour savoir si cela fonctionne:
Quart de tour
Essayez-le en ligne!
En miroir
Essayez-le en ligne!
Miroir et quart de tour
Essayez-le en ligne!
la source
Klein (000) ,
27 à25 octetsEssayez-le en ligne! Tourné une fois! Tourné deux fois! Tourné trois fois!
Et retourné: essayez-le en ligne! Tourné une fois! Tourné deux fois! Tourné trois fois!
Le seul qui m'a donné un peu de peine est l'inversion et la rotation, qui ressemble à:
Ceci est la seule raison pour les deux ensembles de
((
.la source
Klein (211) , 37 octets
Cela a un programme différent pour chaque rotation.
Explication
Notez que chacun de ces programmes est ajouté à un carré avec no-ops avant exécution
Pas de changement
Essayez-le en ligne!
!
fait sauter l'exécution par dessus\
,"left"@
charge la chaîne"left"
dans la pile et termine le programme imprimant la pileQuart de tour
Essayez-le en ligne!
L'exécution se déroule dans le coin supérieur droit du carré, continue dans le coin inférieur gauche et
!\"left"@
imprime à nouveau"left
.Demi tour
Essayez-le en ligne!
Ici, le chemin d'exécution sort par le côté nord, rentre par le côté ouest, ressort par l'est avant d'entrer dans le sud.
\
fait rebondir le chemin"left"@
pour l’imprimer.Trois quarts de tour
Essayez-le en ligne
L'exécution sort du coin supérieur droit, puis rentre en bas à gauche. Une fois encore, les miroirs
/\
redirigent le chemin"left"@
pour l’imprimer.Réflexion
Ceci est essentiellement le même que pour gauche dans toutes les rotations.
la source
JavaScript (Node.js) ,
1481599505461341305271 octetsEn miroir
Essayez-le en ligne!
(Veuillez consulter le lien TIO pour tous les cas de test, y compris la version en miroir)
Bien que plus golfé, taille
22x22 -> 21x21
à crédit de @JoKing!Taille
38x3824x2422x2221x2118x1817x1716x16, symétrie 4 fois.Voici une question - est-il possible d'avoir 15x15 ou plus petit pour JS? Il me semble qu’il me faut au moins le séparateur de commentaires entre deux sous-blocs et au bord, donc au moins 7 + 2 + 2 + 5 = 16 lignes?
la source
Toile ,
1098971 octetsEssayez-le ici | Essayez inversé! Ce sont les deux seuls programmes possibles, car le programme est symétrique par rotation.
Fabriqué en cela .
la source
Gol> <> , 23 octets
Essayez-le en ligne!
C'est le même format que ma réponse de Klein , mais 2 octets plus court. Peut-être existe-t-il un autre langage 2D permettant de jouer au golf sur ces 2 derniers octets ... Mais pour l'instant, c'est aussi court que possible.
la source
Alice , 25 octets
Gauche: normal , 1/4 de tour dans le sens horaire , 1/2 tour , 1/4 de tour dans le sens anti-horaire
À droite: l' image sur l' axe horizontal , diagonal droite , axe vertical , diagonal en haut à droite
Explication
Ce programme comporte trois parties. La première partie est les trois
{
et une}
sur les coins. Le{
tour de la gauche IP jusqu'à ce qu'il atteigne le}
, à quel point il tourne à droite. Dans la version reflétée, l'adresse IP suit la ligne du haut du programme d'origine. Dans la version originale, en tournant à droite, vous frappez immédiatement la partie adjacente{
, en indiquant l’adresse IP le long de la dernière ligne du programme original.Viennent ensuite les deux barres obliques dans la deuxième colonne. Si le programme est orienté horizontalement, l'un ou l'autre type de barre oblique changerait simplement en mode ordinal, envoyant l'adresse IP dans la même direction gauche / droite que celle déjà suivie. Si le programme est orienté verticalement, l'IP rebondit beaucoup plus, mais le fait de les rendre obliques donne le même résultat final. (Deux barres obliques inverses donneraient le résultat opposé et une de chacune créerait une boucle infinie.)
Le reste du programme est simple. L'IP en mode ordinal rebondit en diagonale. Par conséquent, l'un
"left"o@
ou l' autre"right"o@
sera exécuté en fonction de la manière dont cette section a été entrée.la source
Hexagonie , 98 octets
Essayez-le en ligne! | Tourné à 90 ° | Tourné à 180 ° | Tourné à 270 °
inversé | Tourné à 90 ° & inversé | Tourné à 180 ° et inversé | Tourné à 270 ° et inversé
Hexagony était assez amusant pour ce défi, car une rotation ou un renversement peut changer radicalement le programme actuel. Chaque rotation / inversion est son propre programme. Certains chemins d’exécution de programme sont beaucoup plus intéressants que d’autres.
Je conviens que cela a pris plus de temps que prévu. Je suis à peu près sûr qu'une réponse plus courte peut être faite en hexagone, alors bonne chance!
la source
Ruby , 131 octets
Essayez-le en ligne!
la source
APL (dzaima / APL) , 181 octets
Le programme a une symétrie de rotation, de sorte que seuls deux cas doivent être vérifiés
La gauche
Essayez-le en ligne!
Droite
Essayez-le en ligne!
Explication
C'est mon premier programme APL, donc c'est assez simple. Il utilise seulement un truc que je trouve intéressant.
Si nous commençons par éliminer tous les commentaires, nous obtenons les programmes suivants
La gauche
Droite
À partir du programme de gauche, nous faisons trois choses.
Assigner
'lef'
à la variablet
Imprimer la variable
t
et la lettre't'
Assigner
'righ'
à la variablet
Maintenant, parce que c'est le miroir, le bon programme fait ces trois étapes, mais dans l'ordre inverse. Cela signifie que nous imprimons
'left'
pour le programme de gauche et'right'
pour le programme de droite.L’un des trucs ici est qu’il
't'
s’agit en réalité d’une copie tournée du code. Si vous regardez la troisième colonne de notre code, vous verrez que c'est le cas't'
. Nous réutilisons cela't'
dans les versions alternées pour ajouter cet
qui est nécessaire.la source
Haskell ,
461379 octets82 octets enregistrés par Ørjan Johansen
Essayez-le en ligne!
Comme celui-ci présente une symétrie quadruple, il vous suffit de tester le miroir:
Essayez-le en ligne!
C'est un début. C'est loin d'être idéal, mais il y a quelques choses intéressantes qui se passent ici. Haskell est certainement une langue intéressante pour ce défi. J'attends avec impatience une réponse qui bat cette idée, que ce soit la mienne ou celle de quelqu'un d'autre.
la source
Prolog (SWI) ,
649188 octetsUnflipped, Unrotated
Essayez-le en ligne!
Non retourné, tourné
Essayez-le en ligne!
Retourné, non tourné
Essayez-le en ligne!
Retourné, tourné
Essayez-le en ligne!
la source
Prolog (SWI) ,
239223209181 octetsEssayez-le en ligne!
Comme le programme a 4 symétries, il vous suffit de vérifier le miroir:
Essayez-le en ligne!
la source
Python 2 , 209 octets (14 x 14)
Normal (à gauche):
Essayez-le en ligne!
Reflété (à droite):
Essayez-le en ligne!
la source
Propre ,
13311055 octets-276 octets grâce à Ørjan Johansen
Essayez "laissé" en ligne!
Essayez "juste" en ligne!
C'était difficile pour plusieurs raisons:
module <filename>
soit présent au début et que seul le début du fichier. Malheureusement, cela signifie que pour que les rotations du programme en miroir soient valides, elles doivent également figurer au bas du fichier. Pour aggraver cela,module ..
n’est pas valable pour globallet .. in
,where ..
etwith ..
définitions; et le jeton quimodule
apparaît s'il n'a pas été défini provoque une erreur./* /* */
laisse un niveau de commentaire ouvert, et il en va de même/* // */
(ainsi que le commentaire du reste de la ligne).Heureusement, nous pouvons définir
module
comme quelque chose dans une#..
expression (laissez-avant), qui est tout ce dont nous avons besoin. Parce que Clean ne vérifie pas les variantes qui ne sont jamais utilisées (et une variété d’autres choses tout aussi inutilisées), la deuxième définition requise deStart
peut être un déchet complet. Cela nous permet d'utiliser le secondStart
consommer l' en- tête du module au fond du dossier parce que Clean traitem module m
en appelant la fonctionm
surmodule
etm
(qui , depuis que nous avons définimodule
etm
, ne provoque pas une erreur). Peu importe qu’ilm
s’agisse d’une chaîne et non d’une fonction, l’Start
alternative n’est jamais vérifiée.C'est plus facile à voir si vous le regardez à travers les yeux du compilateur:
la source
m
ets
.Brachylog , 341 octets
Essayez-le en ligne!
! enilno ti yrT
Profite de Brachylog en prenant le prédicat principal comme étant celui de la première ligne et ne se souciant pas beaucoup des autres lignes au-delà de l’obligation de les compiler. Non réfléchi, il imprime une chaîne vide suivie de "left" sur la même ligne, et réfléchi, une chaîne vide suivie de "right" sur la même ligne. Je suis tenté de penser qu'il pourrait y avoir un moyen de faire une version (utilement) non-carrée
ṇ
, mais cela pourrait être bien compliqué sans essayer de le faire fonctionner différemment à la réflexion.la source
Ruby , 181 octets
Essayez-le en ligne!
Ceci est un port de la réponse de Curtis Bechtel en Python à Ruby, qui joue au golf un peu plus.
En fait, son programme Python est un polyglotte et tourne également sur Ruby. Ma première réponse fut donc un copier-coller, mais cela me semblait injuste. J'ai donc écrit un script qui génère une nouvelle réponse à partir d'un script de base. Vous pouvez l'essayer ici:
Construit le tien
la source
Lot,
438321 octetsExplanation: A
:
est utilisé pour indiquer une étiquette, qui vaut un commentaire. Par conséquent, comme le programme a une symétrie de rotation, la seule différence entre les deux versions est de savoir laquelle des@
lignes est la première, auquel casleft
ouright
est affiché avant le script. sorties.J'ai essayé de superposer de manière créative les lignes pivotées, mais ma tentative s'est en fait terminée avec une grille plus grande.
Edit: 117 octets sauvegardés grâce à @ ØrjanJohansen.
la source
&rem
par&:
.test.bat
dans l'invite de commande Win10.CMD.EXE
ou quelque chose du genre .05AB1E (hérité) ,
8955 octetsApproche très basique. Les sorties sont en minuscules.
Essayez-le en ligne ou essayez-le en ligne (chaque rotation est la même).
Explication:
Renversé:
Voir ce conseil 05AB1E (section Comment utiliser le dictionnaire? ) Pour comprendre pourquoi
'…¸
est"left"
et'ĩ
est"right"
.la source
q
?(legacy)
version de 05AB1E.Stax , 131 octets
Exécuter et déboguer
C'est la "bonne" variante.
la source
Enchantements runiques , 116 octets
Essayez-le en ligne!
Et inversé
Pas vraiment un port, mais la réponse Klein 000 de Garf Hunter de Post Left est utilisée comme point de départ, étant donné la quasi-compatibilité typique des deux langues (la plupart des commandes sont identiques et l’emballage des bords dans Runic est identique à Klein 000). Le seul problème était que les IP de Klein commençaient toujours par le haut à gauche, contrairement à Runic. En tant que tels, ils
.
font tous partie du code original et sont toujours traités en tant que NOP par Runic, alors que cesont des NOP que je devais ajouter dans le cadre du contrôle du flux.
Imprime
"left"
dans les 4 rotations et en"right"
cas de reflets (et dans les quatre rotations correspondantes). Deux colonnes du milieu étaient complètement inutilisées après mes modifications, j'ai donc pu les supprimer.En théorie, une rotation avec beaucoup d'espaces finaux pourrait être utilisée pour un nombre d'octets inférieur (par exemple, cette variante ), mais les espaces sont nécessaires pour faire pivoter correctement la structure à l'aide d'outils externes et je les ai donc inclus.
Les variantes ci-dessous contiennent les fragments inutilisés qui ont été supprimés, mais sont par ailleurs identiques:
Les quatre gauches . Résultats
leftleftleftleft
(le fait que les quatre puissent être exécutés comme ceci est une coïncidence).Droit 1 , Droit 2 , Droit 3 , Droit 4
la source
Gol> <> , 342 octets
Hou la la! Cela a pris plus de temps que prévu, à mi-parcours, j'ai réalisé que le reflet était vertical , pas horizontal comme je l'avais codé! Je suis à peu près sûr que cela fonctionne, mais si je fais une erreur, faites-le-moi savoir. Cela peut très probablement être joué un peu plus ridicule, je viens de prendre une méthode de force brute extrême pour le faire. La forme elle-même est en fait un carré, elle est techniquement symétrique, sauf sur l'axe des x, donc quand elle bascule, elle retourne "DROIT" à la place !!!
Le personnage qui a rendu ce programme possible est le 'A', qui permet la téléportation au début d'une certaine ligne!
Essayez-le en ligne!
la source