테트리스 탄 그램


13

소개

탄 그램 은 블록을 다양한 모양으로 배열 / 맞춤하는 고전 퍼즐입니다. 중국어에서 From-문자 그대로 "일곱 기술 보드"를 의미합니다. 이 아이디어를 가지고 7 개의 Tetrominos 조각을 사용하여 격자를 채우자.

도전

그리드 좌표 배열을 입력으로 받아 지정된 좌표를 제외하고 Tetris 조각으로 채워진 10 x 20 그리드를 출력하는 함수 또는 프로그램을 작성하십시오.

조각 분포를 균일하게 유지하여 점수를 최적화하십시오.

기준

사용 이 페이스트 빈 당신의 작업을 수행 할 좌표를. 5 개의 좌표 세트가 있습니다. 좌표가 쓰여지는 형식을 자유롭게 수정하고 값은 수정하지 마십시오.

데이터 세트 # 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)
  • 프로그래밍 언어의 배열 스타일을 사용하여 좌표를 입력하십시오.

  • 인쇄 가능한 ASCIIX 또는 다른 ASCII로 그리드의 구멍을 나타 냅니다.

산출

너비가 10 셀 , 높이가 20 셀인 표준 Tetris 그리드 크기를 사용하여 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

노트

좌표는 그리드 에서 단일 XY위치를 나타냅니다 . 그리드는 0을 기준으로하며 좌표 (0,0)는 작성자의 선택에 따라 왼쪽 상단 또는 왼쪽 하단 셀이어야합니다.

벽돌은 할 수 있습니다 :

  • 저자의 재량에 따라 선택됩니다.
  • 저자가 적합하다고 생각되면 회전하십시오.
  • 저자의 판단에 따라 그리드에 배치 (일명 테트리스 중력)

벽돌은 할 수 없습니다 :

  • 그리드의 경계 바깥에 배치하십시오.
  • 그리드의 기존 벽돌 또는 구멍과 겹칩니다.
  • 비표준 테트리스 테트로 미노 조각이어야합니다.

채점

당신의 점수는 다음과 같은 형식입니다 :

(1000-[코드 바이트]) * (M / 10 + 1)

여기서 M은 솔루션 세트에 사용 된 조각 분포에 대한 승수입니다.

3 월 Ides의 최고 점수가 승리합니다.

M을 계산하려면 각 세트에 대해 가장 낮은 개별 테트로 미노 분포 값을 더한 다음 평균을 반올림하여 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을 계산하도록 설정된 것을 고려하지 마십시오.


4
게시 된 후 질문을 개선하는 것은 일반적으로 어렵습니다. 변경 사항이 상당하면 이미 문제에 대해 작업을 시작한 사람들의 작업이 무효화되거나 결과가 게시되기 때문입니다. 샌드 박스에 도전 아이디어 게시하는 것이 좋습니다 . 그것이 메인에 가기 전에 피드백을 요청하고 사양을 연마하는 곳입니다. 즉, 빠른 탈옥 후, 나는 당신의 도전에 눈부신 문제를 보지 못했습니다.
Martin Ender

@ MartinBüttner Duly는 의견을 보내 주셔서 감사합니다.
CzarMatt

2
3 월의 아이디어 = 3 월 15 일 나는 그것을 찾아야했다.
Level River St

작업 설명을 프런트로드하기 위해 약간의 변경을했습니다. 그렇지 않으면 첫 번째 읽기에서 수행해야 할 작업을 이해하는 것이 불가능하기 때문입니다. 어떤 입력 사례를 해결할 수 없는지 언급하면 ​​점수 데이터 세트 외에도 테스트 사례로 작동하도록 개선하면 개선이 될 것이라고 생각합니다.
Peter Taylor

@PeterTaylor Fair, 충분히 해결할 수없는 솔루션 세트를 추가했습니다. 피드백을 주셔서 감사합니다.
CzarMatt

답변:


2

파이썬 3 , 819 바이트, M = 0, 점수 = 181

이것은 무차별 DFS 프로그램입니다. numpy 배열을 작성하고 입력 된 모든 구멍을 삽입합니다. 그런 다음 가장 왼쪽에 채워지지 않은 타일이있는 가장 높은 행을 차지하고 테트로 미노를 배치합니다. 재귀 적으로, 우리는 이제 해결책을 찾을 수 없거나 첫 번째 기회에서 다른 부분을 역 추적하고 시도 할 때 다시 시도합니다.

이것은이 M 은 정해진 순서대로 조각을 사용하려고하고, 거의 항상 목록의 마지막없이 해결책을 발견하기 때문에, 0을. 좀 더 고른 분포를 만들기 위해 각주기마다 무작위로 정렬 된 목록을 사용해 보았지만 random.shuffle 을 가져 오는 데 필요한 바이트 수는 2 의 M 만 얻었 습니다 .

내 골프에서 나는 그것의 많은 것을 오랫동안 잊어 버렸기 때문에 아래 코드에 주석을 달 수 없습니다. 일반적인 아이디어 :

  • 1 자 이름의 numpy 및 itertools 제품 가져 오기
  • 일부 내장의 이름을 1 자로 된 함수로 바꾸고 바이트를 저장하기위한 람다를 정의하십시오.
  • 가능한 모든 테트로 미노 배열을 numpy nd-arrays로 구성하십시오.
  • 재귀 함수에서 :
    • 채워지지 않은 타일의 위치를 ​​얻고 조각 목록을 순환하십시오.
    • 각 조각에 대해 번역을 순환하십시오 (위아래로 이동).
    • 효과가없는 경우 (조각이 보드에서 떨어지거나 다른 조각에 부딪 히거나 구멍에 부딪히는 등) 다음 번역 또는 다음 전체 조각을 시도하십시오.
    • 작동하면 훌륭합니다. 사용 해보고 재귀 적으로 함수를 호출하십시오.
    • 해당 경로가 작동하지 않으면 'a'가 반환되므로 다시 시도하십시오. 작동하면 보드를 반환하고 보드를 통과시킵니다.
  • 마지막으로 프로그램입니다. 우리는 10x20 보드를 1의 numpy 배열로 만듭니다.
  • 입력은 (x1, y1); (x2, y2); ... 형식 입니다. 각 구멍에 9를 넣은 다음 함수를 실행 한 결과를 얻습니다.
  • 그런 다음 print 문은 성공적인 결과 또는 빈 원래 보드를 한 줄씩 표시하여 숫자에 적절한 문자 또는 기호를 대체합니다.
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.