Répétez une rime et une boucle sur les voyelles

15

Voyelles riment: pommes et bananes

Il y a une chanson traditionnelle pour enfants qui répète le même texte encore et encore, seulement chaque fois que chaque voyelle est remplacée par une voyelle aléatoire, mais constante dans la strophe actuelle.

Défi

L'objectif est de proposer le code le plus court qui effectue une telle transformation sur un texte d'entrée.

Règles

  1. Vous devez imprimer la rime autant de fois qu'il y a de voyelles distinctes.
  2. Chaque impression doit être séparée par un saut de ligne (combo \net\r est accepté).
  3. Pour l'itération i, remplacez chaque voyelle par lei voyelle distincte dans le texte original.
  4. Le texte saisi est une séquence de caractères ASCII imprimables (plage [32, 126] .
  5. L'entrée ne contiendra pas de sauts de ligne intégrés.
  6. Seuls les caractères des voyelles doivent être affectés, les autres doivent être sortis exactement comme entrée.
  7. Seuls les caractères des voyelles comptent: les voyelles nasales, bien qu'elles sonnent comme des voyelles (comme en français "Tintin" ), ne doivent pas être traitées comme une voyelle unique.
  8. Le cas est important pour la sortie, mais est positionnel (le remplacement d'une voyelle majuscule se fait par la voyelle de remplacement majuscule)
  9. Les voyelles majuscules ne sont pas distinctes de leur homologue minuscule (c'est a-à- dire <=> A)
  10. Les voyelles consécutives sont toujours considérées séparément (c.-à-d. BoatDonne les deux Bootet Baat)
  11. Étant donné que la lettre yreprésente soit une voyelle ou un son de consonne (comme nous parlons anglais), la traiter comme une voyelle ou une consonne est autorisée, mais les réponses doivent indiquer explicitement si elles se traitent ycomme une voyelle ou non.

Exemples:

Bonjour le monde

Hello world!

donne:

Helle werld!
Hollo world!

Extrait du texte français original (traduit), ytraité comme une voyelle:

An elephant that was rambling all gently in the woods...

donne:

An alaphant that was ramblang all gantla an tha waads...
En elephent thet wes rembleng ell gentle en the weeds...
In iliphint thit wis rimbling ill gintli in thi wiids...
Yn ylyphynt thyt wys rymblyng yll gyntly yn thy wyyds...
On olophont thot wos romblong oll gontlo on tho woods...

Notez le comportement sur la voyelle en majuscule: la casse est conservée à son index (règles 8 et 9).

Exemple sans voyelle

Entrée qui ne contient aucune voyelle, comme:

lgn@hst:~$ rm -rf ./* ~ /

ne doit produire aucune sortie ou un seul saut de ligne.

Entrée voyelle unique

L'entrée contenant une seule voyelle est sortie telle quelle.

Dad sat at a car and saw a fat bat.

donne:

Dad sat at a car and saw a fat bat.

C'est , donc le moins de code de bytecount gagne (rien que la gloire PPCG éternelle)!

joH1
la source

Réponses:

6

Rétine , 45 octets

~(K`A\EI\OU
L$`\\?(.)
./$1/i&$*\T`Vv`5*$&$L$&

Essayez-le en ligne! Ne compte pas ycomme voyelle. Explication:

K`A\EI\OU

Remplace le texte par la chaîne littérale A\EI\OU.

L$`\\?(.)

Correspond à chaque lettre éventuellement précédée d'une barre oblique inverse.

./$1/i&$*\T`Vv`5*$&$L$&

Génère une ligne de code Retina pour chaque lettre.

~(

Évalue le code généré (illustré ci-dessous) à l'aide de l'entrée d'origine. Le .fait que le code ne génère pas le tampon (final). Le /<vowel>/i&fait que le reste de la ligne s'exécute uniquement si l'entrée contient la voyelle donnée (sans tenir compte de la casse). Le *fait que le résultat de la ligne est ignoré, de sorte que la voyelle suivante peut être testée. Le \fait que le résultat soit imprimé sur sa propre ligne avant d'être ignoré. Le T`Vv`AAAAAatranslittère les Vchevilles en majuscules en AAAAAs et toutes les vchevilles en minuscules en a. \Aest une évasion qui fait référence à ASCII 07 (BEL), mais E, n'est pas une classe de caractère, mais heureusement , il est pas une évasion.)O et osont intégrés dans les classes de caractères qui doit être échappé pour donner leurs valeurs littérales (e

./A/i&*\T`Vv`AAAAAa
./E/i&*\T`Vv`\E\E\E\E\E\e
./I/i&*\T`Vv`IIIIIi
./O/i&*\T`Vv`\O\O\O\O\O\o
./U/i&*\T`Vv`UUUUUu
Neil
la source
Mmh, code auto-générateur. Je ne connais pas bien Retina mais c'est impressionnant!
joH1
@ joH1 Eh bien, pour moi, le bit impressionnant est qu'il a économisé 60 octets!
Neil
5

Rubis , 78 octets

->s{s.downcase.scan(/[aeiou]/).uniq.map{|v|s.tr"AEIOUaeiou",v.upcase*5+v}*?\n}

Essayez-le en ligne!

Une approche rapide et naïve. Y n'est pas considéré comme une voyelle.

Kirill L.
la source
4

bash, 96 octets

Deux solutions de longueur égale:

v=aeiouAEIOU;for x in `grep -o [$v]<<<$1|sed 's/./\L&&&&&\U&/'|awk !a[\\$0]++`;{ tr $v $x<<<$1;}
v=aeiouAEIOU;for x in `tr -cd $v<<<$1|sed 's/./\L&&&&&\U&\n/g'|awk !a[\\$0]++`;{ tr $v $x<<<$1;}

Essayez-le en ligne!

Prend l'entrée en tant qu'argument de ligne de commande et renvoie à STDOUT.

Poignée de porte
la source
4

05AB1E (hérité) , 19 octets

(Indirectement) sauvé un octet grâce à Kevin (imprimant directement à l'intérieur de la boucle plutôt que de se joindre, ne fonctionne que dans la version héritée).

lžMÃÙεžMDu«s5×Du«‡=

Essayez-le en ligne!

Utilisation de la réécriture Elixir, 20 octets

lžMÃÙεžMDu«s5×Du«‡}»

Essayez-le en ligne! (sansy) | Essayez-le en ligne! (avecy,žMétant remplacé paržO- il en va de même pour la version héritée)

Comment ça fonctionne

lžMÃÙεžMDu«s5×Du«‡}»     Full program. Example: "Hello"
l                        Convert the input to lowercase. "Hello" –> "hello"
 žMÃ                     Keep only lowercase vowels. "hello" –> "eo"
    Ù                    Remove duplicates. "eo" –> "eo"
     ε            }      For each of the characters (example with "e"):
      žMDu«              Yield "aeiouAEIOU"
           s5×           Swap, and repeat the current char 5 times. "e" –> "eeeee"
              Du«        Duplicate, uppercase and merge. "eeeee" –> "eeeeeEEEE"
                 ‡       Transliteration. For each item in B, replace it in A with
                         the corresponding item in C.
                   »     Join on newlines.
M. Xcoder
la source
Belle réponse, plus courte que la réponse de 21 octets que j'ai préparée. Vous pouvez jouer au golf un octet de plus en bouclant et en imprimant au lieu de mapper: 19 octets . Votre TIO avec ydevrait également utiliser à la 6place de 5, btw.
Kevin Cruijssen
@KevinCruijssen Modifié, merci! À propos de la yversion -vowel, j'ai accidentellement copié le mauvais lien TIO quand j'ai répondu: | ...
M. Xcoder
Ah, maintenant je sais à nouveau pourquoi j'avais le idans mon code .. Votre réponse échoue pour les entrées sans voyelles. Attendu est une sortie vide, mais il imprime en fait l'entrée elle-même .. :(
Kevin Cruijssen
1
@KevinCruijssen Le 20 octets fonctionne, donc j'ai annulé et corrigé le deuxième lien.
M. Xcoder du
4

Japt v2.0a0 -R, 24 22 octets

Traite ycomme une voyelle. Modifiez les deux occurrences de \yà \vpour le traiter comme une consonne.

v f\y â £r\y_Xc^H*ZøZu

Essayez-le


Explication

v                          :Lowercase
   \y                      :RegEx /[aeiouy]/gi (\v is /[aeiou]/gi)
  f                        :Get all matches as an array
      â                    :Deduplicate
        £                  :Map each X
         r\y               :  Replace all matches of the RegEx above in the input
             _             :  Pass matches through a function as Z
              Xc^          :    XOR the character code of X with
                 H*        :     32 multiplied by
                   Zø      :     Does Z contain
                     Zu    :      Uppercase Z
                           :Implicitly join with newlines and output
Hirsute
la source
3

Gelée ,  23 20 18  17 octets

-2 Merci à Erik le Outgolfer

ØcŒHZx5fƇðØc,yð€Y

Pour traiter ycomme une voyelle, remplacer les deux cs par ys.

Essayez-le en ligne!

Comment?

ØcŒHZx5fƇðØc,yð€Y - Link: list of characters, S
Øc                - vowels -> "AEIOUaeiou"
  ŒH              - split in half -> ["AEIOU", "aeiou"]
    Z             - transpose -> ["Aa", "Ee", "Ii", "Oo", "Uu"]
     x5           - times 5 -> ["AAAAAaaaaa", "EEEEEeeeee", "IIIIIiiiii", "OOOOOooooo", "UUUUUuuuuu"]
        Ƈ         - filter keep if:
       f          -   filter keep only -> those of X which have required vowels
                  -                       ...i.e. if S = "blah" then ["AAAAAaaaaa"]
         ð    ð€  - dyadic chain for €ach:
          Øc      -   vowels -> "AEIOUaeiou"
            ,     -   pair       e.g. ["AEIOUaeiou","AAAAAaaaaa"]
             y    -   translate  e.g. swap A for A, E for A, ...
                Y - join with newlines
Jonathan Allan
la source
18 octets (trivial) ( ż/sur une paire Z, deux dyades d'affilée où la gauche n'est pas appariée dans une monade ont implicitement l'argument entre les deux)
Erik the Outgolfer
Merci ( Z> _ <), je ne sais pas ce qui se passait avec ma session TIO, mais la suppression du redondant ðne fonctionnait pas; redémarrage fixe.
Jonathan Allan
TBH, j'ai en fait corrigé x€xaussi, mais tu m'as ninja. : P
Erik the Outgolfer
3

Rouge , 229 octets

Prendre ypour une non-voyelle

func[s][v: charset"aoeiu"w: charset"AOEIU"p: copy""parse s[any[[copy c[v | w](if not find p c[append p c lowercase c
parse s[any[[copy n to[v | w | end]](prin n)opt[v(prin c)|[w(prin uppercase copy c)]| skip]]]print""])]| skip]]]

Essayez-le en ligne!

Un peu plus lisible:

f: func [ s ] [
    v: charset "aoeiu"
    w: charset "AOEIU"
    p: copy ""
    parse s[ 
        any [
            [ copy c [ v | w ]
                ( if not find p c [ 
                    append p c
                    lowercase c
                    parse s [
                        any [
                            [ copy n to [ v | w | end ] ]
                                 ( prin n )
                            opt [ v ( prin c )
                                | [ w ( prin uppercase copy c ) ]
                                | skip
                                ]
                            ] 
                        ]
                    print ""
                ] )
            ]
            | skip
        ]
    ]
]
Galen Ivanov
la source
3

R , 138 , 129 octets

function(x,U=utf8ToInt,a=U(V<-'aeiouAEIOU'))for(i in (which(a%in%U(x))-1)%%5)cat(chartr(V,intToUtf8(rep(a[i+c(1,6)],e=5)),x),'
')

Essayez-le en ligne!

  • y n'est pas considéré comme une voyelle
digEmAll
la source
2

Python, 129 119 112 octets

import re
f=lambda s:'\n'.join(r('[AEIOU]',v.upper(),r('[aeiou]',v,s))for v in'aeiou'if v in s.lower());r=re.sub

Essayez-le en ligne!

y comme une voyelle.

-7 octets grâce à @ Mr.Xcoder

DimChtz
la source
Heureux de voir que vous pourriez le faire fonctionner et jouer un peu au golf! Beau travail
joH1
112 octets .
M. Xcoder
2

JavaScript (Node.js) , 99 octets

Friandises y comme consonne.

s=>(g=F=>Buffer(s).map(c=>2130466>>c&c>64?F(c):c)+`
`)(v=>g[v&=31]||(g[v]=S+=g(c=>c&96|v)),S='')&&S

Essayez-le en ligne!

Commenté

s => (                   // s = input string
  g = F =>               // g = helper function taking a callback function F
    Buffer(s)            // turn s into a Buffer
    .map(c =>            // for each ASCII code c in s:
      2130466            //   2130466 is a vowel bitmask: 1000001000001000100010
                         //                               u     o     i   e   a
      >> c               //   the ECMAScript specification enforces that the shiftCount is
                         //   the result of masking out all but the least significant 5 bits
      & c > 64           //   also make sure to ignore non-letter characters
      ?                  //   if a vowel is identified:
        F(c)             //     invoke F with c
      :                  //   else:
        c                //     just yield c
    ) + `\n`             // end of map(); coerce back to a string and append a newline
  )(v =>                 // invoke g with a callback that takes v:
    g[v &= 31] || (      //   unless this vowel has already been encountered:
      g[v] =             //     mark it as encountered
      S +=               //     and append to the output string S
      g(                 //     the result of another call to g:
        c => c & 96 | v  //       where vowels are replaced with v, using the original case
      )                  //     end of inner call to g
    ),                   //
    S = ''               //   start with S = ''
  ) && S                 // end of outer call to g; return S
Arnauld
la source
2

Java 10, 196 188 octets

s->{var d=new int[99];for(var c:s.toUpperCase().replaceAll("[^AEIOU]","").toCharArray())if(d[c]++<1)System.out.println(s.replaceAll("[AEIOU]",c+"").replaceAll("[aeiou]",(char)(c+32)+""));}

-8 octets grâce à @ joH1 .

Sans yvoyelle pour enregistrer les octets.

Essayez-le en ligne.

Explication:

s->{                       // Method with String parameter and no return-type
  var d=new int[99];       //  Integer-array indicating which vowels we've already output
  for(var c:s.toUpperCase()//  Convert the input to uppercase
            .replaceAll("[^AEIOU]","")
                           //  Remove all non-vowels
            .toCharArray())//  Convert it to a character array)
                           //  And loop over those vowel-characters
    if(d[c]++              //   Increase the vowel-count by 1
             <1)           //   And if it was 0 this iteration:
      System.out.println(  //    Print with trailing newline:
        s                  //     The input,
         .replaceAll("[AEIOU]",c+"")
                           //     with every uppercase vowel replace with the current vowel
         .replaceAll("[aeiou]",(char)(c+32)+""));}
                           //     and every lowercase vowel replaced as well
Kevin Cruijssen
la source
188 octets en insérant la variable vdans la boucle
joH1
@ joH1 Merci, je ne sais pas comment j'ai raté ça ..
Kevin Cruijssen
1

Python 2 , 112 octets

s=input()
V='aeiouAEIOU'
for v in V:
 if v in s.lower():print''.join([c,[v.upper(),v][c>'Z']][c in V]for c in s)

Essayez-le en ligne!

Traite ycomme une consonne.

Chas Brown
la source
1

Java (OpenJDK 8) , 184 octets

y est une voyelle

s->s.chars().mapToObj(c->""+(char)(c>96?c:c+32)).filter("aeiouy"::contains).distinct().forEach(c->System.out.println(s.replaceAll("[aeiouy]",c).replaceAll("[AEIOUY]",c.toUpperCase())))

Essayez-le en ligne!

Roberto Graham
la source