To jest Calvin . Próbuję uzyskać 20 powtórzeń, aby ten użytkownik mógł czatować w pokoju rozmów PPCG Minecraft Server .
Napisz program lub funkcję, która przyjmuje dodatnią liczbę całkowitą.
Jeśli liczba całkowita jest parzysta (2, 4, 6, ...), wydrukuj lub zwróć ten ciąg artystyczny ASCII:
__ __ __ __ ___
/\ /\ | |\ | | / | | /\ | |
/ \/ \ | | \ | |-- | |--\ /__\ |-- |
/ \ | | \| |__ \__ | \ / \ | |
Jeśli liczba całkowita jest nieparzysta (1, 3, 5, ...), wydrukuj lub zwróć ten ciąg artystyczny ASCII:
__ __
\ / | | /| | / | / \ __ / | |
\ /\ / | | / | |-- | |--/ \ / |-- |
\/ \/ | |/ | |__ \__ |__| \/ |__ _|_
Możesz założyć, że wejście jest zawsze dodatnią liczbą całkowitą.
W obu przypadkach wyjściowych może opcjonalnie być dowolna liczba końcowych spacji do prawej krawędzi litery „T” w każdej linii i / lub pojedyncza nowa linia kończąca. Zwróć uwagę, że pomiędzy każdą literą znajdują się dwie kolumny spacji.
Najkrótszy kod w bajtach wygrywa.
code-golf
ascii-art
kolmogorov-complexity
Stary przekaźnik czatu
źródło
źródło
Odpowiedzi:
JavaScript (ES6),
343336289267265260 bajtówPo prostu dla zabawy ... :) (Dzięki Xufox za odcięcie 46 bajtów i zachęcenie mnie do samodzielnego odcięcia kolejnych 37 bajtów).
Nazywany jako
a(4)
lub podobny. Wypróbuj tutaj:Pokaż fragment kodu
Skondensowałem białe znaki w ciągi cyfr od
2
do8
(np.887
= 23 spacje). Każda cyfra jest następnie zastępowana odpowiednią liczbą spacji.0
reprezentuje| |
i1
reprezentuje__
. Podsumowując, ten program jest o 170 bajtów krótszy niż dwa połączone łańcuchy (203 + 227 = 430), więc jestem szczęśliwy. :)Edycja: Jakoś ma dokładnie taką samą długość jak jedyny inny wpis w tym momencie ... o_o
Edit 2: Zapisane trochę miejsca, zmieniając
n%2<1?
sięn%2?
i wymiany strun. Skorzystał również z faktu, że początki dwóch ciągów są takie same, aby zmniejszyć kolejne 5 bajtów.Edycja 3:
|2|
wydawało się, że wyświetla się strasznie dużo, więc uprościłem każde wystąpieniex
, oszczędzając 7 bajtów. Sugestie Xufox odcięły kolejne 40 bajtów.Edycja 4: Sugestia Xufox, by zastąpić
\n
rzeczywistymi opłaconymi podziałami linii, usuwając 6 bajtów z całości. Zmieniającychx
się0
i__
do1
(wstawić zło śmiech tutaj), a następnie łącząc wszystkie (wstawić mnogiej Regex tutaj), jak to uczynił w swoim wejściu, zapisane dodatkowe 16 bajtów.Edycja 5: Ponieważ zdecydowałem się na użycie standardów ES6, użyłem niestandardowej interpolacji ciągów szablonów, aby zgolić 2 ostatnie bajty.
źródło
.replace(/\d/g,d=>' '.repeat(d))
?\n
można zaoszczędzić jeden bajt na podział linii?Matlab,
343341Numer wejściowy jest dostarczany ze standardowego wejścia.
Przykładowy przebieg:
źródło
CJam,
158149145138 bajtówW powyższym użyto notacji karetką, ponieważ kod zawiera znaki niedrukowalne.
Wypróbuj online w interpretatorze CJam .
Jeśli bezpośredni link nie działa w przeglądarce, możesz skopiować kod z tej pasty .
Przykładowy przebieg
Pomysł
Zamiast bezpośredniego kodowania ciągu MINECRAFT (wypełnionego w celu uzyskania stałej długości linii), zakodujemy jego wersję „spakowaną”, w której transponowano wiersze i kolumny.
Po skompresowaniu i usunięciu linii, ten ciąg (nazwijmy go R ) musi zostać zakodowany:
Istnieje wiele przebiegów spacji, dlatego każde wystąpienie tripletu kosmicznego zastąpimy wysuwem linii.
Pozostaje nam siedem różnych znaków (
\n -/\_|
), więc przypisujemy każdemu z nich liczbę od 0 do 6 i rozważamy wynikowe cyfry tablicowe liczby podstawowej 7, które następnie kodujemy jako ciąg bajtów.Dekodowanie działa poprzez odwrócenie kroków od góry.
Lustrzany ciąg może być zbudowany z oryginalnego.
Jeśli odwrócimy kolejność czterech wierszy i zamienimy bryły, otrzymamy:
Jakoś podobnie, ale oczywiście będziemy musieli obrócić rzędy, aby dolny rząd znalazł się na górze:
Tak byłoby, gdyby nie te nieznośne podkreślenia.
Jeśli przeczytamy oryginalny ciąg znaków od góry do dołu i zignorujemy przesunięcia wiersza (otrzymując w ten sposób R ) i zastąpimy każdy znak podkreślenia, a następnie spację, spacją, a następnie znakiem podkreślenia przed przesunięciem wierszy, jest to wynik:
Dużo lepiej! Wszystko, co pozostało do zrobienia jest usunięcie pierwszego miejsca w pierwszym rzędzie (przerzutki wszystkie podkreślenia w pierwszym rzędzie jeden znak po lewej), przesuwając zagubionych podkreślenia w E i C jeden wiersz w górę i odrzucając podkreślenia nad T .
Kod
źródło
Pyth - 182 bajty
Używa podstawowego kodowania. Ponieważ indeksowanie w Pyth jest modułowe, nie muszę nawet robić nic nieparzystego, po prostu ustaw go w odpowiedniej kolejności i używaj
@Q
. Jako bonus działa to również z liczbami ujemnymi.Próbowałem tylko zakodować pierwszy, potem przerzucać i zamieniać ukośniki, ale pierwsza i ostatnia linia były zbyt trudne.
Mógłbym zaoszczędzić 6 bajtów, umieszczając w kodzie rzeczywiste bajty puste, ale to zbyt duży problem.
Wypróbuj online tutaj .
Wygląda naprawdę źle online, ponieważ pole wyjściowe jest zbyt małe i się zawija. Polecam błahy z dev-konsoli i zmieniając
col-md-5
Docol-md-7
.źródło
JavaScript (ES6),
312,285,281,272,270,263,262, 260W przypadku poprzednich edycji zobacz historię edycji .
Edycja 5: W konwersji zamieniłem liczbę związaną z
-
(teraz 0) i białą spacją (teraz 1). W powstałym bloku liczby 1, 2 i 3 nie były już tak często używane. To pozwoliło mi użyć tablicy z brakującymi liczbami.Edycja 6: Poprawiono literał tablicowy. Próbowałem tego wcześniej, ale użyłem
777
i77
jako ciągów zamiast liczb i zauważyłem dopiero teraz, że tego przegapiłem.Edycja 7: „Kod do gry w golfa” jest funkcją określoną w pytaniu i nie ma potrzeby
f=
spełnienia tej specyfikacji. W ten sposób usuwając go, oszczędzasz dwa bajty.Uruchamiany w przeglądarce Firefox 39:
Opiera się na podstawowym systemie liczbowym 6, a każda postać ASCII oznacza liczbę:
Następnie połączyłem reprezentację liczbową każdego ciągu ASCII. Na przykład: gdy pierwszy ciąg ASCII zawiera
/
w jednej pozycji, a drugi zawiera\
w tej samej pozycji , pozycja ta staje się32
, która jest podstawą 6 (20
w systemie dziesiętnym). Jeśli przekonwertujesz to na bazę 36 (aby uzyskać jedną liczbę base-36 na każde dwie liczby base-6), otrzymaszk
.Wszystko to zostało zrobione wcześniej, a funkcja zasadniczo anuluje ten proces.
Teraz obie odpowiedzi JavaScript mają jedną odpowiedź, która ma tę samą liczbę bajtów…PS: Jako notatkę dla mnie i odniesienie do innych, użyłem tego kodu:
źródło
~NaN == -1
?![…][x]+77
,77
nie musi być ciągiem już), ale dodatkowe cofania w golfed kodu nie sprawiło, że było warto…isNaN
z1+
, i~~(i/6)
zi/6|0
.f=
na początku, ale tak jest. Przeczytałem również, że zaakceptowano usunięcie go, więc zrobię to sam, a teraz mam 260 bajtów. ;)CJam, 136 bajtów
W powyższym użyto notacji karetką, ponieważ kod zawiera znaki niedrukowalne.
Kanał służy wyłącznie do „czytelności”. Wypróbuj online w interpretatorze CJam .
Jeśli bezpośredni link nie działa w przeglądarce, możesz skopiować kod z tej pasty .
Przykładowy przebieg
Pomysł
To podejście ma pewne podobieństwa do tego w mojej drugiej odpowiedzi , ale jest o wiele prostsze i (raczej rozczarowujące) nieco krótsze.
Szukamy sposobu na zakodowanie następującego ciągu:
Po wypełnieniu każdego wiersza (w celu uzyskania stałej długości linii), skompresowaniu (transponowaniu wierszy i kolumn) i usunięciu kanałów, ciąg ten należy zakodować:
My zastąpienia każdego podciągu
" |||"
za pomocą 0 , każdy podciąg" "
z 1 i znaków"/-_\| "
o 2 do 7 , tworząc tablicę podstawy 8 cyfr, które mogą być zakodowane w postaci ciągu bajtów.Dekodowanie działa poprzez odwrócenie kroków od góry.
Kod
źródło
Rakieta,
443434386 bajtówTylko dla kopnięć.
Uwaga: może być konieczne uruchomienie
#lang racket
linii w DrRacket.źródło
05AB1E ,
179177176 bajtówWypróbuj online.
Wyjaśnienie:
jest liczbą skompresowaną :
Wypróbuj online.
7в
konwertuje go do Base-7 jako listę, więc otrzymujemy listę cyfr:Wypróbuj online.
è
indeksuje każdą cyfrę w ciągu"\n-/\_|"
, aJ
następnie łączy całą listę razem, co daje nam następujące:Wypróbuj online.
2ä
dzieli ciąg na dwie części.Iè
weź dane wejściowe i zindeksuj je (z automatycznym zawijaniem), aby uzyskać jedną z dwóch części, która jest następnie generowana niejawnie.Ogromne podziękowania dla kompresora ASCII @MagicOctopusUrn , który został użyty do wygenerowania skompresowanej liczby i transliteracji Base-7. Wypróbuj online. (Po czym transliteracja została zagrana w golfa poprzez odwrócenie łańcucha i liczby na stosie,
в
zamiast zamiastB
zrobić listę cyfr i indeksować do łańcucha za pomocąè
.źródło
C, 251 bajtów
Jest to funkcja,
k
która odbiera parametr i drukuje wiadomośćstdout
.Bardziej czytelna wersja:
Najpierw przygotowuje pustą wiadomość (wypełnioną spacjami). Dla każdego znaku (np.
|
Lub-
) ma on listę pozycji, w których należy umieścić ten znak.Jeśli dla każdej pozycji należy wydrukować wersję odwróconą, pozycja jest odwracana. Oznacza to, że jego współrzędna pionowa
y
jest zastępowana przez4-y
lub3-y
(w zależności od tego, czy znak jest znakiem podkreślenia). Kierunki ukośników są również odwracane - odbywa się to zaXOR
pomocą115
.Ta struktura kontrolna służy również do umieszczania znaków nowej linii - wydaje się, że bardziej efektywne jest dodanie do listy 4 dodatkowych współrzędnych niż napisanie wyraźnej pętli.
Istnieje kilka drobnych usterek w tym systemie. Po pierwsze, ostatnia litera T wygląda nieco inaczej w wersji odwróconej:
Aby wyprowadzić go poprawnie, kod musi umieszczać
|
znaki po_
znakach.Ponadto, aby upewnić się, że łańcuch kontrolny zawiera tylko znaki ASCII, kodowałem go:
37
dodane do nich, aby przenieść je do zakresu ASCII 32 ... 127. Mógłbym dodać mniejszą liczbę, ale37
unika znaków takich jak"
i\
, które muszą być poprzedzone literami ciągów.-
znak pojawia się na pozycji 137. Aby to wyjaśnić, dodałem sztuczny-
znak na innej pozycji (79), która jest później nadpisywana - postać|
pojawia się również na pozycji 79.Kolejną zabawną rzeczą było to, że nie mogłem użyć
puts
do wyprowadzenia łańcucha - spowodowałoby to dodanie nowej linii końcowej. Więc użyłemprintf
zamiast tego.Ponadto liczba
57
pojawia się 4 razy w kodzie golfowym - pozornie długie wyrażenie(w%2?4-i/6-p/57:p/57)*57+p%57
pozwala wyeliminować zmiennąy
, co powoduje, że kod jest krótszy.źródło
Perl,
292259246 bajtówWykorzystuje fakt, że dwa ciągi są w większości podobne (np. Cała IE i C) i sprawia, że ciąg znaków składa się ze znaków wyświetlanych w różny sposób w zależności od wyświetlanej wersji. np. m oznacza „cięcie do przodu dla ciągu skierowanego w górę, cięcie do tyłu w odwróconym”. Dokonuje podstawienia transliteracji, aby wyświetlić poprawny znak. Spacje są również kodowane w czasie wykonywania za pomocą podstawień łańcuchowych.
wieloliniowy:
Pomysł:
Ponieważ w wyniku są tylko 22 unikalne kolumny, powinno być możliwe zapisanie go jako 22 * 4 = 88 znaków o zakresie 0-17 (wszystkie możliwe znaki „podwójnego znaczenia”), wraz z wyszukiwaniem 56 znaków tabela z jednym wpisem w zakresie 0–21 na kolumnę. Teoretycznie można to zakodować za pomocą <100 bajtów, jednak ciężko jest sprawić, aby wygrana netto była większa z powodu bardziej skomplikowanego kodu do jej odkodowania.
źródło
CJAM, 206
Dwa obrazy ascii są zakodowane w bazie 216, jeden bajt = 3 znaki.
Sprawdź to tutaj
źródło
PowerShell,
275253248 bajtówSkrypt testowy:
Wynik:
Główne pomysły
Metoda kompresji jest rozszerzoną metodą CJam autorstwa Dennisa ♦:
Skrypt do kompresji:
Ciąg przed kompresją to:
źródło
SAS, 442 bajty
Nie golfa:
Testy:
Mógłbym ewentualnie zaoszczędzić trochę kodu, umieszczając je w blokach wejściowych, ale to dodaje ograniczenie, że makro może być tylko raz na etap danych, co, jak sądzę, narusza ducha pisania go jako makro. (Podejrzewam, że dodanie zachęty w celu uzyskania danych wejściowych w kroku danych dodaje więcej znaków).
źródło
bash, 247 bajtów
Ciągi są łączone i gzipowane.
źródło
PHP, 225 bajtów
Brzydkie, brutalne rozwiązanie.
Skompresowałem, a następnie base64 zakodowałem połączone łańcuchy do wyświetlenia. Kod dekoduje, dekompresuje i dzieli go na 224 znaki. Pierwszy ciąg ma 224 znaki bez końca nowej linii, drugi to 201 znaków (również bez nowej linii po nim). Parzystość argumentu wiersza poleceń (
$argv[1]%2
) jest używana jako indeks w tablicy generowanej przezstr_split()
.źródło
Haskell, 138 bajtów
To trochę hack. Brutalnie forsuję skrót SHA256 połączenia dwóch tekstów minecrafta, a następnie dzielę je i wybieram odpowiedni tekst na podstawie parametru x. Jest to bardzo niepraktyczne i nie można go obliczyć w czasie rzeczywistym, a po drodze mogą nawet wystąpić kolizje.
Ponieważ Haskell nie może mieć reprezentacji ASCII tego skrótu w ciągu, czytam go z pliku o nazwie „a” i dlatego dodałem 32 bajty do mojego wyniku.
Wyjaśnienie:
Tworzy listę każdej kombinacji liter „/ \ | _-” na 425 literach (łączna długość obu tekstów minecrafta)
Wybierz pierwszy, który pasuje do skrótu
Pierwszy tekst ma 225 liter, drugi dokładnie 200.
źródło
JavaScript (ES6),
403296 bajtów(Przeniesiono z mojej poprzedniej odpowiedzi ) Wypróbowanie nowej metody:
Zauważ, że istnieje kilka znaków, których nie można wydrukować; zostały one zastąpione np
\x83
.Sam kodowanie jest o około 40 bajtów krótsze od drugiego, ale proces dekodowania jest bardziej skomplikowany. Użyłem systemu base-216, którego inni używali do kodowania tekstu. W celach informacyjnych oto kod, którego użyłem:
To w zasadzie pobiera tekst ASCII (wstępnie przekonwertowany na bazę 6) i potroi go na sobie, zmieniając go na bazę 216. Następnie dodaje się 53, aby usunąć większość znaków niedrukowalnych.
Sugestie mile widziane!
Oto oryginalny 403-bajtowy kod:
Korzystanie z
for
pętli,while
pętli, czterech zmiennych, które były używane tylko raz, i mnóstwo długich algorytmów do prostych rzeczy. Chłopcze, czy poprawiłem ...źródło
y=[' ','/','|','\\','_','-'],
i zamiasty[x]
pisać' /|\\_-'[x]
. =)Python, 312 bajtów
Funkcja drukuje dane wyjściowe z podaną liczbą całkowitą
źródło
C, 321 bajtów
Zakodowano powtórzenie i indeks znaków w ciągu.
źródło
Python 3, 486
533612źródło
PHP , 263 bajtów
Wypróbuj online!
źródło
Rubinowy, 290 bajtów
Prawdopodobnie słaby i możliwy do ulepszenia wpis. Zasadniczo bardzo prosta (ręcznie) kompresja, w której małe litery oznaczają, że wiele spacji (właściwie ord (ch) - spacje „A”) i wielkie litery to tylko niektóre typowe terminy, które pozwoliły zaoszczędzić kilka bajtów.
źródło
SOGL V0.12 ,
7271 bajtówWypróbuj tutaj!
Lustro pionowe SOGL działało idealnie do tego.
źródło
Płótno , 70 bajtów
Wypróbuj tutaj!
źródło