Kod Morse'a na standardowe wyjście

13

To pytanie wymaga wprowadzenia danych w kodzie Morse'a jako. (kropka) i - (symbol minus), ze spacjami do oddzielenia danych wejściowych. Twoim zadaniem jest konwersja kodu na standardowe wyjście. Możesz założyć, że jedyne dane wejściowe zawierają symbole znaków znajdujące się w alfabecie Międzynarodowego Kodu Morse'a, które można znaleźć tutaj: http://en.wikipedia.org/wiki/Morse_code#Letters.2C_numbers.2C_punctuation .

Wszystkie dane wyjściowe powinny zawierać małe litery. Podwójną spację należy interpretować jako spację słów.

Przykładowe dane wejściowe:

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

Wynik:

example. sos

Najkrótszy kod po dwóch tygodniach wygrywa.

Peter Taylor
źródło
Mówisz, że tylko „symbole znaków” to znaki i symbole?
Sinkingpoint
@Quirliom Wszystkie „symbole” w tym łączu są znakami. Wszystko, co możesz umieścić w String, jest postacią (cóż, w zasadzie). Jednak ta część pytania mówi w zasadzie, że każdy kawałek Morse'a będzie ważny.
Justin
@Quirliom Tak, każda postać Morse'a, taka jak .- dla „a” i. dla „e” jest ważne. Żadne postacie inne niż Morse'a nie muszą być obsługiwane.
Co z odstępami między literami i słowami? Jedno miejsce na pierwsze i dwa (lub więcej) na drugie?
Paul R
Nieznacznie (nie) powiązany: stackoverflow.com/questions/1352587/code-golf-morse-code
javatarz

Odpowiedzi:

8

Mathematica 62

Mathematica pozwala nam oszukiwać

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

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

mi

przykład.

Czy masz dzisiaj wrzód?

Pierwsze dwa symbole .i .-konieczna wykładnia małe kody są prawidłowo.

Ybeltukov
źródło
Brakuje konwersji na małe litery.
Peter Taylor
@PeterTaylor Można go łatwo zmienić f=ToLowerCase@StringDrop[WolframAlpha[". .- "<>#,"Result"],2]&na małe litery.
ybeltukov
Czy korzystanie z interfejsu API Wolfram Alpha nie wymaga identyfikatora aplikacji? Jeśli tak, to czy nie powinno to zwiększyć liczby postaci? Niemniej jednak bardzo sprytne rozwiązanie.
Björn Lindqvist
@ BjörnLindqvist Wystarczy ocenić dokładnie to polecenie w Mathematica , rozwidla się dobrze.
ybeltukov
23

Cholera, miałem nadzieję dotrzeć tu, zanim pojawią się GolfScripterzy :-(

Anyhoo ...

C: 228 znaków:

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]);}}

Pomyślałem, że dodam wyjaśnienie, jak to działa.

Dane wejściowe są analizowane zgodnie z danymi drzewa, w *cktórym można je rozwinąć w następujący sposób (używając ·do reprezentowania pustego węzła):

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

Zaczynając od szczytu drzewa, idź w dół, przesuwając się w lewo po kropkę i w prawo po kreskę. Następnie wypisz dowolny znak, na którym się znajdujesz, gdy łańcuch wejściowy się skończy (tj. Gdy napotkasz znak spacji). Na przykład trzy kropki i myślnik zabiorą Cię vprzez e, ii s. Zamiast jawnie sprawdzać kropki (ASCII \x2e) i myślniki (ASCII \x2d), musimy tylko sprawdzić ostatni bit ( m[n]&1), który wynosi 0 dla .i 1 dla -.

Wystarczy sześć wierszy, aby zakodować wszystko oprócz $, który ma 7 kropek / myślników:, ...-..-ale ponieważ gwarantuje się, że dane wejściowe są poprawne, można to łatwo naprawić poprzez obcięcie danych wejściowych o 6 znaków ( m[6]=0) i interpretację ...-..w $zamian. Możemy również odciąć ostatnie 7 bajtów z danych drzewa, ponieważ wszystkie są puste i nie są potrzebne, jeśli dane wejściowe są prawidłowe.

r3mainer
źródło
1
Fajna sztuczka, aby odrzucić ostatni znak 6-znakowych kodów i skrócić tabelę odnośników.
Peter Taylor
2
Głosuję tak samo za jasnością dyskusji, jak i za jakością algorytmu. Dobra robota.
Michael Stern
Sprawdź, czy możesz zrzucić kilka znaków, przetwarzając znak po znaku zamiast wczytywać cały ciąg znaków. cMożna wstawić. Być może mógłbyś użyć modulo i offsetu, aby spróbować połączyć wyższe wartości razem; to właśnie robię w moim rozwiązaniu. W każdym razie, dobra robota!
FireFly
8

GolfScript ( 116 113 97 znaków)

Obejmuje to znaki niedrukowalne używane w tabeli odnośników, więc podaję je jako wynik 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

Dekoduje to do programu równoważnego z

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+

co jest w istocie

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

Wykorzystuje (nie-minimalny) idealny skrót w oparciu o podstawową ideę Optymalnego algorytmu do generowania minimalnych funkcji skrótu; Czeski, Havas i Majewski; 1992 . Ich podstawową ideą jest to, że używasz dwóch funkcji skrótu f1i f2wraz z tabelą odnośników g, a idealnym hashem jest (g[f1(str)] + g[f2(str)]) % m(gdzie mjest liczba ciągów znaków, które chcemy rozróżnić); sprytny jest sposób, w jaki budują g. Rozważ wszystkie wartości f1(str)i f2(str)ciągi znaków strjako węzły na niekierowanym wykresie i dodaj krawędź pomiędzy f1(str)if2(str)dla każdego ciągu. Wymagają nie tylko, aby każda krawędź była odrębna, ale aby wykres był acykliczny; to po prostu DFS przypisuje wagi do węzłów (tj. wypełnia tabelę odnośników g) tak, aby każda krawędź miała wymaganą sumę.

Czech wsp generuje losowe funkcje f1i f2które są wyrażane za pomocą tabel przeglądowych, ale to oczywiście nie ma dobre: I przeszukiwane odpowiedniego mieszania przy użyciu prostych konwersji bazie dwóch różnych zasad od -10 do 9. również złagodzone wymóg acykliczny. Nie chciałem przypisywać ciągów do wartości od 0 do 54, ale do odpowiednich kodów ASCII, więc zamiast brać (g[f1(str)] + g[f2(str)]) % m, chciałem (g[f1(str)] + g[f2(str)]) % Ndla niektórych N > 'z'. Ale to pozwala swobodnie wypróbować różne Ni sprawdzić, czy którykolwiek z nich pozwala na prawidłową tabelę wyszukiwania g, niezależnie od tego, czy istnieją cykle. W przeciwieństwie do Czech i in. Nie dbam o to, czy poszukiwanie idealnej funkcji skrótu to O (n ^ 4).

Wykres generowany przez -4basei 5basemod 59to:

Wykres renderowany kropką z pewnymi drobnymi poprawkami

co jest całkiem miłe, z wyjątkiem największego podłączonego komponentu, który ma trzy cykle długości 1. Musimy iść do góry, aby N=233znaleźć gspójny.

Peter Taylor
źródło
Inne możliwe kodowania tabeli odnośników: kodowanie różnic nie pomoże, ponieważ nie ma struktury. Możliwe jest wykorzystanie niepowtarzalności wartości przez kodowanie jako permutację, ale albo luki muszą być obsługiwane osobno (54 znaki wyjściowe => 30 bajtów entropii plus dekodowanie; przebiegi wymagają co najmniej 15 bajtów, jeśli są zakodowane jako prosta konwersja podstawowa; może być możliwe ulepszenie obecnych 92 bajtów łącznie) lub dopuszczamy 138 elementów (ponad 98 bajtów entropii plus dekodowanie).
Peter Taylor
Ponieważ jest to kod, który nie jest prefiksem, nie możemy z łatwością spróbować odciążyć ciężkiej pracy od implementacji zlib.
Peter Taylor
4

C, 169 znaków

Nie mogłem znaleźć lepszej funkcji skrótu.

(Wysłałem nieuprawniony kod, ale policzyłem go jako zminimalizowany; aby zminimalizować, po prostu zrób :%s/ //g | %j!w vimie, a następnie umieść spację w dosłownym ciągu znaków.)

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

Testowe uruchomienie

( morse.into tylko cały alfabet Morse'a w osobnych wierszach):

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

Wyjaśnienie

Ten jest dość prosty. c < 33znajdzie znak spacji / separator ( , \n, EOF, ...). c % 2tłumaczy kropkę lub myślnik na trochę. Chodzi o to, aby utworzyć unikalny numer dla każdego znaku, po prostu interpretując go jako liczbę binarną (po prefiksie 1, aby poradzić sobie ze zmienną długością) (ta interpretacja jest v*2 + c%2częścią). Następnie otrzymuję 137-znakową LUT, którą skompresowałem, mieszając uzyskaną wartość ( v < 64? v : v % 51 + 33, stałe znalezione metodą prób i błędów oraz patrząc na rozkład i próbując znaleźć ogromną lukę). Niestety ta funkcja skrótu ma pojedyncze zderzenie, dlatego muszę specjalnie zaprojektować 40 → '&'mapowanie.

Robaczek świętojański
źródło
4

R , 145 bajtów

Przetłumaczyłem kropkę na 2, myślnik na 1 i zinterpretowaliśmy liczbę w trójce i przyjmując mod 89, który daje unikalny numer, którego możemy użyć w tablicy mieszającej. Obecność 13 (111 base-3) oznacza dodanie 1, ponieważ ASCII 13 nie działa w TIO.

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

Wypróbuj online!

R , 236 bajtów (niekonkurencyjny)

To nie będzie konkurencyjne, ale pozwala nam pokazać coś interesującego w R: przechowywać drzewo kodu Morse'a w strukturze cytowanego języka mi odzyskać go z kodu kropek i myślników bardzo prosto, korzystając z faktu, że [[można go zastosować rekurencyjnie do listy. Na przykład m[[c(2,2,3,2)]]pobiera kropkę, kropkę, myślnik, kropkę lub „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]])))

Wypróbuj online!

J.Doe
źródło
1

PowerShell, 193 bajtów

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

Skrypt testu mniej golfowego:

$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"
}

Wynik:

True: example. sos
True: 0123456789abcdefghijklmnopqrstuvwxyz
True: hello world
mazzy
źródło
0

JavaScript (165 bajtów, implementuje tylko cztery płaszczyzny).

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)

Wejście należy przypisać do n, wykonaj następujący kod, aby uzyskać wynik:

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)
aularon
źródło
Nie tylko wydaje się to niepełną implementacją, ale nawet nie działa. Fiddle + Chrome podaje błąd Cannot read property '42' of undefined, a IdeOne również zgłasza błąd (choć bez przydatnego komunikatu).
Peter Taylor
Spróbuj to naprawić :)
Timtech,
@PeterTaylor Stwierdzono, że obsługuje on tylko cztery płaszczyzny, tj. Do 4 znaków kodów Morse'a o długiej długości, dlatego nie będzie akceptowany . -..- .- -- .--. .-.. . .-.-.-jako dane wejściowe, ponieważ ostatni kod ma długość 6 znaków. W przykładowym skrypcie pomijam go i używam polecenia . -..- .- -- .--. .-..alerts ( example).
aularon
Oto skrzypce z drugim kodem blokowym: jsfiddle.net/aularon/AHY4e/1
aularon