Pyth , 106 bayt
DhNR.n.e+]++.[\.sllN::.Bk\0\.\1\-\ b*]*\ +2sllNt/16lNNjmj*3\ d.t[h"ET"h"IANM"h"SURWDKGO"h"HVF L PJBXCYZQ
Çevrimiçi test edin!
açıklama
Birkaç kelimeyle, burada yaptığım şey tablo sütununu sütun olarak oluşturmak ve sonra tabloyu yazdırmadan önce çevirmektir. Biz ikili dizeleri (replace gibi bir sütunda, harfler için mors kodları temsil edilebilir olduğunu fark .
tarafından 0
ve -
tarafından1
) ne zaman sütununda son harfi endeksine sıfırdan sayma.
Algoritma, aşağıdaki örnek bir çalışmayı verdiğim bir işleve dayanır (ikinci sütun için):
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!
Kod açıklaması
Kodu ikiye böldüm. İlk bölüm yukarıda açıklanan işlev, ikinci bölüm işlevi nasıl kullandığımdır:
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) : Mors tablosunda, ilk sütunda, her satırdan sonra bir harf ("E" ve "T") içeren yedi satır vardır. İkinci sütunda, üç satırdır. Sonra bir (üçüncü sütun), sonra sıfır (son sütun). Yani 16 / n - 1
burada n
(sütunun harf sayısı olan N
kod yukarıda). Satırdaki kod ne
(1) :
*]*\ +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 [" ", " ", ...])
Tamam, şimdi h
temelde bir karakter dizisinden bir tablonun sütununu üreten hoş bir fonksiyonumuz var. Hadi kullanalım (aşağıdaki koddaki iki boşluğa dikkat edin):
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
Kod hala kısaltılabilir; belki daha sonra tekrar gelirim.