Napisz najkrótszy program do przekształcenia standardowego wejścia w kod Morse'a . Znaki, których nie ma w tabeli, powinny być wydrukowane tak, jak są.
32
Napisz najkrótszy program do przekształcenia standardowego wejścia w kod Morse'a . Znaki, których nie ma w tabeli, powinny być wydrukowane tak, jak są.
Odpowiedzi:
Golfscript - 74 znaki
Ta odpowiedź obsługuje tylko wielkie litery i cyfry. Litery są oddzielone nowymi liniami, a słowa są oddzielone 2 nowymi liniami
Analiza
Golfscript - 85 znaków
Jest to mniej niż moja odpowiedź SO z powodu złagodzonych wymagań. Wprowadzone dane muszą składać się z wielkich liter / cyfr i znaków interpunkcyjnych „.,?”
Ponieważ interpunkcja nie jest tu nawet wymagana, mogę jeszcze bardziej skrócić odpowiedź
Moja odpowiedź od SO
Golfscript - 107 znaków
znak nowej linii na końcu danych wejściowych nie jest obsługiwany, więc użyj czegoś takiego
echo -n Hello, Codegolfers| ../golfscript.rb morse.gs
Listy są specjalnym przypadkiem i są konwertowane na małe litery i uporządkowane w ich pozycjach binarnych. Cała reszta odbywa się za pomocą tabeli tłumaczeń
źródło
C # (213 znaków)
Jestem pewien, że to nie potrwa długo, ale przynajmniej mam tutaj technikę!
I w czytelnym formacie:
Krótkie wyjaśnienie: ciąg znaków jest stertą, w której lewe dziecko jest kropką, a prawe dziecko jest kreską. Aby zbudować literę, przejdź wstecz i odwróć kolejność.
źródło
ETIAN...
, założyłem, że działa tak samo jak skrypt do gry w golfa, ale masz inny sposób interpretacji napisu. Myślę, że jest to równoważne, ale dodaję 1 do indeksu i używam reprezentacji binarnej, aby uzyskać kropki i myślniki dla wszystkich cyfr po wiodącym 1 ”, np.F=>18=>0b10010=>..-.
String[] a
tr + sed (347)
źródło
/g;s/
staje się,
- plus trochę narzutu).y
zamiast tego użyj polecenia sedHaskell -
314292291 znakówBardziej czytelna dla użytkownika forma:
Przykładowy przebieg:
Pojedyncza biała spacja między dwiema literami i siedem białych spacji między dwoma słowami.
źródło
fromJust.elemIndex c
można zapisać jakohead.findIndices(==c)
. To jeszcze jedna postać, ale możesz się jej pozbyćimport Data.Maybe
, więc w sumie uratujesz 17 znaków. Możesz także zapisać dwa znaki, usuwając spację przed ciągiem przy każdym wywołaniu interkalacji. I jeszcze kilka znaków, wykonująci=intercalate
na początku i zastępując dwa połączenia dointercalate
zi
.intercalate
i zapisałem kolejne 6 postaci! :-)w=words
, co uratuje jedną postać, jeśli się nie mylę. I zamiastl c=...
imap l
powinieneś to zrobićmap\c->...
(nawet nie potrzebujesz parens wokół lambda, ponieważ i tak jest już zamykający paren).l c=...
uratował mi 1 znak, ale nie mogłem go umieścić bez parens, tylko jakomap(\c->...)
. Wersja GHC 6.12.3.Postscriptum
(310)(462)(414)(319) w tym (46) dla tabeli.Połączone cyfry i litery z trójskładnikowym kodowaniem. 5 cyfr trójskładnikowych zmieści się w bajcie! To eliminuje te głupie pętle różnic i całkowicie specjalne numery obudów.
ASCII85 tnie 1/3 każdego stołu. A uproszczenie kodu (wreszcie!) Powraca poniżej 400!
Próbka wyjściowa
Nie golfił i skomentował. Jestem z tego bardzo dumny. Uważam, że jest elegancki, dzięki czemu liczby wykonują pracę. :)
Tabele (33) + (13) = (46)
Oto jak łańcuchy kodują tabelę. Każdy bajt reprezentuje 5-cyfrowy numer potrójny. A bajty są dalej kodowane w ASCII85 (który PostScript może automatycznie dekodować).
źródło
Ruby, 161
Koduje każdą cyfrę do pojedynczego znaku, gdzie 1 to myślnik, 0 to kropka, a wiodący 1 to bit znacznika (plus przesunięcie, aby można go było drukować. Używa matematyki ASCII do używania znaków wejściowych jako wskaźników wyszukiwania.
źródło
VB.NET, 233 bajty
Ta ostatnia funkcja jest zła.
edytuj Kilka ulepszeń.
źródło
Lisp (
532466 znaków)To koduje małe litery, a sekwencje kodu Morse'a są drukowane z końcową spacją
źródło
W Javie 475 znaków.
Tłumaczy az, AZ i 0-9.
Edytować:
Lub 447 znaków, jeśli nie przeszkadza ci, że Java rzuca błąd po tłumaczeniu.
źródło
Perl6 (238)
Wersja do odczytu
źródło
sed, 159 bajtów
Zaczynamy od zmniejszenia całej linii (ponieważ
y
nie można wykonać konwersji bez rozróżniania wielkości liter); odejmij 10 bajtów, jeśli mamy przetwarzać tylko małe litery. Potem Preprocesuj cyfr0
,2
,8
i9
emitować swoje ostateczne symboli.Pętla generuje końcowy symbol dla każdego znaku wejściowego, a następnie tłumaczy każdy znak do następnej iteracji. Jest to równoważne z chodzeniem po dychotomicznej tabeli wyszukiwania pokazanej w artykule na Wikipedii; cyfry, które wymagały specjalnego traktowania, mogą mieć rodziców, którzy nie są w naszej alfanumeryce ASCII.
Pętla kończy się, gdy wszystkie znaki osiągną spację kończącą (po „e” lub „t”).
Na przykład litera
k
jest przekształcana w trzy przejścia:k
=>k-
=>n-
n-
=>n.-
=>t.-
t.-
=>t-.-
=>-.-
źródło
Python 3, 99 znaków
Działa na wielkich i małych literach.
źródło
C,
162160 znaków(Z nieistotnym pozbawionym białych znaków odstępem, bez nowej linii)
M
to tabela odnośników, w której znaki bitowe znaków odpowiadają kropkom i myślnikom w kodzie Morse'a. Znaki[0-9A-Z]
są dekodowane do Morse'a przy użyciu tej tabeli (ze spacją dodaną po kodzie Morse'a), inne znaki są po prostu przekazywane bez zmian.Przykładowy przebieg:
źródło
Perl (489 znaków)
Można go wykonać za pomocą wiersza polecenia.
Edycja: Dzięki @tobyodavies za zwrócenie uwagi, że moje oryginalne rozwiązanie miało tłumaczenie wstecz!
źródło
%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//}
PHP, 474 znaków
Jego 462 znaki, jeśli wszystkie dane wprowadzane są wielkimi literami:
źródło
<?$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,'.-');
05AB1E , 81 bajtów ( niekonkurencyjny )
Wypróbuj online!
Konwertuj wzorce liter na base-3, wzorce liczbowe na base-2, użyj transliteracji ascii o indeksie zero, aby dostać się do kropek i łączników. Nie działa na małych literach.
źródło
Galaretka , 50 bajtów
Pełny program akceptujący łańcuch sformatowany w języku Python jako argument wiersza poleceń, który wypisuje dane rozdzielane spacjami.
Wypróbuj online!
źródło
PowerShell, 142 bajty
Skrypt testu mniej golfowego:
Wydajność:
Uwaga: Dane wyjściowe zawierają końcowe spacje.
źródło
+mazzy+
jest jakaś zuchwała wyściółkaAPL (NARS), 71 znaków, 142 bajty
test:
każda litera jest oddzielona od jednej spacji, każde słowo byłoby oddzielone od 3 spacji. Tabela jest zbudowana na ciągach alfanumerycznych
⎕A,⎕D
i 16-bitowych znakach,'ܨ㈍İᄧюᜪࠄᨳ䜏ഁᙂ䴫쩸穼蚠'
które dzielą na 8 -bitowe znaki, z których każdy jest konwertowany na podstawie 3 z odwróconymi cyframi.źródło
05AB1E , 52 bajty
Wypróbuj online!
źródło
JavaScript (ES6), 184 bajty
W obu wersjach wstawią spacje między dowolnymi postaciami. Konwertuje 0-9 i az (bez rozróżniania wielkości liter) są konwertowane. Spacja jest konwertowana na 3.
Zamień
\n
na znak nowej linii (0x0a
). Nie pokazuje kilku znaków niedrukowalnych z powodu SE. Przejście do trybu edycji pokazuje to.Oto heks:
Bez golfa
Wersja do odczytu, 234 bajty
Bez golfa
źródło
Python 2,
283274 bajtówUtworzyłem ciąg alfanumeryczny, tak że ich umieszczenie w ciągu opisuje ich reprezentację kodu Morse'a. Początkowo miałem używać binarnego, ale
01
będzie taki sam jak1
. Więc użyłem trójki z- = 1
i. = 2
. Tak więc znakc
jest w indeksie1121
w tym ciągu, a reprezentacja kodu Morse'a to--.-
.Uprząż testowa
Aktualizacja
[UWAGA: Białe spacje zawsze się kończą, ale białe spacje oznaczają pauzę, więc zapraszam gości do porządku ]
źródło
PHP,
157150157 bajtówpobiera dane wejściowe z argumentu pierwszego wiersza poleceń. bez przerwy między literami. Uruchom z
-nr
.awaria
Pokonanie JavaScript, Python2, C, Ruby i sed. Jestem szczęśliwy.
Czwarty krok: cofnij mapowanie, aby obsługiwać małe litery bez użycia
strtoupper
.poprzednie wersje:
nie działa na małe litery; +12 bajtów do poprawki: Wymień
$argv[1]
sięstrtoupper($argv[1])
.proste tłumaczenie ciągów, 254 bajty
prosto: tłumaczy cały ciąg naraz, znak na kod Morse'a.
Zapisz do pliku, który ma wykonać lub wymienić
<?=
zecho
i biegać z-r
.interpretacja dziesiętna kodów Morse'a, 184 bajty (-70)
pierwszy krok w golfa: kody Morse'a zakodowane na binarne z dodatkowym prowadzeniem
1
dla zachowania zer wiodących. Pętla przechodzi przez postacie i tłumaczy je jeden po drugim. Uruchom z-nr
.miejsca po przecinku zakodowane w postaci, 157 bajtów (-27)
druga gra w golfa: dodano 60 do wartości dziesiętnej i zakodowano w postaci.
scalone mapowanie, 150 bajtów (-7)
trzecie golfa: scalone mapowanie cyfr i liter do jednego ciągu.
źródło
SmileBASIC,
194190 bajtówźródło