Ulangi sajak dan putaran pada vokal

15

Sajak vokal: Apel dan Pisang

Ada lagu anak-anak tradisional yang mengulangi teks yang sama berulang-ulang, hanya setiap kali setiap vokal diganti dengan vokal acak, tetapi konstan di seluruh bait saat ini.

Tantangan

Tujuannya adalah untuk mengusulkan kode terpendek yang melakukan transformasi pada teks input.

Aturan

  1. Anda harus mencetak sajak sebanyak yang ada vokal di dalamnya.
  2. Setiap cetakan harus dipisahkan dengan satu baris (kombinasi platform tertentu \ndan \rditerima).
  3. Untuk iterasi i, ganti setiap vokal dengan iv berbeda th dalam teks asli.
  4. Teks input adalah urutan karakter ASCII yang dapat dicetak (kisaran [32, 126].
  5. Input tidak akan berisi jeda baris tertanam.
  6. Hanya karakter vokal yang harus terpengaruh, yang lain harus output persis seperti input.
  7. Hanya karakter vokal yang dihitung: vokal nasal, meskipun terdengar seperti vokal (seperti dalam bahasa Prancis "Tintin" ), tidak boleh ditangani sebagai vokal tunggal.
  8. Kasing penting untuk output, tetapi bersifat posisional (mengganti vokal huruf besar dilakukan dengan vokal pengganti huruf besar)
  9. Huruf vokal huruf besar tidak berbeda dengan huruf kecilnya (yaitu a<=> A)
  10. Vokal berturut-turut selalu dianggap terpisah (mis. BoatMenghasilkan keduanya Bootdan Baat)
  11. Karena huruf tersebut ymewakili vokal atau soun konsonan (seperti yang kita berbicara bahasa Inggris), mengatasinya sebagai vokal atau konsonan diperbolehkan, namun jawaban harus secara eksplisit menyatakan apakah mereka menangani ysebagai vokal atau tidak.

Contoh:

Halo Dunia

Hello world!

memberi:

Helle werld!
Hollo world!

Kutipan dari teks bahasa Prancis asli (diterjemahkan), dengan yditangani sebagai vokal:

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

memberi:

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

Perhatikan perilaku pada vokal huruf besar memimpin: case disimpan pada indeksnya (aturan 8 dan 9).

Contoh tanpa huruf

Input yang tidak mengandung vokal apa pun, seperti:

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

harus tidak menghasilkan output, atau satu baris pun.

Input vokal tunggal

Input yang berisi vokal tunggal adalah output apa adanya.

Dad sat at a car and saw a fat bat.

memberi:

Dad sat at a car and saw a fat bat.

Ini adalah , sehingga bytecount kode paling sedikit menang (tidak lain adalah kemuliaan PPCG abadi)!

joH1
sumber

Jawaban:

6

Retina , 45 byte

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

Cobalah online! Tidak dihitung ysebagai vokal. Penjelasan:

K`A\EI\OU

Mengganti teks dengan string literal A\EI\OU.

L$`\\?(.)

Cocokkan setiap huruf secara opsional diawali dengan garis miring terbalik.

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

Menghasilkan satu baris kode Retina untuk setiap huruf.

~(

Mengevaluasi kode yang dihasilkan (ditampilkan di bawah) menggunakan input asli. The .menyebabkan kode untuk tidak output (akhir) penyangga. The /<vowel>/i&menyebabkan sisa baris untuk menjalankan hanya jika input mengandung vokal yang diberikan (kasus-insensitively). The *menyebabkan hasil garis untuk diabaikan, sehingga vokal berikutnya dapat diuji. The \menyebabkan hasil yang akan dicetak pada baris sendiri sebelum diabaikan. The T`Vv`AAAAAatransliterates huruf besar Vowels untuk AAAAAs dan huruf kecil semua vowels ke a. \Aadalah pelarian yang mengacu pada ASCII 07 (BEL), tapi E, Odan bukan kelas karakter, tapi untungnya itu juga bukan pelarian.)o merupakan kelas karakter bawaan yang perlu diloloskan untuk memberikan nilai literalnya (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
sumber
Mmh, kode yang dihasilkan sendiri. Saya tidak mengenal Retina dengan baik tetapi itu mengesankan!
joH1
@ joH1 Yah, bagi saya sedikit yang mengesankan adalah bahwa ia menghemat 60 byte!
Neil
5

Ruby , 78 byte

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

Cobalah online!

Pendekatan yang cepat dan naif. Y tidak dianggap sebagai vokal.

Kirill L.
sumber
4

bash, 96 byte

Dua solusi sama panjang:

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

Cobalah online!

Mengambil input sebagai argumen baris perintah dan output ke STDOUT.

Gagang pintu
sumber
4

05AB1E (warisan) , 19 byte

(Secara tidak langsung) menyimpan satu byte berkat Kevin (mencetak langsung di dalam loop daripada bergabung, hanya bekerja dalam versi lawas).

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

Cobalah online!

Menggunakan penulisan ulang Elixir, 20 byte

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

Cobalah online! (tanpay) | Cobalah online! (dengany,žM digantikan oleh žO- sama berlaku untuk versi lawas)

Bagaimana itu bekerja

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.
Tuan Xcoder
sumber
Jawaban yang bagus, lebih pendek dari jawaban 21 byte yang saya siapkan. Anda dapat bermain golf satu byte lagi dengan mengulang dan mencetak alih-alih pemetaan: 19 byte . TIO Anda yjuga harus digunakan 6sebagai ganti 5, btw.
Kevin Cruijssen
@KevinCruijssen Diedit, terima kasih! Tentang yversi-vokal, saya tidak sengaja menyalin tautan TIO yang salah ketika saya menjawab: | ...
Tn. Xcoder
Ah, sekarang saya tahu lagi mengapa saya memiliki ikode saya .. Jawaban Anda gagal untuk input tanpa vokal. Diharapkan adalah output kosong, tetapi sebenarnya mencetak input itu sendiri .. :(
Kevin Cruijssen
1
@KevinCruijssen The 20-byter bekerja, jadi saya memutar kembali dan memperbaiki tautan kedua.
Tn. Xcoder
4

Japt v2.0a0 -R, 24 22 byte

Memperlakukan ysebagai vokal. Mengubah kedua kejadian dari \yuntuk \vmemperlakukannya sebagai konsonan.

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

Cobalah


Penjelasan

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
Shaggy
sumber
3

Jelly ,  23 20 18  17 byte

-2 Terima kasih kepada Erik the Outgolfer

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

Untuk memperlakukan ysebagai vokal ganti keduanya cdengan ys.

Cobalah online!

Bagaimana?

Ø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
sumber
18 byte (sepele) ( ż/pada pasangan adalah Z, dua pasangan dalam satu baris di mana yang kiri tidak berpasangan dalam monad memiliki argumen di antara implisit)
Erik the Outgolfer
Terima kasih ( Z> _ <), tidak yakin apa yang terjadi dengan sesi TIO saya, tetapi menghapus yang berlebihan ðtidak berhasil; restart tetap.
Jonathan Allan
TBH, aku benar-benar memperbaiki x€xjuga, tapi kamu ninja aku. : P
Erik the Outgolfer
3

Merah , 229 byte

Mengambil yuntuk non-vokal

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

Cobalah online!

Sedikit lebih mudah dibaca:

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
sumber
3

R , 138 , 129 byte

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

Cobalah online!

  • y tidak dianggap sebagai vokal
menggali semua
sumber
2

Python, 129 119 112 byte

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

Cobalah secara Online!

Tidak memperlakukan y sebagai vokal.

-7 byte terima kasih kepada @ Mr.Xcoder

DimChtz
sumber
Senang melihat Anda bisa membuatnya bekerja dan bermain golf sedikit! Kerja bagus
joH1
112 byte .
Tn. Xcoder
2

JavaScript (Node.js) , 99 byte

Memperlakukan y sebagai konsonan.

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

Cobalah online!

Berkomentar

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
sumber
2

Java 10, 196 188 byte

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 byte terima kasih kepada @ joH1 .

Tanpa y vokal untuk menyimpan byte.

Cobalah online.

Penjelasan:

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
sumber
188 byte dengan menggarisbawahi variabel vdalam loop
joH1
@ joH1 Terima kasih, tidak yakin bagaimana saya melewatkan itu ..
Kevin Cruijssen
1

Python 2 , 112 byte

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)

Cobalah online!

Memperlakukan ysebagai konsonan.

Chas Brown
sumber
1

Java (OpenJDK 8) , 184 byte

y adalah vokal

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

Cobalah online!

Roberto Graham
sumber