Tetris Tangram


13

Giới thiệu

Tangrams là một câu đố cổ điển liên quan đến việc sắp xếp / lắp các khối thành nhiều hình dạng khác nhau. Từ tiếng Trung - nghĩa đen là "bảy bảng kỹ năng". Hãy lấy ý tưởng này và sử dụng bảy mảnh Tetrominos để lấp đầy lưới.

Thử thách

Viết một hàm hoặc chương trình lấy một mảng tọa độ lưới làm đầu vào và xuất ra một lưới 10 x 20 hoàn thành chứa đầy các mảnh Tetris ngoại trừ trong các tọa độ đã chỉ định.

Tối ưu hóa điểm số của bạn bằng cách cố gắng giữ cho phân phối đồng đều.

Tiêu chí

Sử dụng pastebin tọa độ này để hoàn thành nhiệm vụ của bạn. Có năm bộ tọa độ. Vui lòng sửa đổi định dạng trong đó các tọa độ được viết, nhưng không phải là các giá trị.

Không thể giải quyết tập dữ liệu số 2 - trong trường hợp này, chỉ cần xuất lưới với các ô nhập liệu được điền vào (nghĩa là Xvị trí của các lỗ).

Đầu vào

Tọa độ lưới đại diện cho 'lỗ' trong lưới. Đây là những tế bào không thể chứa bất kỳ phần nào của Tetromino.

Tọa độ lưới:

(0,0), (1,0), (2,0), ... (9,0)
(0,1), (1,1), (2,1), ... (9,1)
.
.
.
(0,19), (1,19), (2,19), ... (9,19)
  • Sử dụng kiểu lựa chọn ngôn ngữ lập trình của bạn để nhập tọa độ.

  • Thể hiện các lỗ trên lưới bằng một Xhoặc ASCII có thể in khác .

Đầu ra

Sử dụng kích thước lưới Tetris tiêu chuẩn rộng 10 ô, cao 20 ô , in lưới giải pháp nếu và chỉ khi lưới có thể được lấp đầy hoàn toàn và hoàn hảo bằng các mảnh Tetromino.

Mẩu xây dựng với chữ I, O, L, J, T, Z, Snhư sau:

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

Thí dụ

Ví dụ giải pháp đầu ra không có tọa độ đầu vào:

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

Với phân phối như sau:

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

Ghi chú

Tọa độ đại diện cho một đơn XYvị trí trên lưới. Lưới dựa trên 0, nghĩa là tọa độ (0,0)phải là ô trên cùng bên trái hoặc ô dưới cùng bên trái, là lựa chọn của tác giả.

Gạch có thể:

  • được lựa chọn theo ý của tác giả.
  • được xoay như tác giả thấy phù hợp.
  • được đặt trên lưới bất cứ nơi nào theo ý của tác giả (còn gọi là: không có trọng lực Tetris)

Gạch không thể:

  • được đặt bên ngoài giới hạn của lưới điện.
  • chồng lên một viên gạch hoặc lỗ hiện có trong lưới.
  • là một mảnh tetromino Tetris không chuẩn.

Chấm điểm

Điểm của bạn là ở định dạng:

(1000 - [byte trong mã]) * (M / 10 + 1)

Trong đó M là một số nhân để phân phối các mảnh được sử dụng trong các bộ giải pháp của bạn.

Điểm số cao nhất bởi Ides of March chiến thắng.

Để tính M, hãy thêm giá trị phân phối tetromino riêng lẻ thấp nhất cho mỗi bộ và sau đó lấy giá trị trung bình làm tròn xuống để tính M.

Ví dụ:

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

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

Vì vậy, bạn sẽ sử dụng 4như giá trị M của bạn .

Lưu ý: Nếu một tập hợp không có giải pháp, đừng đặt yếu tố đó vào tính toán M, vì nó sẽ không có phân phối tetromino.


4
Cải thiện câu hỏi sau khi chúng được đăng thường rất khó, bởi vì nếu những thay đổi đáng kể, chúng sẽ làm mất hiệu lực công việc của những người đã bắt đầu giải quyết vấn đề (hoặc tệ hơn, thậm chí đăng kết quả). Tôi sẽ khuyên bạn nên đăng ý tưởng thử thách trong hộp cát . Đó là nơi để yêu cầu phản hồi và đánh bóng thông số kỹ thuật trước khi nó đi vào chính. Điều đó đã được nói, sau khi lướt qua nhanh, tôi đã không thấy bất kỳ vấn đề rõ ràng nào với thử thách của bạn.
Martin Ender

@ MartinBüttner Ghi chú đúng, cảm ơn đã phản hồi.
CzarMatt

2
Ides của tháng 3 = 15 tháng 3. Tôi đã phải tìm kiếm điều đó.
Cấp sông St

Tôi đã thực hiện một số thay đổi nhỏ để tải trước mô tả tác vụ, vì nếu không thì không thể hiểu những gì chúng tôi được yêu cầu thực hiện trong lần đọc đầu tiên. Tôi nghĩ rằng nó sẽ là một sự cải thiện nếu bạn nói rằng trường hợp đầu vào nào không thể giải quyết được, để chúng hoạt động như các trường hợp thử nghiệm ngoài bộ dữ liệu chấm điểm.
Peter Taylor

@PeterTaylor Đủ công bằng, tôi đã thêm bộ giải pháp nào không thể giải quyết được. Cảm ơn vì bạn đã phản hồi.
CzarMatt

Câu trả lời:


2

Python 3 , 819 byte, M = 0, Điểm = 181

Đây là một chương trình DFS vũ phu. Nó xây dựng một mảng gọn gàng và chèn tất cả các lỗ được nhập vào. Sau đó, nó lấy gạch không nung ngoài cùng bên trái trên hàng cao nhất có một và đặt một tetromino. Theo cách đệ quy, bây giờ chúng tôi làm lại - khi chúng tôi không thể tìm thấy giải pháp hoặc chúng tôi quay lại và thử một phần khác ở cơ hội đầu tiên.

Cái này có M là 0, vì nó cố gắng sử dụng các mảnh theo thứ tự xác định và hầu như luôn tìm thấy giải pháp mà không có giải pháp cuối cùng trong danh sách. Tôi đã thử sử dụng một danh sách được sắp xếp ngẫu nhiên mỗi chu kỳ để phân phối đồng đều hơn, nhưng tôi chỉ có M là 2, không xứng đáng với các byte cần thiết để nhập Random.shuffle .

Tôi không thể nhận xét đoạn mã dưới đây, vì trong quá trình chơi golf của tôi, tôi đã quên mất phần lớn nó làm gì. Ý tưởng chung:

  • Nhập sản phẩm numpy và itertools, với tên 1 chữ cái
  • Đổi tên một số nội trang thành hàm 1 ký tự và xác định lambda để lưu byte
  • Xây dựng mảng tetrominos có thể là mảng thứ numpy, tất cả các phép quay bao gồm
  • Trong hàm đệ quy:
    • Nhận vị trí của gạch không nung mong muốn và chuyển qua danh sách các mảnh
    • Đối với mỗi phần, chuyển qua các bản dịch của nó (di chuyển nó lên và xuống)
    • Nếu một cái gì đó không hoạt động (mảnh rời khỏi bảng, chạm vào mảnh khác, chạm vào lỗ, v.v.), hãy thử bản dịch tiếp theo hoặc toàn bộ mảnh tiếp theo
    • Nếu nó hoạt động, tuyệt vời. Hãy thử nó, sau đó gọi đệ quy hàm.
    • Nếu đường dẫn đó không hoạt động, nó sẽ trả về 'a', vì vậy chúng tôi chỉ cần thử lại. Nếu nó hoạt động, nó trả lại bảng, và chúng tôi chuyển nó lên dòng.
  • Cuối cùng là chương trình. Chúng tôi xây dựng bảng 10x20 như một mảng gọn gàng của 1.
  • Đầu vào có dạng (x1, y1); (x2, y2); ... Chúng tôi đặt 9 cho mỗi lỗ trong đó, sau đó nhận được kết quả của việc chạy hàm trên nó.
  • Sau đó, câu lệnh in sẽ hiển thị kết quả thành công hoặc dòng bảng gốc, trống theo từng dòng, thay thế các chữ cái hoặc ký hiệu thích hợp cho các số.
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)))

Hãy thử trực tuyến!

Mẫu thử:

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
Ôi trời - thật tuyệt vời Cảm ơn cho bài viết tuyệt vời, và công việc tốt đẹp!
CzarMatt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.