Тетріс Танграм


13

Вступ

Танграми - це класична головоломка, що включає впорядкування / розміщення блоків у різні форми. Від китайця 七巧板 - буквально означає «сім дощок майстерності». Візьмемо цю ідею і використаємо сім частин Tetrominos для заповнення сітки.

Виклик

Напишіть функцію або програму, яка приймає масив координат сітки в якості вхідних даних і виводить заповнену сітку 10 на 20, заповнену фрагментами тетрісу, за винятком зазначених координат.

Оптимізуйте свій рахунок, намагаючись зберегти розподіл штук рівномірним.

Критерії

Скористайтеся цією пасткою координат для виконання свого завдання. Існує п’ять наборів координат. Не соромтеся змінювати формат, у якому записані координати, але не значення.

Набір даних №2 вирішити неможливо - у цьому випадку просто виведіть сітку із заповненими комірками (тобто там, Xде є отвори).

Вхідні дані

Координати сітки являють собою "дірки" у сітці. Це клітини, які не можуть містити жодної частини тетроміно.

Координати сітки:

(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)повинна бути або лівою верхньою, або нижньою лівою коміркою, на вибір автора.

Цеглини можуть:

  • бути обраним на розсуд автора.
  • бути оберненим, як автор вважає за потрібне.
  • розміщуватись на сітці будь-де на розсуд автора (він же: немає гравітації тетрісу)

Цеглини не можуть:

  • розміщувати поза межами сітки.
  • перекривають наявну цеглу або отвір у сітці.
  • бути нестандартним тетраміновим твором Tetris.

Оцінка балів

Ваш результат у форматі:

(1000 - [байт у коді]) * (M / 10 + 1)

Де 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.

Примітка: Якщо набір не має рішення, не враховуйте його для обчислення М, оскільки він не матиме тетромінового розподілу.


4
Поліпшити питання після їх розміщення, як правило, важко, тому що якщо зміни будуть суттєвими, вони призведе до недійсності роботи людей, які вже почали працювати над проблемою (або ще гірше, навіть опублікували результат). Я рекомендую розміщувати виклики ідей у пісочниці . Це місце, щоб попросити відгуку та відшліфувати специфікацію, перш ніж вона буде продовжена. Незважаючи на те, що після швидкого пробігу я не бачив явних проблем із вашим завданням.
Мартін Ендер

@ MartinBüttner Зауважив належно, дякую за відгуки.
CzarMatt

2
Ідеї ​​березня = 15 березня. Мені довелося це подивитися.
Річка Рівня Св.

Я вніс кілька невеликих змін, щоб передзавантажити опис завдання, тому що в іншому випадку неможливо зрозуміти, що нас просять зробити під час першого читання. Я думаю, що було б поліпшення, якщо ви заявили, який із вхідних випадків неможливо вирішити, щоб вони функціонували як тестові випадки на додаток до набору даних.
Пітер Тейлор

@PeterTaylor Справедливо, я додав, який набір рішень неможливо вирішити. Дякуємо за відгук.
CzarMatt

Відповіді:


2

Python 3 , 819 байт, M = 0, оцінка = 181

Це груба програма DFS. Він створює масивний масив і вставляє всі введені отвори. Потім він бере найменшу ліву незаповнену плитку на найвищому ряду, що має її, і розміщує тетроміно. Рекурсивно, ми робимо це знову - коли ми не можемо або знайти рішення, або відмовитися і спробувати ще один твір при першій нагоді.

Має значення М 0, оскільки воно намагається використовувати частини у визначеному порядку і майже завжди знаходить рішення без останнього у списку. Я намагався використовувати довільно упорядкований список кожного циклу, щоб зробити більш рівномірний розподіл, але я отримав лише M 2, який не вартував байтів, необхідних для імпорту random.shuffle .

Я не можу коментувати наведений нижче код, оскільки в своєму гольфі я давно забув, що багато з цього робить. Загальна ідея:

  • Імпортуйте продукт numpy та itertools з назви 1 літер
  • Перейменуйте деякі вбудовані функції на 1 букву та визначте лямбда для збереження байтів
  • Побудуйте масив можливих тетроміно в якості numpy nd-масивів, включаючи всі обертання
  • У рекурсивній функції:
    • Отримайте бажане положення незаповненої плитки та прокрутіть список штук
    • Для кожного твору перегляньте його переклади (переміщуючи його вгору та вниз)
    • Якщо щось не працює (шматок виходить з дошки, потрапляє в інший твір, потрапляє в дірку тощо), спробуйте наступний переклад або наступний весь твір
    • Якщо це працює, чудово. Спробуйте, а потім рекурсивно викликайте функцію.
    • Якщо цей шлях не спрацював, він повернеться "a", тому ми просто спробуємо ще раз. Якщо це спрацювало, він повертає дошку, і ми передаємо її вгору по лінії.
  • Нарешті, програма. Ми будуємо дошку 10x20 як масивний масив 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.