Sie erhalten ein hexagonales Raster der Zeichen .
und #
wie folgt:
. . . . . . . .
. . . . # . . .
. # . . . # . .
. . . # . . . .
. . . . . # . .
. . . . . . . .
Ihre Aufgabe ist es, den gesamten achsenbündigen Begrenzungsrahmen des #
mit weiter zu füllen #
:
. . . . . . . .
. . # # # # . .
. # # # # # . .
. . # # # # # .
. . # # # # . .
. . . . . . . .
Der achsenausgerichtete Begrenzungsrahmen ist die kleinste konvexe sechseckige Form, die alle enthält #
. Beachten Sie, dass beim hexagonalen Gitter drei Achsen zu berücksichtigen sind (W / E, SW / NE, NW / SE):
Hier ist ein weiteres Beispiel, um zu zeigen, dass in einigen Fällen eine oder mehrere Seiten nur eine Seite enthalten #
:
. . . . . . . . . . . . . . . .
. # . . . . . . . # # # # . . .
. . . . . # . . . . # # # # . .
. . # . . . . . . . # # # . . .
. . . . . . . . . . . . . . . .
Sie können diese entweder als Sechsecke mit entarteten Seiten anzeigen oder wie oben beschrieben den Begrenzungsrahmen um sie herum zeichnen. In diesem Fall handelt es sich immer noch um Sechsecke:
Zu schwer? Probiere Teil I aus!
Regeln
Sie können anstelle von und zwei verschiedene nicht durch Leerzeichen druckbare ASCII-Zeichen (0x21 bis 0x7E, einschließlich) verwenden . Ich werde sie jedoch weiterhin als und für den Rest der Spezifikation bezeichnen.#
.
#
.
Eingabe und Ausgabe können entweder eine durch Zeilenvorschub getrennte Zeichenfolge oder eine Liste von Zeichenfolgen sein (eine für jede Zeile), das Format muss jedoch konsistent sein.
Sie können davon ausgehen, dass die Eingabe mindestens eine #
und alle Zeilen gleich lang sind. Beachten Sie, dass es zwei verschiedene "Arten" von Zeilen gibt (beginnend mit einem Leerzeichen oder einem Nicht-Leerzeichen) - Sie können nicht davon ausgehen, dass die Eingabe immer mit demselben Typ beginnt. Sie können davon ausgehen, dass der Begrenzungsrahmen immer in das angegebene Raster passt.
Sie können ein Programm oder eine Funktion schreiben und eine unserer Standardmethoden zum Empfangen und Bereitstellen von Eingaben verwenden.
Sie können jede Programmiersprache verwenden , beachten Sie jedoch, dass diese Lücken standardmäßig verboten sind.
Das ist Code-Golf , also gewinnt die kürzeste gültige Antwort - gemessen in Bytes .
Testfälle
Jeder Testfall hat Ein- und Ausgänge nebeneinander.
# #
. . . .
# . # # # #
. . . .
. # . #
. . . . # .
# . # .
# . # .
. . . . # .
. # . #
# . # .
# . . # # .
. # # #
. # # #
# . . # # #
. # # #
. . # . # #
. . # #
# . . # # .
# . . # # .
. . # #
. . # . # #
. . . . . . . . . . . . . . . .
. . # . # . . . . . # # # . . .
. . . . . . . . . . . # # . . .
. . . # . . . . . . . # . . . .
. . . . . . . . . . . . . . . .
. . # . . . # . . . # # # # # .
. . . . . . . . . . . # # # # .
. . . # . . . . . . . # # # . .
. . . . . . . . . . . . . . . .
. # . . . . . . . # # # # . . .
. . . . . # . . . . # # # # . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. # . . . . . . . # # # # . . .
. . . . . # . . . . # # # # . .
. . # . . . . . . . # # # . . .
. . . . # . . . . . # # # # . .
. # . . . # . . . # # # # # . .
. . . # . . . . . . # # # # # .
. . . . . # . . . . # # # # . .
quelle
Antworten:
Pyth ,
8271 BytesProbieren Sie es online!
Erläuterung
Sei A der Punkt mit der niedrigsten y-Koordinate und B der Punkt mit der höchsten y-Koordinate.
Sei C der Punkt mit dem niedrigsten (x-Wert minus y-Wert) und D der Punkt mit dem höchsten.
Sei E der Punkt mit dem niedrigsten (x-Wert plus y-Wert) und F der Punkt mit dem höchsten.
Dann ist es äquivalent, die Koordinaten zu finden, bei denen die y-Koordinate zwischen A und B liegt, der x-Wert minus y-Wert zwischen C und D liegt und der x-Wert plus y-Wert zwischen E und F.
quelle
Haskell,
256 254243 BytesDanke @Damien fürs Golfen
f
!Die Eingabe erfolgt als Liste der Zeichen, die Ausgabe erfolgt auf die gleiche Weise.
Also das war ein Biest zum Schreiben. Es basiert auf der Idee von LeakyNun und verwendet eine maximale und minimale Filterung anhand der Koordinaten der Elemente.
Ich bin wirklich überrascht von der Tatsache, dass
m=map
tatsächlich Bytes gespart werden, da es so teuer zu sein scheint.Erläuterung:
Hier ist eine etwas weniger geschlachtete Version (Schwerpunkt auf etwas ):
f
ist eine Funktion, die jedem Zeichen einen Index zuweist(y-index, x-index)
und dabei die ursprüngliche Struktur der Liste beibehält.b
:b
Berechnet bei einem Element der indizierten Liste[y-index, y - x, y + x]
.p
: Bei gegebenem indizierten Feld werden 3 Funktionen zurückgegebenInt -> Bool
, von denen die erste die Überprüfung des y-Index, die zweite der Differenz und die dritte der Summe ist.min(snd e)
kümmert sich um die Leerzeichen (ein Leerzeichen ist kleiner als beide). Diese Funktion ist im Golfcode vermerkt.q
Ändern Sie angesichts des indizierten Felds alle erforderlichen Einstellungen.
in,#
indem Sie prüfen, ob dieses bestimmte FeldTrue
zu jeder Testfunktion zurückkehrt.Die endgültige Lösung ist dann die Zusammensetzung von
q
undf
.quelle
f=z(\y->z((,).(,)y)[0..])[0..]
h x=z x[0..]
f=h$h.curry(,)
Python 3,
380378348346 BytesBeachten Sie, dass der Einzug Tabulatoren und keine Leerzeichen enthält.
Golf Version:
Teste es auf Ideone
Erklärung (für ungolfed Version unten):
Die gesamte Verarbeitung erfolgt ohne Konvertierung, Leerzeichen werden einfach übersprungen.
Die Funktion
axes_pos
berechnet 3-Tupel der imaginären "3D" -Koordinaten und summiert sie für alle Zeichen zu (elementweisen) minimalen und maximalen 3-Tupeln (bmin
,bmax
)#
.Koordinaten werden berechnet in
def axes_pos(x, y): return y, x + y, lc - y + x
;Dabei zählt X von 0 nach rechts und Y von 0 nach unten (von der ersten bis zur letzten Zeile).
Die erste imaginäre Koordinate ist im Grunde Y, weil es offensichtlich ist, warum. Seine Axt ist orthogonal zu grünen Grenzen (in den Bildern des OP).
Zweitens ist orthogonal zu roten Grenzen und drittens ist orthogonal zu blauen Grenzen.
Im zweiten Durchgang werden alle
.
Zeichen ersetzt, deren "3D" -Koordinaten elementweise in den Bereich fallenbmin
.bmax
Dies wird in diesem Ausdruck überprüftall(bmin[j] <= p[j] <= bmax[j] for j in range(0, 3))
.Ungolfed-Version mit Tests, auch auf Ideone :
Update 1:
Update 2.3:-1
Für die dritte imaginäre Koordinate unnötig entfernt , da sie nichts ändertTeilweise implementierte Verbesserungen, die auch von
Leaky Nun
mir vorgeschlagen wurden .quelle
def A(x,y):return y,x+y,len(L)-1-y+x
->A=lambda x,y:(y,x+y,len(L)-1-y+x)
len(L)-y+x
inx-y
Jelly ,
4535 134241 BytesDies ist eine Liste von Links; Der letzte muss am Eingang aufgerufen werden, um den Ausgang zu erzeugen.
I / O ist in Form von String-Arrays, wobei
.
leer und@
gefüllt angezeigt wird.Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Hintergrund
Betrachten wir das folgende Beispiel.
Durch Zeichnen eines Paares oder paralleler Linien - das nächste Paar, das alle ausgefüllten Positionen einschließt - in jede der drei Richtungen können wir den hexagonalen Begrenzungsrahmen bestimmen.
In der Implementierung ersetzen wir alle Zeichen zwischen diesen beiden Zeilen mit
@
und alle Zeichen außerhalb dieser Zeilen mit.
(mit der möglichen Ausnahme von Diagonalen, die nur Leerzeichen enthalten).Für die horizontale Achse ergibt sich
für die fallende diagonale achse gibt es
und für die ansteigende diagonale Achse gibt es
Wenn wir das zeichenweise Minimum aller drei nehmen , erhalten wir
.
<@
Alles was zu tun bleibt, ist die Wiederherstellung der Räume.
Wie es funktioniert
quelle
Python,
237230 Bytes7 Bytes dank Dennis.
Port meiner Antwort in Pyth .
Nimmt ein Array von Zeilen als Eingabe und gibt ein 2D-Array von Zeichen aus.
quelle
Perl,
128126 BytesBeinhaltet +6 für
-0F\n
Mit Eingabe auf STDIN ausführen. Verwenden Sie
1
für gefüllt,0
leer. Zeilen müssen am Ende nicht mit Leerzeichen aufgefüllt werden:hexafill.pl
Verwendet Würfelkoordinaten. Bestimmen Sie Maximum und Minimum während der
$= == 1
Schleife und füllen Sie die Koordinaten zwischen diesen Grenzen während der$= == 0
Schleife. Die ersten 58 Schleifen sind sinnlos und nur dazu da, um$-
die Anzahl der Zeilen zu füllenquelle
TSQL, 768 Bytes
Ich schrieb eine Anfrage, um dies zu lösen - was mir ziemlich schwer fiel. Es ist nicht in der Lage, mit all den hervorragenden kürzeren Antworten mithalten zu können. Wollte es aber trotzdem für Interessierte posten. Entschuldigen Sie die Länge der Antwort - in der Hoffnung, dass es bei Codegolf auch um unterschiedliche Ansätze geht.
Golf gespielt:
Ungolfed:
Geige ungolfed
quelle
GNU Octave,
212, 196 BytesVielleicht nicht wirklich die Lieblingssprache eines Golfspielers, aber genau das macht die Herausforderung aus, nicht wahr? Angenommen, m wird als eine Zeichenmatrix genommen: 178 Bytes stehen alleine und 196, wenn sie in eine Funktion gestopft sind .
Golf gespielt:
ungolfed:
Erklärung : Wir bauen ein Koordinatensystem auf, 3 Achsen - senkrecht zu den Sechseckseiten, finden Max und Min jeder Koordinate, bauen dann eine logische Maske auf, die überall mit 1 beginnt und logisch ist jede verbleibende "wahre" Position auf "#" Zeichen.
Wenn Sie es testen möchten, können Sie einfach eine m-Matrix wie folgt erstellen:
und rufen Sie dann das f (m) auf und vergleichen Sie mit m, indem Sie eine Matrix mit beiden in:
quelle
m
und die Ausgabe in gespeichert werdenk
. Antworten sollten immer vollständige Programme oder aufrufbare Funktionen sein.