玩杂耍


20

您的任务是通过完成给定的模板来生成有效的杂耍模式。但是首先,您可能需要知道如何表示这种模式。

在此处输入图片说明

Siteswap简介

Siteswap是杂耍模式的既定符号。通过将模式分成节拍来工作。每次跳动时,您的左手和右手交替扔球。每个掷球(即每个节拍)都用一个数字表示,该数字指示下一次何时掷该球-这直接对应于掷球的高度。

让我们看一些例子。在这里查看所有这些动画

3球级联

最简单的3球图案。每三拍一掷球(交替动手)。写出节拍,如下所示(ASCII行将两个发出相同球的节拍连接起来):

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

请注意,每个L节拍都将扔一个球,然后每个节拍都将其扔出去R.Sitewap模式隐式重复,因此该模式通常表示为333,尽管3也足够了。

441

这是一个sitewap 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
         │ │ └─┘ │ │
         └─┼─────┘ │
           └───────┘

请注意,偶数掷如何发到与之相同的手牌上,而奇数掷如何发给另一只手。

423

有时,您只想通过节拍握住球而不是扔球。这意味着,下一次该手旋转时,该球将被扔出-即2拍后。因此,握球2与模式中的a等效:

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 0表示当前手在该节拍处为空,如下图所示:

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

多重杂耍

不过,如果使用香草Siteswap,此问题可能会有点过于简单。输入多重模式!多重玩法意味着您同时用一只手投掷多个球。例如,在上述的三球级联中,如果您两人在每三拍之间又掷出一个球,则模式将变成[33]33如下所示:

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

这是另一个示例,其中多路复用投掷具有两个不同的高度/长度。它可以表示为[34]11[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
          ││  └─┴──┘│  │
          │└────────┘  │
          └────────────┘

(请注意,1在节拍2处抛出的球会落在节拍处3,并立即(又一次1)再次被抛出以在节拍处着陆,4并成为第二个多重掷的一部分。)

帖子开头的动画的sitewap为 [53]15121

模式有效性

为了使图案在语义上有效,手中的球数必须始终与该拍子指示的掷球次数相对应。这意味着,在以a的拍子处没有球落下,在0任何其他一位数的拍子中只有一个球落下,并且在多重拍子上必须有n个球在落下,其中n是位数在那个多重投掷中。该模式还必须能够无缝重复。

无效模式的示例有543(所有球都将以相同的节拍着地),240(球将以节拍着20)或33[24](没有球在多重节拍上着陆,而两个球在另外两个节拍中都着陆)。

挑战

您将采用一个包含通配符的sitewap模式,并输出有效的模式,并填充这些通配符。

以格式的字符串作为输入(通过stdin,命令行参数,文件或函数参数)

n s

其中n是一个整数,指示要使用的滚珠数量,并且s是站点交换模式(空格)。您可能会认为它在语法上是正确的-所有方括号都匹配并且没有嵌套,并且没有意外的字符。所有引发将是个位数的引发(0- 9)。但是,某些拍子可能只是表示为_,将在输出中用单次或多次抛出来填充。

注意:诸如此类的[_3]内容不会成为输入的一部分。整个节拍丢失或给出了整个节拍。

输出有效的花样,该花样可以处理给定数量的球,并且在所有指定节拍中都与输入花样一致。如果给定输入没有有效的模式,则输出!输出也将通过stdout输出到文件或作为函数返回值。

注意:输出在复用抛出中不得包含不必要的方括号或零。因此,包含[3][03]不接受的输出,必须改为输出3。多重抛出中的数字顺序无关紧要。

注意:可以忽略在循环排列下重复的模式。例如,输入3 __(请注意两个通配符),4224都是有效答案(以及其他答案),但实际上它们描述的是同一模式。您既可以输出两个,也可以只输出其中之一,但是必须一致地进行输出。

这是代码高尔夫,最短的代码获胜(取决于问题底部列出的奖金)。

您可以使用JugglingLab来处理模式,以查看它们是否有效以及它们的外观。

例子

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.

奖金

  • 如果您的答案最多可以处理35个以字母表示的“数字”(10 = A,11 = B,...),请减去20个字符。您可以决定这些字母是大写,小写还是不区分大小写。(如果您要查看某些疯狂的模式,JugglingLab可以将它们以小写形式处理。)
  • 如果您的答案输出了所有有效的解决方案,请减去20个字符

Answers:


6

Python,587-20 = 567个字符

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

出于好奇,您是否偶然知道解决方案的时间复杂性?不过,请不要担心(现在)解释该算法,以免给可能仍在尝试的其他人破坏乐趣。;)
Martin Ender 2014年

我认为这就像 L*n^(n*choose(n+11,n+2))n通配符的数量在哪里L,模式中的字符数在哪里。效率不高。
user1502040 2014年

我只是注意到,在允许循环排列的情况下(例如, 3 __,每个结果都有两次,并且交换了节拍),,但是我认为那是我的错,因为没有指定。我将添加一个子句,但是如果可以帮助节省字节,则可以省略这些子句。
Martin Ender 2014年

好吧,那就赏金吧!对于其他所有人来说,这个问题似乎太无聊或令人生畏。;)
Martin Ender 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.