Le but de ce challenge est d'écrire un programme qui remplit les conditions suivantes:
Le programme n'est ni palindromique, ni essentiellement palindromique (ce qui signifie qu'il est possible de supprimer des caractères pour en faire un palindrome sans modifier les effets du programme).
Le programme n'est pas une involution (ce qui signifie qu'il ne produit pas son entrée d'origine lorsqu'il est exécuté sur sa sortie)
Le programme à polarité inversée est l'inverse du programme normal; ainsi, lorsque le programme inversé est exécuté sur la sortie du programme normal, il renvoie l'entrée d'origine.
Que signifie polarité inversée ? Eh bien, cela diffère entre les langues.
- Pour la plupart des non-esolangs, cela signifie également inverser l'ordre des sous-opérations en une seule opération, inverser l'ordre des arguments et inverser le contenu des listes / tableaux / tuples / dictionnaires / piles / files d'attente / etc codés en dur, ainsi comme inversant l'ordre des blocs de code et des lignes autonomes (mais pas les lignes à l'intérieur des blocs)
Exemples:
Haskell :
x`mod`y
-> y`mod`x
; zipWith ((*3).(+)) [1,2,3] [4,5,6]
->zipWith ((+).(*3)) [6,5,4] [3,2,1]
Python : 2**3
-> 3**2
; for x,y in [(1,2),(3,4),(5,6)]
->for y,x in [(6,5),(4,3),(2,1)]
Pour les langues qui ont des fonctions à 1 caractère (comme Pyth, APL), inversez simplement la chaîne d'instructions
Pour les esolangs à une dimension comme BF, inversez les instructions ou échangez la polarité; les échanges de polarité sont
[]
->{}
,+
->-
,-
->+
,>
-><
,<
->>
,.
->,
et,
->.
(mais pas les deux)Pour les esolangs bidimensionnels comme Befunge, vous pouvez soit effectuer une réflexion sur les axes x ou y ou une diagonale, faire une rotation de 180 degrés, soit combiner une réflexion et une rotation
Les opérations commutatives sont autorisées, mais celles palindromiques ne le sont pas: 2*x
c'est bien, mais x+x
c'est mauvais. La définition d'une inversion de polarité est assez vague, mais utilisez votre jugement sur ce qui a du sens; le but n'est pas de trouver la faille la plus intelligente, mais de trouver la solution la plus intelligente.
Il s'agit d'un concours de popularité, donc une échappatoire très intelligente peut être populaire, mais essayez de rester dans l'esprit de ce défi. Le gagnant sera annoncé une fois qu'il y aura au moins 10 solutions avec au moins 1 vote positif, et qu'il y aura au moins une solution avec plus de votes positifs qu'il n'y a de soumissions avec au moins 1 vote positif; ou en 1 mois, selon la première éventualité. C'est mon premier défi, alors essayez d'être juste et donnez-moi des commentaires constructifs, mais faites-moi également savoir s'il s'agit d'un défi déraisonnable ou s'il est en quelque sorte mal catégorisé ou ambigu. Si vous avez des questions sur une langue qui ne correspond à aucun des pigeonniers que j'ai exposés ici, commentez et je me plierai à la volonté de la communauté s'il y a un tollé fort pour une clarification particulière ou un changement de règle.
MISE À JOUR
Cela fait exactement 1 mois depuis le début de ce concours (il m'est arrivé de le vérifier par hasard, ne sachant pas que j'étais en fait à l'heure). Comme il s'agit d'un concours de popularité, le gagnant (par un glissement de terrain) est Pietu1998-Befunge . Même si les composants du bas (l'inverseur de texte et l'alphabet inversé) sont tous deux des involutions, l'encodeur / décodeur ne le sont pas, donc il n'y a pas de problème là-bas. Points bonus (dans mon esprit) pour avoir réussi à écrire "BEFUNGE" au milieu. J'ai personnellement aimé la nouveauté de la solution Theseus de Zgarb , car la langue a l'air cool (si elle est restreinte). Merci à tous pour votre participation, et bien que le gagnant ait été choisi, je laisse ce concours complètement ouvert et je souhaite la bienvenue aux candidatures futures.
la source
()
palindromique? Techniquement, c'est l'inverse)(
.Réponses:
Befunge
Whoa, c'était un travail, même avec l' éditeur que j'ai fait pour ce défi. Voici ce que j'ai eu, un joli bloc 11x12:
Il fait deux ou trois choses, malheureusement uniquement pour les lettres minuscules.
Ce qu'il fait
Lorsqu'il est exécuté normalement, il effectue un chiffrement César sur l'entrée.
Lorsqu'elle est retournée horizontalement, elle inverse ledit chiffre. C'est l'exigence du défi, mais cela ne s'arrête pas là.
Lorsqu'il est retourné verticalement , il chiffre les entrées avec un alphabet inversé. Cela peut être considéré comme l'approche opposée au chiffre de César.
Enfin, lorsqu'il pivote à 180 degrés, il inverse la saisie. J'ai le sentiment que cela doit être l'inverse de quelque chose (indice: l'entrée).
Comment ça fonctionne
Le bloc se compose essentiellement de quatre algorithmes semi-chevauchants.
Encodeur de chiffrement César
Décodeur de chiffrement César (retourné horizontalement)
Chiffre alphabétique inversé (retourné verticalement)
Inverseur de texte (pivoté à 180 degrés)
la source
Brainfuck, 5
Peut-être pour la première fois, Brainfuck produit une réponse compétitive sur la longueur du code. Dommage que ce ne soit pas une question de code-golf.
Entre un octet (caractère), l'incrémente et sort le résultat. La virgule à la fin attend une autre entrée qui, si elle est donnée, sera ignorée. Il n'y a rien dans la spécification sur la terminaison appropriée: -) *
* (ou de faire quelque chose d'utile avec tout le code dans les deux sens)
Résultats typiques (le deuxième caractère s'il est donné est ignoré).
Transférer:
B
->C
Inverse:
B
->A
ouC
->B
la source
Marbelous
En voici un simple pour commencer. Il lit un caractère dans STDIN, l'incrémente et l'imprime.
Si nous le faisons pivoter de 180 ° (sans permuter les crochets), ou si nous le reflétons sur l'axe des x, nous obtenons
qui lit un octet de STDIN et le décrémente.
Vous pouvez le tester ici .
Je pourrais examiner des programmes Marbelous plus compliqués, mais je suis sûr que es1024 me battra. ;)
Explication
Il
00
s'agit d'une bille de valeur 0 (arbitraire). Les]]
appareils lisent un octet de STDIN - c'est-à-dire que si une bille tombe à travers eux, la valeur de la bille est changée en octet de lecture. Les appareils++
et--
incrémentent ou décrémentent simplement la valeur d'une bille (mod 256) et la laissent passer. Lorsqu'une bille tombe du plateau, l'octet est écrit dans STDOUT.Par conséquent, les deux appareils en haut sont simplement ignorés car le flux de contrôle ne les atteint jamais.
la source
}0
et l'utiliser comme sous-tableau?}0
comme entrée de ligne de commande pour être précis.Marbelous
Cette carte prend un argument (
x
) et retourne(101 * x) mod 256
.La mise en miroir des cellules le long de l'axe des y se traduira par une carte qui prend un argument (
y
) et renvoie(101 * y + 8 * y) mod 256
, qui est l'inverse de la première carte.Testez ceci ici . Les tableaux cylindriques et les bibliothèques Inclure doivent tous deux être vérifiés.
Exemple d'entrée / sortie :
Veuillez noter que Marbelous ne permet que le passage des entiers positifs comme arguments, et ces entiers sont passés dans le programme modulo 256 par l'interpréteur.
101
a été choisi pour deux raisons: il s'agit d'un nombre premier (et chaque entrée possible dans ce programme entraîne une sortie unique), et l'opération inverse impliquée109
, qui est à une distance pratique de 8101
.Brève explication
La colonne contenant les cellules (de haut en bas)
@0 >0 -- 65 @0
fonctionne de la même manière dans les deux tableaux et boucle plusieurs101
fois avant de se diriger vers la droite. De chaque côté de la>0
branche se trouve un synchroniseur différent; lequel est choisi dépend de la mise en miroir ou non de la carte.De chaque côté, en synchronisation avec la boucle centrale, l'entrée est sommée à plusieurs reprises, obtenant ainsi
101*x mod 256
. Sur la carte inversée, deux copies de l'entrée sont également décalées deux fois vers la gauche (input * 4
), puis additionnées et laissées dans un synchroniseur.Une fois la boucle centrale terminée, les billes résumées sont envoyées pour l'impression, qui se trouve sur le côté du plateau (à gauche pour le plateau d'origine, à droite pour le miroir). Après l'impression, une
!!
cellule est atteinte, terminant la carte. Notez que la boucle qui a donné101 * x
continue de fonctionner d'elle-même jusqu'à ce que la carte soit terminée.Dp
imprime simplement le résultat sous forme de nombre décimal.la source
Thésée
Cela peut être considéré comme une échappatoire, mais j'aime la langue, alors voici. Ce programme définit une fonction
f
sur les nombres naturels qui mappe 3n à 3n + 1 , 3n + 1 à 3n + 2 et 3n + 2 à 3n , pour chaque n .Theseus est un langage réversible avec une syntaxe de type Haskell, où chaque fonction est inversible (actualisant les problèmes de non-terminaison). Il est hautement expérimental et conçu à des fins de recherche. Le code ci-dessus définit un type de données pour les nombres naturels et la fonction
f
. Étant donné un numéro d'entrée, vous le faites correspondre sur le côté gauche (il correspond toujoursn
). Ensuite, vous regardez le motif à droite. Si ce motif a une étiquette (iciiter
), vous procédez à la mise en correspondance de motifs sur le côté gauche et vous prenez à nouveau la valeur correspondante sur le côté droit. Cela se répète jusqu'à ce que vous ayez une valeur sans étiquette à droite, et c'est votre sortie. Les motifs à gauche et à droite doivent être exhaustifs et non superposés (séparément pour chaque étiquette). Maintenant, pour "inverser la polarité" def
, je fais ce qui suit.f
.f
by design .Le résultat:
la source
tr
Exemple:
Seul un vrai inverse sur le domaine des chaînes qui n'inclut pas à la fois «a» et «b».
la source
tr abc bca
avec la version à polarité inverséetr acb cba
.Une autre réponse Marbelous
La droite d'origine décale l'entrée de ligne de commande (une valeur de 8 bits), en ajoutant une première si un 1 est perdu par décalage. (
0000 0001 -> 1000 0000
)Faire pivoter cette carte de 180 ° (mais en laissant le contenu de chaque cellule identique) Modifie le programme de sorte qu'il laisse des décalages (
1000 0000 -> 0000 0001
)Vous pouvez le tester ici . (vous devrez activer "Afficher la sortie sous forme de nombres décimaux")
Explication
Les deux programmes se composent de deux cartes, la carte principale (qui obtient l'entrée de ligne de commande) et
Sb
. Jetons un coup d'œil aux deux versions de la carte principale, en ne regardant que les cellules qui peuvent être atteintes dans leur orientation respective (car les billes ne peuvent généralement pas aller vers le haut et les périphériques d'entrée ne sont pas en haut):Ce sont des conseils assez simples, les deux prennent deux copies de l'entrée (qui prennent la place des
}0
cellules. Les aliments d' origine une version dans un dispositif de décalage vers la gauche<<
la version basculées met dans un dispositif de décalage vers la droite>>
Elles permettent d' effectuer un bitshift mais malheureusement défausse tout C'est là que lesSb
cartes entrent en jeu, elles vérifient si le décalage de bits de la valeur qu'elles entraînent entraînera la perte d'un bit et retournera une valeur à ajouter au résultat pour contrer le bit perdu.Voici la partie pertinente de la
Sb
carte d' origine pour le programme d'origine:Celui-ci est incroyablement simple, `^ 7 'vérifie la valeur du bit le plus significatif. Si celui-ci vaut 1, effectuer un décalage à gauche entraînerait la perte de ce bit. Cette carte délivre donc la valeur de ce bit sous la forme d'une valeur de 8 bits à ajouter au résultat du décalage de bits.
Pour la version inversée,
Sb
il faut regarder le bit le moins significatif et revenir128
ou0
, c'est un peu plus compliqué:Si le bit le moins significatif (tel que testé par
^0
) est 0, il renvoie simplement 0. S'il est égal à un, il^0
sortira1
. Cela échouera au test d'égalité avec0
=0
et sera donc poussé vers la droite. Nous soustrayons ensuite 2-2
pour obtenir 255, décalage>>
à gauche pour obtenir 127 et effectuons un binaire~~
pour ne pas obtenir 128 (nous pourrions également simplement en ajouter un++
pour obtenir 128, mais où est le plaisir?)la source