Cel
Kod Morse'a jest często przedstawiany jako dźwięk. Biorąc pod uwagę strumień bitów, które reprezentują, czy dźwięk jest włączony, czy wyłączony, przetłumacz strumień na litery, cyfry i spacje.
Specyfika
- Strumień bitów jest analizowany na podstawie długości powtarzających się bitów ON / OFF.
- 1 bit ON to kropka
- 3 bity ON to kreska
- 1 OFF bit ogranicza kropki i kreski
- 3 bity WYŁ ogranicza znaki
- 7 bitów WYŁ ogranicza słowa (spację)
- Dane wejściowe mogą być ciągiem lub tablicą. W danych wejściowych dozwolone są tylko dwa unikalne znaki / wartości. (np. 0/1, prawda / fałsz, przecinek / spacja)
- Wyjście zwraca ciąg znaków lub jest drukowane na standardowe wyjście.
Przykład
Input: 101010100010001011101010001011101010001110111011100000001011101110001110111011100010111010001011101010001110101
Analysis: \--H--/ E \---L---/ \---L---/ \----O----/\-- --/\---W---/ \----O----/ \--R--/ \---L---/ \--D--/
Output: HELLO WORLD
Założenia
- Strumień zawsze zaczyna się i kończy bitem ON.
- Nie ma wiodących ani końcowych białych znaków.
- Dane wejściowe są zawsze prawidłowe.
- Obsługiwane są wszystkie litery (bez rozróżniania wielkości liter) i cyfry.
Przypadki testowe
101010100010001011101010001011101010001110111011100000001011101110001110111011100010111010001011101010001110101
HELLO WORLD
10100000001011100011101110000000101110000000101011101000101000101010001010101
I AM A FISH
1010111011101110001110111011101110111000101110111011101110001110111010101
2017
101010001110111011100010101
SOS
Punktacja
To jest kod golfowy. Wygrywa kod o najniższej liczbie bajtów do tego czasu w przyszłym tygodniu.
Odpowiedzi:
APL (Dyalog) ,
65626057 bajtów-3 dzięki ngn.
Funkcja ukrytego przedrostka.
Wypróbuj online! Nagłówek
f←
i Stopka pozwalają tylko wywoływać funkcję z wejścia, zachowując liczbę bajtów TIO. W normalnej sesji APL (odpowiadającej polu wejściowemu TIO) nie byłoby to konieczne .⎕CY'dfns'
c op r z dfns pulpit (biblioteka)(
…)
Zastosuj tę ukrytą funkcję:'1+|(00)+'⎕S 1
PCRE S earch 1-run i parzystej-0-run i zwróć6|
resztę długości dopasowań dzieląc dzieląc przez 6⊃∘'/. -'¨
dla każdej długości dopasowania, wybierz odpowiedni znak z tego łańcucha'/|[-.]+'⎕S'&'∘
PCRE S ukośniki i myślnik / kropka - uruchamia i zwraca temorse
przetłumaczone z kodu Morse'a na zwykły tekstźródło
Python 2 ,
142135 bajtówWypróbuj online!
Wyjaśnienie:
Dzieli ciąg na litery na
000
(0
oznacza to spację)Zastępuje każdy
111
z3
i konwertuje na bazę 16.Następnie każdą liczbę modyfikuje się
57
, co daje zakres0..54
, który jest indeksem bieżącego znaku.Poprzednia wersja przekonwertowana na bazę 3:
Python 2 ,
273252247 bajtówWypróbuj online!
Poprzednia wersja przekonwertowana na binarną:
Python 2 ,
282261256 bajtówWypróbuj online!
źródło
Rubin , 123 bajty
Wypróbuj online!
Podziel ciąg wejściowy według limitu znaków. Użyj 3 lub 4 bitów OFF, aby spacje były konwertowane na puste ciągi. Weź podstawową wartość 2 każdej postaci i sprowadź rozsądny zakres (mniej niż 60 możliwych wartości) za pomocą modulo na 3 kolejnych podziałach.
źródło
0?
z Regexp, nadal działa dla czterech przypadków testowych.Python ,
175168 bajtówNajpierw przekonwertuj ciąg na listę ciągów 0 (myślnik) / 1 (kropka), dodaj prefiks
1
(aby zapobiec wiodącym zerom i radzić sobie z białymi spacjami), a następnie przekonwertuj na binarny.Ponieważ każdy kod ma długość nie większą niż 5, wynik waha się od 0 do 63 i może być wymieniony w ciągu.
źródło
lambda s:''.join("_ TEMNAIOGKDWRUS__QZYCXBJP_L_FVH09_8___7_______61_______2___3_45"[int('1'+filter(int,l).replace('2','0'),2)]for l in s.replace('111','2').split('000'))
filter
!Galaretka ,
6762 bajtówWypróbuj online!
źródło
Visual Basic .NET (.NET Core) , 252 bajty
-7 bajtów dzięki @recursive
Funkcja, która pobiera łańcuch
1
s oraz0
s, i zwraca ciąg znaków. (W rzeczywistości, tylko0
forOFF
jest trudnym wymaganiem.OFF
Zakłada się, że nic nie jestON
).Dosłowny ciąg znaków to konfiguracja kodu Morse'a jako plik binarny w postaci tablicy. VB.NET pozwala indeksować ciągi znaków jako tablice znaków. Jest
\
to dzielenie liczb całkowitych, przyjmujące lewą stertę podrzędną dla1
lub prawą podstertę dla111
.Użyłem
!
jako pustego, gdy nie ma wartości w tym miejscu sterty. Konieczne jest jedynie prawidłowe wypełnienie wskaźników.VB.NET pozwala powrócić, przypisując wartość do nazwy funkcji (w tym przypadku
A
). Właśnie iteracyjnie wykonuję konkatenacje ciągów (&
), aby zbudować ciąg wyjściowy. Za pierwszym razem muszę użyć,&
ponieważ użycie+
pozostawia wiodący znak null, ale za każdym razem, gdy mogę użyć+
, który zachowuje się tak samo jak w&
przypadku łańcuchów.Wypróbuj online!
źródło
"!ETIANMSURWDKGOHVF!L!PJBXCYZQ!!5473!!8290!!!!!16"
, a następnie za pomocą indeksowaniaM(c-c\48*22)
, a następnie możesz zapisać kolejne 4, nawet nie używającM
, ale po prostu używając literału ciągu.M(c-c\48*22)
, uzyskam indeks poza granicami przypadku 2017. Myślę, że VB dokonuje podziału i mnożenia z tym samym priorytetem; czy brakuje mi nawiasów?c\48*22
będzie albo0
albo22
. Jest to sposób warunkowego odjęcia 22c
, abyM
skrócić, „składając” koniec sznurka. Jeśli to ci nie pomoże, zawsze możesz usunąć pareny zA &=(" ")
kolejnych 2 bajtów. :)&=
, aby+=
i usunąć kolejne dwie przestrzenie.JavaScript (ES6),
170131 bajtówJak to działa:
Jeśli zmienisz kropki na 0, a myślniki na 1 i przedrostek z 1, otrzymasz liczby binarne, które po przeliczeniu na dziesiętne dają:
Można je przekonwertować na prawidłowe litery, indeksując do
' ETIANMSURWDKGOHVF L PJBXCYZQ'
.Jeśli weźmiemy te liczby moduł 11, otrzymamy liczby 0–8 i 10, które można przekonwertować na prawidłowe liczby za pomocą indeksowanie do
'473168290 5'
.Program dzieli znaki, a następnie przekształca każdy znak w kropki i myślniki, które są konwertowane na odpowiednie dane wyjściowe zgodnie z powyższymi zasadami.
Przypadki testowe:
Pokaż fragment kodu
źródło
Python 2 , 127 bajtów
Wypróbuj online!
Budowanie off TFeld „s rozwiązania poprzez usunięcie zastąpić i pracując w bazie 10, kosztem a xor logiczną i dłuższy ciąg odniesienia.
źródło
PHP,
321284 bajtówZaoszczędź 37 bajtów dzięki @ovs
Poprzednia wersja (321 bajtów)
Wypróbuj online!
Wersja bez golfa:
źródło
Java (OpenJDK 8) , 370 bajtów
Wypróbuj online!
źródło
GNU sed , 261 + 1 = 262 bajtów
+1 bajt dla
-r
flagi.Wypróbuj online!
Wyjaśnienie
Jest to bardzo podstawowe rozwiązanie tabeli odnośników.
Pierwsze trzy linie przekształcają dane wejściowe, więc myślniki to
_
s, a kropki to1
s. Najpierw000
s są zastępowane przez;
, więc znaki są oddzielane przez,;
a słowa przez;;0
. Następnie111
s są zastępowane przez,_
a wszystkie pozostałe0
s są odrzucane, pozostawiając1
s dla kropek.Następna linia dołącza tabelę odnośników. Przybiera postać
cmcmcm...
gdziec
jest znakiem im
jest sekwencją_
s i1
s reprezentującą go.i
jest zastąpiony1
w tabeli w celu ujednoznacznienia. Ponieważ wyrażenia regularne w sed są zawsze zachłanne, tabela jest sortowana od najdłuższego do najkrótszego kodu (czyli np.1_
DopasowaniaA1_
zamiasti1____
).Następnie w pętli każda sekwencja
_
si1
si (i kolejne;
) jest zastępowana odpowiednim znakiem:Na koniec czyszczenie:
i
s są zamieniane na1
s, pozostałe;
s są spacjami, a tabela odnośników jest usuwana:źródło
Galaretka , 67 bajtów
Wypróbuj online!
źródło
JavaScript (ES6),
10410210199 bajtówPrzypadki testowe
Pokaż fragment kodu
W jaki sposób?
Ponieważ konwertujemy z bajtów kosztów binarnych na dziesiętne, używamy funkcji skrótu, która działa bezpośrednio na blokach binarnych interpretowanych w bazie 10.
Przykład
źródło
n*p%m0%m1
dlaSiatkówka ,
144138130103 bajtówWypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:
Zmień cyfry binarne na inne znaki, ponieważ 0 i 1 są prawidłowymi wyjściami.
Wstaw spację przed każdym znakiem i dwie spacje między słowami.
Załóż, że wszystkie postacie to Es.
Przetłumacz wszystkie litery, zakładając, że po nich będzie kropka. Na przykład, jeśli mamy literę E i widzimy drugą kropkę (zużyliśmy pierwszą kropkę, gdy wstawiliśmy literę E), wówczas przekłada się ona na literę I. W przypadku liter, które mogą być prawnie poprzedzone myślnikiem, są one tłumaczone z tym założenie, a następnie kreska jest zużywana przez następny etap. Inne litery są usuwane (utrzymanie
L
bajtu kosztów).Jeśli okaże się, że po nich nastąpił kreska, napraw błędne tłumaczenia. To również zużywa kreskę, gdy została założona przez poprzedni etap. Oba tłumaczenia są powtarzane, aż wszystkie kropki i myślniki zostaną zużyte.
źródło
Perl 5 , 241 + 1 (
-p
) = 242 bajtyWypróbuj online!
źródło
PHP, 181 + 1 bajtów
Uruchom jako potok z
-nR
lub spróbuj online .źródło
ES6 , 268 bajtów
Wykorzystuje kodowanie ASCII po odwzorowaniu z podstawowej reprezentacji Morse'a na pozycję indeksu. Nie mój najlepszy dzień w golfa, ale zajęło to tylko około 15 minut.
Łatwiejszy do odczytania (trochę):
źródło
Wolfram Language (Mathematica) , 288 bajtów
Myślałem o wczytywaniu danych jako pliku binarnego z pliku, ale trudno to wyjaśnić. Baza 36 wydawała się dobrym kompromisowym sposobem na efektywne przechowywanie danych pod względem leksykalnym.
Pobiera na wejściu ciąg zer i jedynek. Wykonuje serię zamian, zaczynając od serii 7 zer, następnie serii 3, a następnie najdłuższych liter binarnych aż do najkrótszych. Ważna jest kolejność wymiany.
Wypróbuj online!
źródło
Perl 5 , 195 bajtów
Kod 194 bajtów + 1 dla
-p
.Nie mogłem tego uruchomić ze standardowym spakowanym ciągiem binarnym, musiałem uciec od znaków o wyższych bajtach, w przeciwnym razie byłbym na 171, jeśli ktoś wie, co przegapiłem lub dlaczego łamanie to byłoby świetne !
Wypróbuj online!
Wyjaśnienie
Ciąg binarny to
pack
zredagowana lista liczb odnoszących się do znaków Morse'a (101011101
-349
dlaF
itd.), Która jest spakowana zakresamiA..Z,0..9
i używana jako odnośnik. Dos///
wyrażenia wymienić wszystkie serie siedmiu0
sekund z miejsca i wtedy wszystkie ciągami cyfr oddzielonych z trzech0
s lub granic słów\b
, z ich odpowiedniego klucza z%h
hash.źródło