Apakah Anda tahu KVZ Anda?


23

Konsep

Dengan cara apa Anda dapat mengacak alfabet bahasa Inggris sehingga masih dapat dinyanyikan dengan nada Twinkle Twinkle Little Star tanpa merusak nada itu?

Aturan

Bertukar

Anggap saja huruf-huruf yang terkandung dalam masing-masing set berikut dapat ditukar secara bebas tanpa merusaknya:

  • {A, J, K}
  • {B, C, D, E, G, P, T, V, Z}
  • {I, Y}
  • {Q, U}
  • {S, X, F}
  • { M N }
  • Karenanya H, L, O, R, dan W terkunci pada tempatnya

Keluaran

Program perlu mengeluarkan string RANDOM (atau daftar karakter) tunggal yang berisi alfabet Inggris lengkap dalam urutan apa pun asalkan pesanan memenuhi persyaratan di atas. Seharusnya tidak ada cara bagi Anda untuk memprediksi string mana yang akan dihasilkan oleh program Anda (jika kami mengabaikan seeding), artinya Anda tidak bisa hanya melakukan hardcode.

Program Anda harus memiliki beberapa probabilitas positif (tidak harus seragam) untuk menghasilkan masing-masing dari keluaran.9!3!3!2!2!2!=104509440

Tidak ada batasan pemformatan tertentu tentang spasi, pembatas atau kasus, hanya konsisten.

Tujuan

Bytes paling sedikit menang!

Contoh:

  • KCDBPSVHIAJLMNOZQRXGUEWFYT
  • A, G, Z, V, P, X, C, H, Y, K, J, L, N, M, O, T, U, R, S, D, Q, B, W, F, I, E
  • KVTDCFBHIJALNMOPURSZQGWXYE
  • pwfyz jcdebxthikalnmogursvq
  • ABCDEFGHIJKLMNOPQRSTUVWXYZ

Tidak ada contoh:

  • HLWROABCDEFZXYGIJKMNPQTSVU

Bukti Konsep: (Python3, 529 bytes)

import random
g1 = ['A', 'J', 'K']
g2 = ['B', 'C', 'D', 'E', 'G', 'P', 'T', 'V', 'Z']
g3 = ['I', 'Y']
g4 = ['Q', 'U']
g5 = ['S', 'X', 'F']
g6 = ['M', 'N']
random.shuffle(g1)
random.shuffle(g2)
random.shuffle(g3)
random.shuffle(g4)
random.shuffle(g5)
random.shuffle(g6)
print(g1[0] + g2[0] + g2[1] + g2[2] + g2[3] + g5[0] + g2[4] + 'H' + g3[0] + g1[1] + g1[2] + 'L' + g6[0] + g6[1] + 'O' + g2[5] + g4[0] + 'R' + g5[1] + g2[6] + g4[1] + g2[7] + 'W' + g5[2] + g3[1] + g2[8])

5
Tidak Zboleh "terkunci di tempat", tidak bersajak dengan yang lain?
Shaggy

3
Tergantung dari mana Anda berasal, saya kira. Jika Anda mengatakan 'zed' maka akan masuk akal untuk mengeluarkannya tetapi sebaliknya, jika Anda mengatakan 'zee' maka tinggalkan saja. Pada akhirnya terserah Anda, seperti sisa set. Mereka seharusnya menjadi pedoman dan titik awal yang bertentangan dengan aturan ketat :)
Breadlord

3
Seragam acak atau setiap kemungkinan memiliki probabilitas bukan nol, atau sesuatu yang lain?
jimmy23013

8
@PeterTaylor Saya pikir maksudnya adalah bahwa anggota grup dapat dengan mudah ditukar di tengah lagu sambil mempertahankan nada dan irama yang asli - jadi ketika mereka melakukan sajak, W adalah 3 suku kata panjang sedangkan U hanya 1, yang akan mengubah ritme lagu.
Sok

2
Bagi mereka yang (seperti saya) tidak tahu apa yang dibicarakan pertanyaan: en.wikipedia.org/wiki/Alphabet_song
anatolyg

Jawaban:


6

05AB1E , 28 byte

A.•¬=©ƶÓÄûkTVã”ØζÞ•Dás#€.rJ‡

Output sebagai string huruf kecil tunggal.

n

Penjelasan:

A                    # (a) Push the lowercase alphabet
 .•¬=©ƶÓÄûkTVã”ØζÞ•  # Push compressed string "ajk bcdegptvz iy qu sxf mn"
  Dá                 # (b) Duplicate it, and only keep the letters (removing the spaces)
    s#               # Swap to get the string again, and split it by spaces
      €.r            # Shuffle each substring randomly
         J           # (c) Join it back together to a single string
                    # Transliterate all characters from (b) to (c) in string (a)
                     # (and output the result implicitly)

Lihat ini 05AB1E ujung tambang (bagian Cara string kompres bukan bagian dari kamus? ) Untuk memahami mengapa .•¬=©ƶÓÄûkTVã”ØζÞ•adalah "ajk bcdegptvz iy qu sxf mn".


7

Python 3 , 140 133 124 123 byte

d=*map(set,'AJK BCDEGPTVZ IY QU SXF MN H L O R W'.split()),
print([d[int(c,16)].pop()for c in'0111141620075581394131a421'])

Cobalah online!

-1 byte, terima kasih kepada Jo King


Python 2 , 174 170 158 byte

from random import*
s=''
for c in'abbbbebHcaaLffObdRebdbWecb':s+=choice(list(set(('AJK BCDEGPTVZ IY QU SXF MN '+c).split()['abcdef'.find(c)])-set(s)))
print s

Cobalah online!



3

Pyth , 59 57 56 byte

hMeD,Vs.SMJc"ajk bcdegptvz iy qu fsx mn h l o r w"dxLGsJ

Cobalah online!

Output adalah array huruf kecil.

hMeD,Vs.SMJc"ajk bcdegptvz iy qu fsx mn h l o r w"dxLGsJ   Implicit: d=" ", G=<lowercase alphabet>
          Jc"ajk bcdegptvz iy qu fsx mn h l o r w"d        Chop the grouping string on spaces, store in J
                                                      sJ   Concatenate J into single string
                                                   xLG     Find the index of each letter in grouping string in the unaltered alphabet
       .SMJ                                                Shuffle each group in J
      s                                                    Concatenate into a single string
    ,V                                                     Pair the shuffled string with their 'correct' positions in the alphabet
  eD                                                       Order the pairs by the derived positions (last element of each pair)
hM                                                         Keep the letter from each pair (the first element)
                                                           Implicit print


3

Perl 6 , 76 byte

{my@a='A'..'Z';<AJK BCDEGPTVZ IY QU SXF MN>>>.&{@a[.ords X-65].=pick(*)};@a}

Cobalah online!

Blok kode anonim tanpa argumen dan mengembalikan daftar karakter.

Penjelasan:

{                                                                          } # Anonymous code block
 my@a='A'..'Z';      # Initialise @a as a list of the alphabet
               <AJK BCDEGPTVZ IY QU SXF MN>   # For each of the sets of letters
                                           >>.&{@a[.ords X-65].=       }  # Set those indexes
                                                                pick(*)   # To a random order
                                                                        ;@a  # And return

3

JavaScript - 421 344 328 320 306 280 277 276 ... 176 Bytes

-77 Bytes - pada saya sendiri

-18 Byte - terima kasih kepada @tsh dan @Geza Kerecsenyi yang membuat saya melihat apa yang awalnya ditunjukkan oleh @tsh juga

-8 Bytes - terima kasih kepada @Geza Kerecsenyi

-14 Bytes - dengan bantuan @Geza Kerecsenyi

- 28 Bytes - pada saya sendiri

-3 Bytes - lagi dengan bantuan @ Geza Kerecsenyi

-1 Bytes - bagaimana ini bisa terjadi ...

...

-100 Bytes - @ Kaiido membunuhnya dan melalui beberapa langkah sebelum semua ini turun hingga 176 Bytes

Golf:

c=[,'AJK','BCDEGPTVZ','IY','QU','SXF','MN'].map(s=>[...s]);alert([...'1222252H311L66O24R5242W532'].reduce((o,v)=>o+(+v?(p=>p.splice((Math.random()*p.length)|0,1))(c[v]):v),""))

atau coba online !


1
Anda setidaknya bisa mengganti ['B', 'C', 'D', 'E', 'G', 'P', 'T', 'V', 'Z'] dengan 'BCDEGPTVZ'.split`` untuk menyimpan beberapa byte
tsh

1
Coba 'BCDEGPTVZ'.split``alih-alih .split('')untuk -2.
Geza Kerecsenyi

1
Juga, Anda dapat menentukan y=q=>q.split``di bagian atas kode Anda, dan membuat semua string array yang Anda lewati y()- misalnya a=['A','J','K']menjadia=y("AJK")
Geza Kerecsenyi

1
Dan ganti 'BCDEGPTVZ'.split('')dengany('BCDEGPTVZ')
Geza Kerecsenyi

1
'abcdef'.includes(s)?r(eval(s)):l[i]
Geza Kerecsenyi

2

Pesona Runic , 210 byte

>yy `AJK`06B$̤$@
>`BCDEGPTVZ`06B$$$$ $̤$y $ $y @
>̤`IY`06Byyy$yyy̤ @
> ̤`QU`06Byy̤ $y @
> ̤`FSX`06B $yy̤$yy@
>y̤ `MN`06Byyy $@
}}f}l3-[r\
3-[2'RA?rR1Kl'RAs]{1-:0)?\}l
> ̤`HLORW`06Bo$y $y$y$yy@ \~{{B͍

Cobalah online!

Pengacakan tidak seragam karena tidak ada cara yang baik untuk melakukannya di Runic. Alih-alih itu secara acak merotasi setiap kumpulan huruf (mis. [BCDEGPTVZ]Adalah satu pengelompokan) dengan jumlah tertentu (mis. Memutar set di atas dengan 4, di mana bagian atas tumpukan berada di sebelah kanan, hasilnya adalah [BCDEGZPTV]) dan kemudian secara acak memutuskan apakah akan membalikkan tumpukan. Ia melakukan operasi ini 15 kali. Akibatnya, semua pemesanan mungkin dimungkinkan tetapi kemungkinannya tidak sama. (Dalam hal ini tidak cukup, meningkatkannya lebih lanjut biaya nol byte , hingga 15000 loop acak).

Ini adalah bagian dari kode yang menangani pengocokan:

  v              vvvv           Loop counter

}}f}l3-[r\                      < Loop entry
[2'RA?r1KRl'RAs]{1-:0)?\}l3-
                       \~{{B͍    < loop exit

 ^^^^^^                         Randomly reverse
          ^^^^^                 Rotate by a random an amount

Sisa kode membuka gulungan ke ini:

                     ABCDEFGHIJKLMNOPQRSTUVWXYZ
>      `AJK`08B      $        $$;
> `BCDEGPTVZ`08B      $$$$ $        $   $ $   $;
>         `IY`08B            $               $;
>          `QU`08B                   $   $;
>          `FSX`08B       $            $    $;
>            `MN`08B             $$;
>          `HLORW`08Bo      $   $  $  $    $;

^                                                   Create IPs
 ^^^^^^^^^^^^^^^^                                   Set letter groupings
                  ^^^                               Call shuffle function
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^    Print letters
                     ^                              Last letter group needs to be sorted

Jika huruf-huruf dibiarkan tidak teracak (tetapi sekali terbalik) dengan mengubah dua byte alfabet dicetak secara normal , yang dapat digunakan untuk memverifikasi bahwa semua pengelompokan huruf dicetak di tempat yang benar. Ruang putih menggeser Bperintah keluar dari fase sehingga semua IP dapat menggunakan loop fungsi pada saat yang sama tanpa bertabrakan, dan kemudian membawanya kembali ke fase lagi.

Untuk bermain golf, pertama-tama setiap ruang yang dapat dihapus pada semua baris telah dipangkas, kemudian masing-masing dua ruang dikonversi menjadi y, dan setiap urutan yyyydikonversi menjadi ̤karena ̤dan yyyyjumlah penundaan yang sama, tetapi 2 byte lebih murah. Loop keluar juga digabungkan dengan HLORWsegmen program utama untuk menghemat spasi byte (12 byte).


2

Perl 5 , 103 91 85 byte

map{my%l;@l{/./g}++;@k{/./g}=keys%l}AJK,BCDEGPTVZ,SXF,IY,QU,MN;say map$k{$_}||$_,A..Z

Cobalah online!

Kode ini (ab) menggunakan fakta bahwa output Perl kunci hash ( %l) adalah acak untuk membuat pemetaan ( %k) dari semua huruf yang dapat dimodifikasi untuk salah satu rekan mereka yang mungkin. Pada waktu output, setiap kunci yang tidak ada diasumsikan tidak berubah.


Kecuali output Perl kunci hash tidak acak sama sekali. Ini sepenuhnya deterministik, hanya dipengaruhi oleh kunci itu sendiri dengan cara yang membuatnya sulit diprediksi. Itu sebabnya kode ini menghasilkan output yang sama di setiap proses. Tidak tahu apakah itu mendiskualifikasi pendekatan ini atau tidak.
John Bollinger

@ JohnBollinger Itu hanya benar dalam menjalankan program. Dalam sekali jalankan, urutan hash akan sama jika hash tidak dimodifikasi. Di dua berjalan atau dengan modifikasi, ada benih acak yang dibuat selama setiap doa perl. Referensi
Xcali

Ok, @Xcali, saya berdiri dengan benar. Namun, saya setidaknya sebagian disesatkan oleh "Coba online!" tautan, yang berulang kali menghasilkan keluaran yang sama untuk saya. Itu pasti caching, atau apalah.
John Bollinger

Menggunakan keysjelas merupakan pendekatan yang baik, tetapi Anda dapat menghemat 6 byte menggunakan sort rand 2,...:( Cobalah secara online!
Dom Hastings


1

Python 3 , 149 byte

a,b,i,q,s,m,h,l,o,r,w=(set(s)for s in["AJK","BCDEGPTVZ","IY","QU","SXF","MN",*"HLORW"])
print([eval(c).pop()for c in[*"abbbbsbhiaalmmobqrsbqbwsib"]])

Cobalah online!

Pengacakan dengan menggunakan pop () untuk set huruf


1

APL (Dyalog Extended) , 55 byte

Program lengkap. Mencetak huruf besar dengan ruang depan dan belakang, tetapi tanpa ruang perantara

{(?⍨∘≢⊇⊢)@(∊∘⍺)⊢⍵}/⌈'AjkBcdegptvzIyQuSxfMn'(⊂⍤⊢,⍨∊⊂⊣)⎕A

Cobalah online!

⎕A alfabet huruf besar

'AjkBcdegptvzIyQuSxfMn'(... ) terapkan fungsi diam-diam anonim berikut dengan argumen yang benar dan string yang ditunjukkan sebagai argumen kiri:

 untuk argumen kiri,

 mempartisi itu, memulai segmen baru di mana

 karakter argumen kiri adalah anggota argumen kanan (yaitu pada huruf besar)

,⍨ menambahkan

 melampirkan (memperlakukannya sebagai satu elemen)
 yang
 argumen yang tepat

 huruf besar semuanya

{... }/ kurangi dengan lambda anonim berikut, memberi ... "QU"λ("SXF"λ("MN"λ"A-Z")):

⊢⍵ pada argumen yang benar (abjad berebut sedang berlangsung)

(... )@(∊∘⍺) menerapkan fungsi diam-diam anonim berikut ke subset yang merupakan anggota dari argumen kiri (grup sajak)

   pada bagian itu

   menyusun ulang menjadi

  ?⍨ permutasi acak  penghitungan
   panjang
  huruf dalam himpunan bagian


1

Arang , 43 byte

FαF⪪”&↖(vJf#S»↖ιηa↷N↖⪪νP´↑x‖υ” F№κι‽Φκ¬№KAμ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Charcoal tidak memiliki operator pengocokan, tetapi saya menemukan metode pengambilan sampel tanpa penggantian. Penjelasan:

Fα

Ulangi setiap huruf alfabet.

F⪪”&↖(vJf#S»↖ιηa↷N↖⪪νP´↑x‖υ” 

Pisahkan string AJK BCDEGPTVZ IY QU SXF MN H L O R Wpada spasi dan loop di atas substring.

F№κι

Ulangi jumlah kali huruf saat ini muncul di substring. (Saya menggunakan loop karena conditional akan membutuhkan elsecaluse. Atau saya bisa saja memfilter pada substring yang berisi huruf saat ini untuk jumlah byte yang sama.)

‽Φκ¬№KAμ

Cetak karakter acak tetapi kecualikan yang sudah dicetak.


0

Retina , 80 byte

K`1A2B2C2D2E5F2GH3I1J1KL6M6NO2P4QR5S2T4U2VW5X3Y2Z
~(K`123456
.
?O`$&.¶
)`¶$
[blank line]
\d
[blank line]

Cobalah online!

Mungkin bukan metode yang paling golf, tapi saya tetap akan mengirimkannya.

Penjelasan:

K`1A2B2C2D2E5F2GH3I1J1KL6M6NO2P4QR5S2T4U2VW5X3Y2Z

Setel string yang berfungsi ke 1A2B2C2D2E5F2GH3I1J1KL6M6NO2P4QR5S2T4U2VW5X3Y2Z . Ada nomor sebelum setiap huruf dalam grup, misalnya A, Jdan Ksemua ada 1sebelum mereka.

~(

Tandai bagian kode yang akan menghasilkan beberapa kode retina, kemudian jalankan sesudahnya.

K`123456

Setel string yang berfungsi ke 123456

.
?O`$&.¶

Ganti setiap karakter dengan ?O`{character}.¶

)`¶$
[blank line]

Hapus baris baru yang tertinggal dan selesaikan grup untuk menghasilkan kode. Grup akan menghasilkan kode:

?O`1.
?O`2.
?O`3.
?O`4.
?O`5.
?O`6.

{n}.cocok dengan semua contoh nomor n diikuti oleh karakter. ?Omengurutkan setiap instance secara acak, dan ini dilakukan untuk semua set karakter.

\d
[blank line]

Akhirnya, hapus semua angka dan secara implisit mengeluarkan string yang dihasilkan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.