C'est un défi assez facile.
Défi
L'entrée contiendra une chaîne (non null
ou vide) d'une longueur maximale de 100. Produisez le nombre de voyelles dans chaque mot de la chaîne, séparées par des espaces.
Règles
- La chaîne ne dépassera pas 100 caractères.
- La chaîne ne contient que alphabets
A-Z
,a-z
et peut également contenir des espaces. - L'entrée doit être consommée à partir des
stdin
arguments de ligne de commande ou. - La sortie doit être sortie dans le
stdout
. - Vous pouvez écrire un programme complet ou une fonction qui prend une entrée dans le
stdin
et produit le résultat. - Les voyelles que votre programme / fonction doit compter sont
aeiou
etAEIOU
.
Cas de test
This is the first test case --> 1 1 1 1 1 2
one plus two equals three --> 2 1 1 3 2
aeiou AEIOU --> 5 5
psst --> 0
the quick brown fox jumped over the lazy dog --> 1 2 1 1 2 2 1 1 1
Notation
Il s'agit de code-golf , donc la soumission la plus courte (en octets) l'emporte.
stdin
avecstdout
. Je n'aime pas "obtenir d'entrée" via les arguments de la fonction. les arguments de la ligne de commande semblent corrects. Je l'ai ajouté dans le post.The name "vowel" is often used for the symbols that represent vowel sounds in a language's writing system, particularly if the language uses an alphabet. In writing systems based on the Latin alphabet, the letters A, E, I, O, U, and sometimes Y are all used to represent vowels. However, not all of these letters represent vowels in all languages.
Qu'entendez-vous par voyelles?Réponses:
Pyth, 17 octets
Solution simple. Essayez-le en ligne: démonstration ou test harnais
Explication:
la source
C,
113 108 10396 96 octetsMerci @ andrea-biondo pour une économie particulièrement agréable de 5 octets.
Cela semble toujours un peu gonflé, donc j'espère que je pourrai le réduire quelques octets plus tard ce soir.
La partie intéressante est peut-être que
sera
1
sic
est une voyelle ASCII (majuscule ou minuscule), et0
pour les autres caractèresa-zA-Z
. La sous-expressionc-65&31
mappe'a'
et'A'
vers0
,'b'
et'B'
vers2
, etc. Lorsque nous ajoutons33
les voyelles correspondent33, 37, 41, 47, 53
respectivement aux nombres , qui sont tous (commodément) premiers. Dans notre gamme, seuls ces nombres se diviseront124701951 = 33*37*41*47*53
, c'est-à-dire que pour les voyelles, le reste124701951%(...)
sera nul.EDIT: De cette façon, on peut considérer l'expression
!(n%((c-65&31)+s))
où(n,s) = (124701951, 33)
comme déterminer si le personnagec
est une voyelle. Dans les commentaires @ andrea-biondo a souligné que la paire(n,s) = (2016,28)
peut également être utilisée dans cette expression pour déterminer la voyelle. Je vais laisser l'explication actuelle en termes de nombres premiers ci-dessus, mais la raison pour laquelle cet appariement plus court fonctionne est à nouveau parce que dans la plage 28--53, les seuls nombres avec des facteurs premiers entièrement dans l'ensemble des facteurs premiers de 2016 sont 28, 32, 36, 42, 48, qui correspondent précisément aux voyelles.EDIT2: 5 autres octets enregistrés depuis
(c-65&31)+28
peuvent être raccourcisc%32+27
.EDIT3: converti en boucle do-while pour finalement le faire descendre en dessous de 100 octets.
Cas de test:
la source
a;
extérieurmain
. De cette façon, vous réduisez certains octets car vous n'avez pas besoin de déclarera
dansmain(...)
et aussi, pas besoin d'initialiser àa
partir de la boucle.a
est réinitialisé à chaque boucle, vous ne pouvez donc pas l'initialiser une fois à zéro en déclarant global. J'ai écrit un petit bruteforcer pour trouver la plus petite(n, s)
paire telle quen%((c-65&31)+s)
zéro pour les voyelles et non nulle pour les consonnes (az, AZ). J'ai trouvé(2016, 28)
et cela semble bien fonctionner:!(2016%((c-65&31)+28))
est 5 caractères plus court. Quoi qu'il en soit, très belle solution :)CJam,
2119 octetsComment ça marche :
Essayez-le en ligne ici
la source
R,
4443 octetsNon golfé + explication:
la source
Perl,
35343130
caractères+1
pour-n
.Comme beaucoup de code Perl, cela fonctionne de droite à gauche.
split
divisera la ligne entrée sur les espaces.map
exécutera le code entre{}
sur chaque mot qui a été divisé.lc
rend le mot en minuscule.=~y/aeiou//
nous donnera le nombre de voyelles..$"
ajoutera un espace au mot.say
imprime ensuite tous les mots!Courir avec:
la source
Python 3, 65 octets
Très simple, assez lisible.
w
représente le mot,c
représente le caractère.la source
Perl: 30 caractères
(Type de force les règles: les nombres dans la sortie sont séparés avec autant d'espaces que les mots d'entrée.)
Exemple d'exécution:
Perl: 27 caractères
(Juste pour montrer à quel point ce serait court si je n'oublie pas la
y///
valeur de retour de. Encore une fois. Maintenant, allez voter pour la réponse de chilemagic qui m'a rappelé lay///
valeur de retour de.la source
s!\w+!lc($&)=~y/aeiou//!ge
le réduit à27
octets (26 caractères +1 pour le-p
.y///
. :(Rubis, 38 octets
Usage:
la source
JavaScript ( ES6 ), 68
E / S via popup. Exécutez l'extrait dans Firefox pour tester.
la source
Rebol - 70
la source
PowerShell, 35 octets
Un peu ennuyeux, mais en compétition pour une fois? (PowerShell ne respecte pas la casse par défaut, woo)
la source
echo <word> | code
, où <mot> est votre mot ou expressionCoup - 85
Explication
read l
lire une ligne de l'entréefor w in l
divise la ligne en mots à l'aide du séparateur d'espacesx=${w//[^aouieAOUIE]/}
supprime tout sauf les voyelles du mot${#x}
est la longueur de la chaîne résultante === nombre de voyellesla source
while
..do
..done
serait plus court. Pas non plus besoin du dernier/
dans la substitution de modèle. Et un seul espace littéral est échappé plus court que cité.read l;for w in $l;do x=${w//[^aouieAOUIE]};echo -n ${#x}\ ;done;echo
Julia,
76726965 octetsNon golfé + explication:
Cela comprendra un seul espace de fuite, dont on me dit qu'il est légitime.
la source
Mathematica, 95 octets
Je ne gagnerai aucun concours, mais ...
la source
InputString
existe dans l'interface Web, c'est une boîte de dialogue dans Mathematica.)InputString
prend la ligne d'entrée suivante.golflua, 55 octets
Correspondance de base des voyelles après les minuscules forcées. Un équivalent (non golfé) de Lua serait
la source
gsub('[aeiouAEIOU]','')
et à sauterlower()
.R , 139 octets
La lecture / écriture de stdout () est terrible
la source
cat()
plutôt quewrite(..., stdout())
.Python 3, 72 octets
Inspiré par @randomra de réponse . C'est
la même longueurlégèrement plus longue, mais en utilisant l'expression régulière au lieu de la compréhension de la liste. C'est aussi moins lisible.la source
import re;print(*map(len,re.sub("[^aeiou ]","",input()).split()))
. (Utilisez la nouvelle ligne au lieu de;
si vous le souhaitez.)2
est l'indicateur insensible à la casse) et divisé par" "
afin qu'il puisse y avoir 0PHP - 94
Version non golfée
la source
Objective-C, 223 octets
Pas le langage le plus compact, mais ça marche.
Version non compressée:
la source
Matlab, 73 octets
Votre défi n'est pas très clair (mais il est intéressant). je suppose
a
,e
,i
,o
,u
.Code:
la source
rs , 50 octets
Cela ne compte pas vraiment; rs a été téléchargé environ 2 semaines après sa publication. Cependant, évidemment, cela ne gagnerait rien de toute façon, donc c'est toujours cool.
Démo en direct.
L'implémentation est assez simple:
la source
Perl,
6045Merci à kirbyfan64sos de m'avoir sauvé 15 octets - ça m'a vraiment aidé!
Notez qu'il y a un espace supplémentaire à la fin de la sortie.
la source
split
en définissant l'ajout$/=" ";
et vous pouvez raccourcir le préfixe de boucle àwhile(<>)
. Avec ces deux changements, le code devient$/=" ";while(<>){$n=()=/[aeiou]/gi;print"$n "}
, économisant 14 octets!Haskell,
7668 octetsMise en œuvre simple, je ne sais pas s'il y a quelque chose à jouer au golf ici.
la source
KDB (Q), 30 octets
Explication
Tester
la source
Smalltalk - 66
72C'est dans Smalltalk / X; les noms de stdin et stdout peuvent être différents dans squeak / pharo.
Dans Smalltalk / X (et de nombreux autres dialectes), les symboles comprennent #value :, donc il peut être abrégé en 66 caractères:
Si codé comme une fonction qui obtient la chaîne comme argument "s":
Bien sûr, en code réel, on utiliserait une fonction utilitaire "f", qui retourne un vecteur des comptes, et l'imprimerait. Cependant, le format de sortie n'est alors pas exactement ce que le défi demandait:
la source
Python 2, 76 octets
J'ai fait cela avant de voir toute autre solution, puis j'ai vérifié pour trouver deux solutions P3 qui sont plus courtes :( Limitations Darn P2.
la source
PowerShell, 65 octets
tester en utilisant le modèle ci-dessous après avoir enregistré en tant que
vowels.ps1
De cette façon, c'est un script réel et pas seulement un extrait de code satisfaisant ainsi la contrainte:
"L'entrée doit être consommée à partir des arguments stdin ou de la ligne de commande."
la source
Gelée , 7 octets
Essayez-le en ligne!
Trouvé avec l'aide de M. Xcoder dans le chat
Explication
Si la sortie doit être séparée par des espaces, ajoutez un
K
à la finla source
SAS, 72
Le format d'E / S restrictif pour celui-ci fait vraiment mal à celui-ci car il est responsable de 25 octets ici.
la source
C # 186
la source
AEIOU
.