DhNR.n.e+]++.[\.sllN::.Bk\0\.\1\-\ b*]*\ +2sllNt/16lNNjmj*3\ d.t[h"ET"h"IANM"h"SURWDKGO"h"HVF L PJBXCYZQ
Kiểm tra nó trực tuyến!
Giải trình
Trong một vài từ, những gì tôi làm ở đây là tạo cột bảng theo cột và sau đó hoán chuyển bảng trước khi in. Chúng tôi nhận thấy rằng trong một cột, mã morse cho các chữ cái có thể được biểu diễn dưới dạng chuỗi nhị phân (thay thế .
bởi 0
và -
bởi 1
) khi đếm từ 0 đến chỉ mục của chữ cái cuối cùng trong cột.
Thuật toán dựa trên một hàm mà tôi đưa ra một ví dụ chạy bên dưới (cho cột thứ hai):
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!
Giải thích mã
Tôi cắt mã làm hai. Phần đầu tiên là chức năng được mô tả ở trên, phần thứ hai là cách tôi sử dụng chức năng:
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) : Trong bảng morse, trong cột đầu tiên, có bảy dòng sau mỗi dòng chứa một chữ cái ("E" và "T"). Trong cột thứ hai, nó là ba dòng. Sau đó, một (cột thứ ba), sau đó bằng không (cột cuối cùng). Đó là 16 / n - 1
nơi n
có số lượng chữ cái trong cột (nằm N
trong đoạn mã trên). Đó là những gì mã ở dòng
(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 [" ", " ", ...])
Được rồi, bây giờ chúng ta có một hàm hữu ích tuyệt vời h
, về cơ bản tạo ra một cột của bảng trong một chuỗi các ký tự. Hãy sử dụng nó (lưu ý hai dấu cách trong mã bên dưới):
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
Mã vẫn có thể được rút ngắn; có lẽ tôi sẽ quay lại sau.