Penerjemah kode morse

32

Tulis program terpendek untuk mengubah input standar menjadi kode Morse . Karakter yang tidak ada dalam tabel harus dicetak sebagaimana adanya.

Kode Morse Internasional

Alexandru
sumber
1
Apakah huruf kapital dan huruf kecil dikodekan?
Joey Adams
9
Juga, dapatkah Anda memberikan contoh input dan output untuk mengklarifikasi detail seperti jarak antar kata?
Joey Adams
Nah, di Morse, tidak ada perbedaan antara huruf kecil dan huruf besar. Tidak ada simbol nyata untuk ruang (hanya diam 3/4 kali) jadi saya kira itu harus diterjemahkan sebagai ruang.
Shikiryu
@ Joey: Detailnya terserah Anda.
Alexandru
Mirip dengan pertanyaan Stack Overflow Code Golf: Morse code .
dmckee

Jawaban:

11

Golfscript - 74 karakter

Jawaban ini hanya mendukung huruf besar dan angka. Huruf-huruf dipisahkan oleh baris baru dan kata-kata dipisahkan oleh 2 baris baru

{." ETIANMSURWDKGOHVF L PJBXCYZQ"?)"?/'#! 08<>"@))10%=or 2base(;{!45+}%n}%

Analisis

    {}% seperti biasa berfungsi seperti peta di atas array
    . dorong salinan char ke stack
    "ETIAN ..." ini adalah tabel pencarian untuk karakter huruf besar
    ? seperti string.find mengembalikan indeks char di dalam string
                  atau -1 jika tidak ditemukan (yaitu angka)
    ) kenaikan indeks itu sehingga E => 2 T => 3 I => 4 dll perhatikan bahwa jika
                  char bukan huruf besar atau spasi sekarang 0 (Salah)
    "? / '#! ..." ini adalah tabel pencarian untuk digit. itu akan digunakan dalam
                  membalikkan cara ke tabel pencarian lainnya.
    @ tarik salinan yang kami buat dari arang ke atas tumpukan
    ))% 10 mengonversi ascii digit ke angka dengan menambahkan 2 dan mengambil mod 10.
                  Sangat penting untuk melakukannya dengan cara ini karena semua huruf besar
                  surat-surat mengenai kode ini juga, dan kami harus memastikan mereka jatuh
                  dalam kisaran 0..9 atau langkah berikutnya akan gagal.
    = tarik karakter ke-n dari string mis. "Halo" 1 = beri "e"
    atau ingat jika pencarian huruf besar gagal, kita memiliki hasil 0, jadi
                  pencarian digit akan digunakan
    2base dikonversi menjadi basis 2 jadi E => [1 0], T => [1 1], I => [1 0 0] dll.
    (; pop bagian depan daftar dan membuangnya sehingga E => [0], T => [1]
    {! 45 +}% meniadakan setiap bit dan menambahkan 45, ini memberikan nilai ascii. dan -
    n baris baru memisahkan setiap kata. ini bisa 32 jika Anda mau
                  pisahkan kata-kata dengan spasi dengan biaya 1 stroke

Golfscript - 85 karakter

Ini lebih pendek daripada jawaban SO saya karena persyaratan santai di sini. Masukan harus huruf besar / digit dan karakter tanda baca ".,?"

{." ETIANMSURWDKGOHVF!L!PJBXCYZQ"?)"UsL?/'#! 08<>"@".,?"58,48>+?=or
2base(;{!45+}%n}%

Karena tanda baca bahkan tidak diperlukan di sini, saya dapat mempersingkat jawabannya

Jawaban saya dari SO
Golfscript - 107 karakter

baris baru di akhir input tidak didukung, jadi gunakan sesuatu seperti ini

echo -n Hello, Codegolfers| ../golfscript.rb morse.gs

Surat adalah huruf khusus dan dikonversi menjadi huruf kecil dan dipesan dalam posisi biner. Segala sesuatu yang lain dilakukan oleh tabel terjemahan

' '/{{.32|"!etianmsurwdkgohvf!l!pjbxcyzq"?)"UsL?/'#! 08<>"@".,?0123456789"?=or
2base(;>{'.-'\=}%' '}%}%'/'*
gnibbler
sumber
Urutan blok kode Anda di sini membingungkan UserScript George . Bisakah saya menyulitkan Anda mengatur ulang? Dan saya akan ingin melihatnya menjelaskan. Saya mendapatkan pohon tersirat, tetapi sisanya adalah misteri bagi saya.
dmckee
@ dmckee, selesai. Naskah George memperhatikan bahwa penghitungan saya keluar satu per satu, jadi saya memperbaikinya juga
gnibbler
Memerlukan upvotes untuk melihat analisis ... boo! Analisisnya adalah apa yang membuat jawaban bernilai upvotes!
Nick Larsen
@Nick, ok saya pikir ini sesingkat yang saya bisa dapatkan, jadi saya akan mulai bekerja pada analisis itu
gnibbler
20

C # (213 karakter)

Saya yakin ini tidak akan bertahan lama, tapi setidaknya saya punya teknik di sini dulu!

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+"  ");}}}

Dan dalam format yang dapat dibaca:

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+" ");
        }
    }
}

Untuk penjelasan singkat, string karakter adalah tumpukan di mana anak kiri adalah titik dan anak kanan adalah tanda hubung. Untuk membuat surat, Anda menelusuri kembali dan membalik urutan.

Nick Larsen
sumber
2
Ini adalah ide terbaik yang pernah saya lihat sejauh ini.
Alexandru
Dan kemudian saya membaca utas tertaut dan memperhatikan bahwa ini jauh dari aslinya.
Nick Larsen
1
Ketika saya melihat ETIAN...di sana, saya menganggap itu bekerja sama dengan skrip golf, tetapi Anda memiliki cara berbeda dalam mengartikan string. Saya pikir itu setara tetapi saya menambahkan 1 ke indeks dan menggunakan representasi biner untuk mendapatkan titik dan garis untuk semua digit setelah 1 "misalnya terkemukaF=>18=>0b10010=>..-.
gnibbler
Anda tidak perlu ruang diString[] 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'
Eelvex
sumber
1
Ruang di sekitar pipa juga bisa dihilangkan ;-)
Yasir Arsanukaev
1
Ya, saya tidak menghitung spasi itu, saya hanya mencetaknya di sini untuk kejelasan :)
Eelvex
2
Anda dapat menggunakan ekspansi brace untuk mempersingkat banyak ( /g;s/menjadi ,- ditambah sedikit overhead).
Nabb
@ nabb ide bagus.
Eelvex
1
Anda dapat menghentikan tr, gunakan yperintah sed sebagai gantinya
Hasturkun
6

Haskell - 314 292 291 karakter

import Data.List
i=intercalate
m=i"       ".map(i" ".map(\c->words".- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.. ----- .---- ..--- ...-- ....- ..... -.... --... ---.. ----."!!(head.findIndices(==c)$['a'..'z']++['0'..'9']))).words

Formulir yang dapat dibaca pengguna:

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

Contoh dijalankan:

*Main> m "welcome humans"
".-- . .-.. -.-. --- -- .       .... ..- -- .- -. ..."

Ada spasi putih di antara dua huruf, dan tujuh spasi putih di antara dua kata.

Yasir Arsanukaev
sumber
Baru saja memeriksa pertanyaan yang dirujuk oleh @dmckee "Code Golf: Morse code" dan tidak menemukan versi Haskell. Saya pikir, mungkin lebih pendek dari 314.
Yasir Arsanukaev
fromJust.elemIndex cdapat ditulis sebagai head.findIndices(==c). Itu satu karakter lebih banyak, tetapi Anda kemudian dapat menyingkirkannya import Data.Maybe, sehingga Anda akan menyimpan total 17 karakter. Anda juga dapat menyimpan dua karakter dengan menghapus spasi di depan string setiap kali Anda memanggil interkalasi. Dan beberapa karakter lainnya dengan melakukan i=intercalatedi awal dan mengganti dua panggilan intercalatedengan i.
sepp2k
@ sepp2k: Ide bagus! Terima kasih. Saya juga bermain dengan intercalatedan telah menyimpan 6 karakter lainnya! :-)
Yasir Arsanukaev
Anda juga dapat melakukannya w=words, yang menghemat satu karakter jika saya tidak salah. Dan alih-alih l c=...dan map l, Anda harus melakukannya map\c->...(Anda bahkan tidak perlu parens di sekitar lambda karena bagaimanapun sudah ada paren penutup setelahnya).
sepp2k
@ sepp2k: Penyisipan l c=...memang menyelamatkan saya 1 karakter, tapi saya tidak bisa meletakkannya tanpa parens, hanya sebagai map(\c->...). GHC versi 6.12.3.
Yasir Arsanukaev
4

Nota bene (310) (462) (414)(319) termasuk (46) untuk tabel.

Gabungan angka dan huruf dengan pengkodean ternary. 5 digit ternary cocok dalam satu byte! Ini menghilangkan loop perbedaan konyol itu, dan nomor casing khusus seluruhnya.

ASCII85 memotong 1/3 dari setiap tabel. Dan menyederhanakan kode (akhirnya!) Kembali di bawah 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

Output sampel

Luser Dr00g!
. ---. . . . ---. . . . . ---. ---. . . ---. --- --- --- --- --- --- --- --- --- --- --- --- ---. !

Tidak diikat dan dikomentari. Saya sangat bangga dengan yang ini. Saya merasa itu elegan, membuat angka melakukan pekerjaan. :)

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

Tabel (33) + (13) = (46)

Inilah cara string menyandikan tabel. Setiap byte mewakili nomor terner 5 digit. Dan byte selanjutnya dikodekan dalam ASCII85 (yang nota bene dapat secara otomatis memecahkan kode).

%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)
luser droog
sumber
4

Ruby, 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}*''

Mengkodekan setiap digit ke dalam karakter tunggal, di mana 1 adalah tanda hubung, 0 adalah titik, dengan angka 1 sebagai penanda (ditambah offset untuk membuatnya tetap dapat dicetak. Menggunakan matematika ASCII untuk menggunakan karakter input sebagai indeks pencarian.

ASHelly
sumber
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

Fungsi terakhir itu jahat.

sunting Beberapa perbaikan.

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
Adam Speight
sumber
Saya memutuskan untuk memberi ini +1 karena saya tidak ingat pernah melihat VB.net digunakan untuk bermain golf.
mbomb007
3

Lisp ( 532 466 karakter)

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

Ini mengkodekan huruf kecil, dan urutan kode morse dicetak dengan spasi tambahan

tobyodavies
sumber
3

Di Jawa, 475 karakter.

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

Menerjemahkan az, AZ dan 0-9.

Edit:

Atau dalam 447 karakter, jika Anda tidak keberatan Java membuat kesalahan setelah terjemahan.

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

Versi yang mudah dibaca

# 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;
}
Bruce Armstrong
sumber
"Saya mendapatkan token ekstra di awal dan akhir karena beberapa alasan": Saya tidak tahu Perl 6, tapi saya kira itu karena string kosong cocok sebelum batas kata pertama dan setelah yang terakhir.
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

Kami mulai dengan menurunkan seluruh baris (karena ytidak dapat melakukan konversi case-sensitive); kurangi 10 byte jika kita hanya menangani input huruf kecil. Kemudian kita preprocess angka 0, 2, 8dan 9untuk memancarkan simbol terakhir mereka.

Loop menghasilkan simbol terakhir untuk setiap karakter input, lalu menerjemahkan setiap karakter untuk iterasi berikutnya. Ini sama dengan berjalan di atas meja pencarian dikotomis yang diperlihatkan dalam artikel Wikipedia; digit yang memerlukan perlakuan khusus dapat dilihat memiliki orang tua yang tidak ada dalam alfanumerik ASCII kami.

Loop berakhir ketika semua karakter telah mencapai ruang terminasi (setelah 'e' atau 't').

Misalnya, surat kitu diubah dalam tiga bagian:

  1. k=> k-=>n-
  2. n-=> n.-=>t.-
  3. t.-=> t-.-=>-.-
Toby Speight
sumber
2

Python 3, 99 Karakter

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

Bekerja pada huruf besar dan kecil.

Cormac
sumber
2

C, 162 160 karakter

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

(Dengan spasi kosong tidak signifikan, tidak ada baris baru)

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

Madalah tabel pencarian di mana bitpattern karakter sesuai dengan titik dan garis dalam kode morse. Karakter [0-9A-Z]diterjemahkan ke morse menggunakan tabel ini (dengan spasi ditambahkan setelah kode morse), karakter lain hanya melewati tidak berubah.

Contoh dijalankan:

HELLO WORLD
.... . .-.. .-.. ---  .-- --- .-. .-.. -.. 
hello world
hello world
ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
.- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.. ----- .---- ..--- ...-- ....- ..... -.... --... ---.. ----. 
FireFly
sumber
Itu bukan 162 karakter ... silakan kirim versi golfnya.
Cyoce
@Cyoce Maaf, saya tidak menghapus spasi yang tidak signifikan karena itu adalah proses mekanis yang membosankan dan hanya membuat lebih sulit untuk membaca kode sumber, yang (dulu?) Cukup praktik standar pada PPCG. Menambahkan versi dengan spasi kosong seperti itu untuk Anda :).
FireFly
144 bytes
ceilingcat
1

Perl (489 karakter)

%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"$_"}}}

Dapat dieksekusi melalui baris perintah seperti itu.

$ perl -e '$CODE' < textfile

Sunting: Terima kasih @tobyodavies karena menunjukkan bahwa solusi asli saya memiliki terjemahannya mundur!

Daniel Standage
sumber
1
Anda bisa mendapatkan ini hingga 286 karakter:%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 karakter

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

Ini 462 karakter jika semua input dalam huruf besar:

<?$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])];
Kevin Brown
sumber
Dengan beberapa trik kecil yang dapat direduksi menjadi:<?$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,'.-');
manatwork
1

05AB1E , 81 byte (Tidak bersaing)

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

Cobalah online!

Ubah pola huruf menjadi basis-3, pola angka ke basis-2, gunakan transliterasi ascii nol yang diindeks untuk mendapatkan titik dan tanda hubung. Tidak berfungsi pada huruf kecil.

Guci Gurita Ajaib
sumber
1

Jelly , 50 byte

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

Program lengkap yang menerima string yang diformat Python sebagai argumen baris perintah yang mencetak output yang dibatasi ruang.

Cobalah online!

Jonathan Allan
sumber
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{$_}})

Skrip uji yang kurang golf:

$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"
}

Keluaran:

True: .- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.. ----- .---- ..--- ...-- ....- ..... -.... --... ---.. ----.
True: .... . .-.. .-.. ---  .-- --- .-. .-.. -..
True: #$%^&

Catatan: Output berisi spasi tambahan.

mazzy
sumber
1
+mazzy+adalah beberapa padding nakal
Veskah
1

APL (NARS), 71 karakter, 142 byte

{36≥y←⍵⍳⍨⎕A,⎕D:'•-'[0∼⍨⌽(5⍴3)⊤y⊃∊(2⍴256)∘⊤¨⎕AV⍳'ܨ㈍İᄧюᜪࠄᨳ䜏ഁᙂ᥃䴫쩸穼蚠']⋄⍵}

uji:

  q←{36≥y←⍵⍳⍨⎕A,⎕D:'•-'[0∼⍨⌽(5⍴3)⊤y⊃∊(2⍴256)∘⊤¨⎕AV⍳'ܨ㈍İᄧюᜪࠄᨳ䜏ഁᙂ᥃䴫쩸穼蚠']⋄⍵}
  q¨'0123456789'
----- •---- ••--- •••-- ••••- ••••• -•••• --••• ---•• ----• 
  q¨"HELLO WORLD"
•••• • •-•• •-•• ---   •-- --- •-• •-•• -••  

setiap huruf dipisahkan dari satu spasi, setiap kata akan dipisahkan dari 3 spasi. Tabel ini dibuat berdasarkan string alfanumerik ⎕A,⎕Ddan 16 bit karakter yang 'ܨ㈍İᄧюᜪࠄᨳ䜏ഁᙂ᥃䴫쩸穼蚠'dipisah dalam 8 bit karakter yang masing-masing dikonversikan dalam basis 3 dengan angka terbalik.

RosLuP
sumber
1

05AB1E , 52 byte

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

Cobalah online!

    •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
Dorian
sumber
1

JavaScript (ES6), 184 byte

Untuk kedua versi ini, mereka akan memberi spasi di antara karakter apa pun. Mengkonversi 0-9 dan az (tidak sensitif huruf) dikonversi. Spasi dikonversi menjadi 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(" ")

Ganti \ndengan karakter baris baru ( 0x0a). Itu tidak menunjukkan beberapa karakter yang tidak dapat dicetak karena SE. Masuk ke mode edit menunjukkannya.

Inilah 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

Tidak disatukan

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

Versi yang dapat dibaca, 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(" ")

Tidak disatukan

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
Naruyoko
sumber
0

Python 2, 283 274 Bytes

Saya membuat string alfanumerik sedemikian rupa sehingga penempatan mereka di string menggambarkan representasi kode Morse mereka. Awalnya saya akan menggunakan biner, tetapi 01akan sama dengan 1. Jadi saya menggunakan ternary dengan - = 1dan . = 2. Dengan demikian karakter cpada indeks 1121dalam string ini, representasi kode Morse-nya --.-.

  • Untuk menghemat byte, saya membuat variabel untuk space, dash, dan dot.
  • Lalu aku mengkodekan string 'decoder' menggunakan pasangan ganti pernyataan untuk mengurangi spasi.
  • Bagian dari fungsi mengubah indeks menjadi array dari digit ternary
  • Fungsi bagian lainnya mengambil string dan mengubah setiap karakter menjadi kode Morse dengan 3 spasi setelah huruf dan 7 (4 ekstra) antara kata-kata
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())

Uji Harness

print(f("Hi")=="....   ..   ")
print(f("Hello")=="....   .   .-..   .-..   ---   ")
print(f("Hello World")=="....   .   .-..   .-..   ---       .--   ---   .-.   .-..   -..   ")
print(f("To be or not to be")=="-   ---       -...   .       ---   .-.       -.   ---   -       -   ---       -...   .   ")
print(f("3 14 15")=="...--       .----   ....-       .----   .....   ")

Memperbarui

  • -9 [16-05-09] Memasukkan fungsi penghitungan terner ke dalam fungsi utama

[CATATAN: Selalu ada jejak spasi putih tapi spasi putih menunjukkan jeda, jadi saya harap itu ok ]

Buah Nonlinier
sumber
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;

mengambil input dari argumen baris perintah pertama. tidak ada jeda antar huruf. Jalankan dengan -nr.

kerusakan

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

Mengalahkan JavaScript, Python2, C, Ruby dan sed. Saya senang.

Langkah ke-4: un-gabungkan pemetaan untuk menangani karakter huruf kecil tanpa menggunakan strtoupper.

versi sebelumnya:

gagal untuk huruf kecil; +12 byte untuk diperbaiki: Ganti $argv[1]dengan strtoupper($argv[1]).

terjemahan string sederhana, 254 byte

<?=strtr($argv[1],["-----",".----","..---","...--","....-",".....","-....","--...","---..","----.",A=>".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]);

lurus ke depan: menerjemahkan seluruh string sekaligus, karakter ke kode morse.
Simpan ke file untuk dieksekusi atau diganti <?=dengan echodan dijalankan dengan -r.

interpretasi desimal dari kode 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;

langkah golf pertama: kode morse dikodekan ke biner dengan tambahan tambahan 1untuk melestarikan nol terkemuka. Putar melalui karakter dan menerjemahkannya satu per satu. Jalankan dengan -nr.

desimal dikodekan ke karakter, 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;

golf kedua: ditambahkan 60 ke nilai desimal dan dikodekan ke karakter.

pemetaan gabungan, 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 ketiga: pemetaan gabungan untuk angka dan huruf menjadi satu string.

Titus
sumber
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
12Me21
sumber