Comme George Orwell l'a écrit en 1984 :
La guerre est la paix La
liberté est l'esclavage L'
ignorance est la force
Ecrivez un programme ou une fonction reprenant l’un des six mots principaux de la citation d’Orwell et produisant son équivalent.
Plus précisément:
[input] -> [output]
war -> peace
peace -> war
freedom -> slavery
slavery -> freedom
ignorance -> strength
strength -> ignorance
Aucune autre paire d'entrée / sortie n'est requise.
Vous devez supposer que les mots sont toujours en minuscule, comme ci-dessus. Sinon, vous pouvez supposer que les mots sont toujours entièrement en majuscules: WAR -> PEACE
, PEACE -> WAR
, etc.
Le code le plus court en octets gagne.
code-golf
string
kolmogorov-complexity
Les passe-temps de Calvin
la source
la source
w p f s i
) ne se trouvent nulle part ailleurs dans ces mots. Une propriété intrigante.Réponses:
05AB1E , 30 octets
05AB1E utilise le CP-1252 .
Essayez-le en ligne! ou en tant que suite de tests
Explication
L'approche directe
ignorance strength war peace freedom slavery
la source
ignorance strength war peace freedom slavery
Il me manque une douzaine d’étapes!JavaScript (ES6), 80 octets
Comment ça fonctionne
Nous utilisons une petite table de correspondance basée sur le code ASCII du deuxième caractère de chaque mot, renvoyant l'index de son équivalent.
En remarque, si les cas mixtes étaient autorisés, l’utilisation
war PEACE FREEDOM slavery IGNORANCE strength
de modulo 6 conduirait à un hachage parfait.Tester
Afficher l'extrait de code
la source
z
, puis compresser la chaîne avec uneatob
sauvegarde de 8 octets?atob
vous obtenez une chaîne composée principalement de javascript valide - vous devez éventuellement n'échapper que le `\` et la citation de fermeture. Il peut être difficile de l'afficher sur ce site, mais cela n'invalide pas la réponse. Voir la réponse à sml par smisGelée , 24 octets
Essayez-le en ligne!
Comment ça fonctionne
Tout d'abord, le jeton
indexe dans le dictionnaire de Jelly pour créer la chaîne
qui
Ḳ
se divise en espaces pour donner le tableau de chaînesµ
commence une nouvelle chaîne monadique avec ce tableau de chaînes comme argument, qui est également la valeur de retour actuelle.ɠ
lit une ligne d'entrée à partir de STDIN eti
trouve son index de la valeur de retour précédente, c'est-à-dire le tableau de chaînes généré.Maintenant,
^1
prend le bit au bit XOR de cet index et 1 . Même pour les indices - rappelez - vous que les indices Jelly sont 1 à base et modulaire, la force a l' indice 1 et l' ignorance a l' indice 6 / 0 - ce incrémente l'indice; pour les indices impairs, il les diminue.Enfin,
ị
récupère la chaîne à cet index à partir de l'argument de la chaîne.la source
Mathematica, 84 octets
Explication
Plus "d'arithmétique" avec des chaînes! Comme dans la réponse liée, ceci est basé sur le fait que vous pouvez "multiplier" des chaînes dans Mathematica, ce qui les laissera non évaluées (comme si vous multipliiez deux variables non affectées
x*y
), mais que Mathematica appliquera des simplifications de base, telles que l'annulation de facteurs dans une division.Nous commençons donc par stocker les trois paires comme produits
x
,y
,z
respectivement et les multiplier tous ensemble:Ceci évalue à
(Mathematica trie automatiquement les facteurs, mais l'ordre nous importe peu.)
Nous divisons cela par l'entrée pour supprimer le mot avec lequel nous ne voulons pas
.../#
, puisque Mathematica annule les facteurs. Par exemple, si l'entrée était"peace"
nous nous retrouverions avec:Enfin, on se débarrasse des paires que nous ne sommes pas intéressés, en substituant chacun
x
,y
etz
avec1
. Encore une fois, la simplification de Mathematica1*a
est toujours d'actualitéa
. Cette partie est faite avec:La bonne chose est que Mathematica sait que la multiplication est
Orderless
ce qui permet de trouver les deux facteurs, qu’ils soient adjacents ou non dans le produit. Seul le mot opposé à l'entrée n'est plus associé dans le produit, de sorte que celui-ci ne sera pas supprimé et reste la seule sortie.la source
WordList[][[<|"l"->14007,"t"->17083,"a"->25105,"r"->32106,"g"->33790,"e"->39048|>@#[[2]]]]&
.WordList
c'est gentil. Prendre une liste de caractères en entrée et renvoyer une chaîne semble un peu louche cependant. ;) Ceci dit, vous pouvez faire mieux avec 4 octetsx[[7-Position[x={"war","slavery","ignorance","strength","freedom","peace"},#][[1,1]]]]&
.<|#->#2&~MapThread~{x={"war","slavery","ignorance","strength","freedom","peace"},Reverse@x}|>
pour 94 octetsVim, 60 octets
Essayez-le en ligne! dans l'interpréteur V compatible avec les versions antérieures.
Bien sûr, si nous passions à V, nous pourrions économiser un octet en utilisant une méthode de saisie plus pratique. Mais comme c'est une si petite différence, je préférerais utiliser la version non-golf.
Explication:
la source
C (gcc) ,
120 à107 octetsAbus maximum de pointeur! Nécessite une machine little-endian et des longs 64 bits.
Le code contient quelques éléments non imprimables, mais le copier-coller devrait toujours fonctionner.
Essayez-le en ligne!
la source
Python, 81 octets
Ou même longueur:
la source
l
comme argument facultatif.Perl 6 , 61 octets
Avec des caractères non imprimables représentés par (car StackExchange les supprime sinon):
Voici un
xxd
vidage hexadécimal:Version développée (caractères non imprimables remplacés par des séquences d'échappement, espaces et commentaires ajoutés):
la source
Bash ,
100878678 octetsEssayez-le en ligne!
La deuxième lettre de chaque mot identifie de manière unique ce mot, j'utilise donc ce caractère comme nom de variable; la valeur de cette variable est l'autre mot correspondant.
Par exemple, la deuxième lettre de
peace
ise
et le mot correspondant àpeace
iswar
, je mets donce=war
.Étant donné une chaîne d'entrée, le deuxième caractère de cette chaîne est utilisé comme nom de variable pour extraire le mot correspondant souhaité, en utilisant le développement de paramètre indirect de bash.
la source
TI-Basic,
1038477 octetsRéduire à une ligne a sauvé beaucoup d'octets!Haha, combien cette déclaration était ironique ...la source
Perl , 63 octets
62 octets +
-p
drapeau.Essayez-le en ligne!
ord
renvoie le code de caractère du premier caractère du mot saisi.Après le
%6
, nous avons:Donc nous avons
slavery
etstrength
tous les deux retournant 1 (puisqu'ils commencent tous les deux par la même lettre), et aucun retournant 2. Par conséquent, nous ajoutons1
pourstrength
(c'est le seul mot qui va correspondre/h/
), et nous avons chaque mot assigné à un index de 0 à 5la source
R, 86
8792octetsChangé en une fonction sans nom et
gsub
ensub
quelques octets. Legrep
détermine laquelle des 3 chaînes est utilisée et l'entrée est supprimée de cette chaîne avecsub
.la source
PHP, 70 octets
la source
Befunge,
8988 octetsEssayez-le en ligne!
Explication
Nous commençons par placer toutes les chaînes de sortie possibles sur la pile, terminées par null. Cette séquence est exécutée de droite à gauche afin que les valeurs soient inversées, car c’est dans cet ordre que les caractères seront nécessaires lorsqu’ils seront finalement affichés.
Nous lisons ensuite les deux premiers caractères de stdin, ce qui est tout ce dont nous avons besoin pour identifier la chaîne de saisie. Si nous prenons la valeur ASCII de la première lettre mod 2, plus la deuxième lettre mod 7, nous obtenons un nombre unique compris entre 2 et 7.
Ce nombre peut ensuite être utilisé comme une sorte d’index dans la liste de chaînes de la pile. Nous décrémentons de façon itérative l'index (la première fois de 2) et, pour chaque itération, nous effaçons une chaîne de la pile avec la séquence
>_
.Une fois que l'index atteint zéro, il reste la chaîne de sortie correcte en haut de la pile. Nous utilisons donc une séquence de sortie de chaîne simple pour écrire le résultat sur stdout.
la source
:-<
et@>:#
« smileys » ici :)Pyke, 29 octets
Essayez-le ici!
la source
C, 93
@ La réponse d'Arnauld a été portée à C
la source
C (gcc) ,
113108 octetsToutes les instances de
\0
peuvent être remplacées par des octets NUL réels à des fins de scoring.t+*--t-47
est un comportement indéfini; cela peut / ne fonctionnera pas avec d'autres compilateurs.Essayez-le en ligne!
la source
JavaScript (ES6), 71
78Tellement ennuyeux que la réponse d'Arnauld, mais aussi plus court.
Maintenant, j'ai ajouté l'encodage avec
btoa
. Dans la chaîne codée, il y a 4 octets que je ne peux pas publier sur ce site, même s'il s'agit de caractères valides dans une chaîne javascript. J'ai donc utilisé un hex d'échappement dans la forme\xHH
. Chacune de ces échappées compte pour 1 octet.La chaîne encodée est
strength0ignorance0peace0war0slavery0freedom
Celui-ci est 82 et insensible à la casse
Tester
la source
CJam, 52 (ASCII seulement)
Essayez-le en ligne
Note: les espaces sont des caractères de tabulation (un avant et un après "EK {")
Explication:
La partie allant jusqu'à "+" décompresse la chaîne "slaveryjfreedomjwarjpeacejignorancejstrength", en utilisant la conversion de base:
string (traité comme un tableau de codes de caractères) → (base 144) nombre → (base 26) tableau de nombres → (en ajoutant "a" à chaque nombre) chaîne
la source
> <> (Poisson),
8478 octetsEssayez-le en ligne!
Nous commençons à nager en haut à gauche, en allant à droite. Nous lançons d’abord la pile avec un 0. Ensuite, nous lisons la première lettre de input (
i
), nous l’évincons (~
), lisons la deuxième lettre (i
) et réduisons sa valeur ASCII modulo 10 (a%
). Ceci mappe a, e, r, l, g et t sur 7, 1, 4, 8, 3 et 6, respectivement - appelons ce nombre N..
extrait deux valeurs de la pile - N et 0 - et saute à ligne N, caractère 0.Après un saut, le poisson effectue un tic-tac avant d'exécuter les instructions. Il ignore donc le premier caractère et traverse la ligne N, ce qui charge le mot correspondant dans la pile. Enfin, nous allons à la ligne 2, qui sort la pile entière et sort.
la source
JavaScript, 78 octets
C'est un genre de port de ma réponse en Python . Nous stockons les mots dans une chaîne où chacun se trouve dans la position opposée à celle de son équivalent. Nous trouvons l'index du mot donné
w
et obtenons cet index à la fin pour renvoyer le résultat.Extrait de test:
la source
Paris / GP, 86 octets
Pari / GP est un interpréteur interactif, nous n’avons pas besoin d’un "print" -cmd pour la sortie; Cependant, l'utilitaire Try-It_Online a besoin d'un "print" -cmd, je l'ai donc séparé en "pied de page".
Nous définissons une "fonction-objet" (la lettre O me rappelle joliment la fonction Orwell ... ;-)):
Après cela, appelez
Essayez-le en ligne!
(Notez que dans Pari / GP, les jetons donnés ici ne sont pas des chaînes mais des noms de variables légaux! Ces variables ne devraient jamais avoir de valeur assignée à)
la source
Empilé, 70 octets
Essayez-le ici! Prend l'entrée sur la pile et laisse la sortie sur la pile. Par exemple:
Ce code est assez explicite. Légèrement modifié pour exécuter tous les cas de test:
la source
'LF
faire?@x
définit une variable,'...'
est une chaîne etLF
est la variable de saut de ligneJolf, 35 octets
Il y a beaucoup de non imprimables. Voici un vidage d'hex, bien que cela ne fasse pas beaucoup de bien:
Voici un lien en ligne.
En gros, le code ressemble à ceci:
la source
En fait , 56 octets
Essayez-le en ligne!
Malheureusement, sans compression intégrée, il est plus court de ne pas compresser la chaîne et de la décompresser manuellement.
Explication:
la source
Haskell, 104
111octetsIdée:
fromEnum
, déplacez 3 étapes vers la droite (module 6) et reconvertissez-le en mot-clé.::O
est nécessaire car l'inférence de type a quelques problèmes. Donnerf
une signaturef :: O -> O
aurait le même effet, mais ce n’est pas si court.Modifier:
Remplacé
par
grâce à @Laikoni.
la source
f
est plus courte:f s=toEnum$mod(3+fromEnum s)6
Dyalog APL , 66 octets
Soit l'un de ceux-ci:
'slavery' 'freedom' 'ignorance' 'strength' 'war' 'peace'⊃⍨6|⎕UCS⊃⍞
utilise cette méthode (requiert⎕IO←0
ce qui est la valeur par défaut sur de nombreux systèmes).'strength' 'freedom' 'war' 'peace' 'slavery' 'ignorance'(⍳⊃(⌽⊣))⊂⍞
effectue une recherche, puis sélectionne l'élément correspondant dans la liste inversée.la source
Qbasic,
138 à99 octetsD$
stocke tous les mots du côté gauche du mantra, puis tous ceux du côté droit. Chaque mot est rempli d'espaces avec exactement 9 lettres par mot.D$
est ensuite ajouté à lui-même.Puis
instr
est utilisé pour trouver l'index du mot entré par l'utilisateur. L’autre partie du mantra est toujours stockée exactement 9 * 3 positions plus loin dans la chaîne, nous imprimons donc une sous-chaîne commençant à cette position, en prenant 9 caractères.la source
SmileBASIC, 92 octets
la source
Python , 80 octets
En quelque sorte, xnor est devenu un golf!
C'est une fonction lambda sans nom, qui renvoie le résultat.
Essayez-le en ligne!
La liste de mots est agencée de telle sorte que chacun se trouve dans la position opposée à celle de son homologue. Étant donné le mot
w
, nous trouvons son index dans la liste de mots, puis bitwise PAS (~
). Cela retourne tous les bits, ce qui est calculén => -n-1
. En raison de l'indexation négative de Python, obtient l'index opposé dans la liste.En tant que sorte de bonus non intentionnel, vous pouvez transmettre n'importe quelle liste de mots d'opposés à cette fonction en tant que second argument.
la source