Eine Ziegelmauer ist ein Rechteck aus horizontalen 1-mal-n-Ziegeln, die in Reihen gestapelt sind. Hier ist eine Wand mit einer Höhe von 4 und einer Breite von 8, auf der rechten Seite sind die Ziegelgrößen dargestellt.
[______][______] 4 4
[__][____][__][] 2 3 2 1
[][______][____] 1 4 3
[____][______][] 3 4 1
Diese Wand ist instabil, weil sie einen Defekt aufweist , eine Stelle, an der zwei vertikale Risse zwischen den Steinen aneinandergereiht sind, wie unten gezeigt, mit Parens in den umgebenden Steinen.
[______][______]
[__][____)(__][]
[][______)(____]
[____][______][]
Die Risse an den Ziegeln der Größe 1 rechts stellen jedoch keinen Fehler dar, da sie durch eine Reihe voneinander getrennt sind.
Schreiben Sie Code, der eine stabile Wand findet und anzeigt, die aus Ziegeln bestimmter Größen besteht. Wenigste Bytes gewinnt.
Eingang
Eine nicht leere Liste mit Ziegelgrößen (positive Zahlen) und einer Höhe von mindestens 2. Diese Liste kann auf Wunsch sortiert werden. Sie können alternativ eine Anzahl von Steinen jeder Größe aufnehmen.
Ausgabe
Ein Bild einer stabilen rechteckigen Wand mit der erforderlichen Höhe, in der alle angegebenen Steine verwendet werden. Drucken Sie es aus oder geben Sie es als Zeichenfolge mit Zeilenumbrüchen zurück.
Zeichnen Sie einen Baustein der Größe n als 2n Zeichen, die von eckigen Klammern umgeben sind.
1: []
2: [__]
3: [____]
4: [______]
...
Die Eingabe hat garantiert mindestens eine Lösung. Wenn es mehrere gibt, sollten Sie immer noch nur eine Wand zeichnen.
Es gibt keine zeitliche Beschränkung. Wende so viel rohe Gewalt an, wie du willst. Ihr Algorithmus sollte theoretisch mit Eingaben jeder Größe arbeiten.
Testfälle:
Es gibt mehrere Lösungen, sodass Ihre Ausgaben möglicherweise unterschiedlich sind.
>> [1, 1, 2, 2], 2
[][__]
[__][]
>> [1, 1, 1, 2, 2, 2, 2, 3], 2
[__][____][__]
[][__][][__][]
>> [1, 1, 2, 2, 3, 3, 3, 3], 3
[][__][____]
[__][____][]
[____][____]
>> [1, 2, 3, 4, 5, 6, 7, 8, 9], 5
[][______________]
[__][____________]
[________________]
[____][__________]
[______][________]
>> [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], 5
[][__][__]
[__][__][]
[][__][__]
[__][__][]
[][__][__]
n>1
und mochte nicht, wie es Testfälle einschränkte. Anscheinend gibt es auch Präzedenzfälle .Antworten:
Perl, 166,
170, 194Eine perfekte Aufgabe für eine Sprache von Larry Wall.
Brachiale Kraft, aber in den Testfällen recht schnell (<1s). Verwendungszweck:
Teste mich .
quelle
CJam,
94 9282 BytesDies ist die 92-Byte-Version. Es folgt die 82-Byte-Version.
Dadurch werden die Bausteine in alle möglichen Arten unterteilt und es wird nur der gültige verwendet. Momentan ziemlich brachial, aber der letzte Testfall wird in ungefähr 10 Sekunden auf dem Java-Interpreter auf meinem Computer ausgeführt.
Erklärung :
Der Code ist in 5 Teile aufgeteilt:
1)
L
Wie können wir ein Array mit einer gegebenen Länge inH
Teile unterteilen?Danach haben wir alle Möglichkeiten, unser Input-Array in H-Brick-Layer aufzuteilen.
2) Holen Sie sich alle Permutationen des Eingabearrays und holen Sie sich dann alle Partitionen für alle Permutationen
Danach haben wir alle möglichen Layouts der Eingabebausteine in einer
H
Ebenenmauer.3) Filtern Sie nur die Layouts heraus, deren Ziegelsteinlängen gleich sind
Nach dem Ende dieses Filters wären alle verbleibenden Layouts perfekte Rechtecke.
4) Nehmen Sie das erste Ziegellayout heraus, das den Stabilitätskriterien entspricht
Nach diesem Schritt müssen wir nur noch das Layout ausdrucken
5) Drucken Sie das Layout
Probieren Sie es hier online aus
82 Bytes
Dies ähnelt fast der 92-Byte-Version, nur dass sie etwas zufällig ist. Wenn Sie die Erklärung für die 92-Byte-Version gelesen haben, sind die Teile 3, 4 und 5 in der 82-Byte-Version genau gleich. Anstatt alle Permutationen aus Teil 1 und 2 zu durchlaufen, generiert diese Version einfach zufällig eine der folgenden Permutation zu einem Zeitpunkt, testet es mit Teil 3 und 4 und startet dann den Prozess neu, wenn die Tests von Teil 3 und 4 fehlschlagen.
Dies gibt die Ergebnisse für die ersten 3 Testfälle sehr schnell aus. Der Testfall height = 5 muss noch auf meinem Computer ausgegeben werden.
Erklärung des Unterschieds
Die Idee zu dieser Version stammt von randomra (Get it?)
Versuchen Sie dieses online
quelle
Python 2,
680670660 BytesIch weiß nicht, warum ich darauf bestehe, diese superlangen "Golfer" zu haben ... aber auf jeden Fall, los geht's.
Dies erfordert die Ausgabe in aufsteigender Reihenfolge sortiert und wird über aufgerufen
b(brick_sizes, height)
.Testfälle:
Das funktioniert folgendermaßen:
quelle
continue
Ende fallen lassen.return(N,N)
Benötigt auch nicht die Klammer.continue
war ein Relikt aus einer früheren Version.W
undT
erhältst ein zusätzliches Argument.Haskell, 262 Bytes
Anwendungsbeispiel:
So funktioniert es: Die Hauptfunktion
#
nimmt eine Listel
(Ziegelsteinliste) und eine Nummerh
(Höhe) und teilt alle Permutationen von an allen möglichen Stellenl
inh
Unterlisten auf (über Funktion%
, zB2%[1,2,3,4]
->[ [[1],[2,3]] , [[1,2],[3]] , [[1,2,3],[]] ]
). Es behält diejenigen bei, bei denen zwei aufeinanderfolgende Elemente die gleiche Summe haben (dh die gleiche Länge in Ziegelsteinen) und die Listen der Zwischensummen keine gemeinsamen Elemente haben (dh Risse reihen sich nicht aneinander, funktionieren nichtv
). Nehmen Sie die erste Liste, die passt, und bauen Sie eine Reihe von Steinen.quelle
Python 2,
528,417,393, 381Sehr lange Bruteforce-Lösung. Es funktioniert, aber das war's auch schon. Das Universum könnte enden, bevor das Ergebnis für den letzten Testfall vorliegt.
a ist die Hauptfunktion:
quelle
from itertools import*
und ihnitertools.
aus dempermutations
Anruf entfernen . Außerdem kann dasif
s am Ende inif all(x==w[0] for x in w)and~-f(o):return
... geändert werden , um 13 Bytes zu sparen.f
immer bei der ersten Iteration zurück? Das sieht komisch aus. Es ist entweder eine Wanze oder eine sehr große Golfgelegenheit.t=0
zweimal zur()
. Sie können diese Funktion zumap(sum,[x[:i] for i in range(len(x))])
einem Einzeiler machen (geeignet zum Lambda-Fischen, wenn Sie möchten). Die Verwendung von isdisjoint und sets inf()
würde dies erheblich reduzieren (wird auchf()
nach nur einem Test zurückgegeben, unabhängig davon, ob ein Fehler gefunden wurde oder nicht). Persönlich würde ichf()
alsreturn not all(map(isdisjoint,map(set,map(r,w[:-1])),map(set,map(r,w[1:]))))
oder etwas ähnliches umschreiben .JavaScript (ES6) 222
232 265 279 319Noch zu golfen.Dieser findet alle Lösungen, gibt nur die zuletzt gefundenen aus und es ist ziemlich schnell.Führen Sie zum Testen das Snippet in Firefox aus
Ungolfed Und erklärte
quelle
Python 2, Gittermethode (290 Zeichen)
Die Methode hier ist, dass Sie das Raster transponieren und nach einer
[[
oder einer]]
beliebigen Stelle in den Spalten suchen . Sie testen auch, ob alle Steine auf der linken und rechten Seite der Wand ausgerichtet sind: Das Süße hier ist, zu testen, ob alle Elemente einer Zeichenfolge gleich sind:'[[[[[['.strip('[')==''
Mini-Version von oben:
Dies könnte wahrscheinlich einfacher in einer Matrix-Manipulationssprache erfolgen.
... oder Missbrauch von Regexen, wodurch wir die Bedingung "Blöcke an den Enden ausrichten" mit der Bedingung "keine Risse" kombinieren können:
Angenommen, die Breite der Wand war w = 6. Die Positionen der Teilzeichenfolge "[..... [" und "] .....]" müssen genau der Menge {0, w-1, w, 2w-1,2w, 3w-1,. ..}. Nichtexistenz an diesen Punkten bedeutet, dass der Zeilenumbruch wie folgt lautet:
Das Vorhandensein von NOT an diesen Stellen bedeutet, dass es einen unsteten "Riss" in der Wand gibt:
Daher reduzieren wir das Problem auf die Mengenäquivalenz, bei der die fraglichen Mengen die Indizes eines regulären Ausdrucks sind.
Python, Regexp-Methode (304 Zeichen):
quelle
x,h=input()
.Matlab (359)
Eingang
ein Vektor von ganzen Zahlen, Beispiel: p ([1 1 2 2 3])
Ausgabe
Das Schema des Wandbeispiels:
quelle