Ihr Ziel ist es, einen Flag-Semaphor-Encoder zu schreiben , der einen bestimmten Satz gemäß dem in Wikipedia beschriebenen Semaphor-System in die entsprechenden Flag-Semaphor-Zeichen umwandelt .
Angenommen, die Eingabe ist ein einzelner Satz, der durch stdin (oder einen gleichwertigen Satz) bereitgestellt wird. Ihre Ausgabe sollte eine Reihe von Semaphorzeichen sein, wobei jede Zeile ein Wort aus dem Satz darstellt. Sie müssen sich nur mit dem Alphabet (AZ) befassen und sollten alle anderen Nicht-Leerzeichen ignorieren, müssen jedoch in der Lage sein, sowohl Groß- als auch Kleinbuchstaben zu verarbeiten. Ihre Ausgabe darf zusätzliche Leerzeichen enthalten.
Semaphorzeichen müssen als 3x3-Quadrat angezeigt werden, wobei eine O
in der Mitte und die Flaggenpositionen durch die Zeichen dargestellt werden | - / \
. Jedes Semaphorzeichen muss durch ein Leerzeichen von benachbarten Zeichen getrennt sein, und jede Zeile muss durch eine Leerzeile getrennt sein. Machen Sie sich keine Sorgen um das Umbrechen von Wörtern, die für Ihre Anzeige möglicherweise zu lang sind - tun Sie so, als hätten Ihre Zeilen eine unendliche Länge.
Beispieleingabe:
abcdefg hijklmn opqrstu vwxyz
Beispielausgabe:
\ | /
O -O O O O O- O
/| | | | | | |\
\ | | /
-O O O- O O O- O
/ / / / / / \
\ | / \| \ /
-O -O -O -O- -O O O
\
| / / \
O O- O O- O-
\ \ \
Beispieleingabe:
This is Code Golf.
Beispielausgabe:
\| \
O -O O -O
/ / \
\
O -O
/ \
\ \ | /
O -O O O
| | |
\ /
O -O O O-
|\ / |
Da dies Code-Golf ist , gewinnt die kürzeste Lösung.
and each row must be separated by a blank line
=> Jedes Wort ist gemeint, nicht wahr?Antworten:
Perl,
282264251247245243241240236233229227220218216214 ZeichenMit einigen schönen Zeilenumbrüchen:
Ich habe eine Weile gebraucht, um das zum Laufen zu bringen (mein erster Versuch einer Perl-Antwort). Es basiert auf einer ähnlichen Idee wie viele andere Antworten. Jedes Flag kann sich an einer von 8 Positionen befinden, es gibt zwei Flags und die beiden Flags können sich niemals an derselben Position befinden. Dies bedeutet, dass ich die Position beider Flags in einem Byte codieren kann - was auch bedeutet, dass ich mit der Perl-
y///
Funktion (Operator?) Direkt von einem Zeichen in seine Codierung übersetzen kann . So:-Deshalb:
Ich bin einigen Zeichen entkommen, die außerhalb des normalen Bereichs liegen, um das Kopieren und Einfügen des Programms zu vereinfachen. Ich bin mir jedoch ziemlich sicher, dass ich ein Programm schreiben kann, um die Escape-Codes durch die Zeichen selbst zu ersetzen, die mich retten ungefähr 30 Zeichen.
quelle
Python,
244238233232Dies verwendet einen meiner Lieblingstricks: die einspurige Codierung. Ich habe die Semaphorbits (sbits) beschriftet.
um die folgende Tabelle zu erhalten, welche sbits für welchen Buchstaben vorkommen:
Jeder Buchstabe kommt in der Tabelle genau zweimal vor, da der Signalgeber zwei Arme hat. Dann betrachte ich dies als eine Grafik auf den Buchstaben az, mit Kanten zwischen Buchstaben, die sbits teilen, wobei die Kanten entsprechend dem gemeinsam genutzten sbit beschriftet sind. Im Idealfall würde ich einen Hamilton-Pfad durch dieses Diagramm finden, sodass nachfolgende Kanten nicht dieselbe Beschriftung haben. Es gibt keine solchen Pfade. Sie werden also feststellen, dass die Variable
e
den Buchstabenb
zweimal enthält .Mit meinem Fast-Hamilton-Pfad
e
konstruiere ich ein Arrayd
von sbit-Labels, die beim Durchlaufen von verwendet werdene
. Um herauszufinden, wo sie ihre Arme hinlegen soll, muss der Signalgeber nur den gewünschten Buchstaben in der folgenden handlichen Tabelle findenwoher gehen ihre Arme in die Position direkt unter und unter und rechts vom Brief.
quelle
to_lower()
zulower()
. Außerdem gab es einen Fehler, als ich versuchte, eine nicht alphabetische Eingabe zu machen.Scala, 272 Zeichen
Ungolfed (gut, weniger Golf):
quelle
Ruby, 287 Zeichen
Die Eingabe muss über STDIN erfolgen.
quelle
Scala
494 ohne Zeilenumbrüche520 mit Zeilenumbrüchen:ungolfed:
Erläuterung:
Ich habe ein Uhrmuster beobachtet, aber nicht mit 12 Stunden, sondern mit 8. Und Startzeit ist 0, wobei 6 Uhr ist, und a, b, c sind die ersten Codes, mit der ersten (einen) Flagge im Süden.
Da Flag 1 und 2 nicht zu unterscheiden sind, können wir alle Kombinationen mit der niedrigeren Nummer für das erste Flag zuerst sortieren. Leider ist die Ordnung von Anfang an gestört, wenn j nicht i folgt, sondern k, l, m, und später wird es ein Chaos.
Deshalb ordne ich meine Schlüssel für das Mapping neu:
Wenn wir von jedem Zeichen 'a' subtrahieren, erhalten wir die Zahlen von (0 bis 7 + 6 + 5 + ... + 1). Wir können die Nummern eines Zeichenrasters abbilden
Ein Paar von zwei Zahlen kann zwei Flags zuordnen, wobei die erste Zahl der Index von 0 bis 6 für das erste Flag ist und das zweite Flag keine Zahl von 1 bis 7 für das zweite Flag ist, sondern für die Entfernung von der erste bis zur zweiten Flagge. (2,2) würde bedeuten, dass das erste Flag nach WEST und das zweite zwei Schritte im Uhrzeigersinn von dort nach NORTH ist.
quelle
object Main extends Application
Block zu wickeln , aber das scheint nicht genug zu sein.readLine
in der letzten Zeile ersetzen"readLine"
, sollte es funktionieren (der Code ist 2.8-kompatibel).Haskell
331357339 ZeichenGolf:
Ungolfed:
Bei der Codierung
[hour, minute]
haben Uhren 8 Stunden und 8 Minuten. Minuten bewegen sich schneller als Stunden. Wenn eine Uhr dort tickt, wo Stunde und Minute gleich sind, addieren Sie 1 zur Stunde und 2 zur Minute (siehe Beispiel für das zweite Häkchen oben). Nur so können sich die Stunden erhöhen. Die Stunden erhöhen sich NICHT, wenn die Minute eine beliebige Minute erreicht. Nur wenn Minuten Stunden entsprechen würden. Verwandelt im ungolfed Codeclock
Buchstaben in Uhren, die das Semaphor darstellen. Die meisten Uhren basieren auf dem Ticken der vorherigen Uhren. Der Rest ist fest codiert. Der Code enthält nichts wirklich mehr.quelle
Perl,
356, 275 ZeichenEine große Anzahl von Zeichen wurde gespeichert, indem 'if else' durch 'ersetzt wurde. :' Konstruktion.
quelle
<>
stattdessen verwenden$ARGV[0]
, können Sie Eingaben von stdin übernehmen undlc
alle Zeichen in Kleinbuchstaben konvertieren. Dies hat den zusätzlichen Vorteil, dass Sie 4 Zeichen sparen. Es behandelt auch keine Nicht-Alphabet-Zeichen, aber es ist wohlYou only need to deal with the alphabet (A-Z) and should ignore all other non-space characters
nicht ganz klar, was man damit machen soll ...PowerShell ,
198192191188 BytesProbieren Sie es online aus!
Die Ausgabe enthält eine leere Leerzeile.
Weniger Golf:
quelle
Holzkohle , 70 Bytes
Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Erläuterung:
Teilen Sie die Eingabe in Kleinbuchstaben auf Leerzeichen und durchlaufen Sie jedes Wort.
Schleife über jedes Zeichen.
Teilen Sie die komprimierte Zeichenfolge
fjmrwyz gnsvxz abcdefg ahiklmn bhopqrs ciotuy djkptv elquwx
auf Leerzeichen und durchlaufen Sie jede Buchstabengruppe.Wenn die Gruppe den aktuellen Buchstaben enthält, ziehen Sie eine Linie in die aktuelle Richtung.
45 ° im Uhrzeigersinn drehen.
Geben Sie die Mitte aus
o
und gehen Sie zur Position des nächsten Buchstabens.Gehen Sie zum Anfang des nächsten Wortes.
quelle