Şapkayı Kediyi Koy


15

Yaklaşan kış bash etkinliğinden ilham aldı

objetive

Şapka ekleyin ^, ´ya da `girişin her kelimenin tek sesli için.

kurallar

  • hatVe vowelrastgele seçilmelidir. Her şapka aynı olasılıkla (% 33) görünmelidir ve ünlüler, kelimedeki geçerli sesli harfler içinde aynı olasılığa sahip olmalıdır (kelimenin 2 geçerli sesli harfleri varsa, her birinin seçilme olasılığı% 50 olmalıdır) - veya en yakın sizin dilinizde.
  • Sadece AEIOUaeiouünlüler olarak kabul edilir (üzgünüm y)
  • Girişte şapkaları olan sesli harfler kurallara müdahale ETMEYİN (ünsüz olarak düşünebilirsiniz)
  • Girişte sesli harf yoksa değiştirilmeyecektir
  • Büyük harf kullanımı korunmalıdır.

Örnekler

winter> wintér
bash> bâsh
rhythm> rhythm
rng ftw> rng ftw
cat in the hat> cât ìn thê hát
dès> dès
tschüss> tschüss
principî> prìncipî
PROGRAMMING PUZZLES & code golf>PROGRÂMMING PÚZZLES & codé gòlf

Kazanan

Bu yani kısa kod kazanıyor


"Rastgele (ya da dilinin sahip olduğu en yakın)" "Eğer dilimin rastgele komutları yoksa sadece deterministik bir şey yapabilirim ???
Fatalize

@LuisMendo daha iyi?
Rod

@ get the current timeRasgele bile değil ?
Rod

@Rod Aklımda herhangi bir dil yok. Sadece bunun rastgele (ve ne tür bir rastgele) olduğunu dayatmanız gerektiğini söylüyorum, aksi takdirde hiç mantıklı değil.
Fatalize

Spesifikasyonlar ^ ´ veya backtick eklememiz gerektiğini söylüyor, ancak tschuss örneği bir özet gösteriyor. Lameller gerekli mi değil mi?
Level River St

Yanıtlar:


2

Perl 6 , 101 bayt

~*.words.map: {(my$p=m:ex:i/<[aeiou]>/».to.pick)~~Mu:D??~S/.**{$p}<(/{("\x300".."\x302").pick}/!!$_}

Dene

Expanded:

~      # stringify (join with spaces)
*\     # Whatever lambda (input parameter)
.words # split into words

.map:  # for each word

{ # bare block lambda with implicit parameter 「$_」
  (

    my $p =

    m
    :exhaustive               # all possible matches
    :ignorecase
    /<[aeiou]>/\              # match a vowel

    ».to.pick                 # pick one of the positions

  ) ~~ Mu:D                   # is it defined ( shorter than 「.defined」 )

  ??                          # if 「$p」 is defined

    ~                         # stringify

    S/
      . ** {$p}               # match 「$p」 positions

      <(                      # ignore them
    /{
      ("\x300".."\x302").pick # pick one of the "hats" to add
    }/


  !!                          # if 「$p」 is not defined    
    $_                        # return the word unchanged
}

2

C #, 273267 bayt

using System.Linq;A=s=>{var r=new System.Random();var a=s.Split(' ');return string.Join(" ",a.Select(w=>w.Select((c,i)=>"AEIOUaeiou".Any(d=>c==d)?i:-1).Where(x=>x>=0).ToList()).Select((l,i)=>l.Any()?a[i].Insert(l[r.Next(l.Count)]+1,""+(char)r.Next(768,771)):a[i]));};

demo.it demo

Gerçekten de hile yaptığımı hissediyorum, çünkü karakterleri birleştirerek oluşturulan aksanlı sesli harflere hala şapka ekliyorum . Bu kabul edilemez ise, bana bildirin bülten levhası kodları ekleyebilirsiniz bu cevabı rakipsiz ilan.

Bu şey , her bir giriş kelimesinin (varsa) rastgele bir sesli harfinden sonra U + 0300 veya U + 0301 veya U + 0302 arasında rastgele bir karakter ekler .

Ungolfed (sadece lambda gövdesi)

var r=new System.Random();
// Split sentence to array of words
var a=s.Split(' ');
// Join the (hat-ed) words back to sentence
return string.Join(
    " ",
    // Select an IEnum of list of integers indicating the positions of vowels
    a.Select(w=>
        w.Select((c,i)=>
            // If it's vowel, return position (>=0), else return -1
            "AEIOUaeiou".Any(d=>c==d)?i:-1
        // Filter vowels only
        ).Where(x=>x>=0)
        .ToList()
    // Convert each list of integers to hat-ed words
    ).Select((l,i)=>
        l.Any()
            // Insert "something" into the word...
            ?a[i].Insert(
                // ...at the position after a random vowel in that word...
                l[r.Next(l.Count)]+1,
                // "something" is a random integer in [0x0300, 0x0303), then casted to UTF16 i.e. [U+0300, U+0302]
                ""+(char)r.Next(768,771))
            // List is empty => just return original word
            :a[i]));

1

Mathematica, 226 bayt

Join@@((p=Position[w=#,Alternatives@@(v=Characters@"aeiouAEIOU")];If[p!={},i=#&@@RandomChoice@p;w[[i]]=FromCharacterCode[ToCharacterCode["àèìòùÀÈÌÒÙ"][[#&@@Position[v,w[[i]]]]]+RandomInteger@2]];w)&/@Split[#,{##}~FreeQ~" "&])&

Adsız işlev, karakter listesini giriş olarak alan ve karakter listesini döndüren. Kolay okunan versiyon, hafifçe soluksuz:

 1  v = Characters["aeiouAEIOU"];
 2  a = ToCharacterCode["àèìòùÀÈÌÒÙ"];
 3  Join @@ (
 4    (p = Position[w = #, Alternatives @@ v]; 
 5      If[p != {},
 6        i = First[RandomChoice[p]]; 
 7        w[[i]] =
 8          FromCharacterCode[
 9            a[[ First[ Position[ v, w[[i]] ] ] ]] + RandomInteger[2]
10          ]
11        ]; w
12    ) &
13  ) /@ Split[#1, FreeQ[{##1}, " "] &] &

Satır 13, girdiyi tüm boşluklarda kelimelere (karakter alt listeleri) böler; her kelime 4-12 satırları tarafından tanımlanan fonksiyon tarafından çalıştırılır ve sonuçlar tekrar 3 satır tek bir listede tekrar birleştirilir.

Satır 4 setleri p , kelimenin hangi karakterlerinin wsesli harf olduğunu gösteren indeksler listesine . Herhangi bir sesli harf (satır 5) varsa, bu tür bir dizinden rastgele bir seçim yaparızi (satır 6) ve sonra sözcüğün tek karakterini yeni bir karaktere (satır 7-10) sıfırlarız. Sonunda (muhtemelen değiştirilmiş) kelimeyi çıkarırız w.

Yeni karakteri seçmek için, değiştirilecek sesli harfin dizede nerede bulunduğunu buluruz vve karşılık gelen karakter kodunu seçeriz a. Ancak üç şapkayı rastgele seçmek için, bu kodu alıp bir karaktere dönüştürmeden önce 0 ile 2 (satır 9) arasında rastgele bir tamsayı ekliyoruz. (Neyse ki, sesli harflerin hepsi arka arkaya UTF-8 karakter kodlarıyla gelir.)


1

Python 3, 170 bayt

from random import *
c=choice
print(' '.join([w,w[:i]+c('̀́̂')+w[i:]][i>0]for w in input().split()for i in[c([j+1 for j,x in enumerate(w)if x in 'aeiouAEIOU']or[0])]))

Ungolfed:

from random import choice
print(' '.join([
                   w,  # Don't modify the word if no vowels were found

                   w[:i] + choice('̀́̂') + w[i:]
               ][i > 0]
               for w in input().split()
                   for i in [choice([j + 1 for j, x in enumerate(w) if x in 'aeiouAEIOU']
                                    or [0])  # choice requires a non-empty sequence
                             ]))

1
Sen arasında boşluk gerekmez importve *.
Bay Xcoder

j+1 forolabilir j+1for.
Jonathan Frech
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.