Alice ist Praktikantin in einem Unternehmen, das Brainfuck sowohl für die clientseitige als auch für die serverseitige Entwicklung als Hauptsprache verwendet. Alice hat gerade ihren ersten Code geschrieben und ist etwas nervös, als sie sich auf ihre erste Codeüberprüfung vorbereitet.
Alice möchte ihren Code korrekt formatieren und gut aussehen lassen, hat aber keine Zeit, den 328-seitigen Style-Guide für Unternehmenscodes zu lesen, und hat sich daher entschieden, ihn als perfektes Quadrat zu formatieren . Leider kann die Codelänge nicht ausreichen, um ein Quadrat zu bilden, und sie hat beschlossen, eine rechteckige Lücke in der Mitte zu lassen. Die Lücken müssen perfekt zentriert und so quadratisch wie möglich sein.
Beispiele
++++++ +++++ +++++ +++++ +++++ +++++
++++++ +++++ +++++ + ++ ++ ++ +++++
++++++ ++ ++ + + + ++ + +
++++++ +++++ +++++ +++++ ++ ++ +++++
++++++ +++++ +++++ +++++ +++++ +++++
Perfect OK Acceptable Unacceptable No way! Nope.
Schreiben Sie ein Programm oder eine Funktion, um Alice zu helfen. Geben Sie den Code von Alice als Eingabezeichenfolge aus und formatieren Sie ihn nach Möglichkeit wie unten beschrieben. Wenn die Formatierung nicht möglich ist, geben Sie einen weinenden Emoji aus :~(
.
Dies ist Code-Golf, also werden Antworten in Bytes gewertet, wobei weniger Bytes das Ziel sind.
Einschränkungen
- Ihr Programm oder Ihre Funktion sollte eine einzelne Zeichenfolge als Eingabe und Ausgabe einer oder mehrerer Textzeilen verwenden (oder eine mehrzeilige Zeichenfolge oder ein Array von Zeichenfolgen zurückgeben, wenn Sie eine Funktion implementieren).
- Die Eingabezeichenfolge kann beliebige ASCII-Zeichen einschließlich Leerzeichen enthalten.
- Alle Leerzeichen in der Eingabe müssen ignoriert werden. Sie sollten nicht für die Codelänge zählen und nicht für die Ausgabe verwendet werden.
- Die Eingabezeichenfolge enthält mindestens ein Nicht-Leerzeichen.
- Der formatierte Code muss die gleichen Nicht-Leerzeichen in der gleichen Reihenfolge wie der eingegebene Code enthalten.
- Der formatierte Code muss ein perfektes Quadrat sein, dh alle Zeilen sollten die gleiche Länge haben und die Anzahl der Zeilen sollte der Länge der Zeilen entsprechen.
- Formatierter Code kann eine Lücke in der Mitte enthalten.
- In der Lücke dürfen nur Leerzeichen (ASCII-Code 32) verwendet werden.
- Der Spalt (falls vorhanden) muss rechteckig sein.
- Jede Zeile des formatierten Codes muss mindestens ein Nicht-Leerzeichen enthalten, dh die Lückenbreite muss unbedingt kleiner als die Quadratbreite sein (Lücke 5x1 ist für 5x5 Quadrat nicht akzeptabel).
- Der Spalt sollte horizontal sein, dh die Spaltbreite sollte größer oder gleich der Spalthöhe sein.
- Der Spalt muss perfekt zentriert sein.
- Folglich sollten die Lückenbreiten- und -höhenparität mit der Quadratbreitenparität identisch sein (beispielsweise kann die Lücke für 5 × 5 Quadrate 1 × 1, 3 × 1 oder 3 × 3 betragen).
- Wenn möglich, Quadrat ohne Lücke ausgeben.
- Wählen Sie bei mehreren Lösungen eine Lösung mit einer Lücke, die dem Quadrat am nächsten liegt, dh der Unterschied zwischen Lückenbreite und Lückenhöhe ist minimal (zum Beispiel: Lücke 10x10 ist vorzuziehen als 8x6 und 8x6 ist vorzuziehen als 6x2).
- Wenn immer noch ein Gleichstand besteht, wählen Sie eine Lösung mit minimaler Lückenfläche (z. B. Lücke 2x2 ist vorzuziehen gegenüber 4x4).
- Wenn es nicht möglich ist, Code zu formatieren, wird ausgegeben
:~(
. - Zeilenumbruch nach letzter Zeile ist optional.
- [Neu] Sie können davon ausgehen, dass jedes Zeichen mit einem Code unter 33 ein Leerzeichen ist. Ich hoffe es hilft dir beim Golfen.
Tests
Input Output Code length Comment
+++++++++ +++ 9 Alice is lucky,
+++ her code perfectly fits a square.
+++
++++++++ +++ 8 Though code length isn't enough for a square,
+ + a small gap fixes it.
+++
++++++ :~( 6 No luck, code cannot be formatted.
Hello, Hell 12 Input may contain any ASCII characters,
World! o , but whitespaces in input should be ignored.
W o
rld!
+++++ + +++++ +++++ 22 Gap is not required to be a square,
+++++ + +++++ +++++ it can be a rectangle.
+ +
+++++
+++++
+++ + +++ ++++++++ 28 There exists another solution:
+++ + +++ + + 6x6 square with 4x2 gap,
+++ + +++ + + but in Alice's opinion square gap
+++ + +++ + + makes code more readable.
+ +
+ +
+ +
++++++++
Heikle Tests
This must be Thism 24 7x7 with 5x5 gap looks good,
5x5 with 1x1 ustbe but 5x5 with 1x1 gap is better,
gap. 5x 5w because gap area is smaller.
ith1x
1gap.
+++ +++ +++ :~( 18 In case you tried 5x5 square
+++ +++ +++ with 7x1 gap ;)
Ressourcen
Aus Platzgründen finden Sie auf tio.run Beispielcode und zusätzliche Testfälle
[Neu] Sie können sich die Tabelle der akzeptierten Lösungen für Eingaben mit bis zu 100 Zeichen ansehen . Ich habe Breite und Höhe vertauscht, weil es intuitiver zu wirken scheint.
Inspiriert von: Ein Quadrat aus Text
Änderungen
2 Tests hinzugefügt, Fehler im Beispielcode behoben.
Es wurde eine Tabelle mit Lösungen bis zu 100 hinzugefügt und eine Klarstellung der Leerstellen hinzugefügt.
Antworten:
C (gcc) , 354 Bytes
Probieren Sie es online!
quelle
isspace(x)
mitx<33
.JavaScript (ES6),
284 ... 274270 Bytes4 Bytes gespart dank @Shaggy
Gibt ein Array von Zeichenfolgen zurück.
Probieren Sie es online!
quelle
This must be 5x5 with 1x1 gap.
[\s\n]
einfach sein\s
?++w>x-2
w++>=x-2
w++>=x
\s
Stax , 80 Bytes
Führen Sie es aus und debuggen Sie es
Wie funktioniert es?
Ausgepackt, ungolfed und kommentiert sieht es so aus.
Führen Sie dieses aus
quelle
Holzkohle , 120 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Entfernen Sie die Leerzeichen aus der Eingabe, kehren Sie sie um und teilen Sie sie in Zeichen auf, damit wir die Zeichen später leichter durchlaufen können.
Beginnen Sie mit einer Größe von Null, was anzeigt, dass (noch) kein Ergebnis gefunden wurde.
Überprüfen Sie alle Seitenlängen bis zur Länge der Zeichenfolge. (Wenn Sie eine Division einfügen, wird der Code natürlich schneller.)
Wenn das Ergebnis ein perfektes Quadrat ist, speichern Sie die Größe des Quadrats und legen Sie diese als Rahmengröße fest.
Überschleife die möglichen Randhöhen und -breiten (die Randbreite ist nicht größer als die Randhöhe, sodass die Lückenhöhe nicht größer als die Lückenbreite ist.)
Wenn die Größe des Rahmens der gewünschten Länge entspricht und wir noch keine Lösung haben oder diese nicht so quadratisch ist wie diese Lösung, aktualisieren Sie die Lösung mit diesen Quadrat- und Rahmengrößen.
Wenn wir eine Lösung haben ...
Zeichnen Sie ein Rechteck aus einem beliebigen Zeichen der angegebenen Quadratgröße.
Wenn der Rand klein genug ist, um eine Lücke zu hinterlassen, löschen Sie die Lücke. (Der Zeichenbefehl zeichnet für negative Werte nach oben und links und mag überhaupt keine Nullwerte.)
Ersetzen Sie alle (verbleibenden) Zeichen durch Zeichen aus der Eingabe.
Sonst Ausgabe
:~(
.quelle
Jelly ,
9185 BytesProbieren Sie es online!
Eine monadische Verknüpfung, die die Eingabezeichenfolge als Argument verwendet und eine Zeichenfolge mit der formatierten Ausgabe oder zurückgibt
:~(
.quelle
Python 2,
287281279 BytesProbieren Sie es online!
Verwendet den lexikografischen Listenvergleich von Python, indem für die Auswahl und den Ausdruck einer Lösung dieselben Werte verwendet werden. Ich bin mir ziemlich sicher, dass
1042 oder so Bytes immer noch abgeschabt werden können.Erläuterung
Entfernen Sie Leerzeichen durch Teilen mit Leerzeichen und Verbinden mit
""
und konvertieren Sie die Eingabe in eine Liste für später. Initialisieren Sie auchl
die Länge des tatsächlichen Codes undp
die Liste der gültigen Möglichkeiten.Durchlaufen Sie alle Möglichkeiten der Lückengrößen von
0*0
bisl*l
. Berechnen Sie die Kantenlänge des Quadrats mitl
Codezeichen undx*y
Leerzeichen alss
.Überprüfen Sie, ob die folgenden Bedingungen zutreffen:
s % 1 == 0
, dh ein perfektes Quadrat würde gebildetx < s-1 > y
, dhx
undy
sind höchstenss-2
und passen in das Quadrats % 2 == x % 2 == y % 2
, dh beidex
undy
stimmen mit der Parität der Kante überein und können zentriert werdenx < 1
, dhx == 0
alle außer der perfekten Quadratanforderung ignorierenWenn die Bedingungen übereinstimmen, fügen Sie die folgenden Elemente in ein Tupel ein
p
, um das optimale zu finden:abs(x-y)/2
; Finden Sie zuerst den minimalen Unterschied vonx
undy
um die quadratischste Lücke zu erhalten. Dies ist immer so, dass wir durch 2 teilen.int(s)
; Als nächstes finden Sie die minimale Seitenlänge. Das
es sich um eine Ganzzahl handelt und die Lückenfläche zunimmtx*y
, wird diese nach Lückenfläche sortiert.-x
; Als nächstes finden Sie die maximale Breite, um horizontale Lücken zu bevorzugen. Dies kommt nach dem Gebiet aufgrund dessen, wie es entwickelt wurde, aber das Gebiet ist das gleichex*y
undy*x
so funktioniert es.Wenn wir gültige Layouts gefunden haben, finden Sie das optimale Layout wie oben beschrieben. Berechnen Sie den horizontalen Rand
b
und initialisieren Sie die ZeilennummerY
auf 0.Wenn sich die Zeilennummer
Y
innerhalb der Lücke befindet (der vertikale Rand befindet sichb+d
, zusammen mitd
dem Tupel), fügen Sie nach dem horizontalen Rand in die Lückenbreite Leerzeichen hinzuc
. (Die Änderung vonc
ist, warum wir es brauchen, um eine Liste zu sein.) Dann drucken Sie eine Zeile des Quadrats und entfernen Sie es vonc
. Wiederholen Sie dieses
Schritte, indem Sie die Zeilennummer erhöhen.Wenn keine Layouts gefunden wurden, schlagen Sie fehl.
quelle
"some\ntext"
Trennzeichen. (input()
Wertet eine Eingabezeile als Python-Code aus.) Wenn dies nicht akzeptabel ist, lassen Sie es mich bitte wissen. Länge 22 funktioniert auch bei mir.Pyth ,
9998 BytesProbieren Sie es online!
Dies verwendet den gleichen Algorithmus wie meine Python-Antwort, aber viele Details werden in Pyth erheblich geändert, um kürzer zu sein.
Pyth zeigt hier sein Alter an, da es seit Ewigkeiten nicht mehr aktualisiert wurde und nur die druckbaren ASCII-Zeichen (für Code, nicht für Daten) verwendet, wodurch viel Platz verschwendet wird.
Interessanterweise könnte dieses Programm, wenn Pyth dieselbe Art von Base-256-Packung wie Stax verwendet, 98 log 256 95 = 81 Bytes lang sein, direkt neben Stax (80 Bytes) und Jelly (85 Bytes). Ich denke, das zeigt sehr gut, wie nah Golfsprachen mit ihren drastisch unterschiedlichen Paradigmen sind.
Erklärung (nur etwas weniger unlesbar als der Code)
#
Umschließt alles mit einemwhile True:
, der die Nachricht unterdrückt und bei einem Fehler beendet.JscQ)
c
hops input (Q
) bei Leerzeichen,s
ums die Teile zusammen und speichert das Ergebnis inJ
.^UJ2
macht die Liste der Indizes (U
) zuJ
und erhält ihre2
nd kartesische Potenz (^
), was zu allen Paaren[h,w]
mit0<=h<len(J)
und führt0<=w<len(J)
.+L@+lJ*Fd
: Für alle (L
) solche Paared
addiert (+
) die Quadratwurzel (@
...2
) der (diel
ength vonJ
plus (+
) , um das Produkt (*F
) des Paaresd
) auf der linken Seite des Paares, ein Triplett zu schaffen[side length, gap height, gap width]
.f!|%hT1&eT|t{%R2TgeStThT
:f
ilter für DrillingeT
wo!|
):hT
) Modulo 1 (%
…1
) ist ungleich Null&
):eT
) ist ungleich Null|
):R
) Modulo 2 (%
…2
), bei der Duplikate ({
) und das erste eindeutige (t
) entfernt wurden, ist nicht leereS
) von Spalthöhe und Spaltbreite (tT
) istg
gleich oder gleich der Seitenlänge (hT
)S
sortiert die Drillinge lexikographisch (nach Seitenlänge, dann nach Spalthöhe).oaFtN
Anschließendo
werden die Tripletts um dena
absoluten Unterschied zwischen Spalthöhe und Spaltbreite (tN
) geordnet .Wenn wir zu diesem Zeitpunkt keine gültigen Lösungen haben, wird
|
das zweite Argument ausgewertet\n":~("
, das gedruckt und zurückgegeben wird:~(
.h
Nimmt die optimale Lösung (oder":"
keine) und es wird in gespeichertK
. Nimmth
dann die Seitenlänge (oder":"
wenn keine vorhanden ist),s
wandelt sie in eine Ganzzahl um (oder schlägt fehl und wird beendet, wenn keine vorhanden ist) und wird in gespeichert (=
)Q
.Jedes von (
m
)[gap height, gap width]
(tK
) wird dann-
von der Seitenlänge (Q
) abgezogen ( ) und das Ergebnis durch 2 (/
…2
) geteilt. Die Ergebnisse sindA
mitG
und gekennzeichnetH
.Schließlich betreten wir eine
W
Hile-Schleife.Z
beginnt bei 0 und wird bei jeder Iteration erhöht, aber der alte Wert wird verwendet (~hZ
sieheZ++
C).W
) der alte Wert in ({
) dier
angeG
bis (Seitenlänge -G
) (-QG
), assign (=
) zuJ
dem folgenden:c
hopJ
an der Position (]
)H
undj
oin die Hälften mit SpaltbreiteeK
mal (*
) einen Raum (d
). Wenn der Wert nicht im Bereich liegt, kehren Sie einfach zurückJ
. Wenn dieses Ergebnis leer ist, stoppen Sie die Schleife.>
) die erstenQ
Zeichen vonJ
und weisen Sie (~
) das Ergebnis zuJ
.J
Nehmen Sie aus dem alten Wert von (<
) die erstenQ
Zeichen und drucken Sie sie aus.Schließlich wird die
#
wieder Schleife beginnt, Fehler und quitt , denncQ)
mitQ
einer Zahl ist ungültig.quelle
05AB1E ,
9589 BytesEin paar Bytes hier und da kann man definitiv golfen.
Die ersten drei Schritte des Programms sind von @recursives Stax-Antwort inspiriert. Stellen Sie also sicher, dass Sie ihn unterstützen!
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
Schritt 1: Alle Leerzeichen entfernen:
[[6,2,4],[6,4,2],[8,6,6]]
":~("
Zum Beispiel: Die Drillinge
[[6,2,4],[6,4,2],[8,6,6]]
werden nach sortiert[[8,6,6],[6,2,4],[6,4,2]]
, danach[8,6,6]
bleibt nur noch.Schritt 4: Erstellen Sie eine Liste, wie die Zeichenfolge aufgeteilt werden soll, um die Leerzeichen einzufügen. Das geht so:
Zum Beispiel: Triplett
[7,3,5]
führt zur Liste[15,2,2,35]
."Alongtesttoseeifitworksasintended."
[15,2,2,35]
["Alongtesttoseei","fi","tw","orksasintended."]
"Alongtesttoseei fi tw orksasintended."
["Alongte","sttosee","i f","i t","w o","rksasin","tended."]
quelle