Wyzwanie:
Napisz program, który generuje następujące dane wyjściowe:
. E .. I ... S .... H
...- V
..- U ..-. F
..--
.- A .-. R .-.. L
.-.-
.-- W .--. P
.--- J
- T -. N -.. D -... B
-..- X
-.- K -.-. C
-.-- Y
-- M --. G --.. Z
--.- Q
--- O ---.
----
To jest sformatowana tabela kodów Morse'a liter od A do Z. Każda kolumna jest oddzielona trzema spacjami.
Brakuje czterech miejsc, z których korzystają międzynarodowe zestawy znaków. Twój program musi tam wpisać spację.
Dane wyjściowe muszą składać się wyłącznie ze spacji ASCII, kropek, myślników, wielkich liter i znaków nowej linii (LF lub CRLF).
Twój program nie przyjmuje danych wejściowych.
Poniżej przedstawiono przykładowy program w języku Python, który generuje pożądane dane wyjściowe:
b = "."
out = []
last = 0
ch = "EISHVUF ARL WPJTNDBXKCYMGZQO "
cx = 0
while b:
if last >= len(b):
print(" ".join(out))
out = [" ", " ", " ", " "][0:len(b) - 1]
out.append(b + " " + ch[cx])
cx += 1
last = len(b)
if len(b) < 4:
b += "."
elif b[-1] == ".":
b = b[0:-1] + "-"
else:
i = len(b) - 1
while b[i] == "-":
i -= 1
if i < 0:
break
if i < 0:
break
b = b[0:i] + "-"
print(" ".join(out))
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
code-golf
ascii-art
kolmogorov-complexity
morse
Locoluis
źródło
źródło
Odpowiedzi:
Galaretka , 85 bajtów
Pełny program drukujący ściągawki.
Wypróbuj online!
W jaki sposób?
Uwaga: Wydaje mi się, że może istnieć sposób, aby to przyciąć, tworząc listę, która poprawnie formatuje się za pomocą atomu siatki
G
, ale nie do końca wiem, jak to zrobić.źródło
Python 3.6,
201197193187 bajtówUżywa trochę formatowania, rozpakowywania i magii A000918 .
źródło
f'{i//k:0{j}b}'.replace(*'0.').replace(*'1-')
ma taką samą długość jak''.join('.-'[int(x)]for x in f'{i//k:0{j}b}')
Siatkówka , 125 bajtów
Wypróbuj online! Powinien mieć 121 bajtów, ale byłem zbyt leniwy, aby poradzić sobie z białymi znakami na początku i na końcu. Wyjaśnienie:
Litery, których kod zaczyna się
.
i-
odpowiednio są wstępnie załadowane. (Teoretycznie możliwe jest uniknięcie wstępnego ładowania,.-
ale w ten sposób oszczędza się bajty.)_
S są używane zamiast spacji, ponieważ są uważane za litery, co ułatwia dopasowanie ich poniżej.Tutaj podzieliliśmy każdą linię na pięć części:
.
)-
)Elementy są następnie ponownie składane na dwie linie:
.
sufiksem, pierwsza połowa pozostałych liter-
sufiksem, druga połowa pozostałych literNowe linie mają ten sam format, co linia istniejąca, tylko z dodatkowym przedrostkiem Morse'a i pozostałą do przetworzenia o połowę więcej liter. Jest to następnie powtarzane, aż każda linia ma tylko jedną literę.
Do
_
s są następnie zmieniony z powrotem do pomieszczenia.źródło
JavaScript (ES6),
154147145 bajtówźródło
PHP, 208 bajtów
Wypróbuj online!
PHP, 229 bajtów
Wypróbuj online!
źródło
Perl 5,
158156 bajtówźródło
PHP,
184 183181 bajtówUruchom
-nr
lub wypróbuj online .awaria
-7 bajtów z spacje Wymienić
ltrim("$r\n")
z"$r\n"
i28
z31
.171 (= -10) bajtów ze spacjami końcowymi :
podział wypróbuj online
źródło
for(;$y<16;$y++,print str_pad(ltrim("$r\n"),28," ",0))for($r="",$c="03231323"[$y&7];$c++<4;)$r.=strtr(sprintf(" %0${c}b ",$y>>4-$c),10,"-.")."EISHVUF ARL WPJTNDBXKCYMGZQO "[$i++];
powinien zaoszczędzić 2 bajty.----
nie pasuje do reszty."EISHVUF ARL WPJTNDBXKCYMGZQO "
powinny mieć na końcu 2 spacje.APL (Dyalog) , 92 bajty
Potrzeby,
⎕IO←0
które są domyślne w wielu systemach.Wypróbuj online!
{
...}¨'
...'
zastosować następującą funkcję anonimową do każdego z ciągów:⍪⍵
przekształć argument w kolumnę' ',
wstaw spację (w każdym rzędzie)'.-'[
… Dodaj],
ciąg po zindeksowaniu za pomocą:≢⍵
długość argumentu⍳
jego wskaźniki (0, 1, 2,…, długość -1)2⊥⍣¯1
anti-base-2 (wykorzystuje tyle bitów, ile potrzeba)⍉
transponuj (z jednej reprezentacji w każdej kolumnie do jednej w każdym wierszu)(
…)⍀
Rozwiń przez (wstaw puste wiersze zgodnie z zerami w):≢⍵
długość argumentu16÷
podziel szesnaście przez to1↑⍨
(over) take from one (tworzy listę jednego, po którym następuje 1- n zer)16⍴
poddaj ten wzór recyklingowi, aż będzie miał szesnaście elementów' ',
przygotuj spację⍕
format (lista tabel w pojedynczą tabelę, dopełnianie każdej ze spacją po każdej stronie)¯1⌽
obróć o jeden krok w prawo (przesuwając w ten sposób tylną przestrzeń do przodu)0 3↓
upuść zero wierszy i trzy kolumny (usuwając w ten sposób trzy spacje wiodące)źródło
16÷⍨
pojawia się twój kod‽SOGL ,
106105102 bajtówJeśli dozwolone są spacje poprzedzające,
10299 bajtów141 bajtów, kompresja
chciałem tylko zobaczyć, jak dobrze SOGL radzi sobie z samą kompresją (cóż, ma więcej niż tylko kompresję, ale zawiera 97% skompresowanych ciągów)
źródło
JavaScript (205 bajtów)
źródło
Rubin,
144 143141 bajtówBez golfa
źródło
Pyth , 106 bajtów
Przetestuj online!
Wyjaśnienie
W kilku słowach generuję tabelę kolumna po kolumnie, a następnie transponuję tabelę przed wydrukowaniem. Zauważamy, że w kolumnie kody Morse'a dla liter mogą być reprezentowane jako ciągi binarne (zamień
.
na0
i-
przez1
) przy liczeniu od zera do indeksu ostatniej litery w kolumnie.Algorytm opiera się na funkcji, z której podam przykładowy przebieg poniżej (dla drugiej kolumny):
Wyjaśnienie kodu
Przecięłam kod na pół. Pierwsza część to funkcja opisana powyżej, druga część to sposób korzystania z funkcji:
(1) : W tabeli Morse'a, w pierwszej kolumnie, po każdej linii znajduje się siedem wierszy zawierających literę („E” i „T”). W drugiej kolumnie są to trzy linie. Następnie jedna (trzecia kolumna), a następnie zero (ostatnia kolumna). To jest
16 / n - 1
, gdyn
jest to liczba liter w kolumnie (który jestN
w kodzie powyżej). To, co robi kod w wierszu (1) :Dobra, teraz mamy przyjemną, pomocną funkcję,
h
która w zasadzie generuje kolumnę tabeli z sekwencji znaków. Użyjmy go (zwróć uwagę na dwie końcowe spacje w poniższym kodzie):Kod można jeszcze skrócić; może wrócę później.
źródło
C,
199195 bajtówNa żywo na coliru (z #include, aby uniknąć ostrzeżenia).
AKTUALIZACJA : Zapisano cztery znaki, przenosząc „deklarację”
m
poza funkcję, zgodnie z sugestią @zacharyTWykorzystuje coś, co wydaje się być standardową strategią: trzymaj litery w drzewie binarnym zakodowanym w tablicy, aby potomkami elementu
i
były2*i
i2*i+1
. To drzewo jest zakorzenione na 2 zamiast 1, ponieważ myślę, że arytmetyka zadziałała nieco krócej. Cała reszta to gra w golfa.Nie golfowany:
źródło
int m
do byciam;
poza funkcją?Bubblegum , 133 bajty
Skompresowany jako strumień LZMA.
źródło
C, 291 bajtów
Wypróbuj online
Jak to działa
Najpierw przeanalizowałem ciąg w C, licząc spacje mniejsze niż 26, więc zakodowałem je małymi literami za
a, b, .. z
pomocą tego małego programuPotem napisałem parser dla tego kodowania, gdzie
/
jest nowa linia, a mała litera reprezentujet[i] - 'a'
spacjeźródło
Bash (z narzędziami), 254 bajty
źródło
Dyalog APL, 159 bajtów (niekonkurencyjny)
źródło
⎕IO←0
(domyślne w wielu systemach) i używając⍨
(dojazdy) .JavaScript (ES7),
242240238 bajtówWypróbuj online!
–2 bajty dzięki Zacharymu .
źródło
a!='0'
naa!=0
.join('')
z.join<insert backtick here><insert backtick here>
? (<insert backtick here>
zastąpiony rzeczywistymi backtickami)a!='0'
naa!=0
, to powinno zadziałać.''
sprawie.