Mon ami et moi avons ce jeu que nous jouons avec des mots. C'est un passe-temps amusant et cela implique "d'annuler" les lettres d'un mot jusqu'à ce qu'il ne reste plus rien. Je suis vraiment fatigué qu'il soit tellement plus rapide que moi, donc c'est votre travail de le mettre en œuvre et de me laisser enfin le battre. Évidemment, puisque je dois rendre le programme aussi facile à cacher que possible, il doit être aussi petit que possible.
Comment fonctionne ce jeu?
Le jeu est un algorithme assez simple. Il réduit une chaîne alphabétique jusqu'à ce qu'elle ne puisse plus être réduite, ce qui en fait une sorte de hachage. Le jeu réel que nous, les humains, sommes très difficiles à implémenter, mais il peut être simplifié dans l'algorithme suivant:
Vous commencez par plier l'alphabet en deux et aligner les deux pièces comme ceci:
a b c d e f g h i j k l m
z y x w v u t s r p q o n
Ensuite, en partant du milieu, vous affectez les entiers positifs à la moitié supérieure et les négatifs au bas:
a b c d e f g h i j k l m
13 12 11 10 9 8 7 6 5 4 3 2 1
z y x w v u t s r p q o n
-13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
Ensuite, vous prenez votre chaîne (nous utiliserons hello world
) et en ignorant tous les caractères non alphabétiques, traduisez-la:
h e l l o w o r l d
6 9 2 2 -2 -10 -2 -5 2 10
Ensuite, vous additionnez les valeurs des lettres. Ceux qui étaient alignés dans le diagramme précédent (par exemple, d
et w
, l
et o
) seront annulés, tandis que les autres s'additionneront.
sum(6 9 2 2 -2 -10 -2 -5 2 10 )=12
12 est le nombre pour b
, donc le hachage de hello world
estb
Pour un mot qui annule complètement (par exemple love
), vous sortie le « 0 caractère »: -
. Notez que dans l'entrée, -
sera toujours ignoré. Cela n'a d'importance que dans la sortie.
Si l'ampleur du nombre est supérieur à 13, alors vous commencez à doubler sur les a
« s et z
» s vous prenez essentiellement autant a
« s ou z
d » ajustement dans le nombre et prendre tout ce qui est à gauche dans la dernière lettre comme ceci:
code golf: 43.
Convient à 3 a
et il en reste 4:
aaa 4: j
result: aaaj
Astuce: Cette partie est fondamentalement divmod
sauf qu'elle arrondit vers zéro, non -infinity
(par exemple -43 deviendrait 3 z
et et a -4
qui est p
ainsi zzzp
).
Remarque: le tiret ne vient pas si le a
«ou z
» s'intègre parfaitement, seulement s'il est exact 0
.
Clarifications:
- Le hachage est cas dans sensible
- Les échappatoires standard ne sont pas autorisées
- Les E / S peuvent être dans n'importe quel format qui n'est pas trop bizarre, stdin, stdout, arg en ligne de commande, fonction, etc.
- Il s'agit de code-golf, donc la taille la plus courte en octets l' emporte.
Exemples:
hello world --> b
love --> -
this is an example --> aak
hello *&*(&(*&%& world --> b
good bye --> ae
root users --> zzs
love
est vide ...Réponses:
CJam, 46 octets
Essayez-le en ligne , ou essayez la suite de tests en ligne .
Explication
L'algorithme fonctionne comme vous pouvez vous y attendre: lisez l'entrée, convertissez-la en minuscules, mappez chaque caractère à une valeur, additionnez les valeurs et imprimez les caractères et ajustez la somme en conséquence jusqu'à ce que la somme soit nulle. L'optimisation probablement la plus intéressante (bien qu'elle n'économise que deux octets) est que les mappages de caractères annulés sont utilisés à la place, car cela évite d'échanger les arguments de soustraction pour corriger le signe lors du calcul de la valeur mappée et évite de les échanger à nouveau lors du mappage vers une lettre en raison de la la soustraction d'une valeur négative pouvant être remplacée par l'addition.
la source
Pyth,
797877656158la source
@Jz
au lieu def}YJz
Il y en a probablement plus, mais je dois dormir maintenant. Bonne chance;)@
!Extrait 10 , 87
la source
R, 258 octets
Ce doit être le code R le plus grossier de tous les temps. J'ai pensé que R pourrait être un choix décent car il a un vecteur de toutes les lettres "a" à "z" comme variable globale intégrée. Mais il s'avère que le reste est un gâchis.
Non golfé + explication:
Cela crée un objet fonction sans nom qui accepte une chaîne en entrée et renvoie la valeur de hachage associée. Pour l'appeler, donnez-lui un nom, par exemple
f=function(s){...}
.Exemples:
Essayez-le en ligne!
Des questions? Je serai ravi de fournir toute autre explication. Suggestions? Les suggestions sont les bienvenues!
la source
Haskell, 171 octets
Essai:
Comment ça marche:
l
est une table de recherche de lettres à la valeur correspondante. Recherchez tous les caractères de la chaîne d'entrée et jetez ceux qui ne sont pas trouvés. Additionnez la liste résultante. En fonction de la somme desp
impressions-
ou peut-être d'abord desa
s ou desz
s et enfin des recherches (inversées) de la lettrel
.la source
R - 200
la source