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.
Odpowiedzi:
Mathematica 62
Mathematica pozwala nam oszukiwać
Pierwsze dwa symbole
.
i.-
konieczna wykładnia małe kody są prawidłowo.źródło
f=ToLowerCase@StringDrop[WolframAlpha[". .- "<>#,"Result"],2]&
na małe litery.Cholera, miałem nadzieję dotrzeć tu, zanim pojawią się GolfScripterzy :-(
Anyhoo ...
C: 228 znaków:
Pomyślałem, że dodam wyjaśnienie, jak to działa.
Dane wejściowe są analizowane zgodnie z danymi drzewa, w
*c
którym można je rozwinąć w następujący sposób (używając·
do reprezentowania pustego węzła):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ę
v
przeze
,i
is
. 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.źródło
c
Moż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!GolfScript (
116 11397 znaków)Obejmuje to znaki niedrukowalne używane w tabeli odnośników, więc podaję je jako wynik xxd:
Dekoduje to do programu równoważnego z
co jest w istocie
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
f1
if2
wraz z tabelą odnośnikówg
, a idealnym hashem jest(g[f1(str)] + g[f2(str)]) % m
(gdziem
jest liczba ciągów znaków, które chcemy rozróżnić); sprytny jest sposób, w jaki budująg
. Rozważ wszystkie wartościf1(str)
if2(str)
ciągi znakówstr
jako węzły na niekierowanym wykresie i dodaj krawędź pomiędzyf1(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ówg
) tak, aby każda krawędź miała wymaganą sumę.Czech wsp generuje losowe funkcje
f1
if2
któ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)]) % N
dla niektórychN > 'z'
. Ale to pozwala swobodnie wypróbować różneN
i sprawdzić, czy którykolwiek z nich pozwala na prawidłową tabelę wyszukiwaniag
, 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
-4base
i5base
mod59
to: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=233
znaleźćg
spójny.źródło
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.)Testowe uruchomienie
(
morse.in
to tylko cały alfabet Morse'a w osobnych wierszach):Wyjaśnienie
Ten jest dość prosty.
c < 33
znajdzie znak spacji / separator (,
\n
, EOF, ...).c % 2
tł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 jestv*2 + c%2
częś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.źródło
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.
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
m
i 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ładm[[c(2,2,3,2)]]
pobiera kropkę, kropkę, myślnik, kropkę lub „f”.Wypróbuj online!
źródło
PowerShell, 193 bajtów
Skrypt testu mniej golfowego:
Wynik:
źródło
JavaScript (165 bajtów, implementuje tylko cztery płaszczyzny).
Wejście należy przypisać do
n
, wykonaj następujący kod, aby uzyskać wynik:źródło
Cannot read property '42' of undefined
, a IdeOne również zgłasza błąd (choć bez przydatnego komunikatu).. -..- .- -- .--. .-.. . .-.-.-
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
).