Le système principal est un dispositif mnémonique pour convertir des nombres en mots afin qu'ils puissent être mémorisés plus facilement.
Il est basé sur la façon dont les mots sonnent phonétiquement, mais pour garder les choses simples pour le défi, nous ne nous intéresserons qu'à la façon dont les mots sont orthographiés. Cela signifie qu'il y aura des conversions incorrectes, mais ça va.
Pour convertir un nombre en un mot à l'aide de notre système principal simplifié:
- Remplacez chacun
0
pars
ouz
. (Certains pourraient l'êtres
et d'autres pourraient l'êtrez
. Il en va de même ci-dessous.)- Remplacez chacun
1
part
oud
outh
.- Remplacez chacun
2
parn
.- Remplacez chacun
3
parm
.- Remplacez chacun
4
parr
.- Remplacez chacun
5
parl
.- Remplacez chacun
6
parj
oush
ouch
.- Remplacez chacun
7
park
ouc
oug
ouq
.- Remplacez chacun
8
parf
ouv
.- Remplacez chacun
9
parp
oub
.- Ajoutez les lettres
aehiouwxy
n'importe où dans n'importe quel montant pour faire un vrai mot anglais, si possible .
La seule exception est qu'elleh
ne peut pas être insérée après uns
ouc
.Le nombre peut en fait être n'importe quelle chaîne des chiffres 0-9 (pas de décimales, ni virgules ni signes).
Le mot ne peut contenir que les lettres minuscules az.
Exemples
Le nombre 32
doit être converti comme ?m?n?
, où ?
représente toute chaîne finie faite à partir des lettres aehiouwxy
(une chaîne du monoïde libre si vous préférez). Il y a plusieurs façons cela pourrait être transformé en un vrai mot anglais: mane
, moon
, yeoman
, etc.
Le nombre 05
peut être converti en ?s?l?
ou ?z?l?
. Certaines possibilités sont easily
, hassle
et hazel
. Le mot shawl
n'est pas autorisé car h
il ne peut pas être placé après s
; il serait incorrectement lu comme 65
.
Défi
Écrivez un programme ou une fonction qui prend une chaîne de chiffres 0 à 9 et trouve tous les mots dans lesquels il pourrait être converti en utilisant la mnémonique simplifiée du système principal.
Votre programme a accès à un fichier texte de liste de mots qui définit ce que sont tous les "vrais" mots anglais. Il y a un mot az en minuscules sur chaque ligne de ce fichier, et vous pouvez éventuellement supposer qu'il a une nouvelle ligne de fin. Voici une liste de vrais mots que vous pouvez utiliser pour les tests. Vous pouvez supposer que ce fichier de liste de mots est appelé f
(ou quelque chose de plus long) et se trouve dans n'importe quel répertoire pratique.
Pour une pénalité de 35 octets (ajoutez 35 à votre score), vous pouvez supposer que la liste de mots est déjà chargée dans une variable en tant que liste de chaînes. C'est principalement pour les langues qui ne peuvent pas lire les fichiers, mais toute soumission peut en profiter.
Votre programme doit sortir tous les mots de la liste de mots dans lesquels le numéro d'entrée peut être converti. Ils doivent être imprimés sur stdout (ou similaire), un par ligne (avec un retour à la ligne facultatif), ou ils peuvent être renvoyés sous forme de liste de chaînes si vous choisissez d'écrire une fonction. La liste de mots n'est pas nécessairement alphabétique et la sortie n'a pas besoin d'être non plus.
S'il n'y a pas de mots possibles, la sortie (ou la liste) sera vide. La sortie est également vide si la chaîne vide est entrée.
Prenez l'entrée via stdin, la ligne de commande ou comme argument de chaîne pour une fonction. La liste de mots ou son nom de fichier ne doit pas faire partie de l'entrée, uniquement la chaîne de chiffres.
Vous ne faites correspondre que des mots simples dans la liste de mots, pas des séquences de mots. Le mot noon
serait probablement l'un des résultats pour 22
, mais pas la séquence de mots no one
.
Cas de test
Supposons que ce soit la liste de mots:
stnmrljkfp
zthnmrlshqfb
asatanamaralajakafapa
aizxydwwwnhimouooraleshhhcavabe
zdnmrlshcvb
zdnmrlshchvb
sthnmrlchgvb
shthnmrlchgvb
bob
pop
bop
bopy
boppy
L'entrée 0123456789
doit donner tous les mots longs sauf zdnmrlshchvb
et shthnmrlchgvb
:
stnmrljkfp
zthnmrlshqfb
asatanamaralajakafapa
aizxydwwwnhimouooraleshhhcavabe
zdnmrlshcvb
sthnmrlchgvb
L'entrée 99
doit donner:
bob
pop
bop
bopy
(Les mots de sortie peuvent être dans n'importe quel ordre.)
Notation
La soumission la plus courte en octets l' emporte. Tiebreaker passe à la soumission publiée en premier.
Site lié à Nifty: numzi.com .
Réponses:
Perl,
8784Prend l'entrée comme paramètre de ligne de commande:
Peut être raccourci un peu si la liste de mots est autorisée sur l'entrée standard:
la source
A
moyenne enopen A,f
?<A>
).Python 2,
215208 octetsCette solution Python construit une expression régulière à partir des parties indexées par l'argument de ligne de commande, puis teste chaque mot avec cette expression régulière (plutôt grande).
Source d'origine avant la minifiante:
Par exemple, l'expression régulière du test
99
est:Le
(?<![sc])h
bit est un composant "regardez derrière l'assertion négative" qui s'assure qu'unh
ne suit pas uns
ouc
dans les pièces de remplissage générales.Merci Calvin. Ce défi m'a motivé à perfectionner mes compétences en expression régulière rouillée.
la source
b=c='((?<![sc])h|[aeiouwxy])*'
sauvera deux octets.t|th -> th?
enregistre un octetPython 3, 170
Version lisible:
Le code utilise le fait qui
th
est redondant (car il correspond au même nombre quet
, eth
est un caractère de remplissage).La
maketrans
fonction statique crée une table mappant les caractères du premier argument à ceux du deuxième argument et les caractères du troisième argument àNone
(ce qui entraînera la suppression de ces caractères).Le code final pourrait être raccourci de quelques octets en créant la table comme argument direct de
translate
.la source
input()
puisse être utilisée, car elle est appelée dans une boucle. En outre, votre regex suggéré est de la même longueur que celui que j'utilise déjà (5 octets).sed, coller, grep, couper - 109
Prend un fichier "w", convertit chaque mot en son numéro, collez-le dans l'original, recherchez le numéro et renvoyez le mot correspondant. Notez que l'espace après la citation après grep est un onglet, le délimiteur par défaut de coller.
Je sais que Perl est en avance, je voulais juste une meilleure version shell comme exemple.
Oh oui, la partie $ 1 signifie que cela est censé être exécuté à partir d'un script shell, (la plupart des shells devraient fonctionner), donc cela prend un argument de ligne de commande.
la source
sed
pour éviter l'ouverture et la@ARGV
surcharge de Perl , mais le manque de plages et de fonctions de suppression ley///
rompt. Étonnamment, même s'il n'y a pas de variables, vous pouvez exprimer directement la logique elle-mêmesed
. Voici ma solution 92:sed -e'h;s/[sc]h/6/g;y/sztdnmrljkcqgfvpb/00112345677778899/;s/[^0-9]*//g;T;s/^$1$//;x;t;d' f
Bash + coreutils, 216
w
sed
remplace les chiffres par leurs remplacements possibleseval printf
utilisations shell extensions de contreventement pour développer toutes les substitutions possiblessed
sur la 1ère ligne supprimeaeiouwxy
eth
(lorsqu'elle n'est pas précédée de[sc]
) de la liste de motsaeiouwxy
eth
de la liste de mots, le derniersed
transforme les résultats de grep (numéros de ligne de chaque correspondance) en une autresed
expression, qui est traitée par le plussed
à l'extérieur pour révéler tous les mots possibles de la liste de mots.Production:
Le fichier de liste de mots est spécifié comme un argument de ligne de commande, suivi du nombre à mnémoniciser:
la source
tr, sed, grep, xargs, sh, 77
Attend le nombre dans stdin et la liste de mots doit être stockée dans le fichier
f
.N'utilise pas tous les remplacements (1 sera toujours z, 7 sera toujours k), donc cela peut être appelé une solution paresseuse, mais il trouve au moins un mnémonique pour 95 nombres dans [1-100].
la source
1
toujours êtrez
ou7
toujoursk
. Ce n'est pas valide.