Menyulap dengan Angka

20

Tugas Anda adalah untuk menghasilkan pola juggling yang valid dengan melengkapi templat yang diberikan. Tapi pertama-tama, Anda mungkin perlu tahu bagaimana pola tersebut dilambangkan.

masukkan deskripsi gambar di sini

Pengantar Siteswap

Siteswap adalah notasi yang ditetapkan untuk pola juggling. Ini bekerja dengan membagi pola menjadi ketukan. Di setiap ketukan, tangan kiri dan kanan Anda bergantian melempar bola. Setiap lemparan (yaitu setiap ketukan) dilambangkan dengan angka yang menunjukkan kapan bola dilemparkan berikutnya - ini berhubungan langsung dengan ketinggian lemparan.

Mari kita lihat beberapa contoh. Lihat animasi semua ini di sini .

Cascade 3-Bola

Pola 3 bola yang paling sederhana. Setiap bola dilemparkan pada setiap ketukan ketiga (tangan bergantian). Menuliskan ketukan seperti ini (garis ASCII menghubungkan dua ketukan di mana bola yang sama dilemparkan):

Beat     1 2 3 4 5 6 7 8 9
Hand     L R L R L R L R L
Siteswap 3 3 3 3 3 3 3 3 3
         └─┼─┼─┘ │ │
           └─┼───┘ │
             └─────┘

Perhatikan bagaimana setiap bola dilemparkan pada Lketukan, dilemparkan berikutnya pada suatu Rketukan. Pola-pola tapak ulang diulang secara implisit, sehingga pola ini biasanya dilambangkan sebagai 333, meskipun sederhananya 3juga cukup.

441

Berikut adalah contoh yang sedikit lebih rumit dengan situswap 441 :

Beat     1 2 3 4 5 6 7 8 9
Hand     L R L R L R L R L
Siteswap 4 4 1 4 4 1 4 4 1
         │ │ └─┘ │ │
         └─┼─────┘ │
           └───────┘

Perhatikan bagaimana lemparan bernomor genap pergi ke tangan yang sama dengan yang mereka lemparkan, sedangkan lemparan bernomor ganjil pergi ke tangan lain.

423

Terkadang Anda hanya ingin memegang bola melalui ketukan alih-alih melemparkannya. Semua itu berarti, bahwa bola ini dilemparkan pada saat giliran tangan ini - yaitu 2 ketukan kemudian. Jadi memegang bola sama dengan a 2di dalam pola:

Beat     1 2 3 4 5 6 7 8 9
Hand     L R L R L R L R L
Siteswap 4 2 3 4 2 3 4 2 3
         │ └─┼─┘ │ │
         │   └───┼─┘
         └───────┘

50505

A 0berarti tangan saat ini kosong pada ketukan itu, karena pola ini menunjukkan:

Beat     1 2 3 4 5 6 7 8 9
Hand     L R L R L R L R L
Siteswap 5 0 5 0 5 5 0 5 0
         └───┼───┼─┘   │
             └───┼─────┘
                 └───────>

Juggling Multipleks

Masalah ini akan sedikit terlalu sederhana dengan vanwap siteswap. Masukkan pola multipleks! Juggling multipleks berarti Anda melemparkan beberapa bola dari satu tangan pada saat yang bersamaan. Misalnya, dalam cascade 3-bola di atas, jika Anda berdua melemparkan bola tambahan pada setiap ketukan ketiga, polanya akan menjadi [33]33dan terlihat seperti ini:

Beat     1    2 3 4    5 6 7    8 9
Hand     L    R L R    L R L    R L
Siteswap [33] 3 3 [33] 3 3 [33] 3 3
          └┴──┼─┼──┴┘  │ │
              └─┼──────┘ │
                └────────┘

Berikut adalah contoh lain, di mana lemparan multipleks memiliki dua ketinggian / panjang yang berbeda. Hal ini dapat dilambangkan sebagai baik [34]11atau [43]11:

Beat     1    2 3 4    5 6 7    8 9
Hand     L    R L R    L R L    R L
Siteswap [43] 1 1 [43] 1 1 [43] 1 1
          ││  └─┴──┘│  │
          │└────────┘  │
          └────────────┘

(Perhatikan bahwa 1lemparan pada beat 2mengalahkan 3dan segera dilemparkan lagi (seperti yang lain 1) untuk mendarat pada beat 4dan menjadi bagian dari lemparan multipleks kedua.)

Tautan situs untuk animasi pada awal posting ini adalah [53]15121 .

Validitas Pola

Agar suatu pola berlaku secara semantik , jumlah bola di tangan harus selalu sesuai dengan jumlah lemparan yang ditunjukkan pada ketukan itu. Ini berarti, tidak boleh ada bola mendarat pada ketukan dengan 0, harus ada hanya satu bola mendarat pada ketukan dengan digit tunggal lainnya, dan harus ada n bola mendarat pada ketukan multipleks, di mana n adalah jumlah digit dalam lemparan multipleks. Pola tersebut juga harus dapat diulang dengan mulus.

Contoh pola yang tidak valid adalah 543(semua bola akan mendarat pada ketukan yang sama), 240( 2akan mendarat pada 0ketukan) atau 33[24](tidak ada bola mendarat pada ketukan multipleks, tetapi dua bola mendarat pada kedua ketukan lainnya).

Tantangan

Anda akan mengambil pola wap situs yang berisi wildcard dan menghasilkan pola yang valid, dengan wildcard yang diisi.

Ambil sebagai input (melalui stdin, argumen baris perintah, parameter file atau fungsi) string format

n s

Di mana nbilangan bulat menunjukkan jumlah bola yang akan digunakan, dan smerupakan pola situswap ( tanpa spasi). Anda dapat berasumsi bahwa itu benar secara sintaksis - semua tanda kurung siku cocok dan tidak bersarang, dan tidak ada karakter yang tidak terduga. Semua lemparan akan menjadi lemparan satu digit ( 0- 9). Namun , beberapa ketukan mungkin hanya dilambangkan sebagai _, yang harus diisi dengan lemparan tunggal atau multipleks pada output.

Catatan: sesuatu seperti tidak[_3] akan menjadi bagian dari input. Entah seluruh ketukan hilang atau seluruh ketukan diberikan.

Keluarkan pola yang valid, yang dapat disulap dengan jumlah bola yang diberikan dan setuju dengan pola input di semua ketukan yang ditentukan. Jika tidak ada pola yang valid dengan input yang diberikan, output !. Output juga akan melalui stdout, ke file atau sebagai nilai pengembalian fungsi.

Catatan: Output tidak boleh mengandung tanda kurung atau nol yang tidak perlu dalam lemparan multipleks. Jadi output yang mengandung [3]atau [03]tidak diterima, Anda harus output 3sebagai gantinya. Urutan digit dalam lemparan multipleks tidak relevan.

Catatan: Anda dapat menghilangkan pola yang duplikat di bawah permutasi siklik. Misalnya untuk input 3 __(perhatikan dua wildcard), keduanya 42dan 24merupakan jawaban yang valid (antara lain), tetapi mereka sebenarnya menggambarkan pola yang sama. Anda dapat menampilkan keduanya atau hanya salah satunya, tetapi Anda harus melakukannya secara konsisten.

Ini golf kode , kode terpendek menang (tergantung pada bonus yang tercantum di bagian bawah pertanyaan).

Anda dapat menggunakan JugglingLab untuk bermain-main dengan pola untuk melihat apakah mereka valid dan seperti apa mereka.

Contohnya

Input           Possible Outputs     Comments

3 _             3
                [21]
                [111]

3 4_3           423

4 4_2           4[51]2
                4[42]2
                4[321]2

3 _23_          6231
                4233
                323[31]
                2235
                223[41]
                0237
                023[43]
                [42]231
                [32]23[11]
4 5_3           !                    5 and 3 will both land at the third beat, but
                                     there is only a single throw at that beat. This
                                     cannot be fixed with any throw in the blank.

2 5_4           !                    Any possible throw in the wildcard (including a
                                     0) will make a pattern for at least 3 balls.

3 54_           !                    The only solution that would correspond to a
                                     3-ball pattern is 540, which is not semantically
                                     valid because the 5 and 4 both land at beat 3.
                                     There are valid solutions, but they require at
                                     least 4 balls.

Bonus

  • Jika jawaban Anda dapat menangani "digit" hingga 35, dilambangkan dengan huruf (10 = A, 11 = B, ...), kurangi 20 karakter . Anda dapat memutuskan apakah huruf-huruf tersebut harus huruf besar, huruf kecil atau peka huruf besar-kecil. (JugglingLab dapat menangani mereka dalam huruf kecil jika Anda ingin melihat beberapa pola gila.)
  • Jika jawaban Anda menghasilkan semua solusi yang valid, kurangi 20 karakter .
Martin Ender
sumber

Jawaban:

6

Python, 587 - 20 = 567 karakter

from itertools import *
E,J,L,R,X=enumerate,''.join,len,range,list
def f(x):
 [u,p]=str.split(x);n=int(u);a=[[[x],x][type(x)==X]for x in eval("["+J(c if c=="["else"-1,"if c=="_"else c+","for c in p)+"]")];l,w=L(a),[i for i,x in E(a)if x==[-1]]
 for j in product([[0]]+X(chain(*[combinations_with_replacement(R(1,10),i+1)for i in R(n+1)])),repeat=L(w)):
  for k,m in zip(w,j):a[k]=m
  b=[0]*l
  for k,x in E(a):
   for y in x:b[(k+y)%l]+=1
  if all(x==L(y)for x,y in zip(b,a))&((sum(map(sum,a))/l)==n):
   u=0;yield J([['['+J(map(str,x))+']',str(x[0])][L(x)==1]for x in a])
 if u:yield"!"
pengguna1502040
sumber
Hanya karena penasaran, apakah Anda mengetahui kompleksitas waktu dari solusi Anda? Jangan khawatir tentang menjelaskan algoritme (belum), agar tidak merusak kesenangan bagi orang lain yang mungkin masih mencoba. ;)
Martin Ender
Saya pikir itu adalah sesuatu seperti di L*n^(n*choose(n+11,n+2))mana njumlah wildcard dan Ljumlah karakter dalam polanya. Tidak persis efisien.
user1502040
Saya baru saja memperhatikan Anda menghitung berlebihan dalam kasus-kasus yang memungkinkan permutasi siklik (misalnya 3 __setiap hasil dua kali, dengan ketukan ditukar), tapi saya kira itu salah saya karena tidak menentukan itu. Saya akan menambahkan klausa untuk memperbolehkan menghapusnya jika itu membantu menghemat byte.
Martin Ender
Nah, dapatkan hadiahnya kalau begitu! Tampaknya pertanyaan itu terlalu membosankan atau terlalu menakutkan bagi orang lain. ;)
Martin Ender