モールス信号変換器


32

標準入力をモールス信号に変換する最短のプログラムを作成します。表にない文字はそのまま印刷する必要があります。

国際モールス符号


1
大文字と小文字の両方がエンコードされていますか?
ジョーイアダムス

9
また、単語の間隔などの詳細を明確にするために、サンプルの入力と出力を提供できますか?
ジョーイアダムス

モールスでは、大文字と小文字の違いはありません。スペースの本当のシンボルはありません(3/4の沈黙です)ので、スペースとして翻訳する必要があると思います。
敷竜

@Joey:詳細はあなた次第です。
アレクサンドル

Stack Overflowの質問Code Golf:Morse codeに似ています
dmckee

回答:


11

Golfscript-74文字

この回答では、大文字と数字のみがサポートされています。文字は改行で区切られ、単語は2つの改行で区切られます

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

分析

    {}%は通常どおり、配列上のマップのように機能します
    。文字のコピーをスタックにプッシュします
    「ETIAN ...」これは大文字のルックアップテーブルです
    ?string.findのように、文字列内の文字のインデックスを返します
                  または、見つからない場合は-1(つまり、数字)
    )そのインデックスをインクリメントして、E => 2 T => 3 I => 4など。
                  charは大文字でもスペースでもありません。現在は0です(False)
    「?/ '#!...」は、数字のルックアップテーブルです。それはで使用されます
                  他のルックアップテーブルと逆の方法。
    @文字のコピーをスタックの一番上にプルします
    ))%10 2を追加してmod 10を取得することにより、ASCII数字を数値に変換します。
                  すべて大文字であるため、この方法で行うことが重要です
                  文字もこのコードをヒットし、それらが落ちることを確認する必要があります
                  0..9の範囲内では、次のステップは失敗します。
    =文字列からn番目の文字を引き出します。例:「Hello」1 =「e」を返します
    または、大文字の検索が失敗した場合、結果が0になるため、
                  数字検索が使用されます
    2baseはbase 2に変換するため、E => [1 0]、T => [1 1]、I => [1 0 0]など。
    (;リストの先頭をポップして捨てるので、E => [0]、T => [1]
    {!45 +}%は各ビットを否定し、45を追加します。これにより、ASCII値のが得られます。そして-
    n改行は各単語を区切ります。あなたがしたい場合、これは32になります
                  1ストロークのコストで単語をスペースで区切ります

Golfscript-85文字

ここでは要件が緩和されているため、これはSOの回答よりも短くなっています。入力は大文字/数字で、句読文字「。、?」である必要があります

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

ここでは句読点も必要ないため、答えをさらに短くすることができます

SO Golfscriptからの私の答え
-107文字

入力の最後の改行はサポートされていないため、次のようなものを使用してください

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

文字は特殊なケースであり、小文字に変換され、バイナリ位置で順序付けられます。他のすべては変換テーブルによって行われます

' '/{{.32|"!etianmsurwdkgohvf!l!pjbxcyzq"?)"UsL?/'#! 08<>"@".,?0123456789"?=or
2base(;>{'.-'\=}%' '}%}%'/'*

ここでのコードブロックの順序は、GeorgeのUserScriptを混乱させています。再配置するのに手間がかかりますか?そして、私それが説明されるのを見たいです。暗黙のツリーを取得しますが、残りは私にとって謎です。
dmckee

@dmckee、できました。ジョージの台本は、私のカウントが1つ外れていることに気づいたので、それも修正しました
ニブラー

分析を見るために賛成票を要求する...ブー!分析は、答えを賛成票に値するものです!
ニックラーセン

@ニック、わかりましたそれは私がそれを得ることができる限り短いと思うので、私はその分析に取り組むことができます
ニブラー

20

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

簡単に説明すると、文字列はヒープであり、左の子はドットで、右の子はダッシュです。レターを作成するには、順番を逆にたどります。


2
これは私が今まで見た中で最高のアイデアです。
アレクサンドル

そして、私はリンクされたスレッドを読んで、これがオリジナルとは程遠いことに気付きました。
ニックラーセン

1
そこを見てETIAN...、golfscriptと同じように機能すると仮定しましたが、文字列を解釈する方法は異なります。それは同等だと思いますが、インデックスに1を追加し、バイナリ表現を使用して、先頭の1 "の後のすべての数字のドットとダッシュを取得します。たとえばF=>18=>0b10010=>..-.
-gnibbler

あなたはスペースを必要としませんString[] a
チョイス

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
パイプの周りのスペースも同様に削除できます
;

1
はい、それらのスペースは数えていません。わかりやすくするためにここに印刷しています:)
Eelvex

2
(あなたはそれをたくさん短縮するブレース展開を使用することができ/g;s/なった,-プラスオーバーヘッドのビット)。
ナブ

@nabb良いアイデア。
エルベックス

1
trをドロップし、y代わりにsedのコマンドを使用することができます
ハストゥルン

6

Haskell — 314 292 291文字

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

2つの文字の間には1つの空白があり、2つの単語の間には7つの空白があります。


@dmckee "Code Golf:Morse code"で参照されている質問をチェックしたところ、Haskellバージョンが見つかりませんでした。私は、314より短い可能性があると思います。
ヤシルアルサヌカエフ

fromJust.elemIndex cと書くことができますhead.findIndices(==c)。これはもう1文字ですが、を取り除くことができるimport Data.Maybeため、合計17文字を節約できます。intercalateを呼び出すたびに文字列の前のスペースを削除することで、2文字を保存することもできます。そしてi=intercalate、最初に実行し、2つの呼び出しをに置き換えて、別の数文字を追加intercalateiます。
sepp2k

@ sepp2k:いいね!ありがとう。またintercalate、6人のキャラクターと一緒に遊んで保存しました!:-)
ヤシルアルサヌカエフ

することもできますw=words。これは、私が間違えなければ1文字を保存します。そして、代わりにl c=...map l、あなたが行う必要がありますmap\c->...(閉じ括弧がとにかくその後すでにありますので、あなたもラムダ周りの括弧は必要ありません)。
sepp2k

@ sepp2k:のインライン化l c=...は1文字を節約しましたが、かっこなしでは配置できませんでしたmap(\c->...)。GHCバージョン6.12.3。
ヤシルアルサヌカエフ

4

追記 (310) (462) (414)(319)(46)を含む。

数字と文字を組み合わせた3進エンコード。5桁の3桁が1バイトに収まります!これにより、これらの愚かな違いのループ、および特別なケースの番号が完全に排除されます。

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

サンプル出力

ルーサーDr00g!
。---。。。。---。。。。。---。---。。。---。--- --- --- --- --- --- --- --- --- --- --- ---。!

ゴルフをしていないとコメント。私はこれをとても誇りに思っています。私はそれがエレガントで、数字が仕事をするように感じます。:)

%!
%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桁の3進数を表します。また、バイトはASCII85でさらにエンコードされます(ポストスクリプトは自動的にデコードできます)。

%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

ルビー、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}*''

各数字を単一の文字にエンコードします。1はダッシュ、0はドットで、先頭に1をマーカービットとして追加します(さらに印刷可能な状態を維持するためのオフセット。ASCII数学を使用して入力インデックスをルックアップインデックスとして使用します)。


4

VB.NET、233バイト

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

その最後の機能は悪です。

編集 いくつかの改善。

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

ゴルフにVB.netが使用されたことを覚えていないため、これを+1することにしました。
mbomb007

3

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

これは小文字をエンコードし、モールス符号シーケンスは末尾スペースで印刷されます


3

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を変換します。

編集:

または、翻訳後にJavaがエラーをスローしても構わない場合は、447文字で入力してください。

    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}

読みやすいバージョン

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

「何らかの理由で最初と最後に余分なトークンを取得します」:Perl 6を知りませんが、空の文字列が最初の単語境界の前と最後の単語境界の後に一致するためだと思います。
msh210

2

sed、159バイト

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バイトを減算します。その後、我々は数字を前処理する028および9それらの最終的なシンボルを放出します。

ループは、各入力文字の最終シンボルを生成し、次の反復のために各文字を変換します。これは、Wikipediaの記事に示されている二分検索テーブルを調べるのと同じです。特別な処理が必要な数字には、ASCII英数字にない親があることがわかります。

ループは、すべての文字が終了スペースに達すると終了します(「e」または「t」の後)。

たとえば、文字kは3つのパスで変換されます。

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

2

Python 3、99文字

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

大文字と小文字で動作します。


2

C、162 160文字

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

162文字ではありません...ゴルフバージョンを投稿してください。
チョイス

@Cyoce申し訳ありませんが、それは退屈な機械的プロセスであり、ソースコードの読み取りを難しくするだけなので、重要ではない空白を削除しませんでした。そのような空白を削除したバージョンを追加しました:)。
ホタル


1

Perl(489文字)

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


1
これを286文字まで%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//}
減らす

1

PHP、474文字

<?$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,'.-');
manatwork

1

05AB1E、81バイト(非競合)

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

オンラインでお試しください!

文字パターンを基数3に、数値パターンを基数2に変換し、ゼロインデックス付きASCII文字変換を使用して、ピリオドとハイフンを取得します。小文字では機能しません。



1

Powershell、142バイト

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

ゴルフの少ないテストスクリプト:

$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: #$%^&

注:出力には末尾スペースが含まれます。


1
+mazzy+いくつかの生意気なパディングです
ベスカ

1

APL(NARS)、71文字、142バイト

{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"
•••• • •-•• •-•• ---   •-- --- •-• •-•• -••  

各文字は1つのスペースから分離され、各単語は3つのスペースから分離されます。このテーブルは、英数字文字列⎕A,⎕Dと8ビット文字'ܨ㈍İᄧюᜪࠄᨳ䜏ഁᙂ᥃䴫쩸穼蚠'に分割された16ビット文字に基づいて構築され、それぞれが逆の数字で基数3に変換されます。


1

05AB1E、52バイト

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

1

JavaScript(ES6)、184バイト

これらの両方のバージョンでは、文字間にスペースが挿入されます。変換0-9およびaz(大文字と小文字を区別しない)は変換されます。スペースは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のため、印刷できない文字がいくつか表示されていません。編集モードに入ると表示されます。

ヘクスは次のとおりです。

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

読み取り可能なバージョン、234バイト

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

0

Python 2、283 274バイト

英数字の文字列を作成し、文字列内でのモールス符号表現を説明します。もともとはバイナリを使用するつもりでした01が、と同じになり1ます。で使用される三元は、私はそう- = 1. = 2。したがって、文字c1121この文字列のインデックスにあり、そのモールス符号表現は--.-です。

  • バイトを節約するために、スペース、ダッシュ、ドットの変数を作成しました。
  • 次に、空白を減らすために、いくつかの置換ステートメントを使用して「デコーダ」文字列をハードコーディングしました。
  • 関数の一部は、インデックスを3進数の配列に変換します
  • 他の部分の関数は文字列を取り、各文字をモールス符号に変換します。文字の後に3つのスペースと単語の間に7(余分な4)があります
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")=="...--       .----   ....-       .----   .....   ")

更新

  • -9 [16-05-09]三項計算関数をメイン関数に組み込みました

[注:末尾の空白は常にありますが、空白は一時停止を表すため、私は大丈夫です]


0

PHP、157の 150 157バイト

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ます。

モールス符号の10進解釈、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リーディングゼロを保持するためにリーディングを追加してバイナリにエンコードされたモールス符号。文字をループし、それらを1つずつ変換します。で実行し-nrます。

文字にエンコードされた10数、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;

2番目のゴルフ:10進値に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;

3番目のゴルフ:数字と文字のマッピングを単一の文字列にマージしました。


0

SmileBASIC、194 190バイト

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.