Toate la bordul trenului ASCII

Toate la bordul trenului 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-" 

Cel mai bun fii pregătit să mergi cu trenul, pentru că „ești pe cale să construiești trenul pe care vei călări. Având un șir s, trimiteți un tren complet format așa cum este descris mai sus. Primul lucru care rezultă este întotdeauna motorul care „îți va trage șirul de-a lungul, așa cum este descris singur mai jos:

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

După locomotivă sunt vagoane care conțin fiecare caracterul prețiosului dvs. încărcătură. Pentru a economisi confuzia la descărcare, compania dvs. v-a însărcinat să etichetați exteriorul acestor mașini. Mașinile în cauză vor arăta întotdeauna astfel:

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

În cazul în care # este reprezentativ pentru caracterul care se află în ” marfa ” Înlănțuirea motorului la fiecare mașină face, de asemenea, parte din treaba dvs., deoarece ați fost însărcinat să supravegheați fluiditatea și succesul întregului transport. Deci, după ce ați etichetat toate mașinile și ați pus motorul pe șine, trebuie să vă asigurați că trenul este asamblat și gata de rulare.

Reguli

  • singura intrare pe care ar trebui să o ia programul dvs. este un singur șir.
  • Motorul trebuie să fie întotdeauna afișat, chiar dacă livrarea dvs. este goală.
  • Fiecare mașină poate deține doar un caracter, nu împingeți-vă norocul, puteți deteriora mărfurile.
  • Trebuie doar să acceptați următoarele caractere ASCII imprimabile: _-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
    Dacă ajungeți să faceți mai multe, „E bine, dar acesta este minimul.
  • Sunt acceptabile 1-2 spații de finalizare, la fel ca o singură linie nouă.
  • Aceasta este , cele mai scurte victorii cu numărul de octeți.

Comentarii

  • Înrudit.
  • Nu ‘ nu cred că acesta este de fapt kolmogorov-complexitate . Bas ed pe această meta postare această întrebare este cu siguranță pe linia dintre potrivirea și nepotrivirea definiției noastre și aș spune personal că nu se potrivește cu eticheta similară cu această întrebare care solicită, de asemenea, un tip de împachetare a șirurilor.
  • Este frumos ascii -art
  • @WheatWizard este ‘ un amestec de mai multe genuri. Motorul ar cădea sub complexitatea kolmogrov, totul sub ASCII-Art și probabil că se încadrează puțin și în manipularea șirurilor.
  • Am avut impresia că comprimarea modelului real al trenului ar fi demnă a etichetei; dar ‘ îl voi elimina doar pentru a opri argumentul.

Răspunde

05AB1E , 101 99 octeți

Prima încercare naivă.

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

Încercați online!

Comentarii

  • Ei bine, codul nu ‘ seamănă cu un tren, dar ‘ câștigă acum.

Răspuns

JavaScript (ES6), 149 144 octeți

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

Nu cred că motorul în sine poate fi comprimat, dar poate că este posibil.

Test fragment

 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> 

Comentarii

  • O mulțime de caractere repetate, ar trebui să fie posibil să stoarceți mai mulți octeți din el.
  • Aproape că puteți vedea trenul împachetat în codul sursă 🙂
  • Votat în sus pentru că codul seamănă cu un tren
  • Puncte bonus deoarece rulează chiar acolo în browser!

Răspuns

Befunge, 276 270 octeți

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_@>$$$$>,# 

Încercați online!

Explicație

Mașina și motorul sunt codificate ca două seturi de cinci șiruri pe liniile 3-12. Valorile caracterelor sunt dezactivate cu 1, astfel încât să nu fie nevoie să se ocupe de ghilimele duble care nu pot fi utilizate într-un șir Befunge.

Codul funcționează prin construirea setului complet de caractere necesare pentru a reda stiva. Pentru fiecare linie de ieșire, se adaugă mai întâi la teanc un șir de mașină adecvat, repetat de câte ori este necesar pentru încărcătură, apoi o copie a șirului de motor corespunzător.

După ce fiecare linie a fost construită, o pereche de săgeți în jos la stânga șirurilor este înlocuită cu o săgeată dreapta, astfel încât următoarea iterație a buclei urmează o cale diferită prin cod, folosind o altă pereche de șiruri pentru mașină și motor.

Odată ce toate datele au fost acumulate pe stivă, există „o buclă de redare finală care scrie caracterele, scăzând 1 de fiecare dată pentru a ține cont de codificarea inițială .

Ca bonus, sursa este proiectată în forma unei turelă , în cazul în care trenul este atacat . Jucătorii de golf mi-au distrus turela de armă.

Comentarii

  • Jucătorii de golf mi-au distrus turela de arme, LOL. +1. Cu toate acestea, ‘ bătând C # și Java.

Răspuns

PHP, 218 211 204 187 183 octeți

 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]; 

Preține intrarea de la STDIN; rulați cu -nR .

Comprimarea motorului sau wagon ar necesita mai mult cod pentru a decomprima decât economisește în stocare.
Nu văd mai mult potențial aici.

Comentarii

  • a&$c=$argn în loc de ""<$c=$argv[1]
  • @J ö rgH ü lsermann Da, acest post era vechi. 🙂

Răspuns

Python 2, 176 octeți

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

Exemplu:

print f("Python") 

 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-" 

Răspuns

Powershell, 167 166 Bytes

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

Exemplu:

.\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-" 

Posibil nevalid! Dacă se execută fără argumente, va încerca să imprime un șir gol și va arăta ca:

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

Dacă se execută cu un șir de intrare gol, acesta va reveni corect totuși:

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

(cam) Ungolfed:

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

cea mai scurtă compresie din Powershell este va fi +"c"*x unde c este caracterul și x este numărul de repetări și că „numai pentru repetări finale sau principale, orice repetare a șirului central va necesita un + și un " suplimentar – deci nu există niciun punct în care să văd compresia economisind orice spațiu și singurul set de caractere repetat este ___ care are doar 3 caractere.

Explicație:

$l=($a=$args[0]).Length Luați primul arg , puneți-l în $ a, apoi luați lungimea de $ a și puneți-l în $ l, acestea sunt singurele variabile de care aveți nevoie.

" o O O"+" ___ "*$l majoritatea ceilalți biți urmează acest format de t partea stângă și apoi partea dreaptă multiplică numărul de caractere necesare.

" o "+([char[]]$a|%{" | $_ |"}) buclă (|%{}) prin $ a ca matrice de caractere, deci foreach (char $_ in $a) pentru o versiune non-pipeline, apoi introduceți caracterul în text.

Aceasta este o abordare extrem de simplă, dar pentru că nu pot găsi o modalitate bună de a comprima șirurile de caractere după aceasta, mi se pare cea mai utilă.

salvat 1 octeți, datorită briantist! și aici mă gândeam că acest lucru nu va fi mai scurt ..

Comentarii

  • Nu ‘ Nu trebuie să mă ocup de argumente :).
  • @carusocomputing yay, mulțumesc că mi-ați anunțat.
  • Frumos! Puteți salva 1 octet schimbând [char[]]$a la $a[0..$l] 🙂
  • ah folosea matrice char înainte să declar $l și am uitat total despre asta. mulțumesc pentru asta!

Răspuns

Java, 361 octeți

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); } }  

Exemplu

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

Comentarii

  • Știu că ‘ a fost înjumătățit pe an, dar puteți golf destul de puțin (și prin eliminarea spațiilor): 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 octeți ) Sau chiar mai mult dacă înlocuiți new java.util.Scanner(System.in).nextLine() cu v[0] ca alternativă în put ( 279 octeți ) Încercați aici .

Răspuns

Perl, 137 octeți

132 octeți de cod + 5 octeți pentru semnalizatoarele -pF.

ascii_train.pl:

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

Rețineți că am adăugat steagul -a în cod, dar este doar pentru că versiunile vechi ale Perl necesită -a -F este utilizat.

Pentru a-l rula:

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

intrarea trebuie furnizată fără o nouă linie finală (cu echo -n de exemplu).

Explicații:
Din ceea ce am văzut, este aproximativ aceeași idee ca răspuns JavaScript al ETHProduction.
Nu se întâmplă multe: din păcate, modelele sunt puțin scurte pentru a face ca operatorul x să merite folosit.
În primul rând, s/./ | $& | /g înconjoară fiecare caracter al intrării cu | (și spații) pentru a forma al doilea nivel al trenului.
Apoi în interiorul acelui șir lung, totul între un ! și o linie nouă este un model pe care dorim să îl repetăm pentru a construi mașinile. Această repetare se face grație regexului s/!(.*)/$1x@F/ge. (Am folosit ! deoarece intrarea nu o poate conține).

Răspuns

SOGL V0.12 , 57 56 octeți

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

Încercați aici!

Explicație:

..‘ 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 

Răspuns

C #, 277 Bytes

Golfed:

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); } 

Testare:

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-" 

Răspuns

C # 221 octeți

nimic special nu se întâmplă aici .. doar creând fiecare linie și alăturându-le cu linii noi.

 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);};  

Răspuns

C, 217 212 208 octeți

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("");}} 

Încercați 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-" 

Răspuns

Jq 1.5 , 178 octeți

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

Extins

# 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)[] 

Exemplu de rulare

$ 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 

Încercați online

Răspuns

Excel VBA, 218 octeți

Funcția anonimă a ferestrei imediate VBE care preia intrarea din intervalul [A1] și ieșiri în fereastra imediată 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)]  

Formatat pentru lizibilitate

 [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)]  

Exemplu de ieșire

  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-"  

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *