Je n'aime pas les chaînes avec plus de trois voyelles d'affilée. Pouvez-vous écrire un programme qui supprime toutes les voyelles que je ne veux pas des mots?
Vous pouvez écrire un programme ou une fonction, en prenant une entrée via STDIN (ou l'alternative la plus proche), un argument de ligne de commande ou un argument de fonction et en sortant le résultat via STDOUT (ou l'alternative la plus proche), la valeur de retour de la fonction ou le paramètre de la fonction (out).
L'entrée est une chaîne contenant uniquement des caractères ASCII imprimables (0x20 à 0x7E, inclus).
La sortie est une chaîne contenant uniquement des séquences d'au plus 3 voyelles consécutives. S'il y a une séquence de plus de 3 voyelles consécutives dans la chaîne d'entrée, votre programme devrait produire une chaîne de sortie comprenant les trois premières voyelles rencontrées dans cette séquence, en éliminant toute autre voyelles consécutives.
Y n'est pas une voyelle aux fins de ce défi.
Il s'agit du code golf, donc le code le plus court (en octets) l'emporte.
Cas de test
"Aeiou" => "Aei"
"screeeen" => "screeen"
"We're queueing up for the Hawaiian movie." => "We're queung up for the Hawaiin movie."
"Spaces break runs: aei iou." => "Spaces break runs: aei iou."
aaYYAAaaaAERGH
.Réponses:
Pyth, 21 octets
Essayez-le en ligne: démonstration ou suite de tests
Explication:
Je parcourt tous les caractères et garde une trace du nombre de voyelles que j'ai passées à l'aide d'un compteur. Chaque fois que je passe un caractère, qui n'est pas une voyelle, je remets le compteur à 0. Je remets des caractères, chaque fois que le compteur est> 4.
la source
Illisible , 1647 octets
Explication
Ce programme est équivalent à un pseudocode comme celui-ci:
avec les affectations de variables suivantes:
Comme vous pouvez le voir, j'ai évité l'emplacement variable 0 car
0
c'est une constante si longue à écrire.Nous lisons donc chaque caractère et stockons la valeur dans
cp
etch
. Nous allons modifiercp
mais garderch
pour que nous puissions l'imprimer si nécessaire. Nous soustrayons successivement les nombres 65, 4, 4, 6, etc. decp
pour vérifier s'il s'agit de chacun des 10 caractères de voyelle possibles en ASCII (notez que le tout dernier n'a pas besoin d'être une affectation).vs
contient toujours 3 de moins que le nombre de voyelles pouvant encore être imprimées. Il commence à0
, donc 3 voyelles peuvent être imprimées. Quand il atteint-3
, nous arrêtons d'imprimer les voyelles.Si nous rencontrons une non-voyelle (y compris l'espace), nous exécutons
print(ch)
suivi devs = 0
. Comme vous l'avez probablement deviné, cela réinitialise le compteur de voyelles.Si nous rencontrons une voyelle , nous exécutons
((--vs)+4) ? print(ch) : (++vs)
. Décomposons cela:vs
;-4
, nous sommes allés trop loin, alors n'imprimez rien, maisvs
revenez à-3
ainsi nous continuerons à refuser d'imprimer les voyelles;la source
Rétine , 25 octets
Essayez-le en ligne.
Substitution de regex assez simple. Cela fonctionne également pour le même nombre d'octets:
la source
JavaScript (ES6), 42
En tant que fonction anonyme
la source
Perl, 27 caractères
(Code de 26 caractères + option de ligne de commande de 1 caractère)
Pas grand-chose, juste une rare occasion dont je me souviens
\K
.Exemple d'exécution:
la source
\K
". :)s/([aeiou]{1,3})(?1)+/$1/gi
.Sérieusement, 34 octets
Vidage hexadécimal:
Essayez-le en ligne
Il utilise le même algorithme que la réponse Pyth, mappant sur la chaîne tout en gardant une trace de la longueur de la course actuelle des voyelles dans un registre, l'incrémentant chaque fois que le caractère actuel est une voyelle et vérifiant s'il a dépassé la longueur autorisée, retourner 0 si c'est le cas, puis filtrer la chaîne d'origine avec ce filtre généré. Il sera beaucoup plus court une fois que nous pourrons utiliser la soustraction d'ensemble sur les chaînes. (Le
Ok
peut être supprimé etOkd
peut être remplacé par juste@
). J'ai entendu dire que cette fonctionnalité arrivera dans la prochaine mise à jour ....la source
C, 166 octets
pas la réponse la plus courte de loin mais joliment golfée je pense ..
cas de test:
la source
Mathematica, 68 octets
La réponse regex serait de la même longueur, mais qui utilise regex?
la source
Java, 115 octets
Attend l'entrée comme paramètre de programme.
Sortie de test unitaire:
la source
String[]
eta
.String[]a
print
plutôt queprintln
. Je ne crois pas que la spécification nécessite une nouvelle ligne de fin.APL, 40 caractères
En anglais:
'aeiouAEIOU'∊⍨' ',⍵
: trouver les voyelles (et ajouter un espace à casser lors de la rotation);(1-⍳4)⌽¨⊂
: tourner 0, 1, 2, 3 fois (avec bouclage) en poussant vers la droite le vecteur booléen;⊃+/ sum
: les rotations et déballer1↓4≠
: trouvez le différent de 4 et supprimez le premier (pour rassembler l'espace que nous avons ajouté)⍵/⍨
: dans l'argument, ne conservez que l'élément dont la somme était différente de 4.la source
Perl 6 ,
3635 octetsusage:
la source
C (205 octets)
(Un saut de ligne a été ajouté pour plus de clarté)
la source
Scala, 107 octets
la source
Javascript ES6, 43 caractères
Tester:
la source
Fichier x86 MS-DOS .COM ,
44 octets36 octetsLes fichiers .COM sont largement pris en charge de MS-DOS 1 à nos jours --- J'exécute dans dosemu, en utilisant uniquement les commandes 8086.
Réduit de 44 à 36 octets en utilisant REPNE SCASB pour tester les voyelles au lieu d'utiliser une commande distincte pour tester chaque voyelle.
la source
Matlab / Octave, 54 octets
Exemple:
Essayez-le à ideone .
la source
V , 21 octets (sans concurrence)
Essayez-le en ligne!
Explication:
C'est à peine plus court que la solution la plus simple:
(22 octets)
la source
Rubis, 44 octets
Exemple:
la source
$<.read
pour lui faire gérer l'entrée multiligne (contenant ainsi le caractère hors de portée 0x0a) au lieu degets
?