Le défi:
Imprimez tous les mots de 2 lettres acceptables dans Scrabble en utilisant le moins d'octets possible. J'ai créé une liste de fichiers texte ici . Voir aussi ci-dessous. Il y a 101 mots. Aucun mot ne commence par C ou V. Creative, même non optimales, les solutions sont encouragées.
AA
AB
AD
...
ZA
Règles:
- Les mots sortis doivent être séparés d'une manière ou d'une autre.
- Le cas n'a pas d'importance, mais devrait être cohérent.
- Les espaces de fin et les nouvelles lignes sont autorisés. Aucun autre caractère ne doit être sorti.
- Le programme ne doit prendre aucune entrée. Les ressources externes (dictionnaires) ne peuvent pas être utilisées.
- Aucune échappatoire standard.
Liste de mots:
AA AB AD AE AG AH AI AL AM AN AR AS AT AW AX AY
BA BE BI BO BY
DE DO
ED EF EH EL EM EN ER ES ET EX
FA FE
GO
HA HE HI HM HO
ID IF IN IS IT
JO
KA KI
LA LI LO
MA ME MI MM MO MU MY
NA NE NO NU
OD OE OF OH OI OM ON OP OR OS OW OX OY
PA PE PI
QI
RE
SH SI SO
TA TI TO
UH UM UN UP US UT
WE WO
XI XU
YA YE YO
ZA
Réponses:
Python 3,
194188 octetsCe n’est certainement pas la méthode la plus courte, mais j’ai pensé que ce serait un bon début. Essayez de compresser chaque paire dans des chemins en superposant autant que possible (par exemple
"ODEX..."
=["OD", "DE", "EX", ...]
). Les espaces sont utilisés pour séparer les chemins et toutes les paires contenant un espace sont supprimées (l'espace de fin est d'empêcher qu'un seulE
soit imprimé à la fin).J'ai aussi essayé le regex, mais c'était plus long.
la source
AYAHOYOWOMUNUHAID
!CJam,
9694 octetsCe qui précède est un hexdump, qui peut être inversé avec
xxd -r -c 16 -g 1
.Essayez-le en ligne dans l' interprète CJam .
En fonction de ce qui compte exactement comme séparé d'une manière ou d'une autre , le nombre d'octets pourrait être abaissé à 93 ou même à 92 :
Si nous remplaçons
-55
par59
, les mots seront séparés par des espaces insécables (0xA0).Si nous remplaçons
-55
parW
, les mots seront séparés par des signes at (0x40).Idée
Nous pouvons coder chaque paire de lettres xy sous la forme (ord (x) - 65) × 25 + (ord (y) - 65) . 1
Au lieu de stocker les entiers résultants, nous stockons les différences de toutes les paires qui correspondent à deux mots adjacents (triés par ordre alphabétique).
La différence la plus élevée est de 35 ; nous les considérons donc comme les chiffres d'un entier de base 36 et convertissons cet entier en une chaîne d'octets.
Code
1 La seconde lettre n'étant jamais un Z , utiliser 25 au lieu de 26 suffit.
la source
PHP
224, 218, 210206Pas vraiment un bon score, mais j'ai aimé le défi.
Je crée un tableau des options, créé un système au niveau du bit pour indiquer quelles options sont valides.
Ensuite, j'ai codé ces options en base 36 pour obtenir la chaîne:
Notez que la 3ème entrée de ce tableau de chaînes n'a pas de valeur, car C n'a pas d'options.
Pour imprimer les valeurs, je viens de convertir les options valides en caractères.
Je pourrais peut-être faire quelque chose pour éviter de reconnaître qu'il n'y a pas de mots qui se terminent par C, J, K, Q, V ou Z, mais je ne peux pas penser à une méthode pour le réduire en atm.
En transposant la table, il y a plus d'éléments vides et les données codent un peu plus compactement, ce qui permet de supprimer quelques octets. Le tableau est maintenant imprimé dans un ordre différent:
Merci à Ismael pour l'explosion et les astuces de boucle.
Avec une mise à jour de php5.6,
pow(,)
peut être remplacé en**
sauvegardant 4 octets supplémentaires .la source
","
, vous pouvez utiliserexplode(0,UB1YB0100CUP[...])
3
je peux utiliser ça! Merci$e++;for($f=0;$f<26;$f++)
parfor($e++,$f=0;$f<26;$f++)
, et maintenant vous pouvez supprimer ces embêtants{}
. Et si vous voulez convertir les caractères en minuscules, utilisez$e^' '
.Perl,
167164157 octetsA écrit un script séparé pour regrouper les lettres aussi compactes que possible dans une chaîne contenant tous les mots valides de 2 lettres. Ceci parcourt ensuite tous les mots de la lettre et affiche ceux valides, un par ligne. Courez avec
perl -M5.10.1 script.pl
.la source
-M5.10.1
pour utiliser lesay
mot clé ajouté à cette version ou ajoutezuse feature 'say';
le corps du script.C, 155 octets
Version golfée
Sortie
Version non-golfée
La chaîne magique de 51 octets de la version golfée contient de nombreux caractères autres que ASCII 126, qui ont presque certainement été mutilés en équivalents Unicode. La version non-golfée utilise hex à la place et comme constante plutôt que littérale. De plus, la version non golfée sépare les mots avec une nouvelle ligne, ce qui facilite la copie et le collage dans Excel, la commande de la liste et la comparaison avec celle requise.
Explication
Si nous élargissons la définition de voyelle pour inclure les 8 lettres AHMEIOUY, nous observons que tous les mots sont constitués d’une voyelle et d’une autre lettre (qui peut ou non être une voyelle.) Par conséquent, pour tous les mots se terminant par besoin d’un tableau de 26 octets, un pour chaque première lettre, avec les bits correspondant à la voyelle. Nous avons besoin d'une table similaire pour les mots commençant par une voyelle, sauf que cette fois, nous n'avons besoin que de 25 octets, car il n'y a pas de mot se terminant par Z. Les deux tables sont combinées pour créer la table finale.
Afin d'éviter tout code ASCII dans la région 0..31, les deux voyelles les moins communes M et H sont attribuées aux 6ème et 7ème bits, et le codage considère 1 pour un mot non valide et 0 pour un mot valide. Puisqu'il n'y a pas de consonne qui se couple à la fois avec M et H, il est possible de s'assurer qu'au moins un de ces bits est un 1.
Le 8ème bit est attribué à A, qui est la voyelle la plus courante, pour tenter de limiter les caractères non-ASCII (il en existe encore beaucoup).
Les tableaux utilisés sont ci-dessous. Pour les mots contenant 2 voyelles, j'ai donné la priorité à la première lettre en tant que "voyelle" et la deuxième lettre en tant que "lettre". Les mots commençant par M constituent une exception à cette règle, car cela évite les conflits entre MM et HM.
Codage Hex de mots commençant par une voyelle
Codage hexadécimal de mots se terminant par une voyelle
la source
Java,
484448407391389 octetsMon premier essai
Formaté:
Essayez-le en ligne
la source
\n
par un espace. Ils ne doivent pas être séparés par de nouvelles lignes."".format
est douloureux à regarder, mais hilarant.Ruby, 166 octets
Emprunter la méthode soignée de sp3000 pour encoder les mots dans une chaîne compacte. Le kicker est ici la méthode courte pour le décoder en mots de deux lettres: Utiliser un lookahead dans la regex passé à la méthode de scan de String afin d’extraire les correspondances qui se chevauchent, ne contenant pas d’espace:
Ruby, 179 octets
Ma propre approche: générer tous les mots de deux lettres entre
AA
etZA
, puis sélectionner ceux qui sont valides à l'aide d'un masque binaire codé en base 36:la source
Matlab, 177 octets
Générez une matrice binaire définissant toutes les paires de lettres autorisées, remodelez-la et codez-la en base 64. La chaîne codée en base 64 (
'CR+ ... % '
) est utilisée comme donnée dans le programme. Le programme inverse les opérations pour décompresser la matrice, puis lit les paires autorisées:la source
Malbolge , 2118 octets
Essayez-le en ligne!
la source
Bash, 179 octets
Il utilise
sed
pour faire le remplacement de regex. La première entrée de regex est basée sur l' idée de Sp3000 alors que la seconde regex utilise une entrée commune sans espaces.Explication:
la source
`grep -o ..
à la place de`sed -r 's/ / &/g'
, une astuce de ma réponse ci-dessous.Comme tous les mots ont deux caractères, nous pouvons les écraser tous ensemble, puis les déchirer à nouveau à l'aide d'une simple expression régulière.
Tout langage adapté aux expressions rationnelles peut le faire, certains plus efficacement que d’autres:
Grep (via Bash), 215 octets
Javascript, 224 octets
Perl, 225 octets
Python, 245 octets
Comme note, certaines des réponses ici sont plus longues que
echo
ce que je considérerais comme une base:Shell POSIX, 307 octets
la source
C -
228217 octets - GCCMettra à jour si je peux le réduire, compilez simplement avec gcc -w, les sorties ./a.out parfaitement. S'il y a un intérêt pour un non-golf, faites le moi savoir.
Je ne vois aucun moyen de le réduire rapidement (vous pouvez techniquement supprimer les guillemets dans les options de vente et vous obtiendrez toujours une réponse correcte, le résultat ressemblant à une poubelle), merci de me le faire savoir. de toute façon pour le raccourcir
la source
_;main(){char*z="AABDEGHILMNRSTWXY AEIOY EO DFHLMNRSTX AE O AEIMO DFNST O AI AIO AEIMOUY AEOU DEFHIMNPRSWXY AEI I E HIO AIO HMNPST EOU IEO A A ";for(;_++^26;)for(;*++z^32;printf("%c%c ",_+64,*z));}
. J'ai remplacé le délimiteur de sortie d'une nouvelle ligne par un espace extra octet) changez la chaîne de format printf en"%c%c\n"
C #, 348 octets
J'ai eu un essai:
Ungolfed:
la source
Pyth , 140 octets
Essayez-le en ligne!
Méthode de compression: comme il n’existe
Z
aucun mot dans la deuxième position, utilisez l’alphabet réordonnébcdfghjklmnpqrstvwxyaeiou
pour coder la validité de chacune de ces lettres en tant que deuxième lettre pour chaque première lettre (les premières lettres sont dans l’ordre alphabétique).Cela correspond à 25 bits par lettre, soit exactement 5 chiffres de la base 32. Comme la plupart des consonnes ne prennent que des voyelles comme deuxième lettre, je mets des voyelles à la fin pour obtenir des nombres à un chiffre. Je suis certain que, dans l’ensemble, il pourrait être amélioré par une analyse plus poussée et une réorganisation de l’alphabet, bien que la définition de l’alphabet réorganisé occuperait davantage d’octets.
Explication
la source
PHP:
211209204Vous devez désactiver les avertissements, sinon on va imprimer en ce qui concerne la création implicite de
$b
Très drôle. Les premières tentatives étaient de l’ordre de 250, mais c’est ma plus mince encore.
la source
!
si… vous en aviez besoin.CJam (99 bytes)
Cela inclut quelques caractères spéciaux, il est donc plus sûr de donner un vidage hexadécimal. (En particulier, le caractère avec valeur
0xa0
, correspondant à un espace insécable, m'a causé pas mal de problèmes lors de la configuration de la démonstration en ligne).Démo en ligne .
L'approche consiste à coder la différence en base 26.
la source
65f+:c
par'Af+
.md
c'est une amélioration brillante, mais je n'avais pas réalisé à quel point ma réponse était proche de la vôtre.CJam,
10098 octets(permalien)
Ceci est ma première entrée en CJam, donc il y a probablement un potentiel pour un peu plus de golf. Cependant, j'ai trouvé un moyen de réduire la liste de caractères à 63 octets, ce qui, espérons-le, sera utile à quelqu'un d'autre.
Méthode de compression
Jusqu'ici, la plupart des méthodes que j'ai vues encodaient les deux lettres de chaque mot. Cependant, lorsque nous plaçons les mots dans l'ordre alphabétique, la première lettre ne change pas très souvent, il est donc inutile de l'encoder explicitement.
Je ne code que le dernier caractère de chaque mot et j'inclus un élément spécial chaque fois que le premier caractère doit être incrémenté. Les caractères sont codés en tant que premier caractère, puis une liste de différences. Comme il n'y a pas de mots en double, les différences doivent être au moins
1
. Ainsi, je peux utiliser0
comme élément de séparation. (Notez que je dois alors stocker la première lettre de chaque sous-séquence sous la forme d'un index, sinon il y aurait une confusion entre 'survol du premier caractère0
' et 'commencer par A0
'.)Comme les différences dans ce cas ne sont jamais supérieures à 15, nous pouvons utiliser des bases 16 et intégrer deux éléments (4 bits) dans chaque octet (8 bits). (Dans le code actuel, j'ai converti à partir de la base 260 au lieu de la base 256 pour éviter les problèmes de caractères non imprimables.)
la source
G
etN
, qui pousse 16 et un saut de ligne.%-3<
par/;;
ou même/&
. (La deuxième option générera un message d'erreur. Le consensus sur les méta est qu'il est acceptable de le faire.)brainfuck , 1371 octets
Tout à fait golfable, mais je n'y ai pas mis beaucoup d'effort.
Essayez-le en ligne!
la source
Zsh, 175 octets
Cette solution utilise une chaîne de 125 caractères, où les lettres minuscules servent de délimiteurs et la première lettre de la séquence de lettres majuscules suivante.
Nous parcourons les lettres de
$L
. Si la lettre en cours$X
est en minuscule par comparaison ascii, définissez-la$W
sur$X
. Sinon, imprimez$W
concaténé avec$X
pour créer le mot actuel.Essayez-le en ligne!
Éditer: ajouté
:l
pour définir les minuscules de manière cohérente, selon les besoinsÉditer2: -4 octets à l'aide de la
$X
variable et simplifié si la[[..]]
conditionÉditer3: -4 octets en supprimant les guillemets (
"
)Éditer5: -5 octets à l'aide de la conversion de tableau au lieu de l'itération
L
ci-dessousÉditer4: Autre approche pour 182 octets , exploitant des chaînes réversibles dans les 33 premières lettres,
$L
n’est que 107 lettresla source
Stax , 91 octets
Exécuter et déboguer
La seule astuce intéressante utilisée par cette réponse consiste à utiliser le jeton "," pour indiquer un changement dans la première lettre, plutôt que de le stocker pour chaque mot.
Merci à récursif pour l'idée d'utiliser l'opérateur m
la source
M
au lieu de1/
, et utilisez une carte abrégéem
au lieu de explicite poureach et print{ ... PF
. Celui-ci emballe à 89.Python 3, 224 octets
Utilise des masques de bits de longueur variable pour coder les secondes lettres existantes pour chaque première lettre possible. Les masques de bits peuvent avoir une longueur de 0,1,3,7,15 ou 31 bits. Les bits sont mappés sur les lettres
for d in 'AOIEHMUSTMNDFPYBCGJKLQRVWXZ':
, les bits précédents sont utilisés pour les lettres plus courantes, de sorte que les masques de bits peuvent être courts dans la plupart des cas (généralement 3 ou 7 bits, car la plupart des consonnes sont uniquement suivies de l'une des 5 voyelles ou YM ou H). Malheureusement, le code à décoder annule les économies réalisées par rapport à des méthodes plus simples (la liste initiale ne contient que 303 octets).la source
Haskell, 192 octets
Pour chaque mot séparé par un espace dans la chaîne, placez la première lettre devant toutes les autres lettres et ajoutez un espace, par exemple
SHIO
->SH SI SO
.la source
Java, 334 octets
Formaté:
Séparément, j'ai codé la liste de mots en un bitSet de longueur 26x26 = 676, puis l'a convertie en tableau d'octets, puis en Base 64. Cette chaîne est codée en dur dans ce programme et la procédure inverse est utilisée pour reproduire le BitSet. et finalement imprimer la liste des mots
la source
Java, 356 octets
Utilise le générateur de nombres aléatoires pour obtenir les mots:
Ungolfed:
Vous pouvez l'essayer ici: http://ideone.com/Qni32q
la source
Perl, 248 octets
Première utilisation de perl (et première utilisation de golf), il y a donc matière à amélioration. Désactivez les voyelles et regroupez les lettres restantes en fonction de la manière dont le mot résultant a été créé - ajouter la voyelle en premier, en dernier ou les deux voyelles en premier et dernier crée un mot sur la liste.
la source
"MM "."MY "."BY "."HM "."SH "
pouvoir être raccourci à"MM MY BY HM SH"
.Javascript (ES6), 214
Peut-être pas le moyen le plus court de le faire, mais certainement intéressant.
Parcourt chaque lettre de la première chaîne en l'ajoutant à chaque lettre de la ligne correspondante de la seconde. Ceci retourne les mots dans l'ordre de leur dernière lettre, comme suit:
Suggestions bienvenues!
la source
Java,
255254 octetsJ'ai trouvé un moyen d'en extraire un octet de plus.
Ou (mais pas beaucoup plus clair):
la source
'A'
en65
.Haskell,
333308298 octetsJuste pour le fun!
L'évaluation
s
imprimera tous les mots dans un ordre étrange - j'ai utilisé le fait que la plupart des combinaisons sont voyelles-consonne ou vice-versa, pourrait probablement optimiser encore plus avec des "classes" de caractères personnalisés, raccourcissant la matrice codée (ici,w
etk
).Est-ce que quelqu'un connaît un moyen plus court d'imprimer des chaînes sans guillemets et crochets que celui monadique? Les classes de types sont encore plus longues, autant que je sache.
En outre, il pourrait également y avoir une façon plus courte de faire
p
le travail ...la source
sequence_
la même chosevoid$sequence
? Ensuite, vous pouvez également omettre leimport
.void
devait être importé. Quoi qu'il en soit, je vais / je dois m'en souvenir.sequence_$map putStrLn
estmapM_ putStrLn
. Remplacez le(
,)
autourconcat$...
d' une autre$
.05AB1E , 143 octets (non-concurrence)
Essayez-le en ligne!
la source
PHP, 170 octets
approche la plus courte que j'ai pu trouver jusqu'à présent ...
panne
Remarque La version de mappage binaire la plus courte avec l'ASCI imprimable coûte 190 octets (113 octets de données + 77 octets de décodage) avec 6 bits = base 64, 174 octets (97 données, 77 décodage) avec 7 bits (base 128); peut-être un peu plus pour s'échapper.
La base 224 (en utilisant ascii 32..255) prend 87 octets de données (+ d'échappement); mais je suppose que le décodage coûtera plus de 10 octets supplémentaires.
Exclure C et V de la carte permettrait d’économiser 16/14/13 octets sur les données mais coûterait beaucoup en décodage.
la source