Rozważ te siedem wagonów ASCII.
Silnik (E)
__
====== \/
| [] |=========
| )
================
O-O-O O-O-O \\
Samochód osobowy (P)
===============
| [] [] [] [] |
===============
O-O O-O
Boxcar (B)
===============
|-|-| | |-|-|
===============
O-O O-O
Cysterna (T)
_____---_____
( )
===============
O-O O-O
Lej zasypowy (H)
_______________
\ | | | | | | /
===============
O-O O-O
Płaski (F)
===============
O-O O-O
Kambuz (C)
=====
====| |====
| [] [] |
=============
O-O O-O
Napisz program, który otrzyma sekwencję znaków EPBTHFC
i wyświetli reprezentację pociągu ASCII, używając --
sprzężeń samochodowych. Najbardziej wysunięte w lewo znaki wejściowe stają się wagonami znajdującymi się najbardziej na prawo. Pociąg jest zawsze skierowany w prawo.
Na przykład wejście EEHTBPFC
powinno produkować
__ __
===== ====== \/ ====== \/
====| |==== =============== =============== _____---_____ _______________ | [] |========= | [] |=========
| [] [] | | [] [] [] [] | |-|-| | |-|-| ( ) \ | | | | | | / | ) | )
=============--===============--===============--===============--===============--===============--================--================
O-O O-O O-O O-O O-O O-O O-O O-O O-O O-O O-O O-O O-O-O O-O-O \\ O-O-O O-O-O \\
Detale
- To jest kod golfowy; najkrótszy program w bajtach wygrywa.
- Dowolna sekwencja jednej lub więcej liter
EPBTHFC
jest prawidłowym wprowadzeniem. - Twój program musi być w stanie wypisać wszystkie 7 typów samochodów dokładnie tak, jak pokazano powyżej.
- Pobierz dane z wiersza poleceń lub bezpośrednio od użytkownika (np. Okno komunikatu). Wyjście na standardowe wyjście. (Cytaty wokół danych wejściowych są w porządku).
- Wysokość wyjściowa powinna wynosić 6 lub maksymalna wysokość wymagana do ciągnięcia wagonów pociągowych.
- Nie należy umieszczać złączek (
--
) z przodu pierwszego samochodu lub z tyłu ostatniego samochodu.
code-golf
ascii-art
kolmogorov-complexity
Hobby Calvina
źródło
źródło
E
z przodu i czy może byćE
gdzieś pośrodku?Odpowiedzi:
Perl, 265 bajtów
Ponieważ ten wpis zawiera bajty, które nie odpowiadają drukowalnym znakom ASCII, nie można go tutaj wkleić bezpośrednio. Zamiast tego udostępniam go jako zrzut heksowy. Użytkownicy systemów uniksowych mogą zrekonstruować skrypt, wprowadzając następujący zrzut heksowy do
xxd -r
polecenia:Skrypt korzysta z funkcji Perl 5.10
say
, dlatego należy go uruchomićperl -M5.010
. Pobiera jeden argument wiersza poleceń składający się z literEPBTHFC
i wyświetla odpowiedni układ wagonu. Na przykład dane wejścioweFEH
generują następujące dane wyjściowe:Czytelny kod na początku skryptu po prostu rozpakował skompresowany ciąg zlib zawierający treść skryptu i analizuje go. Z kolei zdekompresowany kod wygląda następująco:
Należy zauważyć, że wszystkie wagony pociągowe mają linie wypełnione odstępami na jednakowej długości i zawierają sprzęgło (które jest usuwane z skrajnie prawego wagonu za pomocą pętli wyjściowej). Kompresja DEFLATE stosowana przez zlib jest bardzo dobra w kompresji takich powtarzalnych danych, więc nie trzeba próbować kompresować jej ręcznie.
Pamiętaj, że jest to pierwsza szybka próba. Jestem pewien, że można by ogolić kilka bajtów długości, grając z odmianami, takimi jak zmiana kolejności wagonów w źródle.
źródło
Python, 464
Wybrałem podejście z przekleństwami. Nie może tak naprawdę konkurować, ale dobrze się z tym bawiłem (~ 630 bajtów):
źródło
sl
2.0Python (
582488476450 znaków)Sałatka ascii to zakodowany zlib łańcuch znaków skompresowany base64 zawierający cyfry ...
źródło
string.decode('base64')
2.j=lambda y:y==4and'--'or' '
3.for c in A[::-1]:i.append(C[c][y])
f.append(j(y).join(i)
for l in((y==4and'--'or' ').join(C[c][y]for c in A[::-1])for y in range(6-h,6)):print l
for y in range(6-h,6):print(y==4and'--'or' ').join(C[c][y]for c in A[::-1])
Python,
402369Dzięki za ulepszenia, ugoren!
źródło
range(6)
,for x,y in zip("EPBTHFC",range(0,42,6)):
JavaScript,> 471 bajtów
Cóż, cholera, już najlepszy wynik, a ja wciąż nie udało mi się wydrukować wszystkiego po kolei. Ale spędziłem nad tym popołudnie i nadal chciałem to pokazać.
Wystarczy
console.log(c(L)); // L=train car letter
i wydrukuje pojedynczy samochód na konsoli. Wiem, że istnieje wiele możliwości przycinania, aby to zrobić, ale poddaję się. : Pźródło
<marquee>
diabelski diabeł. Dlaczego kiedykolwiek cię zniechęcili?Java (583 znaków)
Dzięki podstawowej domowej kompresji - nie jestem pewien, czy jest tak skuteczny :-) Łańcuch pociągu (np.
EEHTBPFC
) Musi zostać przekazany jako parametr.Rozłożony:
źródło
C #,
758664603562 bajtówNiezbyt dobry wynik, około 200 bajtów w źle zakodowanym ciągu i około 80 bajtów przeznaczonych na jego odkodowanie. Frustrująca ilość kodu wydanego na uporządkowanie sprzęgła w silniku! Teraz pozostawia białe ślady na przodzie pociągu, co jest nieporządne, ale zgodne z zasadami, a także ma wymiary łańcucha danych zakodowane na stałe, co początkowo nie chciałem robić.
Trochę sformatowany:
Łańcuch jest bardzo łatwo kompresowany przez zastąpienie powtarzanego znaku ciągiem reprezentującym liczbę znaków, po których następuje znak (minus 1), lub po prostu znak, jeśli jest tylko jeden z nich (chciałem trzymać się ASCII i unikać robienia czegokolwiek na poziomie sub-char). Enkoder (nie wliczony w wynik):
źródło
Oto moje rozwiązanie w PHP (kompatybilne z wersją 4.4), 512 bajtów. Może być krótszy, ale po prostu zrobił szybką kompilację, aby to wypróbować.
To jest rozproszona wersja dla łatwego czytania:
źródło
Python, 491 bajtów
Podoba mi się to, jak wyszło, chociaż nie będzie zwycięzcą.
źródło
if j==5...x[j]+=y[w[i]][j]+k
na,x[j]+=y[w[i]][j]+('\\ 'if j==5 and w[i]=='E'else'--'if j==4 and i!=u-1 else' ')
aby trochę zaoszczędzić. (Możesz także umieścić tabulator zamiast dwóch spacji przedx[j]...
.)GNU sed , 491 bajtów
Wypróbuj online!
Wyjaśnienie
Jest to w zasadzie bardzo naiwny niestandardowy schemat kompresji. Pierwszy wiersz dołącza do każdej litery na wejściu spację i
#
, aby zaznaczyć koniec każdej części:Następne 7 wierszy zastępuje każdą literę skompresowaną reprezentacją odpowiedniego obrazu ASCII:
Następne 14 wierszy wykonuje „dekompresję”. Na przykład
S
dekompresuje do sześcius
es, as
dekompresuje do dwóch spacji, więcS
staje się 12 spacjami.Po zdekompresowaniu linie każdego samochodu są poprzedzone numerem linii, a każdy samochód jest zakończony przez
#
. Reszta kodu dołącza0123456;
(numery linii i ogranicznik) do przestrzeni wzorów, a następnie w pętli zastępuje każdą cyfrę odpowiadającą linią każdego samochodu.Na koniec tnie przestrzeń wzoru na linie, dzieląc cyfry i usuwając znaki z zewnątrz:
Tutaj jest dużo miejsca na ulepszenia. Nie byłem wcale rygorystyczny w poszukiwaniu optymalnego zestawu kompresji, a użycie tabeli odnośników zamiast 14 osobnych
s///g
byłoby łatwą wygraną. Mogę z tym jeszcze trochę makaron.źródło
Python 3 , 529 bajtów
Wypróbuj online!
Pomyślałem, że opublikuję to, ponieważ nie używa żadnej kompresji, w przeciwieństwie do większości innych odpowiedzi tutaj.
źródło
C (GCC) ,
501499490489484 bajtów-2 -9 -1 -5 bajtów dzięki pułapkowi cat .
Wypróbuj online!
źródło