Viết chương trình ngắn nhất để chuyển đổi đầu vào tiêu chuẩn thành mã Morse . Các ký tự không có trong bảng nên được in như chúng là.
Viết chương trình ngắn nhất để chuyển đổi đầu vào tiêu chuẩn thành mã Morse . Các ký tự không có trong bảng nên được in như chúng là.
Câu trả lời:
Câu trả lời này chỉ hỗ trợ chữ hoa và chữ số. Các chữ cái được phân tách bằng dòng mới và các từ được phân tách bằng 2 dòng mới
{." ETIANMSURWDKGOHVF L PJBXCYZQ"?)"?/'#! 08<>"@))10%=or 2base(;{!45+}%n}%
Phân tích
{}% như thường lệ hoạt động như một bản đồ trên mảng . đẩy một bản sao của char lên ngăn xếp "ETIAN ..." đây là bảng tra cứu các ký tự viết hoa ? like a string.find trả về chỉ mục của char trong chuỗi hoặc -1 nếu không tìm thấy (nghĩa là chữ số) ) tăng chỉ số đó để E => 2 T => 3 I => 4, v.v. lưu ý rằng nếu char không phải là chữ cái viết hoa hoặc dấu cách, bây giờ là 0 (Sai) "? / '#! ..." đây là bảng tra cứu các chữ số. nó sẽ được sử dụng trong đảo ngược để bảng tra cứu khác. @ kéo bản sao đó, chúng tôi đã tạo ra char vào đầu ngăn xếp ))% 10 chuyển đổi chữ số ascii thành một số bằng cách thêm 2 và lấy mod 10. Điều quan trọng là làm theo cách này vì tất cả chữ hoa các chữ cái cũng nhấn mã này và chúng tôi cần đảm bảo rằng chúng rơi trong phạm vi 0..9 hoặc bước tiếp theo sẽ thất bại. = kéo char thứ n từ chuỗi, ví dụ "Hello" 1 = cho "e" hoặc nhớ nếu tra cứu chữ hoa không thành công, chúng tôi có kết quả 0, vì vậy tra cứu chữ số sẽ được sử dụng 2base chuyển đổi sang cơ sở 2 nên E => [1 0], T => [1 1], I => [1 0 0], v.v. (; bật phía trước của danh sách và ném nó đi để E => [0], T => [1] {! 45 +}% phủ định mỗi bit và thêm 45, điều này mang lại giá trị ascii của. và - n dòng mới tách từng từ. đây có thể là 32 nếu bạn muốn phân tách các từ với khoảng trắng với chi phí 1 nét
Golfscript - 85 ký tự
Câu này ngắn hơn câu trả lời SO của tôi do các yêu cầu thoải mái ở đây Đầu vào phải là chữ hoa / chữ số và các ký tự dấu chấm câu ".,?"
{." ETIANMSURWDKGOHVF!L!PJBXCYZQ"?)"UsL?/'#! 08<>"@".,?"58,48>+?=or
2base(;{!45+}%n}%
Vì dấu câu thậm chí không được yêu cầu ở đây, tôi có thể rút ngắn câu trả lời hơn nữa
Câu trả lời của tôi từ SO
Golfscript - 107 ký tự
dòng mới ở cuối đầu vào không được hỗ trợ, vì vậy hãy sử dụng cái gì đó như thế này
echo -n Hello, Codegolfers| ../golfscript.rb morse.gs
Chữ cái là một trường hợp đặc biệt và được chuyển đổi thành chữ thường và được đặt ở vị trí nhị phân của chúng. Mọi thứ khác được thực hiện bởi một bảng dịch
' '/{{.32|"!etianmsurwdkgohvf!l!pjbxcyzq"?)"UsL?/'#! 08<>"@".,?0123456789"?=or
2base(;>{'.-'\=}%' '}%}%'/'*
C # (213 ký tự)
Tôi chắc chắn điều này sẽ không tồn tại lâu, nhưng ít nhất tôi đã có kỹ thuật ở đây đầu tiên!
class P{static void Main(string[] a){foreach(var t in a[0]){var c="";for(int i=" ETIANMSURWDKGOHVF L PJBXCYZQ 54 3 2 16 7 8 90".IndexOf(t);i>0;i/=2)c="-."[i--%2]+c;System.Console.Write(c+" ");}}}
Và ở định dạng có thể đọc được:
class P
{
static void Main(string[] a)
{
foreach(var t in a[0])
{
var c="";
for(int i=" ETIANMSURWDKGOHVF L PJBXCYZQ 54 3 2 16 7 8 90".IndexOf(t);i>0;i/=2)c="-."[i--%2]+c;
System.Console.Write(c+" ");
}
}
}
Để giải thích ngắn gọn, chuỗi ký tự là một đống trong đó con trái là dấu chấm và con phải là dấu gạch ngang. Để xây dựng bức thư, bạn duyệt ngược lại và đảo ngược thứ tự.
ETIAN...
ở đó, tôi cho rằng nó hoạt động giống như bản golf, nhưng bạn có một cách khác để diễn giải chuỗi. Tôi nghĩ rằng đó là tương đương nhưng tôi thêm 1 chỉ số và sử dụng biểu diễn nhị phân để có được các dấu chấm và dấu gạch ngang cho tất cả các chữ số sau hàng đầu 1" ví dụF=>18=>0b10010=>..-.
String[] a
tr a-z A-Z | sed 's/0/--O/g;s/1/.-O/g;s/2/.J/g;s/3/..W/g;s/4/.V/g;s/5/.H/g;
s/6/-.H/g;s/7/-B/g;s/8/-Z/g;s/9/--G/g;s/X/-U/g;s/V/.U/g;s/U/.A/g;
s/Q/-K/g;s/K/-A/g;s/A/.T/g;s/J/.O/g;s/O/-M/g;s/Y/-W/g;s/W/.M/g;
s/M/-T/g;s/T/- /g;s/H/.S/g;s/B/-S/g;s/S/.I/g;s/L/.D/g;s/Z/-D/g;
s/D/-I/g;s/I/.E/g;s/C/-R/g;s/F/.R/g;s/R/.N/g;s/P/.G/g;s/G/-N/g;
s/N/-E/g;s/E/. /g'
/g;s/
trở thành ,
- cộng với một chút chi phí).
y
Thay vào đó, bạn có thể thả tr, sử dụng lệnh của sed
import Data.List
i=intercalate
m=i" ".map(i" ".map(\c->words".- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.. ----- .---- ..--- ...-- ....- ..... -.... --... ---.. ----."!!(head.findIndices(==c)$['a'..'z']++['0'..'9']))).words
Một dạng người dùng dễ đọc hơn:
tbl :: [String]
tbl = words ".- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.. ----- .---- ..--- ...-- ....- ..... -.... --... ---.. ----."
lookupChar :: Char -> String
lookupChar c = tbl !! (fromJust . elemIndex c $ ['a'..'z'] ++ ['0'..'9'])
encWord :: String -> String
encWord = intercalate " " . map lookupChar
encSent :: String -> String
encSent = intercalate " " . map encWord . words
Chạy mẫu:
*Main> m "welcome humans"
".-- . .-.. -.-. --- -- . .... ..- -- .- -. ..."
Có một khoảng trắng giữa hai chữ cái và bảy khoảng trắng giữa hai từ.
fromJust.elemIndex c
có thể được viết là head.findIndices(==c)
. Đó là một ký tự nữa, nhưng sau đó bạn có thể thoát khỏi import Data.Maybe
, vì vậy bạn sẽ lưu tổng cộng 17 ký tự. Bạn cũng có thể lưu hai ký tự bằng cách xóa khoảng trắng phía trước chuỗi mỗi lần bạn gọi xen kẽ. Và một vài nhân vật khác bằng cách thực hiện i=intercalate
ở đầu và thay thế hai cuộc gọi đến intercalate
bằng i
.
intercalate
và đã lưu thêm 6 nhân vật! :-)
w=words
, điều này sẽ cứu một nhân vật nếu tôi không nhầm. Và thay vì l c=...
và map l
, bạn nên làm map\c->...
(thậm chí bạn không cần parens quanh lambda vì dù sao cũng đã có một paren kết thúc rồi).
l c=...
đã giúp tôi tiết kiệm được 1 ký tự, nhưng tôi không thể đặt nó mà không có parens, chỉ như map(\c->...)
. Phiên bản GHC 6.12.3.
Bản thảo (310) (462) (414)(319) bao gồm (46) cho bảng.
Kết hợp số và chữ với một mã hóa ternary. 5 chữ số ternary vừa vặn trong một byte! Điều này giúp loại bỏ những vòng lặp khác biệt ngớ ngẩn và những con số đặc biệt hoàn toàn.
ASCII85 cắt giảm 1/3 mỗi bảng. Và đơn giản hóa mã (cuối cùng!) Trở lại dưới 400!
errordict/undefined{pop( )dup 0 4 3 roll put print{}}put<</*{{[exch/@ cvx]cvx 1
index 1 add}forall pop}def/C{<~#:VD<!AP07"A]ga#R),'7h?+2(./s-9e6~>*}def/#{load
exec}/P{print}0{}1{(.)P}2{(---)P}/S{( )P}48<~o'u/0b'A;]L7n~>* 65 C 97 C/@{5{dup
3 mod # S 3 idiv}repeat # S S S}>>begin{(%stdin)(r)file read not{exit}if #}loop
Sản lượng mẫu
Luser Dr00g! . ---. . . . ---. . . . . ---. ---. . . ---. --- --- --- --- --- --- --- --- --- --- --- --- ---. !
Ungolfed và bình luận. Tôi rất tự hào về điều này. Tôi cảm thấy nó thanh lịch, làm cho các con số làm việc. :)
%!
%Morse Code Translator (Simplified)
%if `load` signals /undefined in /#{load exec},
% pop --load--,
% print the char,
% leave dummy object for `exec` to find
errordict/undefined{pop( )dup 0 4 3 roll put print{}}put
<<
%create int->proc pairs
%from initial int and string values
/*{{[exch/@ cvx]cvx 1 index 1 add}forall pop}def
%the alpha map is applied to Upper and Lower case
/C{<~#:VD<!AP07"A]ga#R),'7h?+2(./s-9e6~>*}def
65 C 97 C
%the number map
48<~o'u/0b'A;]L7n~>*
/#{load exec} %execute a number
/P{print}
0{} % 0: nop
1{(.)P} % 1: '.' dit
2{(---)P} % 2: '---' dah
/S{( )P} % S: space
%execute a morse sequence, from the table
/@{5{dup 3 mod # S 3 idiv}repeat # S S S}
>>begin
%read and execute each char from stdin
{(%stdin)(r)file read not{exit}if #}loop
Các bảng (33) + (13) = (46)
Đây là cách các chuỗi mã hóa bảng. Mỗi byte đại diện cho một số ternary 5 chữ số. Và các byte được mã hóa thêm trong ASCII85 (mà phần mô tả có thể tự động giải mã).
%The Morse Table in Ternary Encoding
% 3 ^4 ^3 ^2 ^1 ^0
% 81 27 9 3 1 Dec Hex dc ->ASCII85
% --------------- --- --- ---
% A 2 1 6+1 7 7 7 256*41+256*50+256*14+
% B 1 1 1 2 27+ 9+3+2 41 29 d85%n85/d85%n85/d85%n85/d85%n85/n
% C 1 2 1 2 27+18+3+2 50 32 2 25 53 35 27 chr(x+33)
% D 1 1 2 9+3+2 14 E # : V D <
% E 1 1 1 1
% F 1 2 1 1 27+18+3+1 49 31
% G 1 2 2 9+6+2 17 11 0 32 47 15 22
% H 1 1 1 1 27+ 9+3+1 40 28 ! A P 0 7
% I 1 1 3+1 4 4
% J 2 2 2 1 54+18+6+1 79 4F
% K 2 1 2 18+3+2 23 17 1 32 60 70 64
% L 1 1 2 1 27+ 9+6+1 43 2B " A ] g a
% M 2 2 6+2 8 8
% N 1 2 3+2 5 5
% O 2 2 2 18+6+2 26 1A 2 49 8 11 6
% P 1 2 2 1 27+18+6+1 52 34 # R ) , '
% Q 2 1 2 2 54+ 9+6+2 71 47
% R 1 2 1 9+6+1 16 10
% S 1 1 1 9+3+1 13 D 22 71 30 10 17
% T 2 2 2 2 7 h ? + 2
% U 2 1 1 18+3+1 22 16
% V 2 1 1 1 54+ 9+3+1 67 43
% W 2 2 1 18+6+1 25 19 7 13 14 82 12
% X 2 1 1 2 54+ 9+3+2 68 44 ( . / s -
% Y 2 2 1 2 54+18+3+2 77 4D 77 256*44+256*256*
% Z 1 1 2 2 27+ 9+6+2 44 2C 24 68 21 [23 36]
% 9 e 6 [ 8 E] (omit final 2)
% 0 2 2 2 2 2 162+54+18+6+2 242 F2
% 1 2 2 2 2 1 162+54+18+6+1 241 F1
% 2 2 2 2 1 1 162+54+18+3+1 238 EE 78 6 84 14 15
% 3 2 2 1 1 1 162+54+ 9+3+1 229 E5 o ' u / 0
% 4 2 1 1 1 1 162+27+ 9+3+1 202 CA
% 5 1 1 1 1 1 81+27+ 9+3+1 121 79
% 6 1 1 1 1 2 81+27+ 9+3+2 122 7A 65 6 32 26 60
% 7 1 1 1 2 2 81+27+ 9+6+2 125 7D b ' A ; ]
% 8 1 1 2 2 2 81+27+18+6+2 134 86 134 256*161+256*256*
% 9 1 2 2 2 2 81+54+18+6+2 161 A1 43 22 77 [50 40]
% L 7 n [ S I] (omit final 2)
d=proc{|x|x>1?d[x/2]+".-"[x&1]:' '}
$><<$<.gets.bytes.map{|i|
e=i>64?"-@B4*:68,?5</.7>E20+193ACD"[(i&95)-65]:i>47?"gWOKIHX`df"[i-48]:nil
e ?d[e.ord-40]:i.chr}*''
Mã hóa mỗi chữ số thành một ký tự đơn, trong đó 1 là dấu gạch ngang, 0 là dấu chấm, với số 1 là bit đánh dấu (cộng với phần bù để giữ cho nó có thể in được. Sử dụng toán học ASCII để sử dụng ký tự đầu vào làm chỉ số tra cứu.
Module Module1
Sub Main(a$())
For Each c In a(0)
Dim i = "ETIANMSURWDKGOHVF L PJBXCYZQ 54 3 2 16 7 8 90".IndexOf(c)
If c <> " " And i >= 0 Then
Console.Write("{0} ", Morse(i))
Else
Console.Write(c)
End If
Next
End Sub
Function Morse(i) As String
Dim b = Math.Log(i) / Math.Log(2)
Return (From m In MorseSeq(If(Double.IsInfinity(b), 0, b)) Order By m.Length)(i)
End Function
Function MorseSeq(i) As IEnumerable(Of String)
Return If(i < 0, {}, From n In ".-" From m In MorseSeq(i - 1).DefaultIfEmpty
Select n & m)
End Function
End Module
Chức năng cuối cùng đó là xấu xa.
chỉnh sửa Một vài cải tiến.
Function Morse(i) As String
Return (From m In MorseSeq(i) Order By m.Length)(i)
End Function
Function MorseSeq(i) As IEnumerable(Of String)
Return If(i=0,{".","-"},From n In".-"From m In MorseSeq(i>>1) Select n & m)
End Function
Lisp ( 535 466 ký tự)
(loop(princ(let((c(read-char)))(case c(#\a".- ")(#\b"-... ")(#\c"-.-. ")(#\d"-.. ")(#\e". ")(#\f"..-. ")(#\g"--. ")(#\h".... ")(#\i".. ")(#\j".--- ")(#\k"-.- ")(#\l".-.. ")(#\m"-- ")(#\n"-. ")(#\o"--- ")(#\p".--. ")(#\q"--.- ")(#\r".-. ")(#\s"... ")(#\t"- ")(#\u"..- ")(#\v"...- ")(#\w".-- ")(#\x"-..- ")(#\y"-.-- ")(#\z"--.. ")(#\1".---- ")(#\2"..--- ")(#\3"...-- ")(#\4"....- ")(#\5"..... ")(#\6"-.... ")(#\7"--... ")(#\8"---.. ")(#\9"----. ")(#\0"----- ")(t c)))))
Điều này mã hóa các chữ cái viết thường và các chuỗi mã morse được in bằng một dấu cách
Trong Java, có 475 ký tự.
import java.io.*;class M{public static void main(String[]b){String s,t="-",m=t+t,o=m+t,z="",e=".",i=e+e,p=t+e,a=e+t,n=i+e,c[]={o+m,a+o,i+o,n+m,n+a,n+i,p+n,m+n,o+i,o+p,z,z,z,z,z,z,z,a,t+n,p+p,t+i,e,i+p,m+e,n+e,i,e+o,p+t,a+i,m,p,o,a+p,m+a,e+p,n,t,i+t,n+t,e+m,p+a,p+m,m+i};BufferedReader r=new BufferedReader(new InputStreamReader(System.in));try{s=r.readLine().toUpperCase();for(int j=48;j<91;j++)s=s.replace(z+(char)j,c[j-48]+" ");System.out.println(s);}catch(Exception x){}}}
Dịch az, AZ và 0-9.
Chỉnh sửa:
Hoặc trong 447 ký tự, nếu bạn không phiền Java sẽ gặp lỗi sau khi dịch.
import java.io.*;class M{static{String s,t="-",m=t+t,o=m+t,z="",e=".",i=e+e,p=t+e,a=e+t,n=i+e,c[]={o+m,a+o,i+o,n+m,n+a,n+i,p+n,m+n,o+i,o+p,z,z,z,z,z,z,z,a,t+n,p+p,t+i,e,i+p,m+e,n+e,i,e+o,p+t,a+i,m,p,o,a+p,m+a,e+p,n,t,i+t,n+t,e+m,p+a,p+m,m+i};BufferedReader r=new BufferedReader(new InputStreamReader(System.in));try{s=r.readLine().toUpperCase();for(int j=48;j<91;j++)s=s.replace(z+(char)j,c[j-48]+" ");System.out.println(s);}catch(Exception x){}}}
Perl6 (238)
my%h="A.-B-...C-.-.D-..E.F..-.G--.H....I..J.---K-.-L.-..M--N-.O---P.--.Q--.-R.-.S...T-U..-V...-W.--X-..-Y-.--Z--..0-----1.----2..---3...--4....-5.....6-....7--...8---..9----.".split(/<wb>/)[1..72];while$*IN.getc ->$c{print %h{$c.uc}||$c}
Phiên bản dễ đọc
# Split string on word breaks to create a hash
# I get an extra token at the beginning and end for some reason
# [1..72] is a slice without the extra pieces
my %h = "A.-B-...C-.-.D-..E.F..-.G--.H....I..J.---K-.-L.-..M--N-.O---P.--.Q--.-R.-.S...T-U..-V...-W.--X-..-Y-.--Z--..0-----1.----2..---3...--4....-5.....6-....7--...8---..9----."
.split(/<wb>/)[1..72];
# For each character in STDIN, print either the looked up value, or itself
while $*IN.getc -> $c {
print %h{$c.uc} || $c;
}
s/.*/\L&/
s/[02]/&-/g
s/[89]/&./g
:
s/[b-ilnprsz5-9]/&./g
s/[ajkmoqt-y0-4]/&-/g
y/abcdefghijklmnopqrstuvwxyz0123456789/edri umsewnrttmwkai isadkgojuvhhbzoo/
t
Chúng tôi bắt đầu bằng cách thu hẹp toàn bộ dòng (vì y
không thể thực hiện chuyển đổi không phân biệt chữ hoa chữ thường); trừ 10 byte nếu chúng ta chỉ xử lý đầu vào chữ thường. Sau đó, chúng tôi preprocess các chữ số 0
, 2
, 8
và9
phát ra những biểu tượng cuối cùng của họ.
Vòng lặp tạo ký hiệu cuối cùng cho mỗi ký tự đầu vào, sau đó dịch từng ký tự cho lần lặp tiếp theo. Điều này tương đương với việc đi lên bảng tìm kiếm nhị phân được hiển thị trong bài viết Wikipedia; các chữ số cần được điều trị đặc biệt có thể được nhìn thấy có cha mẹ không có trong bảng chữ cái ASCII của chúng tôi.
Vòng lặp chấm dứt khi tất cả các ký tự đã đạt đến không gian kết thúc (sau 'e' hoặc 't').
Ví dụ, chữ cái k
được chuyển đổi trong ba lần:
k
=> k-
=>n-
n-
=> n.-
=>t.-
t.-
=> t-.-
=>-.-
char M[256] = "_^\\XP@ACGO &15)\"4+0$>-2'%/6;*(#,8.9=3", v;
main(c) {
for (;
c = getchar(), v = M[c + 208 & 255] - 32, ~c;
putchar(v-1? c : 32))
for (; v > 1; v /= 2) putchar(".-"[v & 1]);
}
(Với khoảng trắng không đáng kể bị tước, không có dòng mới nào)
char M[256]="_^\\XP@ACGO &15)\"4+0$>-2'%/6;*(#,8.9=3",v;main(c){for(;c=getchar(),v=M[c+208&255]-32,~c;putchar(v-1?c:32))for(;v>1;v/=2)putchar(".-"[v&1]);}
M
là một bảng tra cứu trong đó các bitpotype của các ký tự tương ứng với các dấu chấm và dấu gạch ngang trong mã morse. Các ký tự [0-9A-Z]
được giải mã thành morse bằng bảng này (với một khoảng trắng được nối sau mã morse), các ký tự khác chỉ đơn giản được chuyển qua không thay đổi.
Chạy mẫu:
HELLO WORLD
.... . .-.. .-.. --- .-- --- .-. .-.. -..
hello world
hello world
ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
.- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.. ----- .---- ..--- ...-- ....- ..... -.... --... ---.. ----.
%c=("A"=>".-","B"=>"-...","C"=>"-.-.","D"=>"-..","E"=>".","F"=>"..-.","G"=>"--.","H"=>"....","I"=>"..","J"=>".---","K"=>"-.-","L"=>".-..","M"=>"--","N"=>"-.","O"=>"---","P"=>".--.","Q"=>"--.-","R"=>".-.","S"=>"...","T"=>"-","U"=>"..-","V"=>"...-","W"=>".--","X"=>"-..-","Y"=>"-.--","Z"=>"--..",1=>".----",2=>"..---",3=>"...--",4=>"..---",5=>".....",6=>"-....",7=>"--...",8=>"---..",9=>"----.",0=>"-----");while(<>){foreach(split(//)){if(exists($c{$_})){printf"%s ",$c{$_}}else{print"$_"}}}
Có thể được thực hiện thông qua dòng lệnh như vậy.
$ perl -e '$CODE' < textfile
Chỉnh sửa: Cảm ơn @tobyodavies đã chỉ ra rằng giải pháp ban đầu của tôi có bản dịch ngược!
%c=qw(A .- B -... C -.-. D -.. E . F ..-. G --. H .... I .. J .--- K -.- L .-.. M -- N -. O --- P .--. Q --.- R .-. S ... T - U ..- V ...- W .-- X -..- Y -.-- Z --.. 1 .---- 2 ..--- 3 ...-- 4 ..--- 5 ..... 6 -.... 7 --... 8 ---.. 9 ----. 0 -----);while(<>){print($c{$_}||$_)for split//}
<?$a=strtoupper(fgets(STDIN));$m=array(65=>".-",66=>"-...",67=>"-.-.",68=>"-..",69=>".",70=>"..-.",71=>"--.",72=>"....",73=>"..",74=>".---",75=>"-.-",76=>".-..",77=>"--",78=>"-.",79=>"---",80=>".--.",81=>"--.-",82=>".-.",83=>"...",84=>"-",85=>"..-",86=>"...-",87=>".--",88=>"-..-",89=>"-.--",90=>"--..",49=>".----",50=>"..---",51=>"...--",52=>"..---",53=>".....",54=>"-....",55=>"--...",56=>"---..",57=>"----.",48=>"-----",32=>" ");while($i++<strlen($a))echo$m[ord($a[$i])];
462 ký tự của nó nếu tất cả đầu vào là chữ hoa:
<?$a=fgets(STDIN);$m=array(65=>".-",66=>"-...",67=>"-.-.",68=>"-..",69=>".",70=>"..-.",71=>"--.",72=>"....",73=>"..",74=>".---",75=>"-.-",76=>".-..",77=>"--",78=>"-.",79=>"---",80=>".--.",81=>"--.-",82=>".-.",83=>"...",84=>"-",85=>"..-",86=>"...-",87=>".--",88=>"-..-",89=>"-.--",90=>"--..",49=>".----",50=>"..---",51=>"...--",52=>"..---",53=>".....",54=>"-....",55=>"--...",56=>"---..",57=>"----.",48=>"-----",32=>" ");while($i++<strlen($a))echo$m[ord($a[$i])];
<?$a=strtoupper(fgets(STDIN));$m=array(65=>12,2111,2121,211,1,1121,221,1111,11,1222,212,1211,22,21,222,1221,2212,121,111,2,112,1112,122,2112,2122,2211)+array(48=>22222,12222,11222,11122,11222,11111,21111,22111,22211,22221)+array(32=>' ');while($a[$i++])echo strtr($m[ord($a[$i])],12,'.-');
Çvy©58‹i®58-•6V%·,Õo•2B5ôsè}®64›i®64-•4…·]ÑUZ“×\ó$9™¹“ÌLÈÎ%´•3B4ôsè}"012"".- "‡})
Chuyển đổi các mẫu chữ cái thành cơ sở 3, các mẫu số thành cơ sở 2, sử dụng chuyển ngữ ascii được lập chỉ mục bằng 0 để có dấu chấm và dấu gạch nối. Không hoạt động trên chữ thường.
-join($args|% t*y|%{if($_-match'\w'){for($d='ihfbZJKMQY+mazzy+0;?3,>5:.H7<1/9@E42-6B8CG='[$_-48]-42;$d-1){'.-'[$d%2]
$d=$d-shr1}' '}else{$_}})
Kịch bản kiểm tra ít chơi gôn hơn:
$f = {
-join(
$args|% toCharArray|%{
if($_-match'\w'){
for($d='ihfbZJKMQY+mazzy+0;?3,>5:.H7<1/9@E42-6B8CG='[$_-48]-42;$d-1){
'.-'[$d%2]
$d=$d-shr1
}
' '
}else{
$_
}
}
)
}
@(
,("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",".- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.. ----- .---- ..--- ...-- ....- ..... -.... --... ---.. ----. ")
,("HELLO WORLD", ".... . .-.. .-.. --- .-- --- .-. .-.. -.. ")
,("#$%^&","#$%^&")
) | % {
$s,$expected = $_
$result = &$f $s
"$($result-eq$expected): $result"
}
Đầu ra:
True: .- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.. ----- .---- ..--- ...-- ....- ..... -.... --... ---.. ----.
True: .... . .-.. .-.. --- .-- --- .-. .-.. -..
True: #$%^&
Lưu ý: Đầu ra chứa dấu cách.
+mazzy+
là một số đệm táo bạo
{36≥y←⍵⍳⍨⎕A,⎕D:'•-'[0∼⍨⌽(5⍴3)⊤y⊃∊(2⍴256)∘⊤¨⎕AV⍳'ܨ㈍İᄧюᜪࠄᨳ䜏ഁᙂ䴫쩸穼蚠']⋄⍵}
kiểm tra:
q←{36≥y←⍵⍳⍨⎕A,⎕D:'•-'[0∼⍨⌽(5⍴3)⊤y⊃∊(2⍴256)∘⊤¨⎕AV⍳'ܨ㈍İᄧюᜪࠄᨳ䜏ഁᙂ䴫쩸穼蚠']⋄⍵}
q¨'0123456789'
----- •---- ••--- •••-- ••••- ••••• -•••• --••• ---•• ----•
q¨"HELLO WORLD"
•••• • •-•• •-•• --- •-- --- •-• •-•• -••
mỗi chữ cái được phân tách từ một khoảng trắng, mỗi từ sẽ được tách ra từ 3 khoảng trắng. Bảng được xây dựng trên chuỗi ký tự chữ và số và các ký tự 16 ⎕A,⎕D
bit 'ܨ㈍İᄧюᜪࠄᨳ䜏ഁᙂ䴫쩸穼蚠'
mà chúng chia thành các ký tự 8 bit, mỗi ký tự được chuyển đổi trong cơ sở 3 với các chữ số đảo ngược.
Ažh«•1Ju&àøΘn₆δβαLmSÂZΘ=+BD1
÷ΓùwÒмVšh•… .-ÅвJ#ðδJ‡
•1Ju&àøΘn₆δβαLmSÂZΘ=+BD1
÷ΓùwÒмVšh• push compressed number
… .-ÅвJ# convert to custom base " .-"
ðδJ append a space to each morse code
Ažh« ‡ transliterate
Đối với cả hai phiên bản này, chúng sẽ đặt khoảng trắng giữa bất kỳ ký tự nào. Chuyển đổi 0-9 và az (trường hợp không nhạy cảm) được chuyển đổi. Một không gian được chuyển đổi thành 3.
s=>s.split("").map(e=>isNaN(d=parseInt(e.toLowerCase(),36))?e:`_OGCA@PX\\^\r\n `.charCodeAt(d).toString(2).substr(1).split("").map(e=>".-"[e]).join("")).join(" ")
Thay thế \n
bằng một ký tự dòng mới ( 0x0a
). Nó không hiển thị một vài ký tự không thể in được vì SE. Đi vào chế độ chỉnh sửa cho thấy nó.
Đây là hex:
73 3d 3e 73 2e 73 70 6c 69 74 28 22 22 29 2e 6d 61 70 28 65 3d 3e 69 73 4e 61 4e 28 64 3d 70 61 72 73 65 49 6e 74 28 65 2e 74 6f 4c 6f 77 65 72 43 61 73 65 28 29 2c 33 36 29 29 3f 65 3a 60 5f 4f 47 43 41 40 50 58 5c 5c 5e 05 18 1a 0c 02 12 0e 10 04 17 5c 72 14 07 06 0f 16 1d 0a 08 03 09 11 0b 19 1b 1c 60 2e 63 68 61 72 43 6f 64 65 41 74 28 64 29 2e 74 6f 53 74 72 69 6e 67 28 32 29 2e 73 75 62 73 74 72 28 31 29 2e 73 70 6c 69 74 28 22 22 29 2e 6d 61 70 28 65 3d 3e 22 2e 2d 22 5b 65 5d 29 2e 6a 6f 69 6e 28 22 22 29 29 2e 6a 6f 69 6e 28 22 20 22 29
s=> //declare anonymous function
s.split("") //split into array of characters
.map( //for each character
e=> //declare anonymous function
isNaN( //is the character not in range 0-9a-zA-Z
d=parseInt(e.toLowerCase(),36)
//take it as base 36(digits are 0-9a-z) and assign to d
)?e: //if outside range, return as is
`_OGCA@PX\\^\r\n `
//table of the morse code as binary as code point with leading 1
.charCodeAt(d)//get the corresponding code
.toString(2) //convert to binary, 0=., 1=-, with an extra 1 bit
.substr(1) //remove the extra 1 bit
.split("") //split into each bit
.map( //for each bit
e=> //declare anonymous function
".-" //the corresponding symbol for bits
[e] //get it
)
.join("") //join the bits
)
.join(" ") //join the characters with a space between each character
s=>s.split("").map(e=>isNaN(d=parseInt(e.toLowerCase(),36))?e:[95,79,71,67,65,64,80,88,92,94,5,24,26,12,2,18,14,16,4,23,13,20,7,6,15,22,29,10,8,3,9,17,11,25,27,28][d].toString(2).substr(1).split("").map(e=>".-"[e]).join("")).join(" ")
s=> //declare anonymous function
s.split("") //split into array of characters
.map( //for each character
e=> //declare anonymous function
isNaN( //is the character not in range 0-9a-zA-Z
d=parseInt(e.toLowerCase(),36)
//take it as base 36(digits are 0-9a-z) and assign to d
)?e: //if outside range, return as is
[95,79,71,67,65,64,80,88,92,94,
5,24,26,12, 2,18,14,16, 4,23,
13,20, 7, 6,15,22,29,10, 8, 3,
9,17,11,25,27,28]
//table of the morse code as binary with leading 1
[d] //get the corresponding code
.toString(2) //convert to binary, 0=., 1=-, with an extra 1 bit
.substr(1) //remove the extra 1 bit
.split("") //split into each bit
.map( //for each bit
e=> //declare anonymous function
".-" //the corresponding symbol for bits
[e] //get it
)
.join("") //join the bits
)
.join(" ") //join the characters with a space between each character
Tôi đã tạo một chuỗi các chữ số sao cho vị trí của chúng trong chuỗi mô tả biểu diễn mã Morse của chúng. Ban đầu tôi sẽ sử dụng nhị phân, nhưng 01
sẽ giống như 1
. Vì vậy, tôi đã sử dụng ternary với - = 1
và . = 2
. Do đó, ký tự c
nằm ở chỉ mục 1121
trong chuỗi này, biểu diễn mã Morse của nó là --.-
.
q,d,D=" .-"
s=" TE MN AI.OG KD.WR US-.QZ.YC XB- JP L. F VH---.09 8..7-- 6---.1-- 2..3 45".replace(D,d*3).replace(d,q*4)
lambda n:''.join(''.join([0,D,d][i]for i in [s.index(c)//3**i%3 for i in range(5)if s.index(c)//3**i!=0][::-1])+q*3 if c!=q else q*4for c in n.upper())
Khai thác thử nghiệm
print(f("Hi")==".... .. ")
print(f("Hello")==".... . .-.. .-.. --- ")
print(f("Hello World")==".... . .-.. .-.. --- .-- --- .-. .-.. -.. ")
print(f("To be or not to be")=="- --- -... . --- .-. -. --- - - --- -... . ")
print(f("3 14 15")=="...-- .---- ....- .---- ..... ")
Cập nhật
[LƯU Ý: Luôn có khoảng trắng ở cuối nhưng khoảng trắng thể hiện sự tạm dừng, vì vậy tôi là khách ổn ]
for(;$d=ord($c=$argv[1][$i++]);)echo ctype_alnum($c)?strtr(substr(decbin(ord($d>64?".CTRH@ZF\DUGXABEVOJL?K[ISQP"[$d&31]:"]muy{|ld`^"[$c])-48),1),10,".-"):$c;
lấy đầu vào từ đối số dòng lệnh đầu tiên. không tạm dừng giữa các chữ cái. Chạy với -nr
.
phá vỡ
for(;$d=ord($c=$argv[1][$i++]);) # loop through input characters
echo # print ...
ctype_alnum($c) # if char is alphanumeric:
? strtr(
substr(
decbin(
ord($d>64 # 1. map char to char-encoded morse
?".CTRH@ZF\DUGXABEVOJL?K[ISQP"[$d&31]
:"]muy{|ld`^"[$c]
)-60 # 2. subtract 60 from ordinal value
) # 3. decbin: convert to base 2
,1) # 4. substr: skip leading `1`
,10,".-") # 5. strtr: translate binary digits to dash/dot
:$c; # not alphanumeric: no conversion
Đánh bại JavaScript, Python2, C, Ruby và sed. Tôi đang hạnh phúc.
Bước 4: hủy hợp nhất ánh xạ để xử lý các ký tự chữ thường mà không sử dụng strtoupper
.
những phiên bản trước:
thất bại cho chữ thường; +12 byte cần sửa: Thay thế $argv[1]
bằngstrtoupper($argv[1])
.
dịch chuỗi đơn giản, 254 byte
<?=strtr($argv[1],["-----",".----","..---","...--","....-",".....","-....","--...","---..","----.",A=>".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]);
thẳng về phía trước: dịch toàn bộ chuỗi cùng một lúc, ký tự sang mã morse.
Lưu vào tập tin để thực hiện hoặc thay thế <?=
bằng echo
và chạy với -r
.
giải thích thập phân của mã morse, 184 byte (-70)
for(;""<$c=$argv[1][$i++];)echo($m=[32,48,56,60,62,63,47,39,35,33,A=>6,23,21,11,3,29,9,31,7,24,10,27,4,5,8,25,18,13,15,2,14,30,12,22,20,19][$c])?strtr(substr(decbin($m),1),10,".-"):$c;
bước đánh gôn đầu tiên: mã morse được mã hóa thành nhị phân với một bổ sung hàng đầu 1
để bảo toàn các số 0 hàng đầu. Vòng lặp thông qua các ký tự và dịch từng cái một. Chạy với -nr
.
số thập phân được mã hóa thành ký tự, 157 byte (-27)
for(;""<$c=$argv[1][$i++];)echo ctype_alnum($c)?strtr(substr(decbin(ord("@"<$c?"CTRH@ZF\DUGXABEVOJL?K[ISQP"[ord($c)-65]:"]muy{|ld`^"[$c])-60),1),10,".-"):$c;
đánh gôn thứ hai: thêm 60 vào giá trị thập phân và được mã hóa thành ký tự.
ánh xạ hợp nhất, 150 byte (-7)
for(;""<$c=$argv[1][$i++];)echo ctype_alnum($c)?strtr(substr(decbin(ord("]muy{|ld`^8901234CTRH@ZF\DUGXABEVOJL?K[ISQP"[ord($c)-48])-60),1),10,".-"):$c;
golf thứ ba: hợp nhất ánh xạ cho các chữ số và chữ cái thành một chuỗi.