เล่นกลโดยตัวเลข


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จังหวะการเต้นรูปแบบการสลับไซต์ซ้ำโดยปริยายดังนั้นรูปแบบนี้มักจะแสดงเป็น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 ครั้งในภายหลัง ดังนั้นการถือลูกบอลจึงเท่ากับ a 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
         └───┼───┼─┘   │
             └───┼─────┘
                 └───────>

เล่นกลมัลติเพล็ก

ปัญหานี้อาจจะง่ายเกินไปหากวานิลลา siteswap ใส่รูปแบบมัลติเพล็ก! การเล่นกลมัลติเพล็กซ์หมายความว่าคุณโยนลูกบอลหลายลูกจากมือเดียวในเวลาเดียวกัน ตัวอย่างเช่นในน้ำตก 3 ลูกข้างต้นหากคุณสองคนขว้างลูกบอลเพิ่มอีกหนึ่งนัดในการตีครั้งที่สามรูปแบบจะกลายเป็น[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และเป็นส่วนหนึ่งของการโยน multiplex สอง.)

siteswap [53]15121สำหรับการเคลื่อนไหวที่จุดเริ่มต้นของบทความนี้คือ

รูปแบบความถูกต้อง

เพื่อให้รูปแบบมีความหมายถูกต้องจำนวนลูกในมือต้องสอดคล้องกับจำนวนการโยนที่ระบุในจังหวะนั้นเสมอ ซึ่งหมายความว่าจะต้องไม่มีลูกบอลลงจอดด้วยการตีด้วย a 0, ต้องมีเพียงหนึ่งลูกที่ลงจอดด้วยการตีด้วยหลักเดียวอื่น ๆ และจะต้องมีการลงจอดลูกบอลnที่จังหวะมัลติเพล็กซ์โดยที่nคือจำนวนหลัก ในการโยนมัลติเพล็ก รูปแบบจะต้องสามารถทำซ้ำได้อย่างราบรื่น

ตัวอย่างของรูปแบบที่ไม่ถูกต้องคือ543(ลูกบอลทั้งหมดจะร่อนลงที่จังหวะเดียวกัน), 240( 2จะลงจอดที่0จังหวะ) หรือ33[24](ไม่มีลูกบอลกลิ้งลงที่จังหวะมัลติเพล็กซ์ แต่บอลสองลูกลงที่ทั้งสองจังหวะอื่น ๆ )

ความท้าทาย

คุณจะใช้รูปแบบ siteswap ซึ่งมีสัญลักษณ์แทนและส่งออกรูปแบบที่ถูกต้องโดยใช้สัญลักษณ์แทนเหล่านั้น

รับเป็นอินพุต (ผ่าน stdin, อาร์กิวเมนต์บรรทัดคำสั่ง, ไฟล์หรือฟังก์ชันพารามิเตอร์)ของสตริงของรูปแบบ

n s

ที่ไหนnเป็นจำนวนเต็มระบุจำนวนของลูกที่จะนำมาใช้และsเป็นรูปแบบ siteswap ( โดยไม่ต้องเว้นวรรค) คุณอาจคิดว่ามันถูกต้องทางไวยากรณ์ - วงเล็บเหลี่ยมทั้งหมดจับคู่และไม่ซ้อนกันและไม่มีอักขระที่ไม่คาดคิด การโยนทั้งหมดจะเป็นการโยนครั้งเดียว ( 0- 9) อย่างไรก็ตามการเต้นบางครั้งอาจถูกเขียนเป็น a _ซึ่งจะถูกเติมด้วยการโยนเดี่ยวหรือมัลติเพล็กซ์ในเอาต์พุต

หมายเหตุ:สิ่งที่ชอบ[_3]จะไม่เป็นส่วนหนึ่งของอินพุต ทั้งจังหวะที่ขาดหายไปหรือจังหวะที่ได้รับทั้งหมด

เอาท์พุทรูปแบบที่ถูกต้องซึ่งสามารถเล่นกลกับจำนวนลูกบอลที่กำหนดและตกลงกับรูปแบบอินพุตในจังหวะที่ระบุทั้งหมด !ถ้าไม่มีรูปแบบที่ถูกต้องเป็นไปได้ด้วยปัจจัยการผลิตที่ได้รับการส่งออก เอาท์พุทก็จะผ่าน stdout ไปยังไฟล์หรือเป็นค่าตอบแทนฟังก์ชั่น

หมายเหตุ:ผลลัพธ์จะต้องไม่มีเครื่องหมายวงเล็บเหลี่ยมที่ไม่จำเป็นหรือเลขศูนย์ในการมัลติเพล็กซ์ ดังนั้นเอาต์พุตที่มี[3]หรือ[03]ไม่ได้รับการยอมรับคุณต้องเอาท์พุท3แทน ลำดับของตัวเลขในการโยนแบบมัลติเพล็กซ์ไม่เกี่ยวข้อง

หมายเหตุ:คุณอาจละเว้นรูปแบบที่ซ้ำกันภายใต้พีชคณิตการเรียงสับเปลี่ยน เช่นสำหรับการป้อนข้อมูล3 __(ให้จดจำไวลด์การ์ดทั้งสอง) ทั้งคู่42และ24เป็นคำตอบที่ถูกต้อง (ในกลุ่มอื่น ๆ ) แต่จริง ๆ แล้วพวกเขาอธิบายรูปแบบเดียวกัน คุณสามารถส่งออกทั้งสองหรือเพียงหนึ่งในพวกเขา แต่คุณจะต้องทำอย่างสม่ำเสมอ

นี่คือการเข้ารหัสกอล์ฟรหัสที่สั้นที่สุดชนะ (ขึ้นอยู่กับโบนัสที่ระบุไว้ที่ด้านล่างของคำถาม)

คุณสามารถใช้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, B = 11, ... ) ลบ20 ตัวอักษร คุณอาจตัดสินใจว่าจดหมายเหล่านั้นควรเป็นตัวพิมพ์ใหญ่ตัวพิมพ์เล็กหรือตัวพิมพ์เล็ก (JugglingLab สามารถจัดการกับมันในกรณีที่ต่ำกว่าถ้าคุณต้องการดูรูปแบบบ้าบางอย่าง)
  • ถ้าคำตอบของคุณออกผลลัพธ์ทั้งหมดการแก้ปัญหาที่ถูกต้องลบ20 ตัวอักษร

คำตอบ:


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

ฉันคิดว่ามันเป็นสิ่งที่ต้องการ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.