Powtórz wierszyk i pętlę na samogłoskach

15

Wierszyk: Jabłka i banany

Istnieje tradycyjna piosenka dla dzieci, która powtarza ten sam tekst w kółko, tylko za każdym razem, gdy każda samogłoska jest zastępowana losową samogłoską, ale stała w całej zwrotce.

Wyzwanie

Celem jest zaproponowanie najkrótszego kodu, który dokonuje takiej transformacji tekstu wejściowego.

Zasady

  1. Musisz wydrukować wierszyk tyle razy, ile jest w nim wyraźnych samogłosek.
  2. Każdy wydruk musi być oddzielony podziałem wiersza (kombinacja specyficzna dla platformy \ni \rjest akceptowana).
  3. W celu iteracji izastąp każdą samogłoskę ith odrębną samogłoską w tekście oryginalnym.
  4. Tekst wejściowy to sekwencja drukowalnych znaków ASCII (zakres [32, 126].
  5. Dane wejściowe nie będą zawierać osadzonych podziałów linii.
  6. Należy zmieniać tylko znaki samogłosek, inne muszą być wyprowadzane dokładnie jako dane wejściowe.
  7. Liczą się tylko samogłoski: samogłoski nosowe, chociaż brzmią jak samogłoski (jak we francuskim „Tintin” ), nie mogą być traktowane jako pojedyncza samogłoska.
  8. Wielkość liter ma znaczenie dla danych wyjściowych, ale ma charakter pozycyjny (zastąpienie samogłoski pisanej wielkimi literami odbywa się za pomocą samogłoski zastępującej wielkie litery)
  9. Samogłoski wielkich liter nie różnią się od ich małych odpowiedników (tj. a<=> A)
  10. Kolejne samogłoski są zawsze rozpatrywane osobno (tzn. BoatDają zarówno Booti Baat)
  11. Ponieważ litera yreprezentuje albo samogłoskę, albo rzeczownik spółgłoskowy (jak mówimy po angielsku), obsługa go jako samogłoski lub spółgłoski jest dozwolona, ​​jednak odpowiedzi muszą wyraźnie określać, czy obsługują yjako samogłoskę, czy nie.

Przykłady:

Witaj świecie

Hello world!

daje:

Helle werld!
Hollo world!

Fragment oryginalnego tekstu francuskiego (przetłumaczonego), ytraktowanego jako samogłoska:

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

daje:

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

Zwróć uwagę na zachowanie na wiodącej samogłosce wielkich liter: wielkość liter jest utrzymywana na indeksie (reguły 8 i 9).

Przykład bezowocny

Dane wejściowe, które nie zawierają żadnej samogłoski, takie jak:

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

nie może generować żadnego wyjścia ani pojedynczego podziału linii.

Wprowadzanie pojedynczej samogłoski

Dane wejściowe zawierające pojedynczą samogłoskę są wyprowadzane w niezmienionej postaci.

Dad sat at a car and saw a fat bat.

daje:

Dad sat at a car and saw a fat bat.

To jest , więc wygrywa najmniejszy kod bajtowy (tylko wieczna chwała PPCG)!

joH1
źródło

Odpowiedzi:

6

Siatkówka , 45 bajtów

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

Wypróbuj online! Nie liczy się yjako samogłoska. Wyjaśnienie:

K`A\EI\OU

Zamienia tekst na ciąg literalny A\EI\OU.

L$`\\?(.)

Dopasowuje każdą literę opcjonalnie poprzedzoną odwrotnym ukośnikiem.

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

Wysyła wiersz kodu siatkówki dla każdej litery.

~(

Ocenia wygenerowany kod (pokazany poniżej) przy użyciu oryginalnych danych wejściowych. .Powoduje kod nie do wyjścia (gotowym) bufora. /<vowel>/i&Powoduje resztę linii uruchomić tylko wtedy, gdy wejściowy zawiera daną samogłoskę (rozróżniana wielkość liter). *Powoduje wynikiem linii mają być ignorowane, tak, że następna samogłoska może być testowany. \Powoduje, że wynik ma zostać wydrukowany na własnej linii zanim zostanie zignorowane. W T`Vv`AAAAAatransliterates wielkie Vowels do AAAAAs i wszystkich małych vowels do a. \Ajest ucieczką, który odnosi się do ASCII 07 (BEL), ale E, Oi osą wbudowane klas postaci, które muszą być uciekł do wyrażenia wartości dosłownych (e nie jest klasą postaci, ale na szczęście nie jest też ucieczką).

./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
źródło
Mmm, samoczynnie generujący się kod. Nie znam dobrze Retiny, ale to imponujące!
joH1
@ joH1 Cóż, dla mnie imponujące jest to, że zaoszczędził 60 bajtów!
Neil
5

Rubinowy , 78 bajtów

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

Wypróbuj online!

Szybkie i naiwne podejście. Y nie jest uważane za samogłoskę.

Kirill L.
źródło
4

bash, 96 bajtów

Dwa rozwiązania o równej długości:

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

Wypróbuj online!

Pobiera dane wejściowe jako argument wiersza poleceń i wysyła do STDOUT.

Klamka
źródło
4

05AB1E (starsza wersja) , 19 bajtów

(Pośrednio) zapisany jeden bajt dzięki Kevinowi (drukowanie bezpośrednio w pętli zamiast łączenia, działa tylko w starszej wersji).

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

Wypróbuj online!

Przy użyciu przepisywania Elixir, 20 bajtów

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

Wypróbuj online! (bezy) | Wypróbuj online! (zy,žMzastąpienie przezžO- to samo dotyczy starszej wersji)

Jak to działa

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.
Pan Xcoder
źródło
Ładna odpowiedź, krótsza niż 21-bajtowa odpowiedź, którą przygotowałem. Możesz zagrać jeszcze w jeden bajt, zapętlając i drukując zamiast mapowania: 19 bajtów . Twoje TIO z ypowinno również używać 6zamiast 5, btw.
Kevin Cruijssen
@KevinCruijssen Edytowane, dzięki! Jeśli chodzi o ywersję -vowel, przypadkowo skopiowałem niewłaściwy link TIO, kiedy odpowiedziałem: | ...
Mr. Xcoder,
Ach, teraz znów wiem, dlaczego mam ikod. Twoja odpowiedź nie działa w przypadku danych wejściowych bez samogłosek. Oczekiwany jest pusty wynik, ale tak naprawdę sam drukuje dane wejściowe .. :(
Kevin Cruijssen
1
@KevinCruijssen 20-bajtowy działa, więc wycofałem i naprawiłem drugi link.
Pan Xcoder,
4

Japt v2.0a0 -R, 24 22 bajtów

Traktuje yjak samogłoskę. Zmień obu wystąpień \yaby \vtraktować go jako spółgłoskę.

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

Spróbuj


Wyjaśnienie

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
Kudłaty
źródło
3

Galaretka ,  23 20 18  17 bajtów

-2 Dzięki Erikowi Outgolfer

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

Aby traktować yjako samogłoskę, zamień oba cs na ys.

Wypróbuj online!

W jaki sposób?

Ø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
źródło
18 bajtów (trywialne) ( ż/w parze jest to Z, że dwie dyady w rzędzie, w której lewa nie jest
sparowana w monadzie,
Dzięki ( Z> _ <), nie jestem pewien, co się dzieje z moją sesją TIO, ale usunięcie redundancji ðnie działało; restart naprawiony.
Jonathan Allan,
TBH, właściwie to naprawiłem x€xteż, ale ty mnie ninja. : P
Erik the Outgolfer
3

Czerwony , 229 bajtów

Biorąc yza samogłoskę

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

Wypróbuj online!

Nieco bardziej czytelny:

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 Iwanow
źródło
3

R , 138 , 129 bajtów

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

Wypróbuj online!

  • y nie jest uważana za samogłoskę
digEmAll
źródło
2

Python, 129 119 112 bajtów

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

Wypróbuj online!

Nie leczy y jako samogłoska.

-7 bajtów dzięki @ Mr.Xcoder

DimChtz
źródło
Cieszę się, że mogłeś to uruchomić i trochę pograć w golfa!
Dobra
112 bajtów .
Pan Xcoder,
2

JavaScript (Node.js) , 99 bajtów

Przysmaki y jako spółgłoska.

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

Wypróbuj online!

Skomentował

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
źródło
2

Java 10, 196 188 bajtów

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 bajtów dzięki @ joH1 .

Bez yjako samogłoska do zapisywania bajtów.

Wypróbuj online.

Wyjaśnienie:

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
źródło
188 bajtów poprzez wstawienie zmiennej vw pętli
joH1
@ joH1 Dzięki, nie wiem, jak mi tego brakowało ..
Kevin Cruijssen
1

Python 2 , 112 bajtów

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)

Wypróbuj online!

Traktuje yjako spółgłoskę.

Chas Brown
źródło
1

Java (OpenJDK 8) , 184 bajty

y jest samogłoską

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())))

Wypróbuj online!

Roberto Graham
źródło