Herausforderung:
Schreiben Sie ein Programm, das die folgende Ausgabe erzeugt:
. E .. I ... S .... H
...- V
..- U ..-. F
..--
.- A .-. R .-.. L
.-.-
.-- W .--. P
.--- J
- T -. N -.. D -... B
-..- X
-.- K -.-. C
-.-- Y
-- M --. G --.. Z
--.- Q
--- O ---.
----
Dies ist eine formatierte Tabelle mit den Morsecodes der Buchstaben von A bis Z. Jede Spalte ist durch drei Leerzeichen getrennt.
Es fehlen vier Slots, die von internationalen Zeichensätzen verwendet werden. Ihr Programm muss dort ein Leerzeichen schreiben.
Die Ausgabe darf nur aus ASCII-Leerzeichen, Punkten, Bindestrichen, Großbuchstaben und Zeilenumbrüchen (entweder LF oder CRLF) bestehen.
Ihr Programm akzeptiert keine Eingaben.
Das Folgende ist ein Beispiel-Python-Programm, das die gewünschte Ausgabe erzeugt:
b = "."
out = []
last = 0
ch = "EISHVUF ARL WPJTNDBXKCYMGZQO "
cx = 0
while b:
if last >= len(b):
print(" ".join(out))
out = [" ", " ", " ", " "][0:len(b) - 1]
out.append(b + " " + ch[cx])
cx += 1
last = len(b)
if len(b) < 4:
b += "."
elif b[-1] == ".":
b = b[0:-1] + "-"
else:
i = len(b) - 1
while b[i] == "-":
i -= 1
if i < 0:
break
if i < 0:
break
b = b[0:i] + "-"
print(" ".join(out))
Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
code-golf
ascii-art
kolmogorov-complexity
morse
Locoluis
quelle
quelle
Antworten:
Jelly , 85 Bytes
Ein volles Programm zum Ausdrucken des Spickzettel.
Probieren Sie es online!
Wie?
Hinweis: Ich denke, es gibt eine Möglichkeit, dies zu reduzieren, indem man eine Liste erstellt, die das Rasteratom korrekt formatiert
G
, aber ich kann nicht genau herausfinden, wie.quelle
Python 3.6,
201197193187 BytesVerwendet etwas Formatierung, Auspacken und A000918- Magie.
quelle
f'{i//k:0{j}b}'.replace(*'0.').replace(*'1-')
ist die gleiche Länge wie''.join('.-'[int(x)]for x in f'{i//k:0{j}b}')
Netzhaut , 125 Bytes
Probieren Sie es online! Sollte 121 Bytes sein, aber ich war zu faul, um mit dem Leerzeichen am Anfang und Ende umzugehen. Erläuterung:
Die Buchstaben , dessen Code beginnt mit
.
und-
jeweils vorgespannt sind. (Es ist theoretisch möglich, das vorab zu laden.-
, spart aber auf diese Weise Bytes.)_
S werden anstelle von Leerzeichen verwendet, da sie als Buchstaben betrachtet werden, was die Zuordnung im Folgenden erleichtert.Hier teilen wir jede Zeile in fünf Teile:
.
)-
)Die Teile werden dann in zwei Linien wieder zusammengesetzt:
.
Suffix, die erste Hälfte der verbleibenden Buchstaben-
Suffix, die zweite Hälfte der verbleibenden BuchstabenDie neuen Zeilen haben dasselbe Format wie die vorhandene Zeile, nur mit einem zusätzlichen Morse-Präfix und der Hälfte der Buchstaben, die noch verarbeitet werden müssen. Dies wird dann wiederholt, bis jede Zeile nur noch einen Buchstaben enthält.
Die
_
s werden dann wieder in Leerzeichen umgewandelt.quelle
JavaScript (ES6),
154147145 Bytequelle
PHP, 208 Bytes
Probieren Sie es online!
PHP, 229 Bytes
Probieren Sie es online!
quelle
Perl 5,
158156 Bytesquelle
PHP,
184 183181 BytesLaufen Sie mit
-nr
oder versuchen Sie es online .Nervenzusammenbruch
-7 Bytes mit führenden Leerzeichen : Ersetzen Sie
ltrim("$r\n")
mit"$r\n"
und28
mit31
.171 (= -10) Bytes mit nachgestellten Leerzeichen :
Aufschlüsselung versuchen Sie es online
quelle
for(;$y<16;$y++,print str_pad(ltrim("$r\n"),28," ",0))for($r="",$c="03231323"[$y&7];$c++<4;)$r.=strtr(sprintf(" %0${c}b ",$y>>4-$c),10,"-.")."EISHVUF ARL WPJTNDBXKCYMGZQO "[$i++];
sollte 2 Bytes sparen.----
stimmt das nicht mit dem Rest überein."EISHVUF ARL WPJTNDBXKCYMGZQO "
sollte am Ende 2 Leerzeichen haben.APL (Dyalog) , 92 Bytes
Bedürfnisse,
⎕IO←0
die auf vielen Systemen Standard sind.Probieren Sie es online!
{
...}¨'
...'
wenden Sie die folgende anonyme Funktion an jeden des Strings:⍪⍵
Machen Sie das Argument in eine Spalte' ',
ein Leerzeichen voranstellen (in jeder Zeile)'.-'[
…],
Die Zeichenkette voranstellen, nachdem sie indiziert wurde mit:≢⍵
die Länge des Arguments⍳
die Indizes dieser (0, 1, 2,…, Länge -1)2⊥⍣¯1
Anti-Base-2 (verwendet so viele Bits wie nötig)⍉
transponieren (von einer Darstellung in jeder Spalte zu einer in jeder Zeile)(
…)⍀
Erweitern um (Leerzeilen wie durch Nullen in angegeben einfügen):≢⍵
die Länge des Arguments16÷
Teilen Sie sechzehn durch das1↑⍨
(over) take from one (erstellt eine Liste mit einer Eins, gefolgt von 1 bis n) Nullen)16⍴
recyceln Sie das Muster, bis es sechzehn Elemente enthält' ',
ein Leerzeichen voranstellen⍕
Format (die Liste der Tabellen in einer einzigen Tabelle, wobei jede Tabelle mit einem Leerzeichen auf jeder Seite aufgefüllt wird)¯1⌽
um einen schritt nach rechts drehen (dadurch den abschließenden raum nach vorne verschieben)0 3↓
lösche null Zeilen und drei Spalten (entferne so die drei führenden Leerzeichen)quelle
16÷⍨
erscheint in deinem Code?SOGL ,
106105102 BytesWenn vorangestellte Leerzeichen zulässig sind,
102 bis99 Byte141 Bytes, Komprimierung
wollte nur sehen, wie gut SOGL mit nur Komprimierung umgehen kann (nun, es ist mehr als nur Komprimierung, aber es sind 97% komprimierte Zeichenfolgen)
quelle
JavaScript (205 Byte)
quelle
Ruby,
144 143141 BytesUngolfed
quelle
Pyth , 106 Bytes
Testen Sie es online!
Erläuterung
Mit ein paar Worten, was ich hier mache, ist, die Tabelle spaltenweise zu generieren und sie dann vor dem Drucken zu transponieren. Wir stellen fest, dass in einer Spalte die Morsecodes für die Buchstaben als binäre Zeichenfolgen dargestellt werden können (
.
durch0
und-
durch ersetzen)1
), wenn von Null bis zum Index des letzten Buchstabens in der Spalte gezählt wird.Der Algorithmus basiert auf einer Funktion, von der ich im Folgenden ein Beispiel gebe (für die zweite Spalte):
Code Erklärung
Ich habe den Code in zwei Teile geteilt. Der erste Teil ist die oben beschriebene Funktion, der zweite Teil ist, wie ich die Funktion benutze:
(1) : In der Morse-Tabelle stehen in der ersten Spalte nach jeder Zeile sieben Zeilen mit einem Buchstaben ("E" und "T"). In der zweiten Spalte sind es drei Zeilen. Dann eins (dritte Spalte), dann null (letzte Spalte). Das heißt ,
16 / n - 1
won
die Anzahl der Buchstaben in der Spalte (dieN
in dem obigen Code). So sieht der Code in Zeile (1) aus :Okay, jetzt haben wir eine nette hilfreiche Funktion,
h
die im Grunde eine Tabellenspalte aus einer Folge von Zeichen generiert. Lass es uns benutzen (beachte die beiden nachgestellten Leerzeichen im Code unten):Der Code kann noch gekürzt werden; Vielleicht komme ich später darauf zurück.
quelle
C
199195 BytesLive on coliru (mit #include, um die Warnmeldung zu vermeiden.)
UPDATE : Durch Verschieben der "Deklaration" von wurden vier Zeichen gespeichert
m
außerhalb der Funktion wurden gespeichert, wie von @zacharyT vorgeschlagenVerwendet , was eine Standard - Strategie zu sein scheint: halten Sie die Buchstaben in einem Array-codierten binären Baum, so dass die Kinder des Elements
i
sind2*i
und2*i+1
. Dieser Baum wurzelt eher bei 2 als bei 1, weil die Arithmetik meiner Meinung nach etwas kürzer war. Der Rest ist Golfen.Ungolfed:
quelle
int m
, umm;
außerhalb der Funktion zu sein?Bubblegum , 133 Bytes
Komprimiert als LZMA-Stream.
quelle
C 291 Bytes
Versuchen Sie es online
Wie es funktioniert
Zuerst habe ich die Zeichenfolge in C analysiert und dabei Leerzeichen gezählt, die kleiner als 26 sind. Deshalb habe ich sie
a, b, .. z
mit diesem kleinen Programm in Kleinbuchstaben codiertDann habe ich einen Parser für diese Kodierung geschrieben, wobei
/
eine neue Zeile und ein Kleinbuchstabet[i] - 'a'
Leerzeichen darstellenquelle
Bash (mit Dienstprogrammen), 254 Bytes
quelle
Dyalog APL, 159 Bytes (nicht konkurrierend)
quelle
⎕IO←0
(Standardeinstellung auf vielen Systemen) und verwenden⍨
(pendeln) .JavaScript (ES7),
242240238 ByteProbieren Sie es online!
–2 Bytes dank Zachary .
quelle
a!='0'
zua!=0
.join('')
mit.join<insert backtick here><insert backtick here>
? (<insert backtick here>
wird durch aktuelle Backticks ersetzt)a!='0'
zua!=0
, dass funktionieren sollte.''
Fall vergessen .