Ecrivez un programme ou une fonction qui produira une chaîne donnée en escalier, en écrivant chaque partie d'un mot commençant par une voyelle une ligne au-dessous de la partie précédente.
Par exemple:
Input: Programming Puzzles and Code Golf
Output: Pr P C G
ogr uzzl and od olf
amm es e
ing
Contribution
Une chaîne ne contenant que des lettres et des espaces.
La chaîne peut être passée via STDIN
ou des arguments de fonction ou tout équivalent.
Les lettres peuvent être minuscules ou majuscules.
Les entrées sont toujours supposées suivre ces règles, vous n'avez pas besoin de vérifier les entrées incorrectes.
Sortie
Chaque fois qu'une voyelle (qui est, a
, e
, i
, o
, u
ou y
) se rencontre en un mot, vous devez sortir le reste du mot sur la ligne suivante (la voyelle rencontrée inclus), à la position horizontale correcte. Cette règle est récursive, ce qui signifie que s'il y a n voyelles, le mot sera écrit sur n + 1 lignes.
La voyelle doit être écrite au début de la ligne suivante et non à la fin de la ligne précédente quand on en rencontre une.
Chaque mot commence sur la première ligne et doit donc être formaté indépendamment des autres mots. Deux mots sont séparés par un espace.
Si un mot commence par une voyelle, vous devez l'écrire à partir de la deuxième ligne.
Cas de test
- Contribution:
Programming Puzzles and Code Golf
Sortie:
Pr P C G
ogr uzzl and od olf
amm es e
ing
- Contribution:
The quick brown fox jumps over the lazy dog
Sortie:
Th q br f j th l d
e u own ox umps ov e az og
ick er y
- Contribution:
aeiouy
Sortie:
a
e
i
o
u
y
- Contribution:
YEAh UppErcAsE VOwEls
Sortie:
V
Y Upp Ow
E Erc Els
Ah As
E
- Contribution:
If you only knew the power of the Dark Side
Sortie:
kn th p th D S
If y onl ew e ow of e ark id
o y er e
u
Notation
C'est du code-golf , donc le code le plus court gagne.
The vowel should be written at the beginning of the next line, and not at the end of the previous line when one is encountered.
Après réflexion, je comprends que cela signifie que le passage à la ligne suivante doit avoir lieu avant que la voyelle ne soit imprimée, mais pas après, mais cela vaut peut-être la peine d’énoncer cela d’une manière tout à fait compréhensible - cela m’a pris un certain temps.Réponses:
Retina ,
504434(+10)3230 octetsMerci à Dennis d’avoir enregistré 14 octets en utilisant les caractères de contrôle réels.
Sur la base de cette réponse , j'utilise des codes d'échappement ANSI pour déplacer le curseur du terminal verticalement. Le
<ESC>
doit être remplacé par le caractère de contrôle 0x1B et<VT>
par la tabulation verticale0x0B
. Pour des tests plus simples, vous pouvez également remplacer<ESC>
par\e
,<VT>
avec\v
et alimenter la sortieprintf
.Pour le comptage, chaque ligne est placée dans un fichier séparé. Cependant, pour des raisons pratiques, il est plus simple de coller le code dans un fichier unique et d’appeler Retina avec l’
-s
option.Le premier remplacement entoure chaque voyelle dans
\v...#
, où le\v
curseur est déplacé vers le bas et le#
est un marqueur pour la deuxième étape. Lai`
est la notation de Retina pour la correspondance insensible à la casse.Ensuite, la deuxième étape (
+`
) supprime a#
de manière répétée a d'un mot et place un ae\[A
à la fin du mot qui déplace le curseur vers le haut. Cela s'arrête une fois que la chaîne cesse de changer, c'est-à-dire qu'il n'y a plus de#
marqueurs dans la chaîne.la source
printf
. Il suffit de remplacer\e
par l'octet ESC (0x1b).CJam,
3936 octetsCe qui précède est un vidage xxd réversible, car le code source contient le caractère non imprimable VT (point de code 0x0b) et ESC (point de code 0x1b).
Comme cette réponse , il utilise des tabulations verticales et des séquences d'échappement ANSI .
Cela nécessite un terminal vidéo texte compatible, qui inclut la plupart des émulateurs de terminal non Windows.
Essai
Avant d'exécuter le code actuel, nous allons désactiver l'invite et effacer l'écran.
Cela garantit que la sortie est affichée correctement.
Pour restaurer l'invite, exécutez ceci:
Comment ça marche
Nous insérons une tabulation verticale avant chaque voyelle pour déplacer le curseur vers le bas et suffisamment de copies de la séquence d'octets 1b 5b 41 (
"\e[A"
) après chaque espace pour ramener le curseur sur la première ligne.la source
unset PS1save
après.Java, 428 octets
Je sais, c'est horrible. Il y a probablement des personnages dont on peut se débarrasser, mais je suis trop paresseux pour le faire.
la source
int
variables ( à savoiri
,r
,p
,o
etx
) où vous initialisezl
etm
car ils vont donner des valeurs plus tard. Vous pouvez également faireString v="...",a[]=...;
et faire comme ci-dessus pourString u
. Cela devrait réduire votre score un peu.x++-~-p
Perl, 31 octets
Ce qui précède est un vidage xxd réversible, car le code source contient le caractère non imprimable VT (point de code 0x0b) et ESC (point de code 0x1b).
Le code a une longueur de 27 octets et nécessite les commutateurs
040p
(4 octets).Le programme nécessite un terminal vidéo texte prenant en charge les onglets verticaux et les séquences d'échappement ANSI , qui inclut la plupart des émulateurs de terminal non Windows.
Essai
Avant d'exécuter le code actuel, nous allons désactiver l'invite et effacer l'écran.
Cela garantit que la sortie est affichée correctement.
Pour restaurer l'invite, exécutez ceci:
Comment ça marche
perl -040p
lit automatiquement l'entrée sous forme de tokens (-040
) séparés par des espaces , enregistre chaque jeton dans$_
(-p
) et exécute le programme.s/[aeiouy]/.$&/gi
effectue une recherche globale et insensible à la casse$_
des voyelles et remplace chaque voyelle par le caractère de contrôle VT (déplace le curseur vers le bas), suivi de la voyelle elle-même.s
renvoie le nombre de remplacements effectués,$\=".[A"x s...
enregistre donc plusieurs copies de la séquence d'octets 1b 5b 41 (déplace le curseur vers le haut)$\
, une pour chaque voyelle.À la fin du programme, Perl imprime automatiquement à
"$_$\"
cause du-p
commutateur.la source
C,
200190 octetsUngolfed:
Il alloue un tampon rectangulaire (en fait un carré), le remplit d'espaces et de nouvelles lignes, puis traverse la chaîne donnée. À la fin, il ajoute un caractère nul pour éviter les retours à la ligne.
Techniquement, ce n'est pas une fonction puisqu'elle contient des globaux; en fait, il ne peut pas être appelé plus d'une fois (
j
etl
doit être 0 au début). Pour se conformer,i,j,k,l,M;
peut être déplacé versint i,j=0,k,l=0,M;
au début de la fonction.la source
char*t=malloc(M*M);
->char t[M*M];
etfor(i=0;i<M*M;++i)
->for(;i<M*M;++i)
char t[M*M]
?CJam, 47 ans
Oui, c'est un peu long, mais ce n'est pas "tricher" avec les codes ANSI :)
Essayez-le en ligne
L'idée est de calculer un numéro de ligne pour chaque caractère (en commençant à 0, en incrémentant les voyelles et en revenant à 0 en espace), puis pour chaque ligne, répétez la chaîne en remplaçant les caractères qui ont un numéro de ligne différent par un espace. .
la source
K,
81727066 octetsEh bien, c'est un début:
Exemples d'utilisation:
Modifier 1:
Mieux. Quelques améliorations au niveau de la surface:
J'ai notamment inversé les arguments en faveur de
?
la recherche de voyelles et éliminé ainsi le besoin d'un lambda, effectué la même inversion que_
lorsque je divisais les mots sur des espaces, et je me suis rendu compte que~{" "?x}'x
c'était une façon de dire vraiment stupide et trop compliquée" "=x
.Edit 2:
Une autre modification de niveau de surface -
s
avant de l’appliquer sur le lambda, en économisant les parens à l’intérieur:Edit 3:
OK, adoptons une approche différente pour calculer le décalage pour chaque caractère. Au lieu de scinder la séquence au niveau des espaces et de calculer une somme courante (
+\
) des positions des voyelles, nous pouvons agir sur la chaîne en entrée entière en un seul passage, en multipliant la somme courante par 0 chaque fois que nous rencontrons un espace. J'ai besoin de la négation de cette séquence pour pouvoir soustraire au lieu d'ajouter et numériser et utiliser number-of-distinct (#?
) au lieu de max (|/
) lorsque je calcule la quantité de remplissage vertical.Cela sauve 4 autres personnages. Phew!
la source
Ruby:
135131124115112 caractèresÉchantillon échantillon:
la source
/(?=[aeiouy ])/i
.C, 192 octets
Cela parcourt la chaîne en effaçant les caractères au fur et à mesure qu'il les imprime. Il se répète jusqu'à ce qu'il ne reste plus de caractères autres que des espaces à imprimer. C'est un C portable, ne supposant rien sur l'encodage des caractères.
Version lisible
la source
' '
->32
etf(char*s){int l=0,r=1,v,c;
->l,r=1,v,c;f(char*s){
' '
peut- être32
, mais cela dépend de l'encodage des caractères, et comme je l'ai dit, j'ai créé ce lecteur C. portable. Abandonner l'explicite,int
c'est génial, mais je ne sais pas pourquoi j'ai oublié ça!Python 3,
265207202185177 caractèresC'est terrible et je ne suis pas fier. Je sais que cela peut être raccourci, mais je pensais publier de toute façon.
Inspiré par la version C, il crée une liste qui est ensuite remplie en traversant la chaîne d'entrée.
la source
GNU Sed, 151 + 1
(+1 car il faut le
-r
drapeau)Je pensais que sed serait l'outil pour ce travail, mais je l'ai trouvé étonnamment difficile.
Version lisible:
la source
p
, aussi ne produit-il rien. Un petit problème est que les sorties commencent par un espace supplémentaire. Un gros problème est que ce premier texte commençant par une voyelle disparaisse.c
, à cause de la ligne juste avanttx
. J'ai rétabli une version antérieure avec sa boucle similaire et j'aurai une autre tentative plus tard.Python 2,
145142 octetsN’est probablement pas aussi compétitif que d’autres méthodes, mais j’ai pensé que c’était une façon amusante d’utiliser regex.
La regex
(?!([^aeiouy ]*[aeiouy]){N}[^aeiouy]* ).
correspond à n'importe quel caractère ne faisant pas partie du Nième groupe de lettres à partir de la fin d'un mot. Puisqu'il compte depuis la fin du monde, j'inverse la chaîne avant et après, et je dois aussi ajouter un espace à la fin, mais après cela, il devient simple dere.sub
remplacer toutes les occurrences de ces caractères par un espace. Il le fait pour chaque valeur de N jusqu'à ce que la chaîne soit vide.la source
re.I
, vous pouvez économiser 3 octets en substituant la valeur de drapeau appropriée, c.-à-d2
.Octave,
132129 caractèresTester
Contribution:
"YEAh UppErcAsE VOwEls"
Sortie:
la source
Gema :
5348 caractèresNotez que
^[
(x1b) et^K
(x0b) sont des caractères uniques. (Dans l'exemple ci-dessous, j'utilise leurs copieurs-copieurs\e
et leurs\v
équivalents, au cas où vous souhaiteriez l'essayer.)Échantillon échantillon:
la source
Gelée , 42 octets (non compétitif?)
Essayez-le en ligne!
Pourquoi gelée, pourquoi? :-(
la source