모스 부호 번역기


32

표준 입력을 Morse 코드 로 변환하는 가장 짧은 프로그램을 작성하십시오 . 표에없는 문자는 그대로 인쇄해야합니다.

국제 모스 부호


1
대문자와 소문자가 모두 인코딩되어 있습니까?
Joey Adams

9
또한 단어 사이의 간격과 같은 세부 사항을 명확하게하기 위해 샘플 입력 및 출력을 제공 할 수 있습니까?
Joey Adams

모스에서는 소문자와 대문자의 차이가 없습니다. 공간에 대한 실제 기호는 없습니다 (정지 시간의 3/4 배임). 공간으로 변환해야한다고 생각합니다.
Shikiryu

@ 조이 : 세부 사항은 당신에게 달려 있습니다.
Alexandru

Stack Overflow question Code Golf : Morse code 와 유사합니다 .
dmckee

답변:


11

골프 스크립트-74 자

이 답변은 대문자와 숫자 만 지원합니다. 문자는 개행으로 구분되고 단어는 개행으로 구분됩니다

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

분석

    평소와 같이 {} %는 배열의지도처럼 작동합니다.
    . 숯의 사본을 스택에 밀어 넣다
    "ETIAN ..."이것은 대문자를위한 룩업 테이블입니다.
    ? string.find는 문자열에서 char의 인덱스를 반환합니다.
                  발견되지 않은 경우는 -1 (즉 숫자)
    ) 해당 인덱스를 증가시켜 E => 2 T => 3 I => 4 등이
                  char는 대문자 나 공백이 아닙니다. 이제 0입니다 (거짓)
    "? / '#! ..."이것은 숫자의 검색 표입니다. 그것은에 사용될 것입니다
                  다른 룩업 테이블로 반대로 이동하십시오.
    @ char로 만든 사본을 스택 상단으로 당깁니다.
    )) % 10은 2를 더하고 mod 10을 취하여 ASCII 숫자를 숫자로 변환합니다.
                  대문자로되어 있기 때문에 이렇게하는 것이 중요합니다
                  글자도이 코드에 부딪 치므로 반드시 넘어 져야합니다.
                  0..9 범위에서 또는 다음 단계는 실패합니다.
    = 문자열에서 n 번째 문자를 가져옵니다. 예 : "Hello"1 = "e"제공
    또는 대문자 조회가 실패하면 결과가 0이므로
                  숫자 조회가 사용됩니다
    2base는 base 2로 변환하므로 E => [10], T => [11], I => [100] 등
    (; 목록의 앞면을 열어서 버립니다. E => [0], T => [1]
    {! 45 +} %는 각 비트를 부정하고 45를 더합니다. 이는 ascii 값을 제공합니다. 그리고-
    n 개행은 각 단어를 분리합니다. 당신이 원한다면 이것은 32 일 수 있습니다
                  1 스트로크의 비용으로 단어를 공백으로 분리

골프 스크립트-85 자

여기는 편안한 요구 사항으로 인해 내 대답보다 짧습니다. 입력은 대문자 / 숫자 및 문장 부호 문자 ".,?"여야합니다.

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

여기에 구두점이 필요하지 않기 때문에 답을 더 짧게 할 수 있습니다

SO Golfscript의 답변
-107 자

입력 끝에 줄 바꿈이 지원되지 않으므로 다음과 같이 사용하십시오.

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

문자는 특수한 경우이며 소문자로 변환되어 2 진 위치로 정렬됩니다. 다른 모든 것은 번역 테이블에 의해 수행됩니다.

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

여기에서 코드 블록의 순서는 George 's UserScript 혼동 됩니다. 재배치에 문제가 생길 수 있습니까? 그리고 나는 것입니다 그것을 설명보고 싶다. 나는 암묵적 인 나무를 얻지 만 나머지는 나에게 신비입니다.
dmckee 2013

@dmckee, 완료 조지의 대본은 나의 숫자가 1
개로 줄어드는

분석을보기 위해 투표를 요구하는 중 ... 부! 분석은 upvotes의 가치있는 답변을 만드는 것입니다!
Nick Larsen

@Nick, 알았어. 나는 그것을 얻을 수있는 한 짧다고 생각한다. 그래서 나는 그 분석에 대해 작업 할 것이다
gnibbler

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
이것이 지금까지 본 최고의 아이디어입니다.
Alexandru

그런 다음 연결된 스레드를 읽고 이것이 원본과 거리가 멀다는 것을 알았습니다.
Nick Larsen

1
ETIAN...안에있는 것을 보았을 때 골프 스크립트와 동일하게 작동한다고 가정했지만 문자열을 해석하는 다른 방법이 있습니다. 나는 그것이 동등하다고 생각하지만 색인에 1을 더하고 이진 표현을 사용하여 선행 1 "뒤에 모든 숫자에 대한 점과 대시를 얻습니다. 예 :F=>18=>0b10010=>..-.
gnibbler

공간이 필요하지 않습니다String[] 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
파이프 주위의 공간도 제거 할 수 있습니다 ;-)
Yasir Arsanukaev

1
그렇습니다, 나는 그 공간을 세지 않고, 명확성을 위해 여기에 그것들을 인쇄합니다 :)
Eelvex

2
(당신은 그것을 많이 단축 할 중괄호 확장을 사용할 수 /g;s/됩니다 ,- 플러스 오버 헤드 비트).
Nabb

@nabb 좋은 생각입니다.
엘 벡스

1
tr을 삭제하고 y대신 sed의 명령을 사용하십시오
Hasturkun

6

하스켈 — 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"
".-- . .-.. -.-. --- -- .       .... ..- -- .- -. ..."

두 글자 사이에는 공백이 하나 있고 두 단어 사이에는 공백이 7 개 있습니다.


@dmckee "Code Golf : Morse code" 가 참조한 질문을 확인하고 Haskell 버전을 찾지 못했습니다. 314보다 짧은 것이 가능할 것이라고 생각합니다.
Yasir Arsanukaev

fromJust.elemIndex c로 쓸 수 있습니다 head.findIndices(==c). 그것은 한 문자 이상이지만을 제거 할 수 import Data.Maybe있으므로 총 17자를 절약 할 수 있습니다. intercalate를 호출 할 때마다 문자열 앞의 공백을 제거하여 두 문자를 저장할 수도 있습니다. 그리고 i=intercalate시작 부분 을 수행 하고 두 호출을 intercalate로 바꾸어 또 다른 몇 문자 i.
sepp2k

@ sepp2k : 좋은 생각이야! 감사. 나는 또한 intercalate6 명의 캐릭터를 가지고 놀았고 저장했습니다! :-)
Yasir Arsanukaev

w=words내가 실수하지 않으면 하나의 문자를 저장하는을 수행 할 수도 있습니다 . 그리고 대신 l c=...하고 map l, 당신은해야한다 map\c->...(어쨌든 이후 이미 닫는 괄호가 이후 당신도 람다 주위에 괄호가 필요하지 않습니다).
sepp2k

@ sepp2k : 인라인은 l c=...1 문자를 절약했지만으로 만 parens없이 넣을 수 없었습니다 map(\c->...). GHC 버전 6.12.3.
Yasir Arsanukaev

4

추신 (310) (462) (414)표에 (46) 을 포함하여 (319) .

삼항 인코딩으로 숫자와 문자를 결합했습니다. 바이트에 맞는 5 자리 3 자리 숫자! 이것은 어리석은 차이 루프와 특별한 대소 문자를 완전히 제거합니다.

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

리스프 ( 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

펄 6 (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 바이트를 뺍니다. 그런 다음 우리는 숫자를 사전 처리 0, 2, 89최종 심볼을 방출 할 수 있습니다.

루프는 각 입력 문자에 대한 최종 기호를 생성 한 후 다음 반복을 위해 각 문자를 변환합니다. 이것은 Wikipedia 기사에 표시된 이분법 검색 테이블 을 걷는 것과 같습니다 . 특수 처리가 필요한 숫자는 ASCII 영숫자에없는 부모를 가진 것으로 볼 수 있습니다.

모든 문자가 종료 공간에 도달하면 ( 'e'또는 't'뒤) 루프가 종료됩니다.

예를 들어, 문자 k는 세 단계로 변환됩니다.

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

2

파이썬 3, 99 자

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

대문자와 소문자로 작동합니다.


2

C, 162160

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

@Cyoce 죄송합니다, 그것은 지루한 기계적 프로세스이기 때문에 중요하지 않은 공백을 제거하지 않았으며 소스 코드를 읽기 어렵게 만듭니다. 이러한 공백이 제거 된 버전을 추가했습니다 :).
FireFly


1

펄 (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//}
msh210

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

파워 쉘, 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+건방진 패딩입니다
Veskah

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

각 문자는 하나의 공백으로 분리되고 각 단어는 3 개의 공백으로 분리됩니다. 테이블은 영숫자 문자열을 기반으로합니다.⎕A,⎕D 과 16 비트 문자 'ܨ㈍İᄧюᜪࠄᨳ䜏ഁᙂ᥃䴫쩸穼蚠'를 기반으로하며 8 비트 문자 로 분할되며 각각 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

자바 스크립트 (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로 인해 인쇄 할 수없는 두 문자가 표시되지 않습니다. 편집 모드로 들어가면 표시됩니다.

16 진수는 다음과 같습니다.

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

파이썬 2, 283 274 바이트

문자열에 배치하면 모스 부호 표현을 설명하는 영숫자 문자열을 만들었습니다. 원래 바이너리를 사용하려고했지만와 01동일합니다 1. 그래서 - = 1and와 삼항을 사용했습니다 . = 2. 따라서 캐릭터 c1121이 문자열 에서 인덱스 에 있고 모스 코드 표현은 --.-입니다.

  • 바이트를 절약하기 위해 공백, 대시 및 점에 대한 변수를 만들었습니다.
  • 그런 다음 공백을 줄이기 위해 몇 개의 replace 문을 사용하여 '디코더'문자열을 하드 코딩했습니다.
  • 함수의 일부는 인덱스를 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=>".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]);

straightfor : 전체 문자열을 한 번에 번역하고 문자를 모스 부호로 변환합니다.
파일 저장을 실행하거나 교체하기 <?=echo하고 실행 -r.

모스 부호의 십진 해석, 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선행 0을 유지하기 위해 추가 행간 으로 바이너리로 인코딩 된 모스 코드 . 문자를 반복하고 하나씩 변환합니다. 로 실행하십시오 -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;

두 번째 골프 : 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;

세 번째 골프 : 숫자와 문자에 대한 매핑을 단일 문자열로 병합했습니다.


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.