Dịch mã Morse


32

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à.

Mã Morse quốc tế


1
Cả chữ in hoa và chữ thường đều được mã hóa?
Joey Adams

9
Ngoài ra, bạn có thể cung cấp một đầu vào và đầu ra mẫu để làm rõ các chi tiết như khoảng cách giữa các từ không?
Joey Adams

Chà, ở Morse, không có sự khác biệt giữa chữ thường và chữ hoa. Không có biểu tượng thực sự cho không gian (nó chỉ là khoảng im lặng 3/4 lần) vì vậy tôi đoán nó nên được dịch là một khoảng trắng.
Shikiryu

@Joey: Các chi tiết tùy thuộc vào bạn.
Alexandru

Tương tự như câu hỏi Stack Overflow Code Golf: Mã Morse .
dmckee

Câu trả lời:


11

Golfscript - 74 ký tự

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(;>{'.-'\=}%' '}%}%'/'*

Thứ tự các khối mã của bạn ở đây gây nhầm lẫn cho UserScript của George . Tôi có thể làm phiền bạn để sắp xếp lại? Và tôi muốn xem nó được giải thích. Tôi nhận được cây ẩn, nhưng phần còn lại là một bí ẩn đối với tôi.
dmckee

@dmckee, xong rồi. Kịch bản của George nhận thấy số lượng của tôi đã hết, vì vậy tôi cũng đã sửa nó
gnibbler

Yêu cầu upvotes để xem phân tích ... boo! Các phân tích là những gì làm cho câu trả lời có giá trị upvotes!
Nick Larsen

@Nick, ok Tôi nghĩ rằng nó ngắn như tôi có thể có được nó, vì vậy tôi sẽ bắt tay vào phân tích đó
gnibbler

20

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ự.


2
Đây là ý tưởng tốt nhất tôi từng thấy cho đến nay.
Alexandru

Và sau đó tôi đọc các chủ đề được liên kết và nhận thấy điều này là xa so với ban đầu.
Nick Larsen

1
Khi tôi nhìn thấy cái 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=>..-.
gnibbler

Bạn không cần không gian trongString[] a
Cyoce

9

tr + sed (347)

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'

1
Không gian xung quanh một đường ống cũng có thể bị loại bỏ ;-)
Yasir Arsanukaev

1
Vâng, tôi không tính những khoảng trống đó, tôi chỉ in chúng ở đây cho rõ ràng :)
Mười hai

2
Bạn có thể sử dụng mở rộng cú đúp để rút ngắn rất nhiều ( /g;s/trở thành ,- cộng với một chút chi phí).
Nabb

@nabb ý hay.
Eelvex

1
yThay vào đó, bạn có thể thả tr, sử dụng lệnh của sed
Hasturkun

6

Haskell - 314 292 291 ký tự

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ừ.


Chỉ cần kiểm tra câu hỏi được tham chiếu bởi @dmckee "Code Golf: Morse code" và không tìm thấy phiên bản Haskell. Tôi nghĩ, ngắn hơn 314 là có thể.
Yasir Arsanukaev

fromJust.elemIndex ccó 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 intercalatebằng i.
sepp2k

@ sepp2k: Ý kiến ​​hay đấy! Cảm ơn. Tôi cũng đã chơi với intercalatevà đã lưu thêm 6 nhân vật! :-)
Yasir Arsanukaev

Bạn cũng có thể làm 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=...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).
sepp2k

@ sepp2k: Nội tuyến 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.
Yasir Arsanukaev

4

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)

4

Hồng ngọc, 161

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.


4

VB.NET, 233 byte

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

Tôi đã quyết định +1 điều này vì tôi không thể nhớ đã từng thấy VB.net được sử dụng để chơi gôn.
mbomb007

3

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


3

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){}}}

3

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;
}

"Tôi nhận được một mã thông báo bổ sung ở đầu và cuối vì một số lý do": Tôi không biết Perl 6, nhưng tôi đoán đó là vì chuỗi trống khớp với ranh giới từ đầu tiên và sau ranh giới từ cuối cùng.
msh210

2

sed, 159 byte

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ì ykhô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, 89 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:

  1. k=> k-=>n-
  2. n-=> n.-=>t.-
  3. t.-=> t-.-=>-.-

2

Python 3, 99 ký tự

lambda a:print(*[str(ord('ӆҼzࢤpࢮ࠿yࡊoࡀѡÔÞÝࢭÓӅһѢ'[ord(c)%32])).translate(' -.'*18)for c in a])

Hoạt động trên chữ hoa và chữ thường.


2

C, 162 160 ký 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]);}

Mlà 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
.- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.. ----- .---- ..--- ...-- ....- ..... -.... --... ---.. ----. 

Đó không phải là 162 ký tự ... vui lòng đăng phiên bản chơi gôn.
Cyoce

@Cyoce Xin lỗi, tôi đã không loại bỏ khoảng trắng không đáng kể vì đó là một quy trình cơ học nhàm chán và chỉ làm cho việc đọc mã nguồn trở nên khó khăn hơn, thường được sử dụng trên PPCG. Đã thêm một phiên bản với khoảng trắng như vậy tước cho bạn :).
FireFly


1

Perl (489 ký tự)

%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!


1
Bạn có thể giảm xuống còn 286 ký tự:%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//}
msh210

1

PHP, 474 ký tự

<?$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])];

Với một số thủ thuật nhỏ có thể rút gọn thành:<?$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,'.-');
thao tác

1

05AB1E , 81 byte (Không cạnh tranh)

Çvy©58‹i®58-•6V%·,Õo•2B5ôsè}®64›i®64-•4…·]ÑUZ“×\ó$9™¹“ÌLÈÎ%´•3B4ôsè}"012"".- "‡})

Hãy thử trực tuyến!

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.


1

Thạch , 50 byte

“¤⁵©ḤọḌṄ’B‘s5;“ḄẇɗÞI/QẊṂjỵr’Œ?ḃ2¤ṖṖƊ⁺ị⁾.-;
ØBiịÇ)K

Một chương trình đầy đủ chấp nhận một chuỗi định dạng Python làm đối số dòng lệnh in ra đầu ra được phân tách bằng dấu cách.

Hãy thử trực tuyến!


1

Powershell, 142 byte

-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.


1
+mazzy+là một số đệm táo bạo
Veskah

1

APL (NARS), 71 ký tự, 142 byte

{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,⎕Dbit 'ܨ㈍İᄧюᜪࠄᨳ䜏ഁᙂ᥃䴫쩸穼蚠'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.


1

05AB1E , 52 byte

Ažh«•1Ju&àøΘn₆δβαLmSÂZΘ=+BD1
 ÷ΓùwÒмVšh•… .-ÅвJ#ðδJ‡

Hãy thử trực tuyến!

    •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

1

JavaScript (ES6), 184 byte

Đố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ế \nbằ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

Ung dung

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

Phiên bản có thể đọc được, 234 byte

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(" ")

Ung dung

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

0

Python 2, 283 274 byte

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 01sẽ giống như 1. Vì vậy, tôi đã sử dụng ternary với - = 1. = 2. Do đó, ký tự cnằm ở chỉ mục 1121trong chuỗi này, biểu diễn mã Morse của nó là --.-.

  • Để lưu byte, tôi đã tạo các biến cho không gian, dấu gạch ngang và dấu chấm.
  • Sau đó, tôi cứng mã hóa chuỗi 'bộ giải mã' bằng cách sử dụng một vài câu lệnh thay thế để giảm khoảng trắng.
  • Một phần của hàm chuyển đổi một chỉ mục thành một mảng các chữ số ternary
  • Hàm phần khác lấy một chuỗi và chuyển đổi từng ký tự thành mã Morse với 3 khoảng trắng sau các chữ cái và 7 (4 thêm) giữa các từ
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

  • -9 [16-05-09] Kết hợp chức năng tính toán ternary vào chức năng chính

[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 ]


0

PHP, 157 150 157 byte

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 echovà 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.


0

SmileBASIC, 194 190 byte

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.