ICS Maritime Flag Alphabet

14

Das Flaggenalphabet International Code of Signals wird von Schiffen für die Kommunikation verwendet, insbesondere für statische Signale.

Ihre Herausforderung besteht darin, ein Programm oder eine Funktion zu schreiben, die eine Zeichenfolge aus STDIN oder als Argument verwendet und den entsprechenden Text im ICS-Flaggenalphabet anzeigt. Wenn Ihre Sprache nicht auf dem Bildschirm angezeigt wird, ist das Speichern in einer Datei akzeptabel.

Ihr Programm oder Funktion wird Buchstaben unterstützen AZ in Groß- und Kleinschreibung sowie Raum und Newline . Verhalten mit anderen Zeichen ist undefiniert.

Die Anzeige muss groß genug sein, um mindestens 8 Flaggen horizontal und 6 Flaggen vertikal anzeigen zu können. Das Verhalten ist undefiniert, wenn die rechte Kante erreicht ist, bevor eine neue Zeile empfangen wird, oder wenn die Nachricht zu lang ist, um vertikal auf die Anzeige zu passen.

Das Flaggenalphabet ist wie unten gezeigt (lateinische Buchstaben dienen nur als Referenz, sie werden in der Ausgabe nicht benötigt.)

Bildbeschreibung hier eingeben

Maße

Es gibt keine allgemein anerkannte Norm für die Abmessungen dieser Flaggen. Für diese Herausforderung gilt daher Folgendes:

Die Flags müssen 60 x 60 Pixel groß sein und einen horizontalen und vertikalen Abstand von 30 Pixel haben.

Der Schwalbenschwanzschnitt in A und B muss 15 Pixel tief sein.

Alle anderen Linien müssen horizontal, vertikal oder in einem Winkel von 45 Grad verlaufen.

Die Merkmale sind zu lokalisieren, indem die Flagge in ein imaginäres NxN-Gitter mit Seiten von 3,4,5 oder 6 Quadraten unterteilt wird. Beziehen Sie sich auf das obige Bild, aber zur weiteren Verdeutlichung:

A, E, H, K, L und U basieren auf einem 2x2-Raster: Die Breite jeder Farbzone muss 30 Pixel betragen. Auch die Punkte des Diamanten in F müssen sich auf beiden Seiten der Flagge befinden.

J und T basieren auf einem 3x3-Raster: Jedes Band muss 20 Pixel haben.

P, N und S basieren auf einem 4x4-Raster. Auch die diagonalen Linien von Y teilen die Ränder der Flagge in 4.

C, D, R und X basieren auf einem 5x5-Raster. Bänder und Arme von Kreuzen müssen 12 Pixel breit sein.

G, W, M, V basieren auf einem 6x6-Raster. Bänder von G und Ränder von W müssen 10 Pixel breit sein. Kreuzarme auf M und V bedecken die ersten und letzten 10 Pixel jeder Kante der Flagge, wobei entlang der langen Kante Dreieckszonen mit einer Größe von 40 Pixel verbleiben.

Der Kreis von I soll sich in der Mitte der Flagge befinden und einen Durchmesser von 30 Pixel haben.

Ein Fehler von +/- 1 Pixel aus dem obigen Text ist zulässig. Wenn Ihre Sprache nur skalierbare Grafiken unterstützt, können Sie "Pixel" als "Einheiten" interpretieren.

Farben

Die Farben müssen rot, weiß, blau, gelb und schwarz sein, wie in Ihrer Sprache oder deren Dokumentation definiert. Wenn Ihre Sprache keine Farben definiert, können Sie Folgendes verwenden: Rot FF0000, Weiß FFFFFF, Blau 0000FF, Gelb FFFF00, Schwarz 0000000.

Der Hintergrund muss grau sein (Kanäle r, g und b mit einer Intensität zwischen 25% und 75%).

Wertung / Lücken

Das ist Codegolf. Kürzester Code in Bytes gewinnt.

Standardlücken sind nicht zulässig.

Es dürfen keine eingebauten oder Bibliotheksfunktionen zum Anzeigen von Flags verwendet werden. Die Ausgabe darf kein Text sein (und insbesondere dürfen Unicode-Zeichen nicht zum Aufbau der Flag-Form verwendet werden.)

Beispiel

JFK got
my VHS
PC
and XLR
web quiz

sollte folgendes erzeugen

Bildbeschreibung hier eingeben

Level River St
quelle
Ich bin mir nicht ganz sicher, was Sie unter " Das Display muss groß genug sein, um mindestens 8 Flaggen horizontal und 6 Flaggen vertikal anzuzeigen " verstehen , insbesondere angesichts der Tatsache, dass in Ihrem Testfall nur 5 Flaggen ausgegeben werden. Müssen Antworten nur Nachrichten bis zu diesen Dimensionen verarbeiten und müssen keine größeren verarbeiten, oder möchten Sie, dass alle Zeilen mit mindestens 8 Zeichen und alle Nachrichten mit mindestens 6 Zeilen aufgefüllt werden?
Peter Taylor
1
@PeterTaylor Wenn Ihr Programm oder Ihre Sprache intelligent genug ist, um die Größe der Anzeige entsprechend der Ausgabe zu ändern, muss die Anzeige nicht auf 8 x 6 aufgefüllt werden, wenn die Ausgabe kleiner ist. Die Ausgabe muss einen grauen Hintergrund haben und rechteckig sein (alle Zeilen werden mindestens bis zur Länge der längsten Zeile aufgefüllt).
Level River St

Antworten:

15

CJam, 464 Bytes

Sie dachten, CJam hätte keine Bildmanipulationsfunktionen? Nun, du hast richtig gedacht! Aber das wollte ich nicht aufhalten lassen.

"P3
690 690 4
"3a3*a690_@*a*qeuN/{0:U;{_'C<.5*:N;i[{XY+Z<[E8][9C]?XY<=}WWWW{XH<9F?}C{YC/[9FCF]=}{YC/3&9E?}{YH<9F?}{X29.5:R-zYR-z+H>FC?}{XA/1&9E?}{XH<FC?}{XR-_*YR-_*+F_*>E8?}{YK/(9F?}{XH<E9?}{XH<YH<^8E?}{XY+Z-A/XY-A/e&9F?}{XF/YF/^1&F9?}{XY<EC?}{XH-F/YH-F/|9F?}E{XHm6/YHm6/e&CE?}{XH-F/YH-F/|F9?}{XK/[CF9]=}{XH<YH<^FC?}{XY+Z-A/XY-A/e&FC?}{XR-zYR-ze>iA/[CF9]=}{XHm6/YHm6/e&F9?}{XY+F/1&CE?}]=:P~!!{60:Z{Z30:HYH-z-N*-{YV+_2$=XU+P2b1>4f*tt}fX}fY}*U90+:U;}/V90+:V;}/`"[]"-

Dieses Programm gibt das Bild so gut aus, wie CJam es kann: als Text, der das Bild darstellt, wenn es als PPM-Datei gespeichert wird . Versuchen Sie es übrigens nicht einmal mit dem Online-Interpreter. Sie werden den Stapel sprengen. Führen Sie es mit dem Java-Interpreter aus und leiten Sie die Ausgabe mit einem Befehl wie java -jar cjam-0.6.4.jar flags.cjam > flags.ppm. Sobald Sie Ihre Eingabe gemacht haben, senden Sie eine EOF (möglicherweise unmittelbar nach einem Zeilenumbruch) mit Strg + D unter Unix oder Strg + Z unter Windows.

Stichprobe

Wenn es wirklich gewünscht ist, kann ich versuchen, die ursprüngliche ~ 3 MB-Bildquelle irgendwo einzufügen. Aber hier ist das Ergebnis, das in GIMP geöffnet und zu einem PNG konvertiert wurde:

ABCDEFG
hijklmn
OPQRSTU
vwxyz z

flags_alphabet.png

Erläuterung

Der in der Quelle leicht identifizierbare Bildkopf besteht aus der magischen Zahl, Breite, Höhe und dem maximalen Kanalwert. Die Ausgabe ist also ein 690 * 690-Bild (ausreichend für 8 * 8 60px-Flags mit 30px Abstand zwischen ihnen), wobei jeder R-, G- und B-Wert im Bereich von 0 bis 4 liegt.

Die Bilddaten werden als ein mit 3en gefülltes 690 * 690 * 3-Array initialisiert, wodurch das gesamte Bild hellgrau wird. Dann wird die Eingabe gelesen, in Großbuchstaben umgewandelt und in Zeilen aufgeteilt. Die Zeilen werden in einer Schleife verarbeitet, wobei die Flag-Y-Koordinate bei jeder Iteration um 90 erhöht wird, und in jeder Zeile wird jedes Zeichen in einer Schleife verarbeitet, wobei die Flag-X-Koordinate bei jeder Iteration um 90 erhöht wird. Jetzt beginnt die Magie.

Jedes Zeichen wird der Pixelfunktion eines Flags zugeordnet, die beim Aufrufen die Farbe des Pixels an der Position (X, Y) des Flags zurückgibt. Hier ging die meiste harte Arbeit vonstatten: 26 Bilder kurz als mathematische Funktionen zu beschreiben. Jede dieser Funktionen gibt einen Farbwert von 8-15 zurück. Dieser Bereich nutzt die Tatsache aus, dass das resultierende Bit-Array bei der Konvertierung in Basis 2 als [1, R, G, B] interpretiert werden kann. Das erste Element kann entfernt und der Rest mit 4 multipliziert werden, um auf einfache Weise einen Pixelwert im gewünschten Format zu erhalten, der alle möglichen Flaggenfarben (sowie Grün, Cyan und Magenta) abdeckt. Es funktioniert auch gut, dass es Variablen mit einem Zeichen gibt, die auf 10-15 initialisiert sind, und da Variablen kein Leerzeichen benötigen, um sie syntaktisch zu trennen,

Sobald die Funktion abgerufen wurde, müssen Sie nur X und Y von 0 bis 60 durchlaufen, die Funktion bei jedem Schritt aufrufen und das Ergebnis in das Bilddatenfeld zurückschreiben. Ein aufmerksamer Beobachter kann jedoch feststellen, dass die von jeder Flag-Funktion zurückgegebenen Farbwerte kein Grau zulassen. Es gibt also ein bisschen zusätzliche Logik, um Leerzeichen zu überspringen. Aber es gibt immer noch die Schwalbenschwanzschnitte an 'A' und 'B'. Es gibt also auch ein bisschen zusätzliche Logik. Wenn der Zeichenwert kleiner als 'C' ist, wird ein Wert so festgelegt, dass die Obergrenze der X-Schleife in Bezug auf Y korrekt variiert und die ausgeschnittenen Bereiche niemals gezeichnet werden.

Insgesamt bin ich ziemlich zufrieden mit dem Ergebnis. Es hat viel Arbeit gekostet, aber es hat Spaß gemacht. Einige Flags stimmen nicht perfekt mit dem Referenzbild überein, aber ich glaube, ich habe alle Formen so eingestellt, dass sie innerhalb eines Pixelabstands zum Ziel liegen (wenn welche um mehr als das abweichen, lassen Sie es mich wissen und ich werde sie reparieren). Und es gibt definitiv noch Optimierungspotenzial, da die 26 Flag-Funktionen ziemlich redundant sind.


Interessanter erster Versuch, 559 Bytes

Obwohl ich das nie ganz fertiggestellt habe, werde ich es auch posten, weil es ziemlich interessant ist. Anstatt jede Flagge durch eine Funktion von (X, Y) → Farbe zu modellieren, werden Flaggen als Komposition einfacher Formen gezeichnet. Ich hatte jedoch Bedenken, dass ich für jede Form eine erhebliche Menge Rendering-Code schreiben musste. Nach langem Überlegen wurde mir klar, dass ich sie alle mit einigem Durcheinander und Überzeichnen mit nur einer Pseudoform rendern konnte: allen Punkten innerhalb eines bestimmten Abstands zu einem bestimmten Punkt, wobei die Definition von "Abstand" variabel ist. Die Entfernung vom Schachbrett ergibt ein Quadrat, die Entfernung von Manhattan ergibt einen Diamanten und die euklidische Entfernung ergibt einen Kreis. Dies bedeutete, dass jede Form die gleichen fünf Parameter hatte (Farbe, Distanzmodus, x, y,

"P3
690 690 4
"3a3*a690_@*a*qeuN/{0:U;{_'C<.5*:N;i[[8EX30:Q0Q9X60:ZQQCXQZQ]LLLL[F9TTQQ]Ca[9FTQ42QCTQ54QFTQ66Q9TQ78Q][E9TIQI9T42QI][9FTQZQ][FCXQQQ][E9T40QQET50QQ9TZQQET70QQ9T80QQ][FCTZQQ][E8YQQF][9FTQAQ9TQ9~Q][E9TZQQ][8ETTTQETZZQ][F9XQTK9XZQK9XQZK9XTQK][F4{4{JW^1&6*9+TJ)F*W)F*F}fJ}fW][CEX0ZZ][9FTQQF]Ea[E[TZ]_m*{CT@~24}/][F9TQQF][9FTAQQCT9~QQ][FCTTTQCTZZQ]C9$1>9a/Fa*+[9FTQQKCTQQA]9 6$1>Ca/Fa*+[C7{7\-_1&2*C+X@TT@F*}/]]=_!!{([TQQQ]+\+}*5/{~:R;.5-:H;.5-:G;:M;2b1>4f*:O;Z{ZQWQ-z-N*-{JG-{zM_!+#}:P~WH-PM{+}{e>}?RP<{WV+_2$=JU+Ott}*}fJ}fW}/U90+:U;}/V90+:V;}/`"[]"-
Runer112
quelle
1
Ausgezeichnet, das ist die kreative Antwort, nach der ich gesucht habe. Versucht es später auszuführen.
Level River St
1
Dies ist wahrscheinlich der längste CJam-Code, den ich je gesehen habe. Gute Arbeit, +1.
Alex A.
Wieder scheint CJam den Tag zu retten.
ASCIIThenANSI
9
Leider ist es strafbar, CJam-Code länger als 200 Bytes zu posten. Ich muss dich in Gewahrsam nehmen.
Deusovi
2

PHP, 811 Bytes

function f($s){echo"<body bgcolor=#ccc>";$z=split("\n",gzinflate(base64_decode("vVfNasMwDL7vKQK7xlT+iaHQ9LDTLnuIQus6ENhgxS19+kmO0yRrkhbqGIxtyV8sWbIkZ/Prjtm52p9suYbMHqqjPdHMVYfzx/elhBzyNbXtZoXQ7dvm+Q9+dieb7csvZFkJToNlEq6Zqeq6fAcw2arDqCKXUPMCEYQicIc1xmNfUkBDzXgQkpMQ3W0PEGF7fz49dT7IuSCQ1APJ5h9IKAIhdGn1jIHH6oUzvCpZzhtGjoDiePzuzAPJEkG1JPk1uw29G5rC7pxAvAFxuHqd+nQxpCP65S4gR6wzAkphE4rPHfbYaAueky59BrmrZ4wU0Ss8SES/pCNugMduiBSYs25oJTeBSYNMbHO6+bUg22PPhA8E5LCWhT3SFBjEwxaWiOMYD1+FtZSZxateEAZ7pvsEL7w1aQxD3HxLcmayfNA9ZeXzcdteJLm0H5ZITzAwolDkXeGwVAvlSzUOSDDkMRqRxDkuLquVecbKMRKFaESLSYOMg4b6qVHQMnkMns5jyZLBAnksRehirQWrwClEqakDNrqKpjqKpZ8K5rVYTFE56ZmCyT68KinJX+n/puFpyHXg4RRLwg1oW6YipqfimfJTt6/c6XIv6Tnc/HxNXIj+a9nORdwN5Qa3qzvGHw==")));while($c=ord(ucfirst($s))){$s=substr($s,1);echo$c<32?'<br>':($c^32?$z[$c-64]:$z[0]);}}

Der komprimierte Blob enthält SVG-Code für jedes der 26 Flags. Eine einfache Schleife extrahiert dann das SVG-Bild, das jedem Zeichen der Eingabe entspricht, und gibt es aus.

Beispielausgabe für "Dies ist \nein Test":

<body bgcolor=#ccc><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h20v60h-20z fill=#f00 /><path d=M20,0h20v60h-20z fill=#fff /><path d=M40,0h20v60h-20z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h30v60h-30z fill=#fff /><path d=M30,0h30v60h-30z fill=#f00 /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#ff0 /><path d=M15,30a15,15,0,0,1,30,0a15,15,0,0,1-30,0z fill=#000 /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#fff /><path d=M15,15h30v30h-30z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#ff0 /><path d=M15,30a15,15,0,0,1,30,0a15,15,0,0,1-30,0z fill=#000 /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#fff /><path d=M15,15h30v30h-30z fill=#00f /></svg><br><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h30v60h-30z fill=#00f /><path d=M45,30l15-30h-30v60h30z fill=#fff /></svg><svg width=90 height=90 viewBox=0,0,90,90></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h20v60h-20z fill=#f00 /><path d=M20,0h20v60h-20z fill=#fff /><path d=M40,0h20v60h-20z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v30h-60z fill=#00f /><path d=M0,30h60v30h-60z fill=#fff /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#fff /><path d=M15,15h30v30h-30z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h20v60h-20z fill=#f00 /><path d=M20,0h20v60h-20z fill=#fff /><path d=M40,0h20v60h-20z fill=#00f /></svg>

( Sie können es bei ideone ausprobieren , die Seite wird jedoch nicht für Sie gerendert .)

zimperliches Ossifrage
quelle