การนับไอคอนสำหรับ splays นวัตกรรม


11

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

การ์ดในนวัตกรรมแต่ละใบมีเอกลักษณ์และมอบไอคอนจำนวนหนึ่งให้ผู้เล่น หากเราถือว่าไพ่แต่ละใบเป็นตาราง 2x3 แล้วสามในสี่ช่องบนขอบด้านซ้ายและด้านล่างจะถูกนำขึ้นโดยไอคอนเสมอ (สัญลักษณ์ในรูปหกเหลี่ยมสีดำจะไม่ถูกนับ)

ป้อนคำอธิบายรูปภาพที่นี่

เกมนี้มี 6 ประเภทของไอคอน (ปราสาทครอบใบหลอดไฟโรงงานและนาฬิกา) 012345ซึ่งเราจะเป็นตัวแทนของพลโดยใช้ตัวอักษร การใช้#เพื่อเป็นตัวแทนของรูปหกเหลี่ยมสีดำเราสามารถใช้สี่ตัวอักษรเพื่อแสดงไอคอนในการ์ดแต่ละใบ ตัวอย่างเช่นการ์ดด้านบนคือ

0.. #.. 3.. 1..  -> 03#0 #331 355# 144#
3#0 331 55# 44#

ตอนนี้ในนวัตกรรมการ์ดในพื้นที่เล่นถูกจัดกลุ่มเป็นกอง * ซึ่งกระจายในหนึ่งในสี่วิธี สำหรับตัวอย่างแต่ละตัวอย่างเราจะใช้ไพ่ด้านบนสมมติว่าการ์ดด้านซ้ายสุด03#0อยู่ที่ด้านบนของเสาเข็ม

ไม่มี splay:มองเห็นเฉพาะการ์ดบนสุดเท่านั้น

0..
3#0

Splay left : การ์ดบนสุดสามารถมองเห็นได้อย่างสมบูรณ์เช่นเดียวกับอันดับสามของการ์ดด้านล่างทั้งหมด

0..|.|.|.|
3#0|1|#|#|

Splay right : ไพ่ด้านบนสามารถมองเห็นได้อย่างสมบูรณ์เช่นเดียวกับไพ่สามใบด้านซ้ายของการ์ดทั้งหมดด้านล่าง

1|3|#|0..
4|5|3|3#0

Splay up : การ์ดบนสุดสามารถมองเห็นได้อย่างสมบูรณ์เช่นเดียวกับครึ่งล่างของการ์ดทั้งหมดด้านล่าง

0..
3#0
---
331
---
55#
---
44#

ความท้าทาย

อินพุตจะเป็นสตริงที่คั่นด้วยช่องว่างเดียวซึ่งประกอบด้วยสองส่วน:

  • ทิศทางการสเปรย์ซึ่งเป็นหนึ่งใน!<>^นั้นที่ไม่มีการสเปรย์, สเปรย์ซ้าย, สเปรย์ขวาหรือสเปรย์ขึ้นตามลำดับ
  • รายการที่ไม่ว่างเปล่าของบัตรแต่ละแห่งซึ่งเป็นความยาว 4 012345#อักขระและประกอบด้วยตัวอักษร #บัตรซ้ายสุดอยู่ที่ด้านบนของกองและแต่ละบัตรมีตรงหนึ่ง

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

> 03#0 #331 355# 144#
03#0 #331 355# 144# >

ผลลัพธ์จะเป็นรายการของตัวเลขหกตัวที่แสดงถึงการนับสำหรับแต่ละไอคอนเช่นบัตรตัวอย่างด้านบน:

! 03#0 #331 355# 144#  ->  2 0 0 1 0 0
< 03#0 #331 355# 144#  ->  2 1 0 1 0 0
> 03#0 #331 355# 144#  ->  2 1 0 3 1 1
^ 03#0 #331 355# 144#  ->  2 1 0 3 2 2

ตัวอย่างเช่นกรณีที่ไม่มีการสเปรย์มีสอง0ไอคอนและไอคอนหนึ่ง3ไอคอนแสดงขึ้นโดยให้บรรทัดแรก โปรดทราบว่าเราไม่นับ#s เนื่องจากรูปหกเหลี่ยมสีดำไม่ใช่ไอคอน

คุณสามารถเลือกวิธีการแสดงรายการที่สมเหตุสมผลและไม่คลุมเครือเช่นคั่นด้วยตัวคั่นหรือใช้การแสดงรายการแบบธรรมชาติของภาษาของคุณ

กรณีทดสอบ

! 113#  ->  0 2 0 1 0 0
< 113#  ->  0 2 0 1 0 0
> 113#  ->  0 2 0 1 0 0
^ 113#  ->  0 2 0 1 0 0
! 000# 12#2  ->  3 0 0 0 0 0
< 000# 12#2  ->  3 0 1 0 0 0
> 000# 12#2  ->  3 1 1 0 0 0
^ 000# 12#2  ->  3 0 2 0 0 0
! 000# 111# 222#  ->  3 0 0 0 0 0
< 000# 111# 222#  ->  3 0 0 0 0 0
> 000# 111# 222#  ->  3 2 2 0 0 0
^ 000# 111# 222#  ->  3 2 2 0 0 0
! 335# #101 21#2 333# 2#20 3#33 4#54 #133 3#33 32#2  ->  0 0 0 2 0 1
< 335# #101 21#2 333# 2#20 3#33 4#54 #133 3#33 32#2  ->  1 1 2 5 1 1
> 335# #101 21#2 333# 2#20 3#33 4#54 #133 3#33 32#2  ->  0 3 3 7 1 1
^ 335# #101 21#2 333# 2#20 3#33 4#54 #133 3#33 32#2  ->  2 4 4 10 1 2

โปรดทราบว่าสิ่งที่ชอบ!คืออินพุตที่ไม่ถูกต้องเนื่องจากรายการรับประกันว่าไม่ว่างเปล่า


* สำหรับจุดประสงค์ของการท้าทายนี้เราไม่สนใจสีเสาเข็ม

คำตอบ:


5

CJam, 44 37 36 bytes

ขอบคุณ Sp3000 ที่เตือนฉันว่าฉันกำลังเข้าใจเรื่องต่างๆมากเกินไปและประหยัดได้ 7 ไบต์

rci7%"3>0<2<1>"2/=6,slS%{W$~+}*fe=p;

ทดสอบที่นี่

คำอธิบาย

ข้อสังเกตบางอย่าง:

  • เราต้องการนับไพ่ใบแรกทั้งหมดเสมอ
  • สเปรย์ทั้งหมดจะทำให้คำนำหน้าหรือคำต่อท้ายของไอคอนถูกลบออก !ลบทั้งหมดของพวกเขา (ซึ่งเป็นทั้งคำนำหน้าหรือคำต่อท้ายของสี่ตัวอักษร) <ลบตัวอักษรสามตัวแรก>ลบตัวละครสองตัวสุดท้าย^ลบตัวอักษรตัวแรก

ดังนั้นสิ่งที่เราต้องการคือวิธีสั้น ๆ ในการจับคู่โหมด splay กับการตัดที่ถูกต้อง:

rci   e# Read the splay mode and convert to its character code.
7%    e# Take modulo 7. This maps "<!>^" to [4 5 6 3], respectively. Modulo 4 those are
      e# are all distinct (namely [0 1 2 3], respectively).
"3>0<2<1>"
      e# Push this string.
2/    e# Split it into chunks of 2, ["3>" "0<" "2<" "1>"]. Each chunk is CJam code which
      e# performs one of the truncations.
=     e# Select the correct snippet. This works, because array indexing is cyclic in CJam.
6,s   e# Push the string "012345".
lS%   e# Read the remainder of the input and split into space-separated tokens.
{     e# Now we're abusing the fold operation to apply our snippet to every card except
      e# the first, while also combining them all back into a single string.
  W%  e#   Copy the bottom of the stack (the truncation snippet).
  ~   e#   Evaluate it.
  +   e#   Append it the string we're building.
}*
fe=   e# For each character in "012345", count the occurrences in our new string.
p     e# Pretty-print the array.
;     e# Discard the truncation snippet which was still at the bottom of the stack.

เราสามารถสังเกตได้ว่าตัวอย่างข้อมูลที่ถูกตัดทอนมีโครงสร้างจำนวนมาก โหมดแผ่ออกแต่ละแมปไปยังหมายเลขหนึ่งใน[0 1 2 3](โดยเฉพาะในการสั่งซื้อ"!^><") และสองของพวกเขามีและสองมี> <ฉันหวังว่าจะพบแฮชสองอันที่สร้างชิ้นส่วนเหล่านี้แยกจากกันอย่างน่าอัศจรรย์เพราะนั่นจะช่วยประหยัดจำนวนไบต์ แต่จนถึงตอนนี้ฉันก็ไม่สามารถหาอะไรได้ ฉันสามารถแมป"!^><"กับตัวเลขของพาริตี้สลับกับ31%(เพื่อเลือกอักขระที่ถูกต้องจาก"<>") แต่ฉันไม่พบสิ่งใดที่แมปอย่างเรียบร้อย[0 1 2 3]ในลำดับนั้น (ยกเว้นโซลูชันไร้เดียงสา"!^><"#ที่น่าเสียดายที่ไม่ได้บันทึกไบต์ใด ๆ )

โปรดทราบด้วยว่ามันยืดหยุ่นกว่าเล็กน้อย !นอกจากนี้ยังสามารถนำไปใช้n>สำหรับการใด ๆn > 3(ทิ้งทุกอย่างเป็นคำนำหน้า) น่าเสียดายที่ฉันไม่สามารถหาฟังก์ชั่นที่เรียบง่ายสำหรับแผนที่เช่นนั้นได้


0

Pyth, 39 36 33 31 ไบต์

Jtczdm/s+hJm@yk%*%Chz33T19tJ`d6

ลองออนไลน์ ชุดทดสอบ

คำอธิบาย

  • Jtczd: Jการป้อนข้อมูลแยกด้วยช่องว่างเอาส่วนแรกและบันทึกส่วนที่เหลือจะ
  • m6: ทำซ้ำต่อไปนี้สำหรับตัวเลข 0 ถึง 5
    • mtJ: ทำซ้ำต่อไปนี้สำหรับไพ่ทั้งหมดยกเว้นไพ่ใบแรก
      • Chz: รับจุดรหัสของตัวละครตัวแรกในการป้อนข้อมูล
      • %*%... 33T19: แผนที่จุดรหัสของ!<>^(33, 60, 62, 94) ไปยังหมายเลข 0, 4, 5, 14 cp % 33 * 10 % 19ดำเนินการคำนวณที่แน่นอนคือ
      • yk: รับ powerset ของการ์ดปัจจุบัน นี่คือรายการขององค์ประกอบทั้งหมดของการ์ด
      • @: รับไอเท็มของ powerset ที่สอดคล้องกับดัชนีที่คำนวณมาก่อน
    • +hJ: เพิ่มการ์ดใบแรกลงในผลลัพธ์
    • s: เชื่อมต่อการ์ดที่ประมวลผลเข้าด้วยกัน
    • /`d: นับการเกิดขึ้นของตัวเลขปัจจุบันในผลลัพธ์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.