モールス符号を標準出力に


13

この質問は、モールス信号の入力をとして取ります。(ピリオド)と-(マイナス記号)。入力を区切るスペースがあります。あなたの仕事は、コードを標準出力に変換することです。http://en.wikipedia.org/wiki/Morse_code#Letters.2C_numbers.2C_punctuationにある国際モールス符号アルファベットの文字記号のみが入力に含まれていると想定できます。

すべての出力には小文字を使用する必要があります。ダブルスペースは、ワードスペースとして解釈する必要があります。

サンプル入力:

. -..- .- -- .--. .-.. . .-.-.-  ... --- ...

出力:

example. sos

2週間後の最短コードが勝ちます。


あなたはその「文字記号」だけがその文字記号であると言いますか?
シンキングポイント14年

@Quirliomそのリンク内のすべての「記号」は文字です。Stringに入れることができるものはすべて文字です(基本的に)。しかし、質問のその部分は、基本的にすべてのモールス信号が有効であると言っています。
ジャスティン14年

@Quirliomはい、「a」や「。」のように、すべてのモールス「文字」。「e」は有効です。モース文字以外の文字を処理する必要はありません。

文字スペースと単語スペースはどうですか?前者には1つのスペース、後者には2つ(またはそれ以上)のスペースがありますか?
ポールR 14年

回答:


8

Mathematica 62

Mathematicaはチートを可能にする

f=ToLowerCase@StringDrop[WolframAlpha[". .- "<>#,"Result"],2]&

f@"."
f@". -..- .- -- .--. .-.. . .-.-.-"
f@".... .- ...- .  -.-- --- ..-  -- --- --- . -..  - --- -.. .- -.-- ..--.."

e

例。

今日は気分がよろしいですか?

最初の2つのシンボル..-は、小さなコードを正しく解釈するために必要です。


これには、小文字への変換がありません。
ピーターテイラー14年

@PeterTaylor小文字に簡単に変更できます f=ToLowerCase@StringDrop[WolframAlpha[". .- "<>#,"Result"],2]&
イベルトゥコフ14年

Wolfram Alpha APIを使用するにはアプリケーションIDが必要ではありませんか?もしそうなら、それは文字数に追加すべきではありませんか?それにもかかわらず非常に賢い解決策。
ビョルンリンドクヴィスト

BjörnLindqvistだけはでまさにこのコマンドを評価@ Mathematicaに、それは罰金をフォーク。
イベルトゥコフ

23

ドラット、GolfScriptersが到着する前にここに行きたいと思っていた:-(

とにかく...

C:228文字:

char n,t,m[9],*c=" etianmsurwdkgohvf l pjbxcyzq  54 3   2& +    16=/   ( 7   8 90    $       ?_    \"  .    @   '  -        ;! )     ,    :";
main(){while(scanf("%s",m)>0){for(t=m[6]=n=0;m[n];n++)t+=t+1+(m[n]&1);putchar(c[t]);}}

これがどのように機能するかの説明を追加すると思いました。

入力データはのツリーデータに従って解析され、*c次のように展開できます(·空のノードを表すために使用します)。

                     dot <-- (start) --> dash
                e                               t
        i               a               n               m
    s       u       r       w       d       k       g       o
  h   v   f   ·   l   ·   p   j   b   x   c   y   z   q   ·   ·
 5 4 · 3 · · · 2 & · + · · · · 1 6 = / · · · ( · 7 · · · 8 · 9 0
····$·······?_····"··.····@···'··-········;!·)·····,····:·······

ツリーの最上部から始めて、左に移動してドットを、右に移動してダッシュします。次に、入力文字列が終了したとき(つまり、空白文字に遭遇したとき)に発生した文字を出力します。だから、例えば、3つのドットとダッシュに行くことができますvを経由してeiそしてs。代わりに、明示的にドット(ASCIIをチェックする\x2e)とダッシュ(ASCII \x2d)、我々は唯一の最後のビット(チェックする必要があるm[n]&1ため0である)、.および1を-

6行は除くエンコードすべてに十分で$7点/ダッシュを有し、:...-..-が、入力データが有効であることが保証されるので、これは簡単に6つの文字(の入力を切り捨てることによって固定することができるm[6]=0)と解釈する...-..ように$代わりに。ツリーデータから最後の7バイトを削除することもできます。これらはすべて空であり、入力が有効な場合は必要ないからです。


1
6文字のコードの最後の文字を破棄し、ルックアップテーブルを短縮するための素敵なトリック。
ピーターテイラー14年

2
アルゴリズムの品質と同様に、議論を明確にするために投票します。よくできました。
マイケル・スターン14年

文字列全体を読み込むのではなく、文字ごとに処理することでいくつかの文字をc削除できるかどうかを確認します。インライン化できます。おそらく、モジュロとオフセットを使用して、より高い値をまとめてスキッシュすることができます。これは私が私のソリューションで行うことです。とにかく、いい仕事だ!
ホタル14年

8

GolfScript(116 113 97文字)

これには、ルックアップテーブルで使用される印刷できない文字が含まれているため、xxd出力として提供しています。

0000000: 6e2d 2720 272f 7b60 7b5c 6261 7365 2035
0000010: 3925 2210 a9cd 238d 57aa 8c17 d25c d31b
0000020: 432d 783e 277a 3823 e146 e833 6423 23ac
0000030: e72a 39d5 021c 4e33 3b30 3138 dc51 2044
0000040: 3aa7 d001 df4b 2032 333f 36ae 51c3 223d
0000050: 7d2b 5b35 2d34 5d2f 2b32 3333 257d 256e
0000060: 2b

これは以下に相当するプログラムにデコードします

n-' '/{`{\base 59%"\x10\xA9\xCD#\x8DW\xAA\x8C\x17\xD2\\\xD3\eC-x>'z8#\xE1F\xE83d##\xAC\xE7*9\xD5\x02\x1CN3;018\xDCQ D:\xA7\xD0\x01\xDFK 23?6\xAEQ\xC3"=}+[5-4]/+233%}%n+

本質的に

n-' '/{`{\base 59%"MAGIC STRING"=}+[5-4]/+233%}%n+

これは、最小完全ハッシュ関数を生成するための最適アルゴリズムのコアアイデアに基づく(非最小)完全ハッシュを使用します。チェコ語、Havas、Majewski。1992。彼らの基本的な考え方は、2つのハッシュ関数を使用する、ということですf1f2、一緒にルックアップテーブルを使ってg、そして完璧なハッシュがある(g[f1(str)] + g[f2(str)]) % m(ここで、m我々は区別したい文字列の数です)。巧妙なビットは、彼らが構築する方法gです。すべての値を考慮f1(str)し、f2(str)文字列のstr無向グラフにおけるノードとして関心のある、との間にエッジを追加f1(str)およびf2(str)各文字列に対して。各エッジが明確であるだけでなく、グラフが非周期的であることが必要です。次にg、各エッジが必要な合計を持つように、ノードに重みを割り当てる(つまり、ルックアップテーブルにデータを入力する)のは単なるDFS です。

チェコらはランダム関数f1を生成f2し、ルックアップテーブルで表されますが、それは明らかに良くありません:-10から9までの2つの異なるベースを持つ単純なベース変換を使用して適切なハッシュを検索しました。非循環の要件も緩和しました。私は0から54までの値に文字列を代入したくなかったが、対応するASCIIコードに、そうではなく取って(g[f1(str)] + g[f2(str)]) % m私が望んでいた(g[f1(str)] + g[f2(str)]) % NいくつかのためにN > 'z'。しかし、これにより、さまざまな試行をN行いg、サイクルがあるかどうかに関係なく、それらのいずれかが有効なルックアップテーブルを許可するかどうかを確認できます。チェコなどとは異なり、完全なハッシュ関数の検索がO(n ^ 4)であるかどうかは気にしません。

-4baseおよび5basemod によって生成されるグラフ59は次のとおりです。

いくつかの微調整を加えたドットでレンダリングされたグラフ

これは、我々はまで行かなければならない長さ1の3つのサイクルを持っている最大の連結成分から離れてかなりいいですN=233、我々は見つけることができる前に、g一致しているが。


ルックアップテーブルのその他の可能なエンコード:構造がないため、差分エンコードは役に立ちません。順列としてエンコードすることで値の非反復を活用することも可能かもしれませんが、ギャップを個別に処理する必要があります(54出力文字=> 30バイトのエントロピー、およびデコード、エンコードされた場合、実行には少なくとも15バイトが必要です)単純なベース変換として、現在の合計92バイトを改善することだけが可能かもしれません)または138項目(98バイトを超えるエントロピーに加えてデコード)を並べ替えています。
ピーターテイラー14年

これは非接頭辞コードであるため、ハードワークを簡単にzlib実装に振り向けることはできません。
ピーターテイラー14年

4

C、169文字

より良いハッシュ関数が見つかりませんでした。

(私は縮小されていないコードを投稿しましたが、縮小されたとカウントしました;縮小するに:%s/ //g | %j!はvimで行うだけで、文字列リテラルにスペースを戻します。)

c, v = 1;

main() {
  while (c = getchar(), ~c)
    v = c < 33? putchar(
      "& etianmsurwdkgohvf.l.pjbxcyzq..54.3.;!2).+...,16=/:..(.7.?_8.9o\"...$...@...'..-"[v < 64? (v != 40)*v : v % 51 + 33]
    ), 1 : v * 2 + c % 2;
}

テスト走行

morse.inモールス信号の個別の行全体のアルファベットのみ):

% clang morse.c && ./a.out </tmp/morse.in
abcdefghijklmnopqrstuvwxyzO123456789.,?'!/()&:;=+-_"$@
% ./a.out <<<'. -..- .- -- .--. .-.. . .-.-.-  ... --- ...'
example. sos

説明

これはかなり簡単です。c < 33空白/区切り文字を見つけた(\n、EOF、...)。c % 2ドットまたはダッシュをビットに変換します。アイデアは、単純に2進数として解釈することにより、各文字に一意の番号を作成することです(可変長を処理するために1を前に付けた後)(この解釈はv*2 + c%2一部です)。次に、137文字のLUTを取得します。結果の値をハッシュすることで圧縮しv < 64? v : v % 51 + 33ました(試行錯誤で見つかった定数、および分布を見て、大きなギャップを見つけようとします)。残念ながら、このハッシュ関数には単一の衝突があるため、40 → '&'マッピングを特殊なケースにする必要があります。


4

R、145バイト

ドットを2に変換し、ダッシュを1に変換し、数値を3進数で解釈し、mod 89を取得します。これにより、ハッシュテーブルで使用できる一意の数値が得られます。ASCII 13はTIOでは機能しないため、13(111 base-3)が存在するということは、1を追加することを意味します。

cat(c(letters,0:9,".")[match(strtoi(chartr(".-","12",scan(,"",t=scan(,""))),3)%%89+1,utf8ToInt('DG,)62	5N*EHMAI.%"!4=@'))],sep='')

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

R、236バイト(非競合)

これは競争力のあるものとはなりませんが、Rで興味深いものを見せることができます。引用された言語構造内にモールス符号ツリーを保存し、再帰的に適用できるm事実を使用して、ドットとダッシュのコードからそれを取得します[[リスト。たとえば、m[[c(2,2,3,2)]]ドット、ドット、ダッシュ、ドット、または「f」を取得します。

m=quote(.(e(i(s(h(5,4),v(,3)),u(f,M(,2))),a(r(l,.(.(,.),)),w(p,j(,1)))),t(n(d(b(6),x),k(c,y)),m(g(z(7),q),o(D(8),S(9,0))))))
for(w in scan(,"",t=scan(,"")))
cat(chartr("MDS","-. ","if"(is.symbol(z<-m[[(utf8ToInt(w)==45)+2]]),z,z[[1]])))

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


1

Powershell、193バイト

$n=1
-join("$args "|% t*y|%{if($_-32){$n=$n*2+($_-ne'.')}else{("  etianmsurwdkgohvf l pjbxcyzq  54 3   2& +~16=/   ( 7   8 90~~~?~ `"  .~@   '  -~~;! )~ ,~:~~~~$"-replace'~','    ')[$n]
$n=1}})

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

$f = {

$n=1
-join(
    "$args "|% t*y|%{
        if($_-32){
            $n=$n*2+($_-ne'.')
        }else{
            ("  etianmsurwdkgohvf l pjbxcyzq  54 3   2& +~16=/   ( 7   8 90~~~?~ `"  .~@   '  -~~;! )~ ,~:~~~~$"-replace'~','    ')[$n]
            $n=1
        }
    }
)

}

@(
    ,("example. sos",". -..- .- -- .--. .-.. . .-.-.-  ... --- ...")
    ,("0123456789abcdefghijklmnopqrstuvwxyz","----- .---- ..--- ...-- ....- ..... -.... --... ---.. ----. .- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --..")
    ,("hello world", ".... . .-.. .-.. ---  .-- --- .-. .-.. -..")
) | % {
    $expected,$s = $_
    $result = &$f $s
    "$($result-eq$expected): $result"
}

出力:

True: example. sos
True: 0123456789abcdefghijklmnopqrstuvwxyz
True: hello world

0

JavaScript(165バイト、4つのプレーンのみを実装します。)

n=''.replace(/\./g,1).replace(/-/g,0).split(' ')
l='|te|mnai|ogkdwrus|cöqzycxbjpälüfvh'.split('|')
r=''
for(i in n){r+=l[n[i].length][parseInt(n[i],2)]}
alert(r)

入力をに割り当てn、次のコードを実行して出力を取得します。

n='. -..- .- -- .--. .-.. .'.replace(/\./g,1).replace(/-/g,0).split(' ')
l='|te|mnai|ogkdwrus|cöqzycxbjpälüfvh'.split('|')
r=''
for(i in n) {r+=l[n[i].length][parseInt(n[i],2)]}
alert(r)

これは不完全な実装のように見えるだけでなく、機能しません。Fiddle + ChromeはエラーCannot read property '42' of undefinedを返し、IdeOne はエラーも報告します(有用なメッセージはありません)。
ピーターテイラー14年

修正してみてください:)
ティムテック14年

@PeterTaylor 4つのプレーン、つまり4文字のモールス信号までしかサポートしないと述べられています。したがって. -..- .- -- .--. .-.. . .-.-.-、最後のコードは6文字なので、入力として受け入れません。サンプルスクリプトでは. -..- .- -- .--. .-..、これを省略し、alerts(example)で進みます。
アラロン14年

2番目のブロックコードのフィドル:jsfiddle.net/aularon/AHY4e/1-aularon 14
1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.