Pyth , 106 Bytes
DhNR.n.e+]++.[\.sllN::.Bk\0\.\1\-\ b*]*\ +2sllNt/16lNNjmj*3\ d.t[h"ET"h"IANM"h"SURWDKGO"h"HVF L PJBXCYZQ
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 ( .
durch 0
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):
1. Takes "IANM" as input
2. Generates the binary representations of zero up to len("IANM"): ["0", "1", "10", "11"]
3. Replace with dots and hyphens: [".", "-", "-.", "--"]
4. Pad with dots up to floor(log2(len("IANM"))): ["..", ".-", "-.", "--"]
5. Add the corresponding letters: [".. I", ".- A", "-. N", "-- M"]
6. After each element, insert a list of 16 / len("IANM") - 1 (= 3) strings containing only spaces of length floor(log2(len("IANM"))) + 2 (= 4):
[".. I", [" ", " ", " "], ".- A", [" ", " ", " "], "-. N", [" ", " ", " "], "-- M", [" ", " ", " "]]
7. Flatten that list:
[".. I", " ", " ", " ", ".- A", " ", " ", " ", "-. N", " ", " ", " ", "-- M", " ", " ", " "]
8. That's it, we have our second column!
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:
DhNR.n.e+]++.[\.sllN::.Bk\0\.\1\-\ b*]*\ +2sllNt/16lNN
DhNR # Define a function h taking N returning the rest of the code. N will be a string
.e N # For each character b in N, let k be its index
.Bk # Convert k to binary
: \0\. # Replace zeros with dots (0 -> .)
: \1\- # Replace ones with hyphens (1 -> -)
.[\.sllN # Pad to the left with dots up to floor(log2(len(N))) which is the num of bits required to represent len(N) in binary
++ \ b # Append a space and b
] # Make a list containing only this string. At this point we have something like [". E"] or [".. I"] or ...
+ *]*\ +2sllNt/16lN # (1) Append as many strings of spaces as there are newlines separating each element vertically in the table
.n # At this point the for each is ended. Flatten the resulting list and return it
(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
wo n
die Anzahl der Buchstaben in der Spalte (die N
in dem obigen Code). So sieht der Code in Zeile
(1) aus :
*]*\ +2sllNt/16lN
sllN # Computes the num of bits required to represent len(N) in binary
+2 # To that, add two. We now have the length of a element of the current column
*\ # Make a string of spaces of that length (note the trailing space)
t/16lN # Computes 16 / len(N) - 1
*] # Make a list of that length with the string of spaces (something like [" ", " ", ...])
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):
jmj*3\ d.t[h"ET"h"IANM"h"SURWDKGO"h"HVF L PJBXCYZQ
h"ET" # Generate the first column
h"IANM" # Generate the second column
h"SURWDKGO" # Generate the third column
h"HVF L PJBXCYZQ # Generate the last column (note the two trailing spaces)
[ # Make a list out of those columns
.t # Transpose, because we can print line by line, but not column by column
mj*3\ d # For each line, join the elements in that line on " " (that is, concatenate the elements of the lines but insert " " between each one)
j # Join all lines on newline
Der Code kann noch gekürzt werden; Vielleicht komme ich später darauf zurück.