Masukkan Hat ke Kucing

15

Terinspirasi oleh acara pesta musim dingin yang akan datang

Objetive

Tambahkan topi ^, ´atau `ke satu vokal di setiap kata input.

Aturan

  • Itu hatdan vowelharus dipilih secara acak. Setiap topi harus muncul dengan probabilitas yang sama (33%) dan vokal harus memiliki probabilitas yang sama dalam vokal yang valid dalam kata (jika kata tersebut memiliki 2 vokal yang valid, masing-masing harus 50% kemungkinan untuk dipilih) - atau yang terdekat bahwa bahasa Anda miliki.
  • Hanya AEIOUaeioudianggap vokal (maaf y)
  • Vokal dengan topi di input JANGAN mengganggu aturan (Anda dapat menganggapnya sebagai konsonan)
  • Jika input tidak memiliki vokal tidak akan diubah
  • Kapitalisasi harus dipertahankan.

Contohnya

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

Kemenangan

Ini adalah sehingga kode terpendek menang

tongkat
sumber
"Secara acak (atau yang paling dekat dengan bahasa Anda)" jadi jika bahasa saya tidak memiliki perintah acak, saya bisa melakukan sesuatu yang deterministik ???
Fatalkan
@LuisMendo lebih baik?
Rod
@Fatalize bahkan tidak get the current timeacak?
Rod
@Rod Saya tidak memiliki bahasa apa pun dalam pikiran. Saya hanya mengatakan bahwa Anda harus memaksakan bahwa itu acak (dan apa jenis acak) kalau tidak masuk akal sama sekali.
Fatalkan
Spesifikasi mengatakan kita harus menambahkan ^ ´ atau backtick, tetapi contoh tschuss menunjukkan umlaut. Apakah umlaut wajib atau tidak?
Level River St

Jawaban:

1

Perl 6 , 101 byte

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

Cobalah

Diperluas:

~      # 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
}
Brad Gilbert b2gills
sumber
2

C #, 273 267 byte

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

Saya benar-benar merasa seperti selingkuh, karena saya masih menambahkan topi ke huruf vokal beraksen yang dibuat dengan menggabungkan karakter . Jika itu tidak dapat diterima, beri tahu saya agar saya dapat menambahkan kode boilerplate menyatakan jawaban ini tidak bersaing.

Hal ini menambahkan karakter acak di antara U + 0300 atau U + 0301 atau U + 0302 , setelah vokal acak dari setiap kata input (jika ada).

Tidak disatukan (hanya tubuh lambda)

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]));
Tautan Ng
sumber
1

Mathematica, 226 byte

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~" "&])&

Fungsi yang tidak disebutkan namanya mengambil daftar karakter sebagai input dan mengembalikan daftar karakter. Versi yang lebih mudah dibaca, sedikit tidak disentuh:

 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}, " "] &] &

Baris 13 membagi input menjadi kata-kata (daftar karakter) di semua spasi; setiap kata dioperasikan oleh fungsi yang didefinisikan oleh baris 4-12, dan hasilnya digabungkan kembali bersama dalam satu daftar dengan baris 3.

Baris 4 mengatur pdaftar indeks yang menunjukkan karakter kata mana wyang vokal. Jika ada vokal (baris 5), kami membuat pilihan acak dari satu indeks tersebut i(baris 6) dan kemudian mengatur ulang karakter tunggal kata tersebut ke karakter baru (baris 7-10). Akhirnya kami menampilkan kata (mungkin dimodifikasi) w.

Untuk memilih karakter baru, kami menemukan di mana vokal yang akan diganti duduk di string vdan memilih kode karakter yang sesuai a. Tetapi untuk secara acak memilih tiga topi, kita mengambil kode itu dan menambahkan bilangan bulat acak antara 0 dan 2 (baris 9) sebelum mengkonversi kembali ke karakter. (Untungnya, vokal yang sudah digerakkan semua datang dalam trio berturut-turut dari kode karakter UTF-8.)

Greg Martin
sumber
1

Python 3, 170 byte

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

Tidak Disatukan:

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
                             ]))
Alex Hall
sumber
1
Anda tidak perlu ruang antara importdan *.
Tn. Xcoder
j+1 forbisa j+1for.
Jonathan Frech