Votre programme doit trouver tous les mots de cette liste de mots qui contiennent toutes les voyelles ( a e i o u y
). Il existe des moyens faciles de le faire, mais je cherche la réponse la plus courte. Je prendrai n'importe quelle langue, mais j'aimerais voir Bash.
Voici un exemple (pourrait être beaucoup amélioré):
cat wordlist.txt | grep "a" | grep "e" | grep "i" | grep "o" | grep "u" | grep "y"
Votre score est la longueur du code.
-5 points pour compter toutes les occurrences du mot.
Le score le plus bas l'emporte.
code-challenge
natural-language
Le docteur
la source
la source
Réponses:
GolfScript, 20 caractères - 5 = 15 points
Basé sur la solution de Howard , mais en utilisant un test plus court (
\-!
enregistre un caractère de plus&,6=
), un ajout de longueur plus court (.,+
= 3 caractères) et un formatage de sortie plus court (personne n'a dit que la sortie devait être séparée par des`
sauts de ligne, donc enregistre un caractère de plusn*
).Voici la sortie, étant donné la liste de mots en minuscules en entrée (sauts de ligne insérés pour plus de lisibilité):
(Ps. Techniquement, étant donné que le défi dit seulement que le code doit fonctionner pour cette entrée spécifique,
n%{'aeiouy'\-!},`43
serait encore un caractère plus court. Je considère que la tricherie, cependant.)Explication:
n%
divise l'entrée des sauts de ligne en un tableau.{ },
est un opérateur "grep", exécutant le code entre les accolades pour chaque élément du tableau et sélectionnant ceux pour lesquels il renvoie une valeur vraie.'aeiouy'\-
prend la chaîne littéraleaeiouy
et en supprime tous les caractères trouvés dans le mot candidat. le!
alors annule logiquement la chaîne résultante, donnant1
(vrai) si la chaîne est vide et0
(faux) si ce n'est pas le cas..,+
crée une copie du tableau filtré, compte le nombre de mots qu'il contient et ajoute le résultat au tableau d'origine.`
annule le tableau, le convertissant en une représentation sous forme de chaîne de son contenu. (Sans cela, les mots du tableau seraient simplement concaténés dans la sortie, ce qui donnerait un gâchis illisible.)la source
GolfScript, 19 caractères
Usage:
Sortie:
Si vous souhaitez également sortir le nombre à la fin, vous pouvez utiliser
ce qui fait quatre caractères de plus.
la source
Python - 46 caractères
Version lisible: Elle est déjà assez lisible :-)
la source
APL, 21 - 5 = 16
Attend de trouver la liste des mots comme
w
. Renvoie une liste des mots qui contiennent toutes les voyelles, plus leur nombre. Testé avec ngn apl . Voici un exemple .Explication
la source
Rubis 38
Edit 34: Meilleur jusqu'ici (de @OI):
Edit 1: Je viens de remarquer que la question demandait que «y» soit inclus parmi les voyelles, j'ai donc édité ma question en conséquence. Comme @Nik l'a souligné dans un commentaire à sa réponse,
"aeiouy".chars
c'est un personnage de moins que%w[a e i o u y]
, mais je laisse ce dernier, pour la diversité, même si je risque des cauchemars sur l'opportunité manquée.Edit 2: Merci à @OI d'avoir suggéré l'amélioration:
ce qui sauve 11 caractères de ce que j'avais avant.
Edit 3 et 3a: @OI en a supprimé quelques autres:
puis
et encore (3b):
Je suis un simple scribe!
Voici deux autres solutions non compétitives:
Au départ, j'avais:
s
est une chaîne contenant les mots, séparés par des retours à la ligne. Un tableau de motss
contenant les cinq voyelles est renvoyé. Pour les lecteurs peu familiers avec Ruby,%w[a e i o u y] #=> ["a", "e", "i", "o", "u", "y"]
et&
c'est l'intersection des tableaux.Supposer
Dans le bloc
{...}
, initialementdonc "abréviations" n'est pas sélectionné.
Si la chaîne
s
peut contenir des doublons,s.split.select...
peut être remplacée pars.split.uniq.select...
pour supprimer les doublons.Je viens de remarquer que je pouvais enregistrer 1 caractère en remplaçant
size==6
parsize>5
.la source
...size=5
est un bug - devrait l'être...size==5
s.split.select{|w|'aeiouy'.delete(w)==''}
s.split.select{|w|'aeiouy'.tr(w,'')==''}
. Je suis presque sûr que vous pouvez obtenir moins de 40 caractères si vous utilisez une logique nulle et la méthode de chaîne «correcte». Toujours à la recherche ...Haskell - 67
la source
Ruby - 28 caractères (ou 27 si
y
est exclu des voyelles)La commande complète à exécuter est (48 caractères):
EDIT: remplacé
puts
parp
comme suggéré par @CarySwovelandla source
%w[a e i o u]
sauverait 1 char,p
pourputs
, 3 de plus.p
, je l'utilise rarement. Quant à% w [], si y est inclus dans l'ensemble des voyelles, la version avec les caractères est encore plus courte."aeiouy".delete(s)==''
pourrait vous faire économiser quelques caractères.AWK - 29
Pour exécuter: enregistrez la liste des mots en minuscules dans
wordlist.txt
. Alors fais:Si votre système n'en a pas
mawk
,awk
peut également être utilisé.Vous pouvez également l'exécuter à partir d'un fichier en enregistrant le programme dans
program.awk
et en faisantmawk
ouawk
-f program.awk
.la source
'/y/&&/u/&&/i/&&/o/&&/a/&&/e/'
!!Python, 45 caractères
la source
k [22-5 = 17 caractères]
J'ai renommé le fichier "corncob_lowercase.txt" en "w"
Comptez les mots [22 caractères]
Sortie
Trouver tous les mots [25 caractères]
Au total 43 mots contenant toutes les voyelles
(a e i o u y)
Sortie
la source
Javascript / JScript 147 (152-5), 158 (163-5) ou 184 (189-5) octets:
Voici ma version Javascript et JScript horriblement "non golfée" (
164152152-5 = 147 octets):function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r.length]=s[k]);}return r;}
function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=6;for(z in c)i-=!!s[k].search(c[z]);i&&(r[r.length]=s[k]);}return r;}
Merci @GaurangTandon pour la
search()
fonction qui m'a fait économiser un octet!RegExp basé sur des performances HORRIBLE , mais prend en charge les majuscules et les minuscules (163-5 = 158 octets):
function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=RegExp(c[z],'i').test(s[k]);i==6&&(r[r.length]=s[k]);}return r;}
RegExp basé sur de MEILLEURES performances, MAIS prend beaucoup plus d'octets (189-5 = 184 octets):
function(s,k,z,x,i,c,r,l){l=[];r=[];for(z in c='aeiouy'.split(''))l[z]=RegExp(c[z],'i');for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=l[z].test(s[k]);i==6&&(r[r.length]=s[k]);}return r;}
Celui-ci est juste pour le plaisir (175-5 octets) et ne comptera pas comme réponse:
function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r[r.length]=s[k]]=1+(r[s[k]]||0));}return r;}
Il est basé sur la 1ère réponse, mais a un 'twist': vous pouvez savoir combien de fois un mot a été trouvé.
Vous faites simplement ça:
var b=(function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r[r.length]=s[k]]=1+(r[s[k]]||0));}return r;})('youaie youaie youaie youaie a word');
b.youaie //should be 4
Puisque cela
length
n'a pas toutes les voyelles, il ne sera pas supprimé et serait toujours une réponse pour le bonus.Comment l'appelez-vous?
"Simple": vous encapsulez la fonction à l'intérieur
()
puis ajoutez('string goes here');
à la fin.Comme ça:
(function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r.length]=s[k]);}return r;})('a sentence youyoy iyiuyoui yoiuae oiue oiuea');
Cet exemple retournera un tableau uniquement avec 1 chaîne: yoiuae
Je sais que c'est la pire solution, mais ça marche!
Pourquoi je compte -5?
Eh bien, les tableaux Javascript / JScript ont une propriété (
length
) dans les tableaux qui indique le nombre d'éléments qu'il possède.Après avoir été confirmé dans la question, le bonus de -5 est pour indiquer le nombre de mots.
Puisque le nombre de mots est dans cette propriété, j'ai automatiquement le score de -5.
la source
search()
lieu d'indexOf()
enregistrer 1 caractère..split()
activer"aeiouy"
. JS boucle sur un tableau et une chaîne de la même manière. (Le supprimer vous permet d'économiser ~ 10 caractères)Rubis
3938Actuellement, l'entrée Ruby la plus courte lors du comptage de l' ensemble du programme, y compris les entrées et les sorties.
Enregistré un caractère en utilisant
map
au lieu deeach
:Une autre version, 39 caractères avec une sortie plus jolie:
Les deux programmes prennent l'entrée de stdin ou sous la forme d'un nom de fichier transmis comme argument de ligne de commande:
$ ruby wovels.rb wordlist.txt
Il en coûte 3 personnages supplémentaires pour inclyde
y
comme une pelle.la source
Enumerable#grep
pour raccourcir cela? par exemple, ens.split.grep /a*e*i*o*u*y/
supposants
est une chaîne de mots séparés par des retours à la ligne..*
entre les wovels.s = "aeiouy\neiouay\nyuaioe\n"
. Puiss.split.grep /a*e*i*o*u*y/
revient["aeiouy", "eiouay", "yuaioe"]
pour moi. Test danspry
Ruby 2.0.0. Au fait, c'est une excellente solution.grep
utilisé l'=~
opérateur, mais apparemment il utilise===
. Je soupçonnais que cela correspondrait également à des chaînes ne contenant pas toutes les wovels, parce que, par exemple, cela/e*a*i*o*u*y/=~"eioy"
fonctionne. Je ne comprends vraiment pas ce que fait réellement===
entre une expression régulière et un opérateur. Grande trouvaille; Je vous suggère de le poster comme réponse vous-même. edit j'avais raison: essayez avec par exemple"heya"
.Mathematica (65 ou 314)
Deux approches très différentes, la meilleure a été proposée par Bélisaire dans les commentaires de ma réponse initiale. Tout d'abord, mon effort brutal, qui génère de manière algorithmique toutes les expressions régulières possibles qui correspondent à une combinaison de six voyelles (y compris "y"), puis vérifie chaque mot de la liste de mots cible par rapport à chacune de ces 720 expressions régulières. Cela fonctionne, mais ce n'est pas très concis et c'est lent.
~ 320 caractères. Quelques-uns pourraient être enregistrés en utilisant une notation alternative et des caractères supplémentaires sont perdus lors de la préparation du fichier de dictionnaire sous forme de liste de chaînes (le format naturel du dictionnaire dans Mathematica. D'autres langues peuvent ne pas avoir besoin de cette préparation, mais Mathematica en a). Si nous omettons cette étape, en supposant qu'elle a été gérée pour nous, la même approche peut être effectuée en moins de 250 caractères, et si nous utilisons le dictionnaire intégré de Mathematica, nous réalisons des économies encore plus importantes,
Moins de 200 caractères. Pour compter le nombre de mots trouvés, il suffit de transmettre le résultat à
Length[Flatten[]]
, qui peut être ajouté autour de l'un des blocs de code ci-dessus, ou peut être effectué ensuite avec, par exempleLength@Flatten@%
,. La liste de mots spécifiée pour ce défi donne 43 correspondances, et le dictionnaire Mathematica donne 64 (et est beaucoup plus rapide). Chaque dictionnaire a des mots correspondants pas dans l'autre. Par exemple, Mathematica trouve «non professionnel», qui n'est pas dans la liste partagée, et la liste partagée trouve «eucaryote», qui n'est pas dans le dictionnaire de Mathematica.Belisarius a proposé une solution bien meilleure. En supposant que la liste de mots a déjà été préparée et affectée à la variable
l
, il définit un test unique basé sur laStringFreeQ[]
fonction de Mathematica , puis applique ce test à la liste de mots à l'aide de laPick[]
fonction. 65 caractères, et c'est environ 400 fois plus rapide que mon approche.la source
f@u_:=And@@(!StringFreeQ[u,#]&/@Characters@"aeiouy");Pick[l,f/@l]
oùl
est la liste des motsy
comme une voyelle (selon les exigences OP!)Perl 6 - 35 caractères
Inspiré par la solution Ruby de @CarySwoveland:
Ceci permet de sélectionner (
grep
s) chaque ligne que les rendementsTrue
pour<a e i o u y> ⊆ *.comb
, qui est juste une façon de fantaisie de demander « est l'ensemble('a','e','i','o','u','y')
un sous - ensemble (⊆
) de l'ensemble composé des lettres de l'entrée (*.comb
)? »En fait, les deux
<a e i o u y>
et*.comb
seulement créer desList
s:⊆
(ou(<=)
si vous êtes coincé en ASCII) les transforme enSet
s pour vous.Pour obtenir le nombre de lignes imprimées, ce 42 caractères - 5 = 37 points script de affichera cela également:
la source
C - 96 octets
J'ai sauvé plusieurs octets de parenthèses grâce à une heureuse coïncidence de priorité des opérateurs.
la source
Javascript - Score = 124 - 5 = 119 !!!
Modifier: 17/02/14
Un grand merci à @Ismael Miguel pour m'avoir aidé à couper ~ 12 caractères !
J'ai supprimé le formulaire de la fonction de notation des flèches grasses parce que même si je l'ai vu commencer à l'utiliser, cela ne fonctionne pas. Je ne sais pas pourquoi ...
Pour le faire fonctionner:
Passez tous les mots séparés par un saut de ligne comme argument à la fonction comme indiqué ci-dessous.
Tester:
la source
k="aeiouy".split("")
pour être à l'intérieur de lafor(i in k)
boucle. L'utilisation;
au lieu de nouvelles lignes enregistre certains octets dans Windows. Et pourtant, je ne vois pas comment cela va gérer une liste de mots. Et comment le faire fonctionner.k="aeiouy";o=0;for(i in k)
, essayezo=0;for(i in k='aeiouy')
. et en utilisant les octets de sauvegarde, vous pouvez les utiliser pour changero+=RegExp(k[i]).test(s)
eno+=RegExp(k[i],'i').test(s)
, en prenant un octet de plus, mais en travaillant avec les majuscules et les minuscules.Bash + coreutils, 39
Prend l'entrée de stdin.
la source
sed 29 caractères
Ordre choisi parmi la fréquence des lettres sur wikipedia pour vérifier la vitesse.
Sur mon hôte:
et
la source
Bash (grep) - 36 octets
Notez l'ordre des voyelles testées, les moins fréquentes en premier. Pour le cas de test, cela s'exécute environ 3 fois plus vite que le test dans l'ordre aeiou y. De cette façon, le premier test supprime un plus grand nombre de mots afin que les tests suivants aient moins de travail à faire. Évidemment, cela n'a aucun effet sur la longueur du code. De nombreuses autres solutions publiées ici bénéficieraient de la même manière des tests dans cet ordre.
la source
D - 196
Non-golfé :
Utilisation :
C:\>rdmd vowels.d wordlist.txt
wordlist.txt
doit contenir les mots de la liste en minuscules.la source
Rebol (104 caractères)
Non-golfé:
d
contient maintenant la liste des mots trouvés. Voici un exemple de la console Rebol:la source
Smalltalk (36/57 caractères)
pour obtenir le nombre, envoyez #size à la collection résultante. La collection de résultats contient 43 mots («sans retenue» «avec autorité» ... «sans conteste» «sans reconnaissance»)
Le code ci-dessus a 77 caractères, mais j'aurais pu renommer le fichier de liste de mots en 'w', donc je compte le nom de fichier comme 1, ce qui donne un score de 57.
La lecture du fichier fait-elle partie du problème ou non? Sinon (voir d'autres exemples), et que la liste de mots est déjà dans une collection c, alors le code se réduit à:
qui est de 36 caractères (avec les espaces omis supprimés).
la source
mis à jour: espaces inutiles supprimés
Très lent mais en bash (81 caractères):
EDIT:
echo $l|fold -w1
remplacé parfold -w1<<<$l
comme suggéré par @ nyuszika7hla source
fold -w1<<<$l
au lieu deecho $l|fold -w1
. Remarque: Le code actuel est de 84 caractères, vous ne devez pas compter la nouvelle ligne de fin.JavaScript - 95 octets
Voici mon golf.
Et je voudrais également souligner que votre golf ne semble pas trouver toutes les occurrences de voyelles.
Non golfé:
la source
(?=.*a)
vérifier s'il sea
trouve quelque part dans la chaîne.trier + uniq + sed
Celui-ci ne correspond pas aux occurrences répétées d'un mot. Il ne correspond pas non plus à la lettre «y» si elle apparaît au début d'un mot.
la source
Frapper
Pas aussi court que les PO, mais une ligne dans Bash:
la source
C # - 170
Formaté:
Pas d'humeur en ce moment à implémenter le comptage mais devrait être facile.Le chemin d'accès à la (liste en minuscules de la) liste de mots doit être transmis au programme comme premier argument:Sortie:
J'ai pris la liberté de sortir et de séparer les mots par des virgules; ni l'un ni l'autre n'est spécifié dans les règles (qui stipulent "doit trouver tous les mots", pas comment (et IF) sortir)
Dont compte (+ sortie): 192 - 5 = 187
Sortie:
(Notez le nombre à la fin: 43)
Aucune sortie ("doit trouver tous les mots"): 137 - 5 = 132
(Flexion des règles un bitm puis à nouveau: pas vraiment) Cela trouve tous les mots et le décompte est disponible en exécutant
r.Count()
.la source
C-Sharp
Je n'ai jamais fait cela auparavant et je ne sais pas exactement quelles sont les procédures d'affichage. Mais c'est ce que j'ai trouvé:
185 octets
wordList
= aList<string>
de tous les mots.si vous souhaitez afficher un total:
219 - 5 = 214 octets
Étendu
la source
vb.net (Score 91 = 96c - 5) * 0
* 0 + 49c min
Cela crée une énumération contenant tous les mots qui contiennent toutes les voyelles.
la source
Your program must find all the words in this wordlist
. Ceci n'est pas un programme mais un extrait de programme et b) ne lit / n'utilise pas la liste de mots.Mathematica -
136102Le lien raccourci va à http://www.mieliestronk.com/corncob_lowercase.txt
la source
http://bit.ly/1iZE9kY
.Characters["aeiou"]
or more if you includey
.