Wszyscy na pokładzie pociągu ASCII

Wszyscy na pokładzie pociągu ASCII!

 o O O ___ ___ ___ ___ ___ ___ ___ ___ ___ o | C | | O | | D | | E | | | | G | | O | | L | | F | TS__[O] |___| |___| |___| |___| |___| |___| |___| |___| |___| {======|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""| ./o--000""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-" 

Najlepiej przygotuj się na jazdę pociągiem, ponieważ masz zamiar zbudować pociąg, którym będziesz jechał. Biorąc pod uwagę ciąg znaków s, wyprowadź w pełni uformowany pociąg, jak pokazano powyżej. Pierwszą rzeczą wyjściową jest zawsze silnik, który „będzie pociągał za sznurek, jak pokazano poniżej:

 o O O o TS__[O] {======| ./o--000" 

Za lokomotywą znajdują się wagony zawierające każdy charakter cennego ładunku. Aby uniknąć zamieszania podczas rozładunku, Twoja firma zleciła Ci etykietowanie tych samochodów z zewnątrz. Samochody, o których mowa, zawsze będą wyglądać następująco:

 ___ | # | |___| _|"""""| "`-0-0-" 

Gdzie # jest reprezentatywnym znakiem znajdującym się wewnątrz ” ładunku ” hold. Dołączanie silnika do każdego samochodu jest również częścią twojej pracy, ponieważ masz za zadanie nadzorowanie płynności i powodzenia całej dostawy. Tak więc po oznaczeniu wszystkich wagonów i umieszczeniu silnika na torach musisz upewnić się, że pociąg jest zmontowany i gotowy do jazdy.

Zasady

  • jedyne dane wejściowe, które program powinien pobierać, to pojedynczy ciąg.
  • Silnik musi być zawsze wyprowadzany, nawet jeśli przesyłka jest pusta.
  • Każdy samochód może pomieścić tylko jeden znak, nie pchnij szczęście, możesz uszkodzić towar.
  • Potrzebujesz obsługi tylko następujących drukowalnych znaków ASCII: _-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
    Jeśli w końcu zrobisz więcej, „też w porządku, ale jest to absolutne minimum.
  • Dopuszczalne są 1-2 końcowe spacje, podobnie jak pojedynczy końcowy znak nowej linii.
  • To jest , najkrótsza liczba bajtów wygrywa.

Komentarze

  • Mglisto powiązane.
  • Nie ' nie sądzę, że to w rzeczywistości złożoność Kolmogorova . Bas ed na tym meta poście to pytanie jest z pewnością na granicy między dopasowaniem a niepasowaniem naszej definicji i osobiście powiedziałbym, że nie pasuje do tagu podobnego do to pytanie , które również prosi o rodzaj zawijania ciągu.
  • To jest piękne ascii -art
  • @WheatWizard it ' to mieszanka wielu gatunków. Silnik wpadłby w złożoność kolmogrowa, całość pod ASCII-Art i pewnie też trochę wpada w manipulację strunami.
  • Miałem wrażenie, że skompresowanie rzeczywistego wzoru pociągu byłoby warte znacznika; ale ja ' po prostu usunę go, aby zatrzymać argument.

Odpowiedź

05AB1E , 101 99 bajtów

Naiwna pierwsza próba.

" o O O o"ð7×"TS__[O] {======|./o--000""J5ä¹v… _ €ÐJy“ | ÿ | |___| _|"""""|"`-0-0-"“«5ä})øJ» 

Wypróbuj online!

Komentarze

  • Cóż, kod nie ' nie przypomina pociągu, ale teraz ' wygrywa.

Odpowiedź

JavaScript (ES6), 149 144 bajty

s=>` o O Oa ___ o a | $& | TS__[O]a |___| {======|a_|"""""| ./o--000"a"\`-0-0-"`.replace(/a(.*)/g,(_,c)=>s.replace(/./g,c)) 

Nie sądzę, aby sam silnik dał się skompresować, ale być może jest to możliwe.

Fragment testowy

 let f = s=>` o O Oa ___ o a | $& | TS__[O]a |___| {======|a_|"""""| ./o--000"a"\`-0-0-"`.replace(/a(.*)/g,(_,c)=>s.replace(/./g,c)) O.innerHTML = f("CODE GOLF") 
 <input value="CODE GOLF" oninput="O.innerHTML=f(this.value.replace(/\n/g,"&lt;br&gt;"))"><br> <pre id=O></pre> 

Komentarze

  • Wiele powtarzających się znaków, powinno dać się wycisnąć więcej bajtów z tego.
  • Prawie widać, jak pociąg jest zapakowany w kodzie źródłowym 🙂
  • Głosowano za głosem głównie dlatego, że kod przypomina pociąg
  • Dodatkowe punkty, ponieważ działa bezpośrednio w przeglądarce!

Odpowiedz

Befunge, 276 270 bajtów

p1p~:7>7+#:`#~_$:v >#p0p10:p00:+1g00_v#: v"!!```!!!"v>0p01g\-0g1+53p v"!}!#!}!!"v0 p115< v"!}```}!!"v^:-1< v"}#####}`">00g:| >"(.1.1.a#"^+<v1< v"P!P!p!!! "v5>g00p v"!!!!!p!!!"v6 v"^P\``TU!!"vp v"}>>>>>>|!"v+ >"(111..p0/"v6 v-1:g110">>"<g >:11p!#v_p011^ #-:#1_@>$$$$>,# 

Wypróbuj online!

Wyjaśnienie

Samochód i silnik są zakodowane jako dwa zestawy po pięć ciągów w wierszach od 3 do 12. Wartości znaków są wyłączone o 1, aby uniknąć konieczności zajmowania się podwójnymi cudzysłowami, których nie można użyć w ciągu Befunge.

Kod działa poprzez tworzenie pełnego zestawu znaków potrzebnych do renderowania pociągu stos. Dla każdego wiersza danych wyjściowych najpierw do stosu jest dodawany odpowiedni łańcuch wagowy, powtarzany tyle razy, ile jest to konieczne dla ładunku, a następnie jedna kopia odpowiedniego ciągu silnika.

Po skonstruowaniu każdego wiersza para strzałek w dół po lewej stronie ciągów jest zastępowana strzałką w prawo, więc następna iteracja pętli przebiega inną ścieżką w kodzie, używając innego para ciągów dla samochodu i silnika.

Po zgromadzeniu wszystkich danych na stosie następuje końcowa pętla renderująca, która wypisuje znaki, odejmując za każdym razem 1, aby uwzględnić początkowe kodowanie .

Jako bonus, źródło jest zaprojektowane w kształcie wieży działowej , na wypadek gdyby pociąg został zaatakowany . Golfiści zniszczyli moją wieżyczkę.

Komentarze

  • Golfiści zniszczyli moją wieżyczkę, LOL. +1. A jednak ' pokonuje C # i Javę.

Odpowiedź

PHP, 218 211 204 187 183 bajtów

 o O O<?for(;$y<5;print"\n".[" o "," TS__[O]"," {======|","./o--000""][+$y++])for($p=0;$c=a&$argn[$p++];)echo[" ___ "," | $c | "," |___| ","_|"""""|","\"`-0-0-""][+$y]; 

Pobiera dane wejściowe z STDIN; działa z -nR .

Sprężanie silnika lub wagon wymagałby więcej kodu do zdekompresowania, niż oszczędza na pamięci.
Nie widzę tutaj większego potencjału.

Komentarze

  • a&$c=$argn zamiast ""<$c=$argv[1]
  • @J ö rgH ü lsermann Tak, ten post był starożytny. 🙂

Odpowiedź

Python 2, 176 bajtów

 lambda i:"\n".join(map("".join,zip(*[[" o O O"," o "," TS__[O]"," {======|","./o--000""]]+[[" ___ "," | "+x+" | "," |___| ","_|"""""|","\"`-0-0-""]for x in i])))  

Przykład:

print f("Python") 

daje

 o O O ___ ___ ___ ___ ___ ___ o | P | | y | | t | | h | | o | | n | TS__[O] |___| |___| |___| |___| |___| |___| {======|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""| ./o--000""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-" 

Odpowiedź

Powershell, 167 166 bajtów

$l=($a=$args[0]).Length;" o O O"+" ___ "*$l;" o "+($a[0..$l]|%{" | $_ |"});" TS__[O]"+" |___| "*$l;" {======|"+"_|"""""|"*$l;"./o--000""+""`-0-0-"""*$l 

Przykład:

.\train.ps1 "PowerShell!" o O O ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ o | P | | o | | w | | e | | r | | S | | h | | e | | l | | l | | ! | TS__[O] |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| {======|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""| ./o--000""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-" 

Prawdopodobnie nieprawidłowe! Jeśli zostanie uruchomiony bez żadnych argumentów, spróbuje wypisać jeden pusty ciąg i będzie wyglądał następująco:

 o O O o | | TS__[O] {======| ./o--000" 

Jeśli zostanie uruchomiony z pustym ciągiem wejściowym, zwróci poprawnie jednakże:

.\train.ps1 "" o O O o TS__[O] {======| ./o--000" 

(trochę) Ungolfed:

$l=($a=$args[0]).Length " o O O"+" ___ "*$l " o "+($a[0..$l]|%{" | $_ |"}) " TS__[O]"+" |___| "*$l " {======|"+"_|"""""|"*$l "./o--000""+""`-0-0-"""*$l 

Najkrótsza kompresja w Powershell to będzie +"c"*x, gdzie c to znak, a x to liczba powtórzeń, a to „tylko dla powtórzeń końcowych lub początkowych, każde środkowe powtórzenie będzie wymagało dodatkowego + i dodatkowy " – więc nie ma w tym sensu, aby zobaczyć, jak kompresja oszczędza miejsce, a jedynym powtórzonym zestawem znaków jest ___, który ma tylko 3 znaki.

Wyjaśnienie:

$l=($a=$args[0]).Length Weź pierwszy argument , umieść go w $ a, a następnie weź długość $ a i umieść go w $ l, to są jedyne potrzebne zmienne.

" o O O"+" ___ "*$l większość pozostałe bity mają ten format t lewa część, a następnie prawa część pomnożona przez liczbę wymaganych znaków.

" o "+([char[]]$a|%{" | $_ |"}) pętla (|%{}) przez $ a jako tablicę znaków, więc foreach (char $_ in $a) dla wersji innej niż potokowa, a następnie umieść znak w tekście.

jest to niezwykle proste podejście, ale ponieważ nie mogę znaleźć dobrego sposobu na skompresowanie ciągów po tym, wydaje się, że jest najbardziej przydatny.

Zapisano 1 bajt dzięki briantist! i myślałem, że to nie potrwa dłużej ..

Komentarze

  • Nie ' nie muszę obsługiwać żadnych argumentów :).
  • @carusocomputing yay, dziękuję za poinformowanie mnie.
  • Świetnie! Możesz zaoszczędzić 1 bajt, zmieniając [char[]]$a to $a[0..$l] 🙂
  • ah używałem tablicy znaków, zanim zadeklarowałem $l i całkowicie zapomniałem o tym. dzięki za to!

Odpowiedź

Java, 361 bajtów

class C {static void main(String[]v){Scanner q = new Scanner(System.in);String i = q.nextLine();String[] t = {" o O O ", " o ", " TS__[O] ", " {======|", "./o--000"",};for (char c: i.toCharArray()) {t[0]+="___ ";t[1]+="| # | ".replace("#",c);t[2]+="|___| ";t[3]+="_|\"\"\"\"\"|";t[4]+="\"`-0-0-"";}for(String p:t) System.out.println(p);}} 
 class C { static void main(String[]v) { Scanner q = new Scanner(System.in); String i = q.nextLine(); String[] t = { " o O O ", " o ", " TS__[O] ", " {======|", "./o--000"", }; for (char c: i.toCharArray()) { t[0]+="___ "; t[1]+="| # | ".replace("#",c); t[2]+="|___| "; t[3]+="_|\"\"\"\"\"|"; t[4]+="\"`-0-0-""; } for(String p:t) System.out.println(p); } }  

Przykład

java o O O ___ ___ ___ ___ o | j | | a | | v | | a | TS__[O] |___| |___| |___| |___| {======|_|"""""|_|"""""|_|"""""|_|"""""| ./o--000""`-0-0-""`-0-0-""`-0-0-""`-0-0-" 

Komentarze

  • Wiem, że ' minęło połowę roku, ale możesz sporo golfa (również poprzez usunięcie spacji): interface C{static void main(String[]v){String n="\n",b=" o O O ",c=" o ",d=" TS__[O] ",e=" {======|",f="./o--000'";for(String x:new java.util.Scanner(System.in).nextLine().split("")){b+="___ ";c+="| "+x+" | ";d+="|___| ";e+="_|\"\"\"\"\"|";f+="\"`-0-0-'";}System.out.print(b+n+c+n+d+n+e+n+f);}} ( 318 bajtów ) Lub nawet więcej, jeśli zastąpisz new java.util.Scanner(System.in).nextLine() z v[0] jako alternatywą w put ( 279 bajtów ) Wypróbuj tutaj .

Odpowiedź

Perl, 137 bajtów

132 bajty kodu + 5 bajtów dla -pF flag.

ascii_train.pl:

 #!/usr/bin/perl -apF s/./ | $& | /g;$_=" o O O! ___ o $_ TS__[0]! |___| {======|!"."_|"""""|"." ./o--000"!\"`-0-0-"";s/!(.*)/$1x@F/ge  

Zwróć uwagę, że dodałem flagę -a w kodzie, ale dzieje się tak tylko dlatego, że stare wersje Perla wymagają -a, gdy -F.

Aby go uruchomić:

echo -n "code-golf" | perl ascii_train.pl 

dane wejściowe należy podać bez końcowego znaku nowej linii (na przykład z echo -n).

Wyjaśnienia:
Z tego co widziałem, to mniej więcej ten sam pomysł jako odpowiedź JavaScript ETHProduction.
Nie dzieje się tak wiele: niestety wzorce są zbyt krótkie, aby operator x był wart użycia.
Po pierwsze, s/./ | $& | /g otacza każdy znak wejścia | (i spacjami), tworząc drugi poziom pociągu.
Następnie wewnątrz tego długi ciąg, wszystko pomiędzy ! a nową linią to wzór, który chcemy powtórzyć przy konstruowaniu samochodów. To powtórzenie jest wykonywane dzięki wyrażeniu regularnemu s/!(.*)/$1x@F/ge. (Użyłem !, ponieważ dane wejściowe nie mogą go zawierać).

Odpowiedź

SOGL V0.12 , 57 56 bajtów

Τ¡ā↓mΛC┌─⁵℮Ƨ⅛□→(š;∞⅟¹°⅔Ζ‽ζ÷⁴‘9n,{"s=Ο!NθæιžGš‼t╬¼Xg`‘8n┼ 

Wypróbuj tutaj!

Wyjaśnienie:

..‘ push a compressed string of the locomotive in a single line 9n split in line lengths of 9 ,{ for each character in the input "..‘ push a compressed string of a wagon in a single line 8n split to line lengths of 8 ┼ add horizontally 

Odpowiedź

C #, 277 bajtów

Gra w golfa:

string T(string s){var o=new string[]{" o O O"," o "," TS__[O]"," {======|","./ o--000"" };for(int i=0;i<s.Length;i++){o[0]+=" ___ ";o[1]+="| # | ".Replace("#",s[i]+"");o[2]+=" |___| ";o[3]+="_|\"\"\"\"\"|";o[4]+="\"`-0-0-"";}return string.Join("\r\n",o); 

Ungolfed:

public string T(string s) { var o = new string[] { " o O O", " o ", " TS__[O]", " {======|", "./ o--000"" }; for (int i = 0; i < s.Length; i++) { o[0] += " ___ "; o[1] += "| # | ".Replace("#", s[i] + ""); o[2] += " |___| "; o[3] += "_|\"\"\"\"\"|"; o[4] += "\"`-0-0-""; } return string.Join("\r\n", o); } 

Testowanie:

Console.Write(new AllAboardTheASCIITrain().T("")); o O O o TS__[O] {======| ./ o--000" 

I …

Console.Write(new AllAboardTheASCIITrain().T("Programming Puzzles & Code Golf")); o O O ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ o | P | | r | | o | | g | | r | | a | | m | | m | | i | | n | | g | | | | P | | u | | z | | z | | l | | e | | s | | | | & | | | | C | | o | | d | | e | | | | G | | o | | l | | f | TS__[O] |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| {======|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""| ./ o--000""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-" 

Odpowiedź

C # 221 bajtów

nic specjalnego się tutaj nie dzieje … po prostu tworząc każdą linię i łącząc ją z nowymi liniami.

 s=>{var t=new[]{" o O O"," o "," TS__[O]"," {======|","./o--000""};foreach(var c in s){t[0]+=" ___ ";t[1]+=$" | {c} | ";t[2]+=" |___| ";t[3]+="_|\"\"\"\"\"|";t[4]+="\"`-0-0-"";}return string.Join("\n",t);};  

Odpowiedź

C, 217 212 208 bajtów

i;f(char*t){char d[]=" o O O o TS__[O] {======|./o--000" ___ | C | |___| _|\"\"\"\"\"|\"`-0-0-"",*p;for(;i<5;i++){printf("%.9s",d+i*9);for(p=t;d[57]=*p++;)printf("%.8s",d+45+i*8);puts("");}} 

Wypróbuj online

Ou tput:

 o O O ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ o | C | | O | | D | | E | | | | G | | O | | L | | F | | | | I | | N | | | | C | TS__[O] |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| {======|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""| ./o--000""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-" 

Odpowiedź

Jq 1.5 , 178 bajtów

[[" o O O o TS__[O] {======|./o--000""|_nwise(9)]]+[range(length)as$i|[.[$i:$i+1]|" ___ | \(.) | |___| _|\"\"\"\"\"|\"`-0-0-""|_nwise(8)]]|transpose|map(add)[] 

Rozwinięty

# engine def E:" o O O o TS__[O] {======|./o--000""|_nwise(9); # car (note string interpolation) def C:" ___ | \(.) | |___| _|\"\"\"\"\"|\"`-0-0-""|_nwise(8); # generate train [[E]] + [range(length) as $i| [.[$i:$i+1] |C]] # combine rows and concatenate strings | transpose | map(add)[] 

Uruchomienie próbne

$ jq -MRr train.jq <<< "golf" o O O ___ ___ ___ ___ o | g | | o | | l | | f | TS__[O] |___| |___| |___| |___| {======|_|"""""|_|"""""|_|"""""|_|"""""| ./o--000""`-0-0-""`-0-0-""`-0-0-""`-0-0-" $ wc -c < train.jq 178 

Wypróbuj online

Odpowiedź

Excel VBA, 218 bajtów

Anonimowa funkcja bezpośredniego okna VBE, która pobiera dane wejściowe z zakresu [A1] i wyprowadza do bezpośredniego okna VBE

 [B1]=[Len(A1)]:?" o O O"[Rept(" ___ ",B1)]:?" o ";:For i=1To[B1]:?" | "Mid([A1],i,1)" | ";:Next:?:?" TS__[O]"[Rept(" |___| ",B1)]:?" {======|"[Rept("_|""""""""""|",B1)]:?"./o--000""[Rept("""`-0-0-"",B1)]  

Sformatowany pod kątem czytelności

 [B1]=[Len(A1)] ?" o O O"[Rept(" ___ ",B1)] ?" o ";:For i=1To[B1]:?" | "Mid([A1],i,1)" | ";:Next:?: ?" TS__[O]"[Rept(" |___| ",B1)]: ?" {======|"[Rept("_|""""""""""|",B1)]: ?"./o--000""[Rept("""`-0-0-"",B1)]  

Przykładowe wyjście

  o O O ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ o | V | | B | | A | | | | E | | x | | p | | r | | e | | s | | s | TS__[O] |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| |___| {======|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""| ./o--000""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-""`-0-0-"  

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *