Tetris Tangrams


13

Einführung

Tangrams sind ein klassisches Puzzle, bei dem Blöcke in verschiedenen Formen angeordnet / angebracht werden. Aus dem Chinesischen 七巧板 - bedeutet wörtlich "sieben Bretter des Könnens". Nehmen wir diese Idee und verwenden Sie die sieben Tetrominos füllen ein Gitter .

Herausforderung

Schreiben Sie eine Funktion oder ein Programm, das ein Array von Gitterkoordinaten als Eingabe verwendet und ein fertiges 10 x 20-Gitter ausgibt, das mit Tetris-Teilen gefüllt ist, mit Ausnahme der angegebenen Koordinaten.

Optimieren Sie Ihre Punktzahl, indem Sie versuchen, die Verteilung der Teile gleichmäßig zu gestalten.

Kriterien

Verwenden Sie diesen Pastebin Koordinaten- , um Ihre Aufgabe zu erledigen. Es gibt fünf Koordinatensätze. Sie können das Format ändern, in dem die Koordinaten geschrieben werden, nicht jedoch die Werte.

Datensatz 2 kann nicht gelöst werden. In diesem Fall geben Sie das Raster einfach mit ausgefüllten Eingabezellen aus (z. B. X wo sich die Löcher befinden).

Eingang

Gitterkoordinaten repräsentieren "Löcher" im Gitter. Dies sind Zellen, die keinen Teil eines Tetrominos enthalten können.

Gitterkoordinaten:

(0,0), (1,0), (2,0), ... (9,0)
(0,1), (1,1), (2,1), ... (9,1)
.
.
.
(0,19), (1,19), (2,19), ... (9,19)
  • Verwenden Sie den Array-Stil Ihrer Programmiersprache, um die Koordinaten einzugeben.

  • Stellen Sie Löcher im Raster mit einem Xoder einem anderen druckbaren ASCII-Code dar .

Ausgabe

Drucken Sie ein Lösungsraster mit einer Standard-Tetris-Rastergröße von 10 Zellen Breite mal 20 Zellen Höhe , wenn das Raster vollständig und perfekt mit Tetromino-Stücken gefüllt werden kann.

Stücke mit Buchstaben konstruiert I, O, L, J, T, Z, Swie folgt:

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

Beispiel

Ausgabelösungsbeispiel ohne Eingabekoordinaten:

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

Mit Verteilung wie folgt:

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

Anmerkungen

Koordinaten repräsentiert eine einzelne Xund YPosition auf dem Gitter. Das Gitter basiert auf 0, dh die Koordinate (0,0)sollte entweder die linke obere oder die linke untere Zelle sein, die vom Autor gewählt wird.

Ziegel können:

  • nach Ermessen des Autors ausgewählt werden.
  • nach Belieben des Autors gedreht werden.
  • irgendwo im Ermessen des Autors auf dem Gitter platziert werden (auch bekannt als: keine Tetris-Schwerkraft)

Ziegel können nicht:

  • außerhalb der Grenzen des Rasters platziert werden.
  • Überlappen Sie einen vorhandenen Baustein oder ein Loch im Raster.
  • ein Tetris-Tetromino-Stück sein, das nicht dem Standard entspricht.

Wertung

Ihre Punktzahl hat das Format:

(1000 - [Byte im Code]) * (M / 10 + 1)

Wobei M ein Multiplikator für die Verteilung der in Ihren Lösungssätzen verwendeten Teile ist.

Höchste Punktzahl bei den Ides of March-Siegen.

Um M zu berechnen, addieren Sie den niedrigsten einzelnen Tetromino-Verteilungswert für jeden Satz und berechnen Sie dann M durch Abrunden des Durchschnitts.

Beispielsweise:

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

6 + 4 + 5 + 4 + 4 = 21/5 = 4,6

Also würden Sie 4als Ihren M- Wert verwenden.

Anmerkung: Wenn eine Menge keine Lösung hat, berücksichtigen Sie diese Menge nicht bei der Berechnung von M, da sie keine Tetrominoverteilung haben würde.


4
Das Verbessern von Fragen nach dem Posten ist im Allgemeinen schwierig, da sie bei erheblichen Änderungen die Arbeit von Personen ungültig machen, die bereits mit der Arbeit an dem Problem begonnen haben (oder, schlimmer noch, das Ergebnis gepostet haben). Ich würde empfehlen, Challenge-Ideen in der Sandbox zu veröffentlichen . Dies ist der Ort, an dem Sie um Feedback bitten und die Spezifikation verbessern können, bevor sie in Betrieb genommen wird. Trotzdem habe ich nach einem kurzen Überfliegen keine auffälligen Probleme mit Ihrer Herausforderung gesehen.
Martin Ender

@ MartinBüttner Richtig angemerkt, danke für die Rückmeldung.
CzarMatt

2
Ides of March = 15. März. Ich musste das nachschlagen.
Level River St

Ich habe ein paar kleine Änderungen am Frontload der Aufgabenbeschreibung vorgenommen, da ansonsten nicht zu verstehen ist, was beim ersten Durchlesen verlangt wird. Ich denke, es wäre eine Verbesserung, wenn Sie angeben würden, welche der Eingabefälle nicht gelöst werden können, sodass sie zusätzlich zu einem Scoring-Datensatz als Testfälle fungieren.
Peter Taylor

@PeterTaylor Gut, ich habe hinzugefügt, welcher Lösungssatz nicht gelöst werden kann. Danke für die Rückmeldung.
CzarMatt

Antworten:


2

Python 3 , 819 Bytes, M = 0, Score = 181

Dies ist ein Brute-Force-DFS-Programm. Es erstellt ein Numpy-Array und fügt alle eingegebenen Löcher ein. Dann nimmt er das am weitesten links stehende unbelegte Plättchen in die oberste Reihe und setzt ein Tetromino. Rekursiv machen wir es jetzt noch einmal - wenn wir entweder keine Lösung gefunden haben oder bei der ersten Gelegenheit einen Rückzieher machen und ein anderes Stück ausprobieren.

Dies hat ein M von 0, da es versucht, Teile in einer bestimmten Reihenfolge zu verwenden, und fast immer eine Lösung ohne die letzte in der Liste findet. Ich habe versucht, eine zufällig geordnete Liste für jeden Zyklus zu verwenden, um eine gleichmäßigere Verteilung zu erzielen , aber ich habe nur ein M von 2 erhalten, was die für den Import von random.shuffle erforderlichen Bytes nicht wert war .

Ich kann den folgenden Code nicht kommentieren, da ich beim Golfen längst vergessen habe, was das alles bewirkt. Die allgemeine Idee:

  • Importieren Sie numpy- und itertools-Produkte mit Namen aus einem Buchstaben
  • Benennen Sie einige Builtins in 1-Buchstaben-Funktionen um und definieren Sie ein Lambda, um Bytes zu sparen
  • Erstellen Sie das Array möglicher Tetrominos als numpy nd-Arrays, einschließlich aller Rotationen
  • In der rekursiven Funktion:
    • Holen Sie sich die Position der gewünschten nicht gefüllten Kachel und blättern Sie durch die Stückliste
    • Blättern Sie für jedes Stück durch die Übersetzungen (auf und ab bewegen)
    • Wenn etwas nicht funktioniert (Teil geht vom Brett, trifft ein anderes Teil, trifft ein Loch usw.), versuchen Sie es mit der nächsten Übersetzung oder dem nächsten ganzen Teil
    • Wenn es funktioniert, großartig. Probieren Sie es aus und rufen Sie die Funktion rekursiv auf.
    • Wenn dieser Pfad nicht funktioniert hat, wird ein 'a' zurückgegeben, also versuchen wir es einfach noch einmal. Wenn es funktioniert hat, gibt es das Board zurück und wir geben es die Linie hinauf.
  • Endlich das Programm. Wir bauen das 10x20-Board als numpy Array von Einsen.
  • Die Eingabe hat die Form (x1, y1); (x2, y2); ... Wir fügen für jedes Loch eine 9 ein und erhalten dann das Ergebnis der Ausführung der Funktion.
  • In der Druckanweisung wird dann entweder das erfolgreiche Ergebnis oder das leere Originalbrett zeilenweise angezeigt, wobei die Ziffern durch die entsprechenden Buchstaben oder Symbole ersetzt werden.
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)))

Probieren Sie es online!

Beispieltest:

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
Oh mein Gott - das ist erstaunlich. Vielen Dank für das wundervolle Schreiben und die gute Arbeit!
CzarMatt
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.