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

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

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


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.


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.

Ł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

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

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

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ę

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


Cieszę się, że mogłeś to uruchomić i trochę pograć w golfa!
Dobra


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

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

188 bajtów poprzez wstawienie zmiennej vw pętli
joH1

@ joH1 Dzięki, nie wiem, jak mi tego brakowało ..
Kevin Cruijssen



Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.