Hintergrund
Dies ist eine Fortsetzung meiner früheren Herausforderung , bei der es darum ging, die Form einer Skulptur zu berechnen, die durch Fallenlassen von Magneten auf einen riesigen Stapel erhalten wurde.
Gute Nachricht: Der exzentrische Künstler mochte Ihre Arbeit und hat ein anderes Projekt für Sie. Er arbeitet immer noch mit Magnetskulpturen, hat sich aber entschlossen, sein Kunststudio zu erweitern - in den Weltraum ! Seine derzeitige Methode besteht darin, einen einzelnen würfelförmigen Magneten in die Umlaufbahn zu sprengen und andere Magnete darauf zu schießen, um einen riesigen magnetischen Satelliten zu erzeugen.
Eingang
Ihre Eingabe ist eine endliche Liste von 0
s und 1
s, die entweder im nativen Listenformat Ihrer Sprache oder als Zeichenfolge angegeben wird. Es wird als "Blaupause" eines Kunstwerks interpretiert und wie folgt von links nach rechts verarbeitet.
Sie beginnen mit einem einzelnen Magneten, der an einer ganzzahligen Koordinate der 2D-Ebene schwebt, und fügen gemäß den Anweisungen immer mehr Magnete hinzu. Die Richtlinie 0
dreht die gesamte Skulptur um 90 Grad gegen den Uhrzeigersinn. Bei der Richtlinie 1
findet der Künstler die am weitesten links stehende Säule der Skulptur und schießt von unten einen neuen Magneten darauf. Der neue Magnet haftet am untersten vorhandenen Magneten in der Säule und wird Teil der Skulptur. Beachten Sie, dass der Magnet im Gegensatz zur früheren Herausforderung nicht an anderen Magneten in der benachbarten Säule haftet. seine Geschwindigkeit ist jetzt astronomisch!
Ausgabe
Der Künstler möchte wissen, ob die gesamte Skulptur in seine Garage passt (wie er sie aus der Umlaufbahn bringt, bleibt unklar). Ihre Ausgabe ist also die Breite und Höhe der Skulptur, geordnet von niedriger nach höher. Sie können als Liste mit zwei Elementen, als Paar oder als durch Komma getrennte Zeichenfolge angegeben werden.
Beispiel
Betrachten Sie die Eingabesequenz
[1,0,1,1,0,1,0,0,1,1]
Um es zu verarbeiten, beginnen wir mit einem Magneten, der im Raum schwebt:
#
Die erste Anweisung lautet 1
, also schießen wir einen neuen Magneten von unten:
#
#
Die nächste Anweisung lautet 0
, also drehen wir die Skulptur:
##
Die nächsten beiden Anweisungen sind 1,1
, was bedeutet, dass wir zwei Magnete in die linke Spalte schießen:
##
#
#
Dann drehen wir uns erneut und schießen einmal, wie von 0,1
:
#
###
#
Schließlich drehen wir uns zweimal und schießen zweimal:
#
###
# #
#
Die resultierende Skulptur hat Breite 3
und Höhe 4
, also geben wir aus [3,4]
.
Regeln
Sie können entweder eine Funktion oder ein vollständiges Programm angeben. Die niedrigste Byteanzahl gewinnt und Standardschlupflöcher sind nicht zulässig.
Testfälle
[1,0,1] -> [2,2]
[1,0,1,1,0,1,0,0,1,1] -> [3,4]
[1,1,0,1,1,0,1,0,1,1] -> [4,5]
[1,1,0,1,1,0,1,0,1,1,0] -> [4,5]
[1,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1] -> [3,3]
[0,1,0,1,1,1,1,0,0,1,0,1,0,0,1,1,0,1,0,1,0,0,1,1,0,1,0,0,0,0,1,0,1,0,1,1,0,0,1,1] -> [5,7]
[1,0,1,1,1,1,0,1,0,0,0,0,1,1,1,0,1,1,0,1,0,1,0,0,0,0,0,0,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,1,1,0,0,0,0,1,1,0,0,1,1,0,1,0,0,1,1,0,1,1,0,0,1,0,1,0,0,1,0,1,1,1,0,1,1,0,0,1,0,1,1,0,0,0,1,0,1,1,0,0,1,0,1,1,0] -> [11,12]
[1,1,0,1,1,0,1,0,1,1,0]
zurückkehren[5,4]
und nicht[4,5]
? Die Skulptur wird am Ende gedreht.Antworten:
Pyth :
3433 BytesEingabe ist eine Liste von Einsen und Nullen, wie in der Frage. Probieren Sie es online aus: Pyth Compiler / Executor
Erläuterung:
Es ist eine Eins-zu-Eins-Übersetzung des folgenden Python 2- Codes ( 126 Byte ).
Ich erstelle eine Liste von Koordinaten der einzelnen Magnete. Dies wird mit dem Magneten initialisiert
[0,0]
. Dann manipuliere ich für jede der ganzen Zahlen der Blaupause die Liste folgendermaßen. Wenn die nächste Ganzzahl ist0
, drehe ich die Skulptur, indem ich die Koordinaten für jeden Magneten[a,b]
auf ändere[-b,a]
(im Grunde genommen mit einer Rotationsmatrix multiplizieren). Wenn die nächste Ganzzahl a ist1
, suche ich nach dem Minimalstück[a,b]
(das automatisch der niedrigste Magnet der Spalte ganz links ist) und hänge den Magneten[a,b-1]
an die Liste an.Nachdem alle Eingaben verarbeitet wurden, erstelle ich zwei Sätze (zum Entfernen von Duplikaten), einen für die x-Werte und einen für die y-Werte, und drucke die Größen in sortierter Reihenfolge aus.
Eine Idee zur Verbesserung : Verwendung komplexer Zahlen als Koordinaten für die Magnete. Eine Drehung ist nur eine Multiplikation mit
j
und Subtraktionj
vom niedrigsten Magneten in der Spalte ganz links. Leider erfordert das Auffinden dieses Magneten ganz links in Python viel zu viele Zeichen, und es wird nicht einmal davon gesprochen, das Rechteck zu finden.quelle
CJam, 48 Bytes
Testen Sie es hier.
Erwartet die Eingabe als Array im CJam-Stil (dh Leerzeichen anstelle von Kommas) und präsentiert die Ausgabe auf ähnliche Weise. Wenn Sie die Testfälle aus der Frage direkt verwenden möchten, kopieren Sie sie direkt in das Eingabefeld (einschließlich der
->
und Ergebnisse) und verwenden Sie dieses Testkabel, das die Zeilen in das richtige Eingabeformat konvertiert (und die Ergebnisse verwirft):Erläuterung
Ich setze die Regeln nur sehr wörtlich um. Ich behalte ein Raster mit der aktuellen Skulptur (als Array von Zeichenfolgen) und drehe dann für jede Anweisung entweder das Raster oder füge einen neuen Block hinzu. Die wichtigsten Tricks zum Speichern von Bytes sind:
S
undN
ich habe Zugriff auf Strings den Raum und Newline - Zeichen enthält (dh das Zeichen in einem Array verpackt), statt zu verwenden, sagen sie,1a
und0a
ein Array erhält eine Zahl enthält.Lassen Sie uns den Code durchgehen:
quelle
Matlab (92)
Standardeingabe wird verwendet. Daten sollten in das Formular eingegeben werden
[1,0,1,1,0,1,0,0,1,1]
.Ungolfed:
Beispiellauf:
quelle
Python - 211
quelle
[1]
.CJam, 47 Bytes
Dies nimmt die von STDIN eingegebene Array-Eingabe im CJam-Stil (Leerzeichen anstelle von Komma) und druckt das Ergebnis in STDOUT.
Beispiel:
gibt
Ausgabe.
Erklärung folgt, nachdem ich überzeugt bin, dass dies nicht weiter gespielt werden kann.
Probieren Sie es hier online aus
quelle