모스 부호를 표준 출력으로


13

이 질문에는 모스 부호를로 입력하는 것이 포함됩니다. (마침표) 및-(빼기 기호) (입력을 구분하기위한 공백) 당신의 임무는 코드를 표준 출력으로 변환하는 것입니다. 국제 입력 코드 알파벳 ( http://en.wikipedia.org/wiki/Morse_code#Letters.2C_numbers.2C_punctuation) 에있는 문자 기호 만 입력에 있다고 가정 할 수 있습니다 .

모든 출력은 소문자를 사용해야합니다. 이중 공백은 단어 공간으로 해석해야합니다.

샘플 입력 :

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

산출:

example. sos

2 주가 지난 후 가장 짧은 코드.


당신은 '문자 기호'만 그 문자 기호 라고 말 합니까?
Sinkingpoint

@Quirliom 해당 링크의 모든 "기호"는 문자입니다. 문자열에 넣을 수있는 것은 문자입니다 (기본적으로). 그러나 질문의 ​​그 부분은 기본적으로 모든 모스가 유효 할 것이라고 말합니다.
Justin

@Quirliom 예. 'a'와 '.'과 같은 모든 모스 '문자'. 'e'는 유효합니다. 모리스 이외의 문자는 처리 할 필요가 없습니다.

글자 공간과 단어 공간은 어떻습니까? 전자를위한 하나의 공간과 후자를위한 2 개의 공간?
Paul R

답변:


8

매스 매 티카 62

Mathematica 는 우리가 부정 행위를 할 수 있습니다

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

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

이자형

예.

오늘 부 드렸어?

처음 두 문자 ..-올바르게 작은 코드를 해석하는 것이 필요하다.


소문자로의 변환이 누락되었습니다.
피터 테일러

@PeterTaylor f=ToLowerCase@StringDrop[WolframAlpha[". .- "<>#,"Result"],2]&소문자에 맞게 쉽게 수정할 수 있습니다 .
ybeltukov

Wolfram Alpha API를 사용하지 않아도 응용 프로그램 ID가 필요합니까? 그렇다면 문자 수에 추가해서는 안됩니까? 그럼에도 불구하고 매우 영리한 솔루션입니다.
Björn Lindqvist

@ BjörnLindqvist Mathematica 에서이 명령을 정확히 평가하면 문제가 없습니다.
ybeltukov

23

Drat, 나는 GolfScripters가 도착하기 전에 여기에 오기를 바랐습니다 :-(

안 hoo ...

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
····$·······?_····"··.····@···'··-········;!·)·····,····:·······

나무 꼭대기에서 시작하여 왼쪽으로 이동하여 점을, 오른쪽으로 이동하여 대시를 내리십시오. 그런 다음 입력 문자열이 끝날 때 (예 : 공백 문자가있을 때) 발생하는 모든 문자를 출력하십시오. 그래서 예를 들어, 세 개의 점과 대시로 이동합니다 v통해 e, i그리고 s. 점 (ASCII \x2e)과 대시 (ASCII \x2d) 를 명시 적으로 확인하는 대신 마지막 비트 ( m[n]&1) 만 확인하면됩니다 ( 0은 .1, 1은) -.

6 개의 행으로 $7 도트 / 대시가있는을 제외한 모든 항목을 인코딩하기에 충분합니다 . ...-..-그러나 입력 데이터가 유효하므로 입력을 6 자 ( m[6]=0) ...-..$자르고 대신 해석 하여 쉽게 수정할 수 있습니다 . 또한 트리 데이터에서 마지막 7 바이트를 모두 잘라낼 수 있습니다. 모두 비어 있고 입력이 유효한 경우 필요하지 않기 때문입니다.


1
6 문자 코드의 마지막 문자를 버리고 조회 테이블을 단축시키는 좋은 트릭입니다.
피터 테일러

2
알고리즘의 품질과 마찬가지로 토론의 명확성을 위해 많은 투표를하고 있습니다. 잘 했어.
Michael Stern

전체 문자열을 읽는 대신 문자별로 처리하여 몇 개의 문자를 제거 할 수 있는지 확인하십시오. c인라인 될 수 있습니다. 아마도 모듈로와 오프셋을 사용하여 더 높은 값을 함께 없애려고 할 수 있습니다. 이것이 내 솔루션에서하는 일입니다. 어쨌든 잘 했어!
FireFly

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+

이것은 최소한의 완벽한 해시 함수를 생성하는 최적 알고리즘 의 핵심 아이디어를 기반으로 ( 최소한의) 완벽한 해시를 사용합니다. 체코, 하 바스 및 마예 스키; 1992 년 . 이들의 기본 개념은 두 개의 해시 함수를 사용한다는 것입니다 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까지의 두 개의 다른 염기로 간단한 염기 변환을 사용하여 적절한 해시를 검색했습니다. 문자열을 0에서 54 사이의 값에 할당하고 싶지 않지만 해당 ASCII 코드에 문자열을 할당하고 싶지 않아 일부를 (g[f1(str)] + g[f2(str)]) % m(g[f1(str)] + g[f2(str)]) % N했습니다 N > 'z'. 그러나 그것은 자유 로움을 시도 N할 수 g있고주기가 있는지 여부에 관계없이 유효한 조회 테이블을 허용 하는지 여부를 확인할 수 있습니다. Czech 등과 달리 완벽한 해시 함수 검색이 O (n ^ 4)인지는 상관하지 않습니다.

-4base5basemod에 의해 생성 된 그래프 59는 다음 과 같습니다.

약간의 미세 조정으로 점으로 렌더링 된 그래프

이는 우리가 올라 가야 할 길이 1의 3주기를 가지고있는 가장 큰 연결된 기기에서 떨어져 상당히 좋은 N=233우리가 찾을 수 있습니다 전에 g일치하는합니다.


룩업 테이블의 다른 가능한 인코딩 : 차이점 인코딩은 구조가 없기 때문에 도움이되지 않습니다. 순열로 인코딩하여 값의 비 반복을 활용할 수 있지만 간격을 개별적으로 처리해야합니다 (54 개의 출력 문자 => 30 바이트의 엔트로피 + 디코딩, 실행은 인코딩 된 경우 최소 15 바이트 필요) 똑 바른 기본 변환으로; 현재 총 92 바이트를 개선 할 수있을 것입니다.
피터 테일러

접두사 코드가 아니기 때문에 어려운 작업을 zlib 구현으로 쉽게 전환 할 수 없습니다.
피터 테일러

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점 또는 대시를 비트로 변환합니다. 아이디어는 단순히 각 문자에 대해 고유 한 숫자를 이진수로 해석하여 (가변 길이를 처리하기 위해 1을 접두사로 붙인 후) (이 해석은 v*2 + c%2부분)입니다. 그런 다음 결과 값 ( v < 64? v : v % 51 + 33, 시행 착오를 통해 발견 된 상수 및 분포를보고 큰 차이를 찾으려고 시도)을 해시하여 압축 한 137 문자 LUT를 얻습니다 . 불행히도이 해시 함수에는 단일 충돌이 있으므로 40 → '&'매핑 을 특수하게 처리해야 합니다.


4

R , 145 바이트

점을 2로, 1로 대시를 변환하고 3 진수로 숫자를 해석하고 모드 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은 error를 제공 Cannot read property '42' of undefined하고 IdeOne 은 오류 를보고합니다 (유용한 메시지는 없지만).
피터 테일러

그것을 수정하십시오 :)
Timtech

@PeterTaylor 그것은 4 개의 평면, 즉 최대 4 자 길이의 모스 부호 만 지원하므로 . -..- .- -- .--. .-.. . .-.-.-마지막 코드는 6 자이므로 입력으로 받아들이지 않을 것이라고 언급 되어 있습니다. 예제 스크립트에서 나는 그것을 생략하고 . -..- .- -- .--. .-..alerts ( example)로 이동합니다.
aularon

다음은 두 번째 블록 코드가있는 바이올린입니다. jsfiddle.net/aularon/AHY4e/1
aularon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.