Les bases:
Vous devrez fournir un jeu de devinettes à neuf niveaux avec le moins de caractères possible (dans la langue de votre choix).
Les métriques:
- Fournissez une liste de mots (un mot par ligne, séparé par une nouvelle ligne) (par exemple,
/usr/share/dict/words
ou similaire pourrait faire). C'est bien de canaliser un nom de fichier ou la liste de mots dans votre solution. - Fournir 9 niveaux avec incrémentation de la longueur des mots (mots avec 4 caractères
->
12 caractères):
Niveau 1: un mot aléatoire de la liste de mots contenant 4 caractères Niveau 2: un mot aléatoire de la liste de mots contenant 5 caractères ... ... Niveau 8: un mot aléatoire de la liste de mots contenant 11 caractères Niveau 9: un mot aléatoire de la liste de mots contenant 12 caractères
- À chaque niveau, obscurcissez un mot choisi au hasard dans la liste (avec une longueur de mot bien sûr) et remplacez un certain nombre de caractères par l'astérisque (
*
). Le nombre de caractères à remplacer:current_word_length / 3
(arrondir vers le bas). Randomisez qui caractères à remplacer. - Laissez le joueur «deviner» le mot (un seul
try
par niveau), donnez votre avis (correct
ouwrong
) et donnez des points en conséquence. Quand c'est correct, le joueur gagnenumber_of_obfuscated_characters * 10 points
. - Imprime le score actuel à la fin de chaque niveau.
Le format (& exemple d'E / S):
Assurez-vous de suivre le schéma de mise en forme suivant:
En-tête de niveau 1 # niveau ======= # g * ek # mot obscurci geek # user input # validation de supposition correcte score: 10 # partition imprimée # Niveau 2 ======= l * nux linux correct score: 20 Niveau 3 ======= couru ** m Aléatoire correct score: 40 ... Niveau 9 ======= sem *** act * ve semi-inactif faux score: 90
Gagnant:
Solution la plus courte (par nombre de caractères de code). Amusez-vous au golf!
sem***act*ve
==>semelfactive
Réponses:
Perl, 180 caractères
Ruby bat Perl? Ça n'ira pas! :-)
Comme la solution Ruby de jsvnm, mais contrairement au code Perl de Joel Berger, ce script prend le nom de fichier d'une liste de mots comme paramètre de ligne de commande. Autrement dit, vous devez l'exécuter comme ceci:
Voici une version dé-golfée:
La déclaration
vec($_, rand $n, 8) = 42 while ($= = $n/3) > y/*//
contient quelques astuces intéressantes. Premièrement, 42 est le code ASCII d'un astérisque; il s'avère que l'utilisationvec
de modifier des caractères uniques dans une chaîne est plus courte que de le faire avecsubstr
. Deuxièmement, la variable$=
ne prend que des valeurs entières, donc l'utiliser pour stocker le nombre de lettres cachées me fait gagner un anint
. Enfin,y/*//
est un moyen rapide de compter le nombre d'astérisques dans une chaîne à l'aide de l'opérateur de translittération.Edit: 7 caractères enregistrés en utilisant
$@
pour stocker le score divisé par 10 et en y ajoutant un zéro pendant la sortie (ce qui, à bien y penser, aurait été plus court que la version précédente même si j'avais utilisé une variable normale) .Edit 2: Il s'avère que l'intégration de nouvelles lignes littérales dans les chaînes de sortie permet d'économiser un caractère au lieu de jouer avec
$,
.la source
Rubis (188)
prend le nom de fichier pour lire les mots comme argument.
la source
Bash, 350 caractères
la source
Perl: 266
ou avec un peu plus d'espace blanc
et je pense qu'avec un peu de travail ça pourrait être encore mieux!
la source
R, 363 caractères
la source
Python 335
Je sais que je suis un peu en retard à la fête, mais le python n'est pas représenté, alors j'ai compris ce que le diable:
Et semi-non golfé:
la source
K, 198
Suppose un dictionnaire d dans le répertoire de travail actuel.
Non golfé:
la source