เขียนโปรแกรมที่สั้นที่สุดที่จะเปลี่ยนเข้ามาตรฐานลงในรหัสมอร์ส อักขระที่ไม่ได้อยู่ในตารางควรพิมพ์ตามที่เป็น
เขียนโปรแกรมที่สั้นที่สุดที่จะเปลี่ยนเข้ามาตรฐานลงในรหัสมอร์ส อักขระที่ไม่ได้อยู่ในตารางควรพิมพ์ตามที่เป็น
คำตอบ:
คำตอบนี้รองรับเฉพาะตัวพิมพ์ใหญ่และตัวเลข ตัวอักษรจะถูกคั่นด้วยการขึ้นบรรทัดใหม่และคำจะถูกคั่นด้วย 2 บรรทัดใหม่
{." ETIANMSURWDKGOHVF L PJBXCYZQ"?)"?/'#! 08<>"@))10%=or 2base(;{!45+}%n}%
การวิเคราะห์
{}% ทำงานได้ตามปกติเหมือนแผนที่เหนืออาร์เรย์ . ดันสำเนาของถ่านลงบนสแต็ก "ETIAN ... " นี่เป็นตารางค้นหาสำหรับอักขระตัวพิมพ์ใหญ่ ? like a string.find ส่งคืนดัชนีของ char ในสตริง หรือ -1 หากไม่พบ (เช่นเป็นหลัก) ) เพิ่มดัชนีนั้นดังนั้น E => 2 T => 3 I => 4 เป็นต้นสังเกตว่าถ้า char ไม่ใช่ตัวอักษรตัวพิมพ์ใหญ่หรือเว้นวรรคตอนนี้เป็น 0 (เท็จ) "? / '#! ... " นี่เป็นตารางการค้นหาสำหรับตัวเลข มันจะถูกใช้ใน ย้อนกลับไปยังตารางการค้นหาอื่น ๆ @ ดึงสำเนาที่เราสร้างขึ้นไปด้านบนของสแต็ก ))% 10 แปลง ascii ดิจิตเป็นตัวเลขโดยการเพิ่ม 2 และรับ mod 10 สิ่งสำคัญคือต้องทำเช่นนี้เพราะตัวพิมพ์ใหญ่ทั้งหมด ตัวอักษรกดรหัสนี้ด้วยและเราต้องทำให้แน่ใจว่ามันตกลงมา ในช่วง 0..9 หรือขั้นตอนถัดไปจะล้มเหลว = ดึงถ่านที่ n จากสตริงเช่น "Hello" 1 = ให้ "e" หรือจำไว้ว่าการค้นหาตัวพิมพ์ใหญ่ล้มเหลวเรามีผลลัพธ์ 0 รายการดังนั้น ระบบจะใช้การค้นหาหลัก 2base แปลงเป็นฐาน 2 ดังนั้น E => [1 0], T => [1 1], I => [1 0 0] ฯลฯ (; ปรากฏที่ด้านหน้าของรายการและโยนทิ้งเพื่อให้ E => [0], T => [1] {! 45 +}% คัดค้านแต่ละบิตและบวก 45 นี่จะให้ค่า ascii ของ และ - ขึ้นบรรทัดใหม่คั่นแต่ละคำ นี่อาจเป็น 32 ถ้าคุณต้องการ แยกคำที่มีช่องว่างสำหรับค่าใช้จ่าย 1 จังหวะ
Golfscript - 85 ตัวอักษร
นี่สั้นกว่าคำตอบ SO ของฉันเนื่องจากข้อกำหนดผ่อนคลายที่นี่อินพุตต้องเป็นตัวพิมพ์ใหญ่ / หลักและอักขระเครื่องหมายวรรคตอน ".,?"
{." ETIANMSURWDKGOHVF!L!PJBXCYZQ"?)"UsL?/'#! 08<>"@".,?"58,48>+?=or
2base(;{!45+}%n}%
เนื่องจากไม่จำเป็นต้องใช้เครื่องหมายวรรคตอนที่นี่ฉันอาจทำให้คำตอบสั้นลงยิ่งขึ้น
คำตอบของฉันจาก SO
Golfscript - 107 ตัวอักษร
ไม่รองรับ newline ในตอนท้ายของอินพุตดังนั้นใช้บางอย่างเช่นนี้
echo -n Hello, Codegolfers| ../golfscript.rb morse.gs
ตัวอักษรเป็นกรณีพิเศษและถูกแปลงเป็นตัวพิมพ์เล็กและเรียงลำดับตามตำแหน่งไบนารี ทุกอย่างอื่นจะทำโดยตารางการแปล
' '/{{.32|"!etianmsurwdkgohvf!l!pjbxcyzq"?)"UsL?/'#! 08<>"@".,?0123456789"?=or
2base(;>{'.-'\=}%' '}%}%'/'*
C # (213 ตัวอักษร)
ฉันแน่ใจว่าสิ่งนี้จะไม่คงอยู่นาน แต่อย่างน้อยฉันก็ได้เทคนิคที่นี่มาก่อน!
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+" ");}}}
และในรูปแบบที่อ่านได้:
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+" ");
}
}
}
สำหรับคำอธิบายสั้น ๆ สตริงของตัวละครคือฮีปที่เด็กซ้ายเป็นจุดและเด็กที่ถูกต้องคือเส้นประ ในการสร้างตัวอักษรให้คุณย้อนกลับและกลับลำดับ
ETIAN...
ในนั้นฉันคิดว่ามันทำงานเหมือนกับ Golfscript แต่คุณมีวิธีตีความสตริงที่แตกต่างออกไป ฉันคิดว่ามันจะเทียบเท่า แต่ฉันเพิ่ม 1 ในดัชนีและใช้การเป็นตัวแทนไบนารีเพื่อรับจุดและขีดกลางสำหรับตัวเลขทั้งหมดหลังจากนำ 1 "เช่น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/
กลายเป็น,
- บวกกับค่าใช้จ่ายเล็กน้อย)
y
คำสั่งแทน
import Data.List
i=intercalate
m=i" ".map(i" ".map(\c->words".- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.. ----- .---- ..--- ...-- ....- ..... -.... --... ---.. ----."!!(head.findIndices(==c)$['a'..'z']++['0'..'9']))).words
แบบฟอร์มที่ผู้ใช้อ่านได้มากขึ้น:
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
วิ่งตัวอย่าง:
*Main> m "welcome humans"
".-- . .-.. -.-. --- -- . .... ..- -- .- -. ..."
มีช่องว่างเดียวระหว่างตัวอักษรสองตัวและช่องว่างเจ็ดช่องระหว่างคำสองคำ
fromJust.elemIndex c
head.findIndices(==c)
สามารถเขียนเป็น นั่นคือตัวละครมากกว่าหนึ่งตัว แต่คุณสามารถกำจัดได้import Data.Maybe
ดังนั้นคุณจะประหยัดได้ถึง 17 ตัวอักษร คุณยังสามารถบันทึกอักขระสองตัวโดยลบช่องว่างด้านหน้าของสตริงแต่ละครั้งที่คุณเรียกใช้ และตัวอักษรไม่กี่อื่นด้วยการทำi=intercalate
ที่จุดเริ่มต้นและแทนที่สองสายที่จะมีintercalate
i
intercalate
และได้บันทึกตัวละครอีก 6 ตัว! :-)
w=words
กันซึ่งช่วยประหยัดอักขระหนึ่งตัวหากฉันไม่เข้าใจผิด และแทนที่จะเป็นl c=...
และmap l
คุณควรทำmap\c->...
(คุณไม่จำเป็นต้องมี parens รอบแลมบ์ดาเพราะมีการปิด paren หลังจากนั้น)
l c=...
ได้ช่วยฉัน 1 ตัวอักษร แต่ฉันไม่สามารถใส่ได้โดยไม่ต้อง parens map(\c->...)
เพียงเป็น GHC เวอร์ชั่น 6.12.3
ป.ล. (310) (462) (414)(319)รวมถึง(46)สำหรับตาราง
รวมตัวเลขและตัวอักษรเข้ากับการเข้ารหัสแบบไตรภาค ตัวเลข 5 หลักประกอบไปด้วยไบต์! สิ่งนี้จะกำจัดลูปที่แตกต่างโง่ ๆ เหล่านั้นและหมายเลขปลอกพิเศษทั้งหมด
ASCII85 ลด 1/3 ของแต่ละตาราง และลดความซับซ้อนของรหัส (ในที่สุด!) กลับมาต่ำกว่า 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
ตัวอย่างผลลัพธ์
Luser Dr00g! . --- . . . --- . . . . --- --- . . --- --- --- --- --- --- --- --- --- --- --- --- !
Ungolfed และแสดงความคิดเห็น ฉันภูมิใจในสิ่งนี้มาก ฉันรู้สึกว่ามันสง่างามทำให้ตัวเลขทำงานได้ :)
%!
%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
ตาราง (33) + (13) = (46)
นี่คือวิธีที่สตริงเข้ารหัสตาราง แต่ละไบต์แทนหมายเลขไตรภาค 5 หลัก และไบต์จะถูกเข้ารหัสเพิ่มเติมใน ASCII85 (ซึ่ง postscript สามารถถอดรหัสอัตโนมัติ)
%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}*''
เข้ารหัสแต่ละหลักให้เป็นอักขระเดี่ยวโดยที่ 1 คือเส้นประ, 0 คือจุดโดยที่ 1 นำหน้าเป็นบิตเครื่องหมาย (บวกออฟเซ็ตเพื่อให้พิมพ์ได้ใช้คณิตศาสตร์ ASCII เพื่อใช้ตัวอักษรป้อนเข้าเป็นดัชนีการค้นหา
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
ฟังก์ชั่นสุดท้ายนั้นชั่วร้าย
edit การปรับปรุงสองสามอย่าง
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
เสียงกระเพื่อม ( 532 466 ตัวอักษร)
(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)))))
การเข้ารหัสตัวอักษรตัวพิมพ์เล็กและลำดับรหัสมอร์สจะถูกพิมพ์ด้วยช่องว่างต่อท้าย
ใน Java, 475 ตัวอักษร
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){}}}
แปล az, AZ และ 0-9
แก้ไข:
หรือใน447ตัวอักษรถ้าคุณไม่สนใจ Java ที่จะโยนข้อผิดพลาดหลังจากการแปล
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}
เวอร์ชันที่อ่านได้
# 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
เราเริ่มต้นด้วยการลดขนาดของทั้งบรรทัด (เนื่องจากy
ไม่สามารถทำการแปลงตามตัวพิมพ์เล็กและใหญ่) ลบ 10 ไบต์ถ้าเราจัดการกับตัวพิมพ์เล็กเท่านั้น แล้วเรา preprocess ตัวเลข0
, 2
, 8
และ9
ปล่อยสัญลักษณ์สุดท้ายของพวกเขา
การวนซ้ำสร้างสัญลักษณ์สุดท้ายสำหรับอักขระอินพุตแต่ละตัวจากนั้นแปลอักขระแต่ละตัวสำหรับการวนซ้ำถัดไป นี่เทียบเท่ากับการเดินขึ้นตารางการค้นหาแบบแบ่งขั้วที่แสดงในบทความ Wikipedia ตัวเลขที่ต้องการการดูแลเป็นพิเศษสามารถเห็นได้ว่ามีพ่อแม่ที่ไม่ได้อยู่ในตัวอักษรและตัวเลข ASCII ของเรา
การวนซ้ำจะสิ้นสุดลงเมื่อตัวละครทุกตัวมีพื้นที่ถึงจุดสิ้นสุด (หลังจาก 'e' หรือ 't')
ตัวอย่างเช่นตัวอักษรk
ถูกเปลี่ยนเป็นสามรอบ:
k
=> k-
=>n-
n-
=> n.-
=>t.-
t.-
=> t-.-
=>-.-
lambda a:print(*[str(ord('ӆҼzࢤpࢮyࡊoࡀѡÔÞÝࢭÓӅһѢ'[ord(c)%32])).translate(' -.'*18)for c in a])
ใช้งานได้ทั้งบนและล่าง
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]);
}
(ด้วยการถอดช่องว่างที่ไม่มีนัยสำคัญไม่มีการขึ้นบรรทัดใหม่)
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
เป็นตารางการค้นหาที่อักขระรูปแบบบิตตรงกับจุดและขีดกลางในรหัสมอร์ส ตัวละคร[0-9A-Z]
ถูกถอดรหัสเพื่อมอร์สโดยใช้ตารางนี้ (ด้วยช่องว่างต่อท้ายรหัสมอร์ส) ตัวละครอื่น ๆ จะถูกส่งผ่านไม่เปลี่ยนแปลง
วิ่งตัวอย่าง:
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"$_"}}}
สามารถดำเนินการผ่านทางบรรทัดคำสั่งเช่นนั้น
$ perl -e '$CODE' < textfile
แก้ไข: ขอบคุณ @tobyodavies ที่ชี้ให้เห็นว่าโซลูชันดั้งเดิมของฉันมีการแปลย้อนหลัง!
%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 อักขระหากอินพุตทั้งหมดเป็นตัวพิมพ์ใหญ่:
<?$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"".- "‡})
แปลงรูปแบบตัวอักษรเป็น base-3, รูปแบบตัวเลขเป็น base-2 ใช้การทับศัพท์แบบ ascii ที่มีการทำดัชนีเป็นศูนย์เพื่อไปที่จุดและเครื่องหมายยัติภังค์ ไม่ทำงานบนตัวพิมพ์เล็ก
-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{$_}})
สคริปต์ทดสอบ golfed น้อย:
$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"
}
เอาท์พุท:
True: .- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.. ----- .---- ..--- ...-- ....- ..... -.... --... ---.. ----.
True: .... . .-.. .-.. --- .-- --- .-. .-.. -..
True: #$%^&
หมายเหตุ: เอาต์พุตมีช่องว่างต่อท้าย
+mazzy+
คือ padding ที่หน้าด้านบาง
{36≥y←⍵⍳⍨⎕A,⎕D:'•-'[0∼⍨⌽(5⍴3)⊤y⊃∊(2⍴256)∘⊤¨⎕AV⍳'ܨ㈍İᄧюᜪࠄᨳ䜏ഁᙂ䴫쩸穼蚠']⋄⍵}
ทดสอบ:
q←{36≥y←⍵⍳⍨⎕A,⎕D:'•-'[0∼⍨⌽(5⍴3)⊤y⊃∊(2⍴256)∘⊤¨⎕AV⍳'ܨ㈍İᄧюᜪࠄᨳ䜏ഁᙂ䴫쩸穼蚠']⋄⍵}
q¨'0123456789'
----- •---- ••--- •••-- ••••- ••••• -•••• --••• ---•• ----•
q¨"HELLO WORLD"
•••• • •-•• •-•• --- •-- --- •-• •-•• -••
ตัวอักษรแต่ละตัวจะแยกออกจากพื้นที่หนึ่งคำแต่ละคำจะถูกแยกออกจาก 3 ช่อง ตารางนี้สร้างบนสตริงตัวอักษรและตัวเลข⎕A,⎕D
และอักขระ 16 บิตซึ่ง'ܨ㈍İᄧюᜪࠄᨳ䜏ഁᙂ䴫쩸穼蚠'
แบ่งเป็น 8 บิตแต่ละตัวแปลงเป็นฐาน 3 ด้วยตัวเลขย้อนกลับ
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
สำหรับทั้งสองเวอร์ชันพวกเขาจะใส่ช่องว่างระหว่างอักขระใด ๆ ตัวแปลง 0-9 และ az (case insensitive) ถูกแปลง พื้นที่ถูกแปลงเป็น 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(" ")
แทนที่\n
ด้วยอักขระขึ้นบรรทัดใหม่ ( 0x0a
) มันไม่ได้แสดงตัวละครที่ไม่สามารถพิมพ์ได้สองตัวเพราะของ SE การเข้าสู่โหมดแก้ไขแสดงให้เห็น
นี่คือ 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
ฉันสร้างสตริงของตัวอักษรและตัวเลขเพื่อให้ตำแหน่งในสตริงอธิบายการแทนค่ารหัสมอร์ส แต่เดิมผมจะใช้ไบนารี แต่จะเป็นเช่นเดียวกับ01
1
ดังนั้นผมจึงใช้ ternary ด้วยและ- = 1
. = 2
ดังนั้นจึงเป็นตัวละครc
ที่ดัชนีในสายนี้แทนรหัสมอร์ส1121
--.-
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())
สายรัดทดสอบ
print(f("Hi")==".... .. ")
print(f("Hello")==".... . .-.. .-.. --- ")
print(f("Hello World")==".... . .-.. .-.. --- .-- --- .-. .-.. -.. ")
print(f("To be or not to be")=="- --- -... . --- .-. -. --- - - --- -... . ")
print(f("3 14 15")=="...-- .---- ....- .---- ..... ")
ปรับปรุง
[หมายเหตุ:มีพื้นที่สีขาวต่อท้ายเสมอ แต่พื้นที่สีขาวแสดงถึงการหยุดชั่วคราวดังนั้นฉันจึงเป็นแขกที่โอเค]
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;
รับอินพุตจากอาร์กิวเมนต์บรรทัดคำสั่งแรก ไม่มีการหยุดระหว่างตัวอักษร -nr
ทำงานด้วย
ทำให้พังถล่ม
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
การเอาชนะ JavaScript, Python2, C, Ruby และ sed ฉันมีความสุข
ขั้นตอนที่ 4: strtoupper
การยกเลิกการทำแผนที่รวมกับตัวละครที่จับตัวพิมพ์เล็กโดยไม่ต้องใช้
รุ่นก่อนหน้า:
ล้มเหลวสำหรับตัวอักษรตัวเล็ก; 12 ไบต์แก้ไข: แทนที่ด้วย$argv[1]
strtoupper($argv[1])
การแปลสตริงอย่างง่าย 254 ไบต์
<?=strtr($argv[1],["-----",".----","..---","...--","....-",".....","-....","--...","---..","----.",A=>".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]);
ตรงไปข้างหน้า: แปลสตริงทั้งหมดในครั้งเดียวตัวละครเพื่อรหัสมอร์ส
บันทึกไปยังไฟล์ที่จะดำเนินการหรือแทนที่<?=
ด้วยและทำงานด้วยecho
-r
การแปลความหมายทศนิยมของรหัสมอร์ส, 184 ไบต์ (-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;
ขั้นตอนแรกของการเล่นกอล์ฟ: รหัสมอร์สเข้ารหัสเป็นเลขฐานสองพร้อมกับนำเพิ่มเติม1
เพื่อรักษาศูนย์นำ วนรอบตัวอักษรและแปลทีละตัว -nr
ทำงานด้วย
ทศนิยมเข้ารหัสเป็นอักขระ 157 ไบต์ (-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;
ตีกอล์ฟครั้งที่สอง: เพิ่ม 60 เป็นค่าทศนิยมและเข้ารหัสเป็นอักขระ
การแมปแบบรวม 150 ไบต์ (-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;
การเล่นกอล์ฟที่สาม: การแมปที่รวมกันของตัวเลขและตัวอักษรเป็นสายเดียว
INPUT S$WHILE""<S$B=INSTR(" ETIANMSURWDKGOHVFLPJBXCYZQ 54 3 2 16 7 8 90",S$[0])+1IF B THEN S=LOG(B,2)FOR I=0TO S-1?"._"[B-(1<<S)AND S>>I||0];:NEXT?" ";
?SHIFT(S$)*!B;
WEND