Sesli harfleri bir kafiye ve döngü tekrarlayın


15

Ünlüler kafiye: Elma ve Muz

Aynı metni tekrar tekrar tekrarlayan geleneksel bir çocuk şarkısı vardır, sadece her sesli harfin yerine rastgele bir sesli harf verilir, ancak mevcut stanzada sabit kalır.

Meydan okuma

Amaç, bir giriş metninde böyle bir dönüşüm gerçekleştiren en kısa kodu önermektir.

kurallar

  1. Kafiyeyi, içinde ünlü sesli harflerin olduğu kadar çok yazdırmalısınız.
  2. Her baskı bir satır sonu ile ayrılmalıdır (platforma özgü birleşik \nve \rkabul edilir).
  3. Yineleme için i, her sesli iharfleri orijinal metindeki farklı sesli harflerle değiştirin .
  4. Giriş metni yazdırılabilir ASCII karakter dizisidir (aralık [32, 126].
  5. Giriş gömülü satır kesmeleri içermeyecek.
  6. Yalnızca sesli harf karakterleri etkilenmelidir, diğer harflerin tam olarak girdi olarak girilmesi gerekir.
  7. Sadece sesli harf karakterleri sayılır: sesli harfler (sesli harfler gibi) (Fransızca "Tintin" gibi ) tek bir sesli harf olarak ele alınmamalıdır.
  8. Durum çıktı için önemlidir, ancak konumsaldır (büyük harfli sesli harfin değiştirilmesi büyük harfli sesli harfle yapılır)
  9. Büyük harfli harfler küçük harfli karşılıklarından farklı değildir (yani a<=> A)
  10. Ardışık sesli harf her zaman ayrı ayrı kabul edilir (yani. BoatSonucunda hem Bootve Baat)
  11. Mektup ybir sesli harf veya ünsüz bir soun (İngilizce konuştuğumuz gibi) temsil ettiğinden, sesli harf veya ünsüz olarak kullanılmasına izin verilir, ancak cevaplar ysesli harf olarak işleyip işlemediğini açıkça belirtmelidir .

Örnekler:

Selam Dünya

Hello world!

verir:

Helle werld!
Hollo world!

ySesli harf olarak kullanılan orijinal Fransızca metinden (çevrilmiş) alıntı :

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

verir:

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

Büyük harf ünlü harfine ilişkin davranışı not edin: case kendi dizininde tutulur (kural 8 ve 9).

Ünlü olmayan örnek

Sesli harf içermeyen giriş, örneğin:

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

çıktı veya tek satır sonu üretmemelidir.

Tek sesli giriş

Tek bir sesli harf içeren giriş olduğu gibi çıkar.

Dad sat at a car and saw a fat bat.

verir:

Dad sat at a car and saw a fat bat.

Bu , bu yüzden en az bayt kodu kazanır (sonsuz PPCG zaferden başka bir şey)!

Yanıtlar:


6

Retina , 45 bayt

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

Çevrimiçi deneyin! ySesli harf olarak sayılmaz . Açıklama:

K`A\EI\OU

Metni değişmez dizeyle değiştirir A\EI\OU.

L$`\\?(.)

İsteğe bağlı olarak bir ters eğik çizgiyle başlayan her harfle eşleşir.

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

Her harf için bir Retina kodu satırı verir.

~(

Üretilen kodu (aşağıda gösterilen) orijinal girişi kullanarak değerlendirir. .Değildir (nihai) tampon çıkışına kod neden olur. /<vowel>/i&Giriş verilen sesli harf (harf duyarsız) içeriyorsa, sadece çalıştırmak için hattının geri kalan neden olur. *Bir sonraki sesli harf test edilebilir, böylece hattın sonucu göz ardı neden olur. \O göz ardı edilmeden önce kendi satırında basılacak sonucunu neden olur. T`Vv`AAAAAaBüyük harf çevirisi şu Vkadar owels AAAAAs ve tümü küçük viçin owels a. \AASCII 07 (BEL) ifade eder bir kaçış olduğunu, ancak E, bir karakter sınıfı değil ama neyse o da bir kaçış değildir.)O ve o(built-in onların değişmez değerleri vermek için kaçtı gereken karakter sınıfları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

Mmh, kendi kendini üreten kod. Retina'yı iyi tanımıyorum ama bu etkileyici!
joH1

@ joH1 Benim için etkileyici olan nokta, 60 bayt tasarruf etmesidir!
Neil

5

Ruby , 78 bayt

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

Çevrimiçi deneyin!

Hızlı ve naif bir yaklaşım. Y sesli harf olarak kabul edilmez.


4

bash, 96 bayt

İki eşit uzunlukta çözüm:

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

Çevrimiçi deneyin!

Girdiyi komut satırı bağımsız değişkeni olarak alır ve STDOUT'a çıktı verir.


4

05AB1E (eski) , 19 bayt

(Dolaylı olarak) Kevin sayesinde bir bayt kaydetti (katılmak yerine doğrudan döngü içine yazdırmak, sadece eski sürümde çalışmak).

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

Çevrimiçi deneyin!

İksir yeniden yazma özelliğini kullanarak, 20 bayt

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

Çevrimiçi deneyin! (olmadany) | Çevrimiçi deneyin! ile (y,žMile ikame edilenžO- Aynı eski sürümü için geçerlidir)

Nasıl çalışır

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.

Güzel cevap, hazırladığım 21 bayt cevaptan daha kısa . Eşleme yerine döngü ve yazdırma yaparak bir bayt daha golf edebilirsiniz: 19 bayt . İle TIO'nuz btw yerine yde kullanılmalıdır . 65
Kevin Cruijssen

@KevinCruijssen Düzenlendi, teşekkürler! y-Vowel sürümü hakkında, cevap verdiğimde yanlışlıkla yanlış TIO bağlantısını kopyaladım: | ...
Bay Xcoder

Ah, şimdi neden tekrar kodumda olduğunu biliyorum i.. Sesli olmayan girişler için cevabınız başarısız oluyor. Beklenen boş bir çıktı, ancak aslında girdinin kendisini yazdırıyor .. :(
Kevin Cruijssen

1
@KevinCruijssen 20 bayt çalışıyor, bu yüzden geri aldım ve ikinci bağlantıyı düzelttim.
Bay Xcoder

4

Japt v2.0a0 -R, 24 22 bayt

Treats ySesli harf gibi . Her iki tekrarlarını değiştirme \yiçin \vbir ünsüz olarak tedavi etmek.

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

Dene


açıklama

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

Jöle ,  23 20 18  17 bayt

-2 Outgolfer Erik sayesinde

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

ySesli harf olarak davranmak için ikisini de değiştirinc ile sy .

Çevrimiçi deneyin!

Nasıl?

Ø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 bayt (önemsiz) ( ż/bir çiftte, bir Zmonadda solun eşleştirilmediği bir satırda iki dyads örtülü olarak arasında argüman var)
Outgolfer Erik

Teşekkürler (Z > _ <), TIO oturumumda neler olup bittiğinden emin değilim, ancak gereksizliği kaldırmak ðişe yaramadı; yeniden başlatma düzeltildi.
Jonathan Allan

TBH, ben de düzelttim x€xsen beni ninja ettin. : P
Outgolfer Erik

3

Kırmızı , 229 bayt

Alarak yolmayan bir sesli için

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

Çevrimiçi deneyin!

Biraz daha okunabilir:

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 bayt

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

Çevrimiçi deneyin!

  • y sesli harf sayılmaz

2

Python, 129 119 112 bayt

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

Çevrimiçi deneyin!

Tedavi etmez y sesli harf olarak.

@ Mr.Xcoder sayesinde -7 bayt


Çalışmak ve biraz golfed görmek sevindim! Güzel iş
joH1


2

JavaScript (Node.js) , 99 bayt

Treats y ünsüz olarak.

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

Çevrimiçi deneyin!

Yorumlananlar

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 bayt

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)+""));}

@ JoH1 sayesinde -8 bayt .

yBaytları kurtarmak için sesli harf olmadan .

Çevrimiçi deneyin.

Açıklama:

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

vDöngüdeki değişkeni satır içine alarak 188 bayt
joH1

@ joH1 Teşekkürler, bunu nasıl özlediğimi
bilmiyorum



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.