표준 입력을 Morse 코드 로 변환하는 가장 짧은 프로그램을 작성하십시오 . 표에없는 문자는 그대로 인쇄해야합니다.
표준 입력을 Morse 코드 로 변환하는 가장 짧은 프로그램을 작성하십시오 . 표에없는 문자는 그대로 인쇄해야합니다.
답변:
이 답변은 대문자와 숫자 만 지원합니다. 문자는 개행으로 구분되고 단어는 개행으로 구분됩니다
{." 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(;>{'.-'\=}%' '}%}%'/'*
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+" ");
}
}
}
간단한 설명을 위해 문자열은 왼쪽 자식이 점이고 오른쪽 자식이 대시 인 힙입니다. 편지를 만들려면 순서를 거꾸로 뒤로 이동합니다.
ETIAN...
안에있는 것을 보았을 때 골프 스크립트와 동일하게 작동한다고 가정했지만 문자열을 해석하는 다른 방법이 있습니다. 나는 그것이 동등하다고 생각하지만 색인에 1을 더하고 이진 표현을 사용하여 선행 1 "뒤에 모든 숫자에 대한 점과 대시를 얻습니다. 예 :F=>18=>0b10010=>..-.
String[] a
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'
/g;s/
됩니다 ,
- 플러스 오버 헤드 비트).
y
대신 sed의 명령을 사용하십시오
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 개 있습니다.
fromJust.elemIndex c
로 쓸 수 있습니다 head.findIndices(==c)
. 그것은 한 문자 이상이지만을 제거 할 수 import Data.Maybe
있으므로 총 17자를 절약 할 수 있습니다. intercalate를 호출 할 때마다 문자열 앞의 공백을 제거하여 두 문자를 저장할 수도 있습니다. 그리고 i=intercalate
시작 부분 을 수행 하고 두 호출을 intercalate
로 바꾸어 또 다른 몇 문자 i
.
intercalate
6 명의 캐릭터를 가지고 놀았고 저장했습니다! :-)
w=words
내가 실수하지 않으면 하나의 문자를 저장하는을 수행 할 수도 있습니다 . 그리고 대신 l c=...
하고 map l
, 당신은해야한다 map\c->...
(어쨌든 이후 이미 닫는 괄호가 이후 당신도 람다 주위에 괄호가 필요하지 않습니다).
l c=...
1 문자를 절약했지만으로 만 parens없이 넣을 수 없었습니다 map(\c->...)
. GHC 버전 6.12.3.
추신 (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)
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
리스프 ( 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)))))
이것은 소문자를 인코딩하고 모스 코드 시퀀스는 후행 공백으로 인쇄됩니다
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){}}}
펄 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;
}
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
, 8
및 9
최종 심볼을 방출 할 수 있습니다.
루프는 각 입력 문자에 대한 최종 기호를 생성 한 후 다음 반복을 위해 각 문자를 변환합니다. 이것은 Wikipedia 기사에 표시된 이분법 검색 테이블 을 걷는 것과 같습니다 . 특수 처리가 필요한 숫자는 ASCII 영숫자에없는 부모를 가진 것으로 볼 수 있습니다.
모든 문자가 종료 공간에 도달하면 ( 'e'또는 't'뒤) 루프가 종료됩니다.
예를 들어, 문자 k
는 세 단계로 변환됩니다.
k
=> k-
=>n-
n-
=> n.-
=>t.-
t.-
=> t-.-
=>-.-
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
.- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.. ----- .---- ..--- ...-- ....- ..... -.... --... ---.. ----.
%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에게 감사드립니다!
%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//}
<?$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,'.-');
Çvy©58‹i®58-•6V%·,Õo•2B5ôsè}®64›i®64-•4…·]ÑUZ“×\ó$9™¹“ÌLÈÎ%´•3B4ôsè}"012"".- "‡})
문자 패턴을 기수 3으로, 숫자 패턴을 기수 2로 변환하고 인덱스가없는 ASCII 음역을 사용하여 마침표와 하이픈을 얻습니다. 소문자로 작동하지 않습니다.
-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: #$%^&
참고 : 출력에는 후행 공백이 포함됩니다.
+mazzy+
건방진 패딩입니다
{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 진수로 반전 된 숫자로 변환됩니다.
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
이 두 버전 모두 문자 사이에 공백을 넣습니다. 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
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
문자열에 배치하면 모스 부호 표현을 설명하는 영숫자 문자열을 만들었습니다. 원래 바이너리를 사용하려고했지만와 01
동일합니다 1
. 그래서 - = 1
and와 삼항을 사용했습니다 . = 2
. 따라서 캐릭터 c
는 1121
이 문자열 에서 인덱스 에 있고 모스 코드 표현은 --.-
입니다.
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")=="...-- .---- ....- .---- ..... ")
최신 정보
[참고 : 항상 후행 공백이 있지만 공백은 일시 중지를 나타내므로 게스트는 괜찮습니다. ]
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;
세 번째 골프 : 숫자와 문자에 대한 매핑을 단일 문자열로 병합했습니다.