เกมเตตริส


13

บทนำ

Tangramsเป็นเกมปริศนาคลาสสิกที่เกี่ยวข้องกับการจัดเรียง / การติดตั้งบล็อคให้เป็นรูปทรงต่างๆ จากภาษาจีน七巧板 - ความหมายแท้จริง "กระดานเจ็ดทักษะ" ลองใช้ความคิดนี้และใช้Tetrominosเจ็ดตัวเพื่อเติมกริด

ท้าทาย

เขียนฟังก์ชั่นหรือโปรแกรมที่ใช้อาร์เรย์ของพิกัดกริดเป็นอินพุตและส่งออกตาราง 10 เต็ม 20 โดยเต็มไปด้วยชิ้น Tetris ยกเว้นในพิกัดที่ระบุ

เพิ่มประสิทธิภาพคะแนนของคุณโดยพยายามที่จะให้การกระจายของชิ้นส่วนที่เหมือนกัน

เกณฑ์

ใช้พิกัดpastebin นี้เพื่อให้งานของคุณสำเร็จ มีพิกัดห้าชุด อย่าลังเลที่จะปรับเปลี่ยนรูปแบบที่พิกัดถูกเขียน แต่ไม่ใช่ค่า

ชุดข้อมูล # 2 ไม่สามารถแก้ไขได้ - ในกรณีนี้เพียงแค่แสดงกริดที่เต็มไปด้วยเซลล์อินพุต (เช่นXที่อยู่ของหลุม)

อินพุต

พิกัดกริดแสดงถึง 'หลุม' ในกริด เซลล์เหล่านี้ไม่สามารถมีส่วนใดส่วนหนึ่งของ Tetromino ได้

พิกัดกริด:

(0,0), (1,0), (2,0), ... (9,0)
(0,1), (1,1), (2,1), ... (9,1)
.
.
.
(0,19), (1,19), (2,19), ... (9,19)
  • ใช้รูปแบบอาร์เรย์ของภาษาโปรแกรมที่คุณเลือกเพื่อป้อนค่าพิกัด

  • แทนหลุมในตารางด้วยXหรืออื่น ๆ ที่ASCII พิมพ์

เอาท์พุต

การใช้ขนาดตารางมาตรฐานของ Tetris กว้าง 10 เซลล์สูง 20 เซลล์พิมพ์ตารางวิธีแก้ปัญหาเฉพาะในกรณีที่สามารถเติมตารางอย่างสมบูรณ์และสมบูรณ์แบบโดยใช้ชิ้นส่วน Tetromino

ชิ้นสร้างด้วยตัวอักษรI, O, L, J, T, Z, Sดังนี้

I          
I          L      J
I    OO    L      J     T     ZZ      SS
I    OO    LL    JJ    TTT     ZZ    SS

ตัวอย่าง

ตัวอย่างโซลูชันเอาต์พุตที่ไม่มีพิกัดอินพุต:

ZZIIIILLLI
JZZTTTLLLI
JJJSTLOOLI
SZZSSLOOLI
SSZZSLLJJI
TSOOSLLJII
TTOOSSLJII
TZOOSSLZII
ZZOOSSZZII
ZJJJJSZLLI
TTTJJOOILI
ITZJJOOILI
IZZTTTLIII
IZOOTZLIII
IJOOZZLLII
LJJJZSSTII
LLLTSSTTTI
LLLTTSSZJI
OOLTSSZZJI
OOIIIIZJJI

ด้วยการกระจายดังนี้

I          
I          L      J
I    OO    L      J     T     ZZ      SS
I    OO    LL    JJ    TTT     ZZ    SS

11   6     8     6      6     7      6

หมายเหตุ

พิกัดเป็นตัวแทนเดียวXและYตำแหน่งในตาราง เส้นตารางเป็นแบบอิง 0 หมายถึงพิกัด(0,0)ควรเป็นเซลล์ด้านบนซ้ายหรือเซลล์ล่างซ้ายเลือกตัวเลือกของผู้เขียน

อิฐสามารถ:

  • ได้รับการคัดเลือกตามดุลยพินิจของผู้เขียน
  • ถูกหมุนตามที่ผู้เขียนเห็นว่าเหมาะสม
  • ถูกวางลงบนตารางทุกที่ขึ้นอยู่กับดุลยพินิจของผู้เขียน (aka: ไม่มีแรงโน้มถ่วง Tetris)

อิฐไม่สามารถ:

  • ถูกวางไว้นอกขอบเขตของตาราง
  • ทับซ้อนอิฐที่มีอยู่หรือหลุมในตาราง
  • เป็นชิ้น Tetetino Tetris ที่ไม่ได้มาตรฐาน

เกณฑ์การให้คะแนน

คะแนนของคุณอยู่ในรูปแบบ:

(1,000 - [ไบต์เป็นรหัส]) * (M / 10 + 1)

โดยที่ M เป็นตัวคูณสำหรับการกระจายของชิ้นส่วนที่ใช้ในชุดโซลูชันของคุณ

คะแนนสูงสุดโดย Ides of March ชนะ

ในการคำนวณ M ให้เพิ่มค่าการกระจาย tetromino ต่ำสุดสำหรับแต่ละชุดจากนั้นนำค่าเฉลี่ยปัดเศษลงเพื่อคำนวณ M

ตัวอย่างเช่น:

Set 1: 5
Set 2: 4
Set 3: 5
Set 4: 6
Set 5: 3

6 + 4 + 5 + 4 + 4 = 21/5 = 4.6

ดังนั้นคุณจะใช้4เป็นค่าMของคุณ

หมายเหตุ: หากชุดไม่มีวิธีการแก้อย่าใช้ตัวประกอบที่กำหนดไว้ในการคำนวณ M เนื่องจากไม่มีการกระจาย tetromino


4
การปรับปรุงคำถามหลังจากที่โพสต์นั้นเป็นเรื่องยากเพราะหากการเปลี่ยนแปลงมีความสำคัญพวกเขาจะทำให้งานของคนที่เริ่มทำงานแล้วมีปัญหา (หรือแย่กว่านั้นคือแม้แต่โพสต์ผลลัพธ์) ฉันจะแนะนำความคิดการโพสต์ความท้าทายใน sandbox นั่นคือสถานที่สำหรับขอคำติชมและขัดสเป็กก่อนที่จะไปบนหลัก ที่ถูกกล่าวหลังจากเรียดอย่างรวดเร็วฉันไม่เห็นปัญหาที่เห็นได้ชัดใด ๆ กับความท้าทายของคุณ
Martin Ender

@ MartinBüttnerรับรองสำเนาถูกต้องขอบคุณสำหรับความคิดเห็น
CzarMatt

2
Ides of March = 15 มีนาคม ฉันต้องมองหามัน
เลเวลริเวอร์เซนต์

ฉันได้ทำการเปลี่ยนแปลงเล็กน้อยในการโหลดคำอธิบายงานไว้ล่วงหน้าเพราะไม่อย่างนั้นมันเป็นไปไม่ได้ที่จะเข้าใจสิ่งที่เราถูกขอให้ทำในการอ่านครั้งแรก ฉันคิดว่ามันจะเป็นการปรับปรุงหากคุณระบุว่ากรณีการป้อนข้อมูลใดที่ไม่สามารถแก้ไขได้เพื่อให้พวกเขาทำหน้าที่เป็นกรณีทดสอบนอกเหนือจากชุดข้อมูลการให้คะแนน
Peter Taylor

@PeterTaylor ยุติธรรมเพียงพอฉันได้เพิ่มชุดโซลูชันที่ไม่สามารถแก้ไขได้ ขอบคุณสำหรับความคิดเห็น.
CzarMatt

คำตอบ:


2

Python 3 , 819 ไบต์, M = 0, คะแนน = 181

นี่คือโปรแกรม DFS ที่ดุร้าย มันสร้างอาร์เรย์ numpy และแทรกหลุมที่ป้อนทั้งหมด จากนั้นจะนำไทล์ที่ไม่ได้บรรจุที่อยู่ซ้ายสุดไปยังแถวที่สูงที่สุด ตอนนี้เราทำมันซ้ำแล้วซ้ำอีก - เมื่อเราไม่สามารถหาวิธีแก้ปัญหาได้หรือเราย้อนรอยและลองอีกชิ้นในโอกาสแรก

สิ่งนี้มีค่าMเป็น0 เนื่องจากพยายามใช้ชิ้นส่วนตามลำดับที่กำหนดและเกือบจะหาวิธีแก้ปัญหาโดยไม่ต้องใช้ตัวสุดท้ายในรายการ ฉันพยายามใช้การสุ่มรายการสั่งซื้อแต่ละรอบจะทำให้การกระจายมากยิ่งขึ้น แต่ฉันมีเพียงM 2 ซึ่งไม่คุ้มค่าไบต์จำเป็นต้องนำเข้าrandom.shuffle

ฉันไม่สามารถออกความเห็นรหัสด้านล่างเนื่องจากในสนามกอล์ฟของฉันฉันลืมไปนานแล้วว่ามันทำอะไรได้มาก แนวคิดทั่วไป:

  • นำเข้าผลิตภัณฑ์ numpy และ itertools พร้อมชื่อ 1 ตัวอักษร
  • เปลี่ยนชื่อบิวอินบางส่วนเป็นฟังก์ชัน 1 ตัวอักษรและกำหนดแลมบ์ดาเพื่อบันทึกไบต์
  • สร้างอาเรย์ของ tetrominos ที่เป็นไปได้เป็น numpy nd-arrays การหมุนทั้งหมดรวมอยู่ด้วย
  • ในฟังก์ชั่นวนซ้ำ:
    • รับตำแหน่งของกระเบื้องที่ไม่สำเร็จที่ต้องการและหมุนผ่านรายการชิ้นส่วน
    • สำหรับแต่ละชิ้นให้วนไปตามการแปล (เลื่อนขึ้นและลง)
    • หากมีบางอย่างไม่ทำงาน (ชิ้นส่วนหลุดออกจากกระดานให้ไปพบกับอีกชิ้นหนึ่งโดนหลุม ฯลฯ ) ให้ลองใช้คำแปลถัดไปหรือชิ้นส่วนถัดไปทั้งหมด
    • ถ้ามันใช้งานได้ดี ลองใช้แล้วเรียกใช้ฟังก์ชันซ้ำ ๆ
    • หากเส้นทางนั้นใช้ไม่ได้ผลก็จะกลับมาเป็น 'a' ดังนั้นเราลองใหม่อีกครั้ง ถ้ามันใช้งานได้มันจะคืนค่าบอร์ดและเราก็ผ่านมันไป
  • ในที่สุดโปรแกรม เราสร้างบอร์ด 10x20 ขึ้นเป็นจำนวน numpy ของ 1 อัน
  • อินพุตมีรูปแบบ(x1, y1); (x2, y2); ...เราใส่ 9 สำหรับแต่ละหลุมในนั้นจากนั้นรับผลลัพธ์ของการเรียกใช้ฟังก์ชันบนมัน
  • จากนั้นพิมพ์คำสั่งแสดงผลลัพธ์ที่สำเร็จหรือว่างเปล่าบรรทัดกระดานต้นฉบับโดยบรรทัดแทนตัวอักษรหรือสัญลักษณ์ที่เหมาะสมสำหรับตัวเลข
import numpy as n
from itertools import product as e
m,s=range,len
p=[n.rot90(a,k)for a,r in[([[2,2]]*2,1),([[3]*3,[1,3,1]],4),([[0]*4],2),([[1,1,6],[6]*3],4),([[7,1,1],[7]*3],4),([[4,4,1],[1,4,4]],2),([[1,5,5],[5,5,1]],2)]for k in m(r)]
o=lambda a:e(m(s(a)),m(s(a[0])))
def t(l,d=0):
	g=list(zip(*n.where(l==1)))[0]
	for a in p:
		for u,v in o(a):
			w,x=l.copy(),0
			for r,c in o(a):
				if a[r,c]!=1:
					i,j=g[0]+r-u,g[1]+c-v
					if any([i<0,i>19,j<0,j>9])or l[i,j]!=1:
						x=1
						break
					w[i,j]=a[r,c]
			if x==0:
				if len(w[w==1]):
					f=t(w,d+1)
					if type(f)==str:continue
					return f
				return w
	return'a'
b=n.ones((20,10))
b[list(zip(*[eval(k)[::-1]for k in input().split(';')]))]=9
a=t(b)
for r in(a,b)[type(a)==str]:
	print(''.join(map(dict(zip([0,2,3,4,5,6,7,9,1],'IOTZSLJX-')).get,r)))

ลองออนไลน์!

ตัวอย่างทดสอบ:

In: (1,1);(8,1);(4,4);(5,8);(4,11);(5,15);(1,18);(8,18)
Out: 
IIIIOOOOLL
TXOOOOOOXL
TTOOOOOOTL
TOOIOOOOTT
TOOIXOOTTI
TTTITOOTTI
TTTITTTTII
OOTTTTTTII
OOTTTXOOII
TTTTOOOOII
TTTTOOOOII
TTTTXTOOII
ITTTTTTTII
ITTTTTTTII
IITTTLLTTI
IITOOXLTTI
IITOOTLTTI
IITTLTTTTI
IXTLLTJTXI
ILLLLLJJJI

1
โอ้ - นี่ช่างน่าอัศจรรย์ ขอบคุณสำหรับการเขียนที่ยอดเยี่ยมและการทำงานที่ดี!
CzarMatt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.