Повторіть риму і петлю на голосні


15

Рифма голосних: Яблука та банани

Існує традиційна дитяча пісня, яка повторює один і той самий текст знову і знову, лише кожен раз, коли кожен голосний замінюється випадковим голосним, але постійним по всій нинішній строфі.

Виклик

Мета - запропонувати найкоротший код, який виконує таке перетворення на вхідному тексті.

Правила

  1. Ви повинні надрукувати риму стільки разів, скільки в ній є різні голосні.
  2. Кожен друк повинен бути відокремлений розривом рядка (комбінація певної платформи \nта \rприймається).
  3. Для ітерації iзамініть кожну голосну iчастину різною голосною в початковому тексті.
  4. Вхідний текст - це послідовність друкованих символів ASCII (діапазон) [32, 126].
  5. Введення не міститиме вбудованих розривів рядків.
  6. Потрібно впливати лише на голосні символи, інші повинні виводитись точно як вхідні дані.
  7. Залічуються лише голосні символи: носові голосні звуки, хоча вони звучать як голосні (як у французькій "Tintin" ), не повинні оброблятися як одна голосна.
  8. Дело має значення для виводу, але є позиційним (заміна головного великого гласного виконується основним головним голосовим заміщенням)
  9. Великі голосні голоси не відрізняються від їх нижнього регістру (тобто a<=> A)
  10. Послідовні голосні завжди розглядаються окремо (т. BoatЕ. Вступає як Bootі Baat)
  11. Оскільки лист yє або голосним, або приголосним звуком (як ми говоримо англійською), поводження з ним як голосний або приголосний дозволено, однак у відповідях має бути чітко зазначено, чи вони поводяться yяк голосний чи ні.

Приклади:

Привіт Світ

Hello world!

дає:

Helle werld!
Hollo world!

Уривок з оригінального французького тексту (у перекладі) з yобробкою як голосна:

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

дає:

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...

Зверніть увагу на поведінку на головному голосному голосному: регістр зберігається у своєму індексі (правила 8 та 9).

Приклад безголосних

Введення, яке не містить жодної голосної, наприклад:

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

не повинно створювати жодного виходу або одного розриву рядка.

Одноголосне введення

Вхід, що містить одну голосну, виводиться так, як є.

Dad sat at a car and saw a fat bat.

дає:

Dad sat at a car and saw a fat bat.

Це , так що найменший виграшний код виграє (нічого, крім вічної слави PPCG)!

Відповіді:


6

Сітківка , 45 байт

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

Спробуйте в Інтернеті! Не вважається yголосним. Пояснення:

K`A\EI\OU

Замінює текст буквальним рядком A\EI\OU.

L$`\\?(.)

Кожна літера відповідає необов'язково передує косою рисою.

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

Виводить рядок коду сітківки для кожної літери.

~(

Оцінює згенерований код (показаний нижче) за допомогою оригінального введення. .Викликає код , щоб не виводити (кінцевий) буфера. /<vowel>/i&Викликає решту лінії , щоб працювати тільки тоді , коли вхідний сигнал містить задану голосний (регістронезавісімого). *Викликає результат лінії ігнорується, так що наступний голосний може бути перевірений. \Призводить до того результату , який буде надрукований на окремому рядку , перш ніж він буде проігнорований. У T`Vv`AAAAAaтранслітерує прописні Vowels до AAAAAs- і малими vowels до a. \Aце втеча , який відноситься до ASCII 07 (BEL), але E, не класова характер, але , до щастя , це також не втеча.)O і oвбудовані символьні класи , які потрібно екранувати , щоб дати їх літерні значення (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

Ммг, самогенеруючий код. Я не знаю Retina добре, але це вражає!
joH1

@ joH1 Ну, для мене вражаючий біт полягає в тому, що він врятував 60 байт!
Ніл


4

баш, 96 байт

Два рішення однакової довжини:

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;}

Спробуйте в Інтернеті!

Приймає введення як аргумент командного рядка і виводить в STDOUT.


4

05AB1E (спадщина) , 19 байт

(Побічно) збережений один байт завдяки Кевіну (друк безпосередньо всередині циклу, а не приєднання, робота лише у застарілій версії).

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

Спробуйте в Інтернеті!

Використовуючи перезапис Elixir, 20 байт

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

Спробуйте в Інтернеті! (безy) | Спробуйте в Інтернеті! y,žMзамінюєтьсяžO-ж саме відноситься до застарілої версії)

Як це працює

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.

Приємна відповідь, коротша за 21 байтну відповідь, яку я підготував. Ви можете пограти ще одним байтом за допомогою циклу та друку замість відображення: 19 байт . Ваш TIO з yтакож повинен використовувати 6замість 5, btw.
Кевін Кройсейсен

@KevinCruijssen Відредаговано, дякую! Щодо yверсії -vowel, я випадково скопіював неправильне посилання TIO, коли відповів: | ...
Містер Xcoder

Ах, тепер я знову знаю, чому я мав iсвій код. Ваша відповідь не відповідає для введення даних без голосних. Очікується, що це порожній вихід, але він фактично друкує сам вхід .. :(
Кевін Круїйсен

1
@KevinCruijssen 20-байтовий працює, тому я відкотив і зафіксував друге посилання.
Містер Xcoder

4

Japt v2.0a0 -R, 24 22 байти

Трактується yяк голосна. Зміна обох входжень \yдля \vрозглядати його в якості приголосного.

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

Спробуй це


Пояснення

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

3

Желе ,  23 20 18  17 байт

-2 Завдяки Еріку Переможнику

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

Щоб трактувати yяк голосну, замініть обидва cs на ys.

Спробуйте в Інтернеті!

Як?

Ø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

18 байт (тривіально) ( ż/на парі - Zдві діади поспіль, де ліва пара є монадою, мають аргументи між ними неявно)
Ерік Атголфер

Дякую ( Z> _ <), не впевнений, що відбувається з моїм сеансом TIO, але видалити зайве ðне вийшло; перезапуск виправлено.
Джонатан Аллан

ТБХ, я насправді виправив x€xтеж, але ти ніндзя мене. : P
Erik the Outgolfer

3

Червоний , 229 байт

Прийняття yнеголосного

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]]]

Спробуйте в Інтернеті!

Трохи легше читати:

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
        ]
    ]
]



2

JavaScript (Node.js) , 99 байт

Ласощі у як приголосний.

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

Спробуйте в Інтернеті!

Прокоментував

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

2

Java 10, 196 188 байт

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 байт завдяки @ joH1 .

Без y голосного для збереження байтів.

Спробуйте в Інтернеті.

Пояснення:

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

188 байт шляхом вбудовування змінної vв циклі
joH1

@ joH1 Дякую, не впевнений, як я пропустив це ..
Кевін Круїйсен



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.