Pyth , 106 바이트
DhNR.n.e+]++.[\.sllN::.Bk\0\.\1\-\ b*]*\ +2sllNt/16lNNjmj*3\ d.t[h"ET"h"IANM"h"SURWDKGO"h"HVF L PJBXCYZQ
온라인으로 테스트하십시오!
설명
한마디로, 여기서 내가하는 일은 테이블을 열별로 생성 한 다음 인쇄하기 전에 테이블을 바꾸는 것입니다. 우리는 바이너리 문자열 (교체 같은 열에서 문자의 모스 코드는 표현 될 수 있다는 것을주의 .
에 의해 0
및 -
에 의해 1
) 때 열에서 마지막 문자의 인덱스 0에서 계산.
알고리즘은 아래에서 두 번째 열에 대해 예제 실행을 제공하는 함수에 의존합니다.
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!
코드 설명
코드를 2 개로 자릅니다. 첫 번째 부분은 위에서 설명한 기능이고 두 번째 부분은 내가 기능을 사용하는 방법입니다.
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) : 모스 테이블의 첫 번째 열에는 각 줄 뒤에 문자 ( "E"및 "T")가 포함 된 7 개의 줄이 있습니다. 두 번째 열에서는 세 줄입니다. 그런 다음 1 (세 번째 열), 0 (마지막 열)입니다. 즉 16 / n - 1
여기서 n
(인 열에서 문자의 개수를 N
코드는 상기에서). 그 줄에서 코드 무엇
(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 [" ", " ", ...])
자, 이제 h
기본적으로 일련의 문자에서 테이블의 열을 생성하는 유용한 함수 가 있습니다. 그것을 사용합시다 (아래 코드에서 두 개의 후행 공백에 유의하십시오).
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
코드는 여전히 단축 될 수 있습니다. 나중에 다시 올게요