Sayılarla Hokkabazlık


20

Göreviniz, belirli bir şablonu tamamlayarak geçerli bir hokkabazlık deseni oluşturmaktır. Ama önce, muhtemelen böyle bir modelin nasıl ifade edildiğini bilmeniz gerekir.

resim açıklamasını buraya girin

Siteswap'a Giriş

Siteswap, hokkabazlık modelleri için oluşturulmuş gösterimdir. Deseni atımlara bölerek çalışır. Her vuruşta, sol ve sağ eliniz, topu fırlatmaya başlar. Her atış (yani her vuruş), bir sonraki topun ne zaman atılacağını gösteren bir sayı ile gösterilir - bu doğrudan atış yüksekliğine karşılık gelir.

Bazı örneklere bakalım. Tüm bunların animasyonlarını burada görebilirsiniz .

3 Toplu Kaskad

En basit 3 top modeli. Her top her üç vuruşta bir atılır (alternatif eller). Bu vuruşları yazmak şöyle görünür (ASCII çizgileri aynı topun atıldığı iki vuruşları birleştirir):

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
         └─┼─┼─┘ │ │
           └─┼───┘ │
             └─────┘

Bir atılan her topu nasıl Not Lritmi, bir sonraki atılır Rbu desen genellikle olarak gösterilir böylece beat.Siteswap desenler, üstü kapalı tekrarlamak 333basitçe rağmen, 3aynı zamanda yeterli olacaktır.

441

441 siteswap ile biraz daha karmaşık bir örnek :

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
         │ │ └─┘ │ │
         └─┼─────┘ │
           └───────┘

Çift sayılı atışların atıldıkları elin nasıl gittiğine, tek sayılı atışların ise diğer ele gittiğine dikkat edin.

423

Bazen bir topu atmak yerine bir vuruşla tutmak istersiniz. Bütün bunlar, bu top bir dahaki seferinde sırayla atılacağı anlamına gelir - yani 2 sonra atıyor. Yani bir topu tutmak 2kalıptaki bir a eşittir :

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

Bir 0akım elde Bu model gösterdiği gibi, bu vuruş boş olduğu anlamına gelir:

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
         └───┼───┼─┘   │
             └───┼─────┘
                 └───────>

Çok Katlı Hokkabazlık

Bu sorun olsa vanilya siteswap ile biraz çok basit olurdu. Çoğullama desenleri girin! Multiplex hokkabazlık aynı anda bir elden birden fazla top atmanız anlamına gelir. Örneğin, yukarıdaki 3 top kaskadında, eğer her üç vuruşta iki ek bir top atarsanız, desen olur [33]33ve şöyle görünür:

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
          └┴──┼─┼──┴┘  │ │
              └─┼──────┘ │
                └────────┘

Burada, multipleks atışın iki farklı yüksekliğe / uzunluğa sahip olduğu başka bir örnek var. Ya olarak ifade edilebilir [34]11ya da [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
          ││  └─┴──┘│  │
          │└────────┘  │
          └────────────┘

(Bu Not 1yendi atılan 2ritmi arazilerde 3ve hemen başka şekilde (yine atılır 1) araziye ritmi de 4ve ikinci multipleks atmak parçası olmak.)

Bu yazının başlangıcında animasyon için site değişikliği yapıldı [53]15121 .

Desen Geçerliliği

Bir desenin anlamsal olarak geçerli olması için, bir eldeki topların sayısı her zaman o vuruşta belirtilen atış sayısına karşılık gelmelidir. Bu, a ile bir vuruşta topların toplanmaması, 0diğer herhangi bir tek basamaklı bir vuruşta sadece bir topun inmesi ve n'nin basamak sayısı olduğu çok katlı bir vuruşta n topun toplanması gerektiği anlamına gelir . bu çoklu atışta. Desen ayrıca sorunsuz bir şekilde tekrarlanabilmelidir.

Geçersiz modellerine örnekler 543, (bütün topları aynı ritmi iniş olurdu) 240( 2iniş olurdu 0dövmek) ya da 33[24](Multiplex atışı hiçbir topun ancak iki top diğer iki atım hem iniş).

Meydan okuma

Joker karakterler içeren bir sitewap deseni alır ve joker karakterler doldurulmuş olarak geçerli bir desen çıkarırsınız.

Olarak al (stdin, komut satırı argümanı, dosya veya fonksiyon parametresi aracılığıyla) girişi formatının bir dize

n s

Burada nkullanılacak topların sayısını belirten bir tamsayıdır ve s(a siteswap desen olmayan boşluk). Sözdizimsel olarak doğru olduğunu varsayabilirsiniz - tüm köşeli parantezler eşleşir ve iç içe değildir ve beklenmedik karakterler yoktur. Tüm atışlar tek haneli atışlar ( 0- 9) olacaktır. Bununla birlikte , bazı atımlar sadece _çıkış olarak tek veya çok katlı bir atışla doldurulacak olan a olarak belirtilebilir .

Not: Böyle bir şey [_3]olacak değil girişin parçası olmak. Ya tüm vuruş eksik ya da tüm vuruş verildi.

Verilen sayıda topla hokkabazlık edilebilecek ve belirtilen tüm atımlarda giriş paterni ile anlaşılabilecek geçerli bir patern verin. Verilen girişlerle geçerli bir düzen mümkün değilse, çıktı alın !. Çıktı ayrıca stdout aracılığıyla, bir dosyaya veya işlev dönüş değeri olarak olacaktır.

Not: Çıktıda gereksiz köşeli parantez veya multipleks atışlarda sıfır bulunmamalıdır. Bu nedenle, içeren [3]veya [03]kabul edilmeyen çıktılar, 3bunun yerine çıktı almanız gerekir . Mültipleks atıştaki rakamların sırası ilgili değildir.

Not: Sen edebilir halkalı permütasyon altında aynısı olan desenleri ihmal. Örneğin, giriş için 3 __(iki joker karaktere dikkat edin), ikisi de geçerlidir 42ve 24(diğerlerinin yanı sıra) geçerli cevaplardır, ancak aslında aynı modeli tanımlarlar. Her ikisini de ya da sadece birini çıktısını alabilirsiniz, ancak bunu tutarlı bir şekilde yapmanız gerekir.

Bu kod golf , en kısa kod kazanır (sorunun altında listelenen bonuslara tabi).

JugglingLab'ı , geçerli olup olmadıklarını ve neye benzediklerini görmek için desenlerle oynamak için kullanabilirsiniz .

Örnekler

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.

Bonuslar

  • Cevabınız, harflerle (10 = A, 11 = B, ...) belirtilen 35'e kadar "rakamları" işleyebiliyorsa, 20 karakter çıkarın . Bu harflerin büyük, küçük veya büyük / küçük harfe duyarlı olmayacağına karar verebilirsiniz. (Bazı çılgın kalıplara bakmak istiyorsanız, JugglingLab bunları küçük harflerle işleyebilir.)
  • Cevabınız tüm geçerli çözümleri verirse , 20 karakter çıkarın .

Yanıtlar:


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"!"

Merakınızdan sadece çözümünüzün zaman karmaşıklığını biliyor musunuz? Yine de denemekte olan diğerleri için eğlenceyi bozmamak için algoritmayı (henüz) açıklama konusunda endişelenmeyin. ;)
Martin Ender

Bence bu L*n^(n*choose(n+11,n+2))nerede gibi bir şeyn joker karakter sayısıdır ve Ldesende karakter sayısıdır. Tam olarak verimli değil.
user1502040

Sadece döngüsel permütasyonlara izin veren durumlarda aşırı sayım yaptığınızı fark ettim (ör. 3 __ , her sonuç iki kez , ritimler değişti), ancak sanırım bu bunu belirtmemek için benim hatam. Bayt tasarrufuna yardımcı olursa, bunları atlamaya izin vermek için bir madde ekleyeceğim.
Martin Ender

Öyleyse bir ödül al! Soru, herkes için çok sıkıcı ya da çok yıldırıcıydı. ;)
Martin Ender
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.