Votre tâche consiste à écrire un programme qui produira une liste lisible de tous les mots de cinq lettres avec la structure suivante:
consonne - voyelle - consonne - voyelle - consonne
La sortie doit être triée alphabétiquement avec un mot par ligne et aucun mot ne doit être répété deux fois. Il peut être en minuscule ou en majuscule mais pas mélangé. Donc, la liste pourrait commencer et se terminer comme ceci:
babab
babac
babad
...
zyzyw
zyzyx
zyzyz
Les voyelles sont a - e - i - o - u - y , les 20 autres lettres de l 'alphabet anglais sont des consonnes.
Les mots ne doivent pas nécessairement être des mots du dictionnaire.
Le code le plus court gagne.
Remarque: Il y a quelques années, je suis tombé sur un programme sur un site Web universitaire qui faisait exactement cela. Il s'avère que mon prénom et mon nom de famille correspondent à la contrainte cvcvc, et que je me cherchais moi-même.
Réponses:
Mathematica,
726561 octetsPour les tests, je recommande de remplacer
Print@@@
par""<>#&/@
. Mathematica affichera ensuite une forme tronquée indiquant les premiers et derniers mots au lieu de prendre indéfiniment 288 000 lignes.Explication
J'ai finalement trouvé un usage pour diviser des chaînes. :)
J'ai été intrigué par la possibilité d'ajouter ou de multiplier des chaînes pendant un moment, mais les cas d'utilisation réels sont assez limités. Le point principal est que quelque chose comme
"foo"+"bar"
ou"foo"*"bar"
(et par conséquent la forme abrégée"foo""bar"
) est tout à fait valable dans Mathematica. Cependant, il ne sait pas vraiment quoi faire avec les chaînes dans les expressions arithmétiques, donc ces choses ne sont pas évaluées. Mathematica ne s'applique généralement applicables si simplifications. En particulier, les chaînes seront triées dans l'ordre canonique (ce qui est assez compliqué dans Mathematica, une fois que vous commencez à trier des chaînes contenant des lettres de casse différente, des chiffres et des non-lettres), ce qui est souvent un dealbreaker, mais cela n'a pas d'importance ici. . En outre,"abc""abc"
sera simplifié pour"abc"^2
(ce qui pose un problème lorsque vous avez répété des chaînes, mais nous ne l’avons pas non plus), et quelque chose comme"abc"/"abc"
va réellement annuler (que nous utiliserons même).Alors, qu'essayons-nous de jouer au golf ici. Nous avons besoin d'une liste de voyelles et d'une liste de consonnes pour pouvoir les alimenter
Tuples
et générer toutes les combinaisons possibles. Ma première approche a été la solution naïve:Cette liste de consonnes codée en dur fait un peu mal. Mathematica possède une fonction
Alphabet
intégrée qui me permettrait de l'éviter si je pouvais supprimer les voyelles de manière économique. C'est là que ça devient difficile. Le moyen le plus simple de supprimer des éléments estComplement
, mais cela finit par être plus long, en utilisant l'une des options suivantes:(Notez que nous n'avons plus besoin d'appliquer
Characters
à l'ensemble, carAlphabet[]
donne une liste de lettres, pas une chaîne.)Essayons donc cette affaire d'arithmétique. Si nous représentons tout l'alphabet comme un produit de lettres au lieu d'une liste, nous pouvons supprimer les lettres par simple division, en raison de la règle d'annulation. Cela économise beaucoup d'octets car nous n'en aurons pas besoin
Complement
. En outre,"a""e""i""o""u""y"
est en fait un octet plus court queCharacters@"aeiouy"
. Nous faisons donc cela avec:Où nous stockons les produits de consonnes et de voyelles dans
a
etb
, respectivement. Cela fonctionne en écrivant une fonction qui multiplie tous ses arguments avec##
et les divise par le produit des voyelles. Cette fonction est appliquée à la liste alphabétique, qui transmet chaque lettre en tant qu'argument séparé.Jusqu'ici tout va bien, mais maintenant nous avons
comme argument à
Tuples
, et ces choses sont toujours des produits, pas des listes. Normalement, le moyen le plus rapide de remédier à ce problème consiste à mettre unList@@@
à l'avant, ce qui transforme à nouveau les produits en listes. Malheureusement, l'ajout de ces 7 octets le rend plus long que l'approche naïve.Cependant, il s'avère que
Tuples
peu importe la tête des listes intérieures. Si tu fais(Oui, pour un indéfini
f
.) Vous obtiendrez:Juste comme si vous aviez utilisé un
List
au lieu def
. Nous pouvons donc passer ces produits directementTuples
et obtenir le bon résultat. Cela permet d'économiser 5 octets sur l'approche naïve en utilisant deux chaînes codées en dur.Maintenant,
"a""e""i""o""u""y"
c'est toujours assez ennuyant. Mais attendez, nous pouvons économiser quelques octets ici aussi! Les arguments de notre fonction sont les lettres individuelles. Donc, si nous choisissons juste les bons arguments, nous pouvons les réutiliser au lieu des littéraux de chaîne, ce qui est plus court pour trois d'entre eux. Nous voulons des arguments#
(court pour#1
),#5
,#9
,#15
,#21
et#25
. Si nous plaçons#
à la fin, nous n’avons pas non plus besoin d’ajouter d’autres*
pour les multiplier, car (regex)#\d+
est un jeton complet auquel aucun non-chiffre ne peut être ajouté. Par conséquent, nous nous retrouvons avec#5#9#15#21#25#
, économisant encore 4 octets.la source
Tuples
tour. C'est entièrement non documenté, non? Et inattendu compte tenu du fait que le formulaire à deux entrées permetTuples[list,n]
delist
ne pas avoir laList
tête (du moins pour moi)!List
. La tête à chaque niveau dans les tableaux générés parTuples
sera la même que la tête de liste .Tuples[f[{1,2}, {3,4}]]
donne à la{f[1, 3], f[1, 4], f[2, 3], f[2, 4]}
place. Il n'est pas documenté que la tête interne est complètement ignorée.Perl, 47 octets
Compter le shebang comme un.
Essayez-le en ligne!
la source
say
?-M5.01
devrait être "gratuit".-M5.010
. Et la partie la plus intéressante du golf ne doit pas être remplacéeprint
parsay
...-E
(et par la suitesay
) un billet de faveur?Python 3 - 110 octets
Amusement en boucle simple :)
la source
Ruby,
72 7152 octetsMerci à Value Ink pour l’idée de base, qui a ramené cela à 60 octets.
la source
grep
. Si vous générez une plage qui utilise des chaînes en minuscule, vous obtenez uniquement une séquence de mots en minuscule.puts ("babab".."zyzyz").grep /#{["[^aeiouy]"]*3*"[aeiouy]"}/
pour 60 octets05AB1E ,
1816 octets05AB1E utilise le codage CP-1252 .
Explication
À des fins de test, je recommande de remplacer
žP
par quelques consonnes etžO
quelques voyelles.Exemple utilisant 5 consonnes et 3 voyelles
la source
Python 2 ,
12010294 octetsEssayez-le en ligne!
la source
Pure Bash, 74 ans
Expansion d'accolade simple.
Essayez-le en ligne .
Si chaque article doit être sur sa propre ligne, alors nous avons:
Pure Bash, 84
la source
PHP,
88868480 octetsjoli incrément de chaîne :)
6 octets enregistrés par @Christoph
boucles à travers toutes les chaînes de
bababa
lazyzyz
et des tests si elles correspondent au modèle. Courez avec-nr
.la source
$a="001";$a++;
un jour. C'était un changement très peu pratique.for($s=$v=aeiouy;++$s<zyzza;)preg_match("#[^$v][$v][^$v][$v][^$v]#",$s)&&print"$s\n";
vous sauve 1 caractère. Malheureusement, vous devez modifier l’écho pour pouvoir l’utiliser&&
. Le remplacement\n
par un véritable saut de ligne en sauvegarde un autre."#([^$v][$v]){2}[^$v]#"
mais je ne l’ai pas testé.([^$v][$v]){2}[^$v]
ne fonctionne pas dans la boucle, alors que[^$v]([$v][^$v]){2}
ça marche . Les deux fonctionnent de manière autonome (même avec la variable) cependant.MATL , 21 octets
Essayez-le en ligne! (mais la sortie est tronquée).
la source
11Y2'y'h2Y2yX~yyy&Z*
( Essayez-le en ligne! )vcvcv
motif, pascvcvc
comme il se doit. Merci quand même!Python, 92 octets
Ne peut pas laisser
itertools
gagner. Itératif est 1 octet plus long dans Python 2.la source
Haskell,
5451 octetsmapM func list
construit tous les mots en prenant les caractères possibles pour l’index i dans la liste renvoyée parfunc (list!!i)
.Edit: @xnor a trouvé 2 octets à sauvegarder et en regardant sa solution, j'ai trouvé un autre.
la source
mapM id$take 5$cycle["bcdfghjklmnpqrstvwxz","aeiouy"]
enregistre un octet.mapM(cycle["bcdfghjklmnpqrstvwxz","aeiouy"]!!)[0..4]
oumapM(["bcdfghjklmnpqrstvwxz","aeiouy"]!!)[0,1,0,1,0]
. Il serait bien de ne pas coder en dur les voyelles et les consonnes, maismapM(\n->[x|x<-['a'..'z'],elem x"aeiou"==odd n])[0..4]
ne le fait pas tout à fait.cycle
de votre première variante par une récursion explicite enregistre un octet supplémentaire.Brachylog , 18 octets
Essayez-le en ligne!
Explication
la source
g
etb
, mais le tester, c'est parce quej
semble refuser de prendre une liste de chaînes comme entrée?:ea
montre vraiment les atouts de Prolog / Brachylog, et constitue une étape que la plupart des autres langues trouvent beaucoup plus difficile.g
etb
étaient nécessaires.j
semble être un bug et cela est dû une fois de plus à la difficulté de distinguer une liste d'arguments d'une liste. Je pourrais résoudre ce problème, mais cela complexifiera encore une fois la mise en œuvre. Je pourrais aussi bien ne pas régler le problème et investir mon temps à résoudre le problème central dans une nouvelle version de Brachylog.JavaScript (ES6),
9190 octetsÉdite
for
instructionExplication
This defines a 5-deep recursive function that uses the parity of its depth of call to determine whether to iterate vowels or consonants. On each iteration, it checks to see whether to recurse or print by checking the amount of recursions left, and concatenates the letter of its current iteration to the end of the 5 character string that is currently being built depth-first.
Solution alternative à 89 octets utilisant le codage ISO8859-1:
Solution alternative à 96 octets qui renvoie la sortie entière en tant que chaîne unique:
Courez à vos risques et périls. Pour la solution à 91 octets, utilisez simplement
f()
et pour l'option à 97 octets, utilisezconsole.log(f())
.la source
f=(s='',i=2)=>(for(c of(i%2?'aeiouy':'bcdfghjklmnpqrstvwxz'))for(q of i?f(s+c,i-1):[s+c])q)
utilisation de la forme standard est malheureusement un octet plus long: l'function*f(s='',i=2){for(c of(i%2?'aeiouy':'bcdfghjklmnpqrstvwxz'))yield*i?f(s+c,i-1):[s+c]}
attente du jour où un générateur est l'option la plus courte ...for...of
déclaration pour enregistrer un octetC,
201199186184183169163 bytesDoing it a bit differently than with the previous basic counting method:
Ungolfed:
And written in a bit more conventional way:
Basically, i are the counters, and s the array of strings containing all the chars over which we should iterate, for each counter. The trick is the inner while loop: it is used to increment the counters, starting from the rightmost one. If we see that the next character we should display is the ending null char, we restart the counter to zero and the "carry" will be propagated to the next counter.
Thanks Cristoph!
la source
char *c
I think the space is unnecessary.f(){char*c="bcdfghjklmnpqrstvwxz",*v="aeiouy",i[]={0,0,0,0,0},*s[]={c,v,c,v,c},j=0;while(j>=0){for(j=0;j<5;++j)putchar(s[j][i[j]]);for(;--j>=0&&!s[j][++i[j]];)i[j]=0;puts("");}}
gets you to 177. Come on you can do even better ;).i[5]={0}
instead ofi[]={0,0,0,0,0}
saves 7 bytes.Perl, 71 bytes
Try it online!
Explanation
I'll add more explanations later.
map{push@{1+/[aeiouy]/},$_}a..z;
creates two arrays:@1
contains the consonants, and@2
contains the vowels.glob
when call with arguments like{a,b}{c,d}
returns all permutations of the elements in the braces.la source
Befunge, 95 bytes
Try it online!, although note that the output will be truncated.
This is just a loop over the range 0 to 287999, outputting the index as a mixed based number 20-6-20-6-20, with the "digits" of the number retrieved from the tables on the last two lines.
la source
Perl 6, 70 bytes
Explanation of the interesting part:
The code before that just generates the list of vowels (
$_
) and the list of consonants (c
), which is regrettably verbose.la source
Python 2,
120117 bytesThanks to @WheatWizard for the tabs tip.
Try it online!
Not sure that this can be golfed much. Try it online truncates at 128KB but shows enough to give an idea. A local run with debug code to count the words gave a total of 288000. Runs in about 45 seconds if anyone wants to test.
Non-compliant and therefore non-competing version (prints out nested arrays instead of the specified format) for 110 bytes:
la source
Perl 6, 53 Bytes
Takes a little time to have any output. Very inefficient. Does the job.
la source
xeger, 49 bytes
Given a regular expression, xeger simply generates all matching strings. In order not to kill the browser, it pauses every 1000 outputs and you need to click to continue, but it'll get there eventually.
Here's a 23-byte version with a bug in
^
fixed:These are character classes "all lower-case ASCII consonants"
[:c]
withy
excluded^y
, and "all lower-case ASCII vowels"[:v:]
withy
added.la source
&
.[bcdfghj-np-tvwxz]
.JavaScript (Firefox 30-57), 82 bytes
Returns an array of strings. Very fast version for
102101 (1 byte thanks to @ETHproductions) bytes:la source
CJam,
32312928 bytesSaved 2 bytes thanks to Martin Ender and 1 byte thanks to kaine
Try it online! (Note that the output gets cut off on TIO)
Explanation
la source
'{,97>
to get the alphabet. And then"aeiouy"_'{,97>^
to save another byte on1$
.Stacked, noncompeting, 51 bytes
Pretty simple. Try it here!
la source
Perl,
635954 bytesTrying Perl golf for a change.
EDIT: Looks like I've still got much to learn... :)
la source
/$b[^$a]/&&say for"a"x5.."z"x5
to save a few bytes. Edit: and you can drop the$b
and do$a="aeiouy";/([^$a][$a]){2}[^$a]/&&say for"a"x5.."z"x5
.aeiouy
. Also, since your regex checks for 5 characters, you can doa.."z"x5
.$a
and$b
as variable names, because those don't need to be declared even in strict mode... :) I also use Perl 6 a lot these days, which doesn't even have a non-strict mode.Scala,
8786 bytesla source
f"$c$d$e$f$g"
with""+c+d+e+f+g
to save a byte.R,
143132 bytesThis is my first go at code golf so I'd welcome any suggestions to chop it down further. So far it's all pretty standard R; the only possibly tricky thing here is that paste0 recycles its arguments to the length of the longest one.
Edit: used assignment trick from rturnbull, replaced
sapply(x,length)
withlengths
.la source
R,
11198 bytesAdded
y
as a vowel, and golfed off 13 bytes, thanks to @Patrick B.We use
expand.grid
to generate all possible combinations ofV
andC
in a matrix, which we define from the preset variableletters
(the alphabet). We reverse the combinations (as the default is for the first variable to rotate the fastest) to ensure alphabetical order. Then we iterate through each row of the matrix, printing each letter to stdout. We use thefill
argument tocat
to ensure that each word begins on a new line.la source
Clojure, 101 bytes
Not that exciting...
la source
Ruby,
6561 bytesCompletely different approach:
New things I learned today: the Array#product function
la source
C 361 bytes
Ungolfed version:
There must be some way to shorten this definitely.
Explanation
la source