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

15

Рифмы гласных: яблоки и бананы

Существует традиционная детская песня, которая повторяет один и тот же текст снова и снова, только каждый раз, когда каждый гласный заменяется случайным гласным, но постоянным в текущей строфе.

Вызов

Цель состоит в том, чтобы предложить кратчайший код, который выполняет такое преобразование для входного текста.

правила

  1. Вы должны печатать рифму столько раз, сколько в ней четких гласных.
  2. Каждый оттиск должен быть отделен переводом строки (для каждой платформы выбран комбо \nи \rпринимается).
  3. Для итерации iзамените каждый гласный iгласным в исходном тексте.
  4. Вводимый текст представляет собой последовательность печатных символов ASCII (диапазон [32, 126].
  5. На входе не будет вставленных разрывов строк.
  6. Должны быть затронуты только гласные символы, остальные должны выводиться точно как ввод.
  7. Учитываются только гласные символы: носовые гласные, звучащие как гласные (как в французском «Тинтин» ), не должны обрабатываться как один гласный.
  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.

Это , поэтому выигрывает меньше всего кода bytecount (ничего, кроме вечной славы PPCG)!

joH1
источник

Ответы:

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$&

Выводит строку кода Retina для каждой буквы.

~(

Оценивает сгенерированный код (показан ниже) с использованием исходного ввода. .Вызывает код , чтобы не выводить (конечный) буфера. /<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 (legacy) , 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.
Мистер Xcoder
источник
Хороший ответ, короче, чем 21-байтовый ответ, который я подготовил. Вы можете сыграть в гольф еще один байт, зациклив и напечатав вместо отображения: 19 байт . Ваш TIO с yдолжен также использовать 6вместо 5, кстати.
Кевин Круйссен
@KevinCruijssen Отредактировано, спасибо! Что yкасается версии -vowel, я случайно скопировал неправильную ссылку TIO, когда ответил: | ...
Mr. 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гласным заменить обаc s на 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две диады подряд, где левая непарная в монаде имеет неявный аргумент между ними)
Эрик Outgolfer
Спасибо ( Z> _ <), не уверен, что происходило с моим сеансом TIO, но удаление избыточности ðне работало; перезагрузка исправлена.
Джонатан Аллан
TBH, я на самом деле тоже исправил x€xно ты меня ниндзя. : P
Эрик 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
        ]
    ]
]
Гален Иванов
источник
3

R , 138 , 129 байтов

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),'
')

Попробуйте онлайн!

  • y не считается гласным
digEmAll
источник
2

Питон, 129 119 112 байтов

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

Попробуйте онлайн!

Не лечит Y как к гласной.

-7 байт благодаря @ Mr.Xcoder

DimChtz
источник
Рад видеть, что вы можете заставить его работать и играть в гольф немного! Отличная работа
joH1
112 байтов .
г-н Xcoder
2

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

Y

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
Arnauld
источник
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 Спасибо, не знаю, как я это пропустил ..
Кевин Круйссен,