숫자로 저글링


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비트가,가 AT 다음 발생합니다 R이 패턴은 일반적으로 표시되도록 beat.Siteswap 패턴, 암시 적으로 반복 333간단하지만, 3도 충분할 것이다.

441

siteswap 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패턴에서 와 같습니다 .

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

멀티 플렉스 저글링

이 문제는 바닐라 사이트 스왑을 사용하면 너무 간단합니다. 멀티 플렉스 패턴을 입력하십시오! 멀티 플렉스 저글링은 한 손에서 동시에 여러 볼을 던지는 것을 의미합니다. 예를 들어, 위의 3 구슬 캐스케이드에서 세 번째 박자마다 2 구를 더 던지면 패턴은 [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즉시 또 다른 것으로 던져집니다.)14

이 게시물의 시작 부분에서 애니메이션에 대한 사이트 스왑은 [53]15121 입니다.

패턴 유효성

패턴이 의미 적으로 유효하기 위해서는 핸드의 볼 수는 항상 해당 비트에 표시된 드로우 수와 일치해야합니다. 이 수단은, 기호가있는 비트에 착륙에는 볼이 없어야합니다 0, 다른 한 자리와 비트에 하나의 볼 착륙이 있어야하고,이 있어야 N 멀티 플렉스 비트, 어디에 착륙 공 N 의 자리수 그 다중 던지기에서. 패턴도 원활하게 반복 할 수 있어야합니다.

유효하지 않은 패턴의 예는 543(모든 공이 같은 비트에 착륙), 240( 비트에 2착륙 0) 또는 33[24](다중 비트에 공이 착륙하지 않지만 두 공이 다른 두 비트에 착륙하는 것)입니다.

도전

와일드 카드가 포함 된 사이트 스왑 패턴을 가져 와서 와일드 카드가 채워진 유효한 패턴을 출력합니다.

로 받아 (표준 입력 명령 줄 인수 파일 또는 함수 파라미터를 통해) 입력 형식 문자열

n s

여기서 n사용되는 볼의 개수를 나타내는 정수이고, s(a 사이트 스왑 패턴이다 없이 공백). 구문 상 정확 하다고 가정 할 수 있습니다. 모든 대괄호가 일치하고 중첩되지 않으며 예기치 않은 문자가 없습니다. 모든 던지기는 한 자리 던지기 ( 0- 9)입니다. 그러나 일부 비트 는 단지로 표시 될 수 있으며 _, 이는 출력에서 ​​단일 또는 다중 스로우로 채워집니다.

참고 : 같은 것이 입력의 일부 [_3]아닙니다 . 전체 비트가 누락되었거나 전체 비트가 제공됩니다.

주어진 볼 수로 저글링 할 수 있고 지정된 모든 비트의 입력 패턴과 일치하는 유효한 패턴을 출력합니다. 주어진 입력에 유효한 패턴이 없으면 output을 출력하십시오 !. 출력stdout을 통해, 파일로 또는 함수 리턴 값으로도 이루어집니다.

참고 : 출력에는 불필요한 대괄호 나 멀티 플렉스 던지기에 0이 포함되지 않아야합니다. 따라서 출력을 포함 [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.

보너스

  • 답이 문자 (10 = A, 11 = B, ...)로 표시된 최대 35 자리의 "숫자"를 처리 할 수 ​​있으면 20자를 뺍니다 . 해당 문자를 대문자, 소문자 또는 대소 문자를 구분해야하는지 여부를 결정할 수 있습니다. (정글 패턴을보고 싶다면 JugglingLab에서 소문자로 처리 할 수 ​​있습니다.)
  • 답이 유효한 모든 솔루션을 출력 하면 20자를 뺍니다 .

답변:


6

파이썬, 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

나는 그것이 같은 생각 L*n^(n*choose(n+11,n+2))어디 n와일드 카드의 수와 L패턴의 문자 수입니다. 정확히 효율적이지 않습니다.
user1502040

주기적 순열을 허용하는 경우 (예 : 3 __비트가 교환 된 상태에서 모든 결과가 두 번 발생하는 경우) 초과 계산을하고 있음을 알았지 만 지정하지 않은 것이 내 잘못이라고 생각합니다. 바이트를 절약하는 데 도움이되는 경우 생략을 허용하는 절을 추가합니다.
Martin Ender

그럼, 현상금을 가져라! 그 질문은 다른 사람들에게는 너무 지루하거나 너무 어려운 것 같습니다. ;)
Martin Ender
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.