ASCII Train Golf


60

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 EPBTHFCi 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 EEHTBPFCpowinno 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 EPBTHFCjest 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.


Czy zawsze będzie Ez przodu i czy może być Egdzieś pośrodku?
Martin Ender

1
„najkrótszy program wygrywa”. => czy liczymy bajty lub znaki?
xem.


1
Kolejne powiązane pytanie: codegolf.stackexchange.com/q/4690/9498
Justin

Odpowiedzi:


21

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 -rpolecenia:

0000000: 7573 6520 436f 6d70 7265 7373 275a 6c69  use Compress'Zli
0000010: 623b 6576 616c 2075 6e63 6f6d 7072 6573  b;eval uncompres
0000020: 7320 2778 daad 9241 6b83 3014 c7ef f914  s 'x...Ak.0.....
0000030: ef10 6add f67c 5ed6 8b06 c646 476f dda1  ..j..|^....FGo..
0000040: 3723 c183 1d85 8212 c740 087e f625 a6a3  7#.......@.~.%..
0000050: b1f6 24fd 3de1 3d7f e8fb e790 b74a 74ed  ..$.=.=......Jt.
0000060: f9f4 c3e9 25cf a328 6310 a094 6b4c 8c78  ....%..(c...kL.x
0000070: 2569 5406 8a12 8cf8 c7ab 09b1 ff71 0222  %iT..........q."
0000080: 833d da02 b874 2981 c10d 3333 df74 39c1  .=...t)...33.t9.
0000090: f531 d6dc 0f03 8f9f 9666 a12d 7021 6e7a  .1.......f.-p!nz
00000a0: 6416 2807 228e dd99 3584 c40f cc52 53ac  d.(."...5....RS.
00000b0: 9160 82a2 4559 0bcd a22c ff2e 1cc1 0e63  .`..EY...,.....c
00000c0: 9d09 6f85 25b8 13b3 8470 3fe3 5c27 a1eb  ..o.%....p?.\'..
00000d0: df5a 7735 b44d 2b86 9eb6 5fef 87dd e707  .Zw5.M+..._.....
00000e0: a5b8 219d b1ae eaed 3743 4709 f1aa d83c  ..!.....7CG....<
00000f0: f1d5 3357 257d 6be7 1039 9186 63a3 214d  ..3W%}k..9..c.!M
0000100: 9257 f607 1251 a1e7 27                   .W...Q..'

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 liter EPBTHFCi wyświetla odpowiedni układ wagonu. Na przykład dane wejściowe FEHgenerują następujące dane wyjściowe:

                             __                     
                 ======      \/                     
_______________  | [] |=========                    
\ | | | | | | /  |              )                   
===============--================--===============
 O-O       O-O    O-O-O   O-O-O \\  O-O       O-O   

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:

@a=split$/,<<'';
            __    
======      \/    
| [] |=========   
|              )  
================--
 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   

$i=reverse pop=~y/EPBTHFC/0-6/r;
say$i=~s/./$a[6*$&+$_]/gr=~s/--$//r for 0..5

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.


62

Python, 464

from curses import*
E,P,B,T,H,F,C='eJyNkM0NgDAIhe9MwVEPpBN0AxMHsKaLdHgfpVr7E+NHUyCQR4C5EiP5jKXBUeLj5ORvkDes5DtEiHeBoWo+hI36NtN9XurrRaVMQTSTEBizPo3+SGBBICLZ0/K9y0whtlDA/Gruj8SwyaRJA9tSPz16qmdTxqO9VeAvC5VloQ=='.decode('base64').decode('zlib').split('L')
i=[s.split('\n')for s in map(eval,raw_input()[::-1])]
h=max(sum(map(bool,s))for s in i)
w=initscr()
x=0
for t in i:[w.addstr(y,x,t[y+6-h])for y in range(h)];x+=len(t[-2])
w.addstr(h-2,x-2,'  ')
w.getch()
endwin()

Wybrałem podejście z przekleństwami. Nie może tak naprawdę konkurować, ale dobrze się z tym bawiłem (~ 630 bajtów):

pociąg

from curses import*
E,P,B,T,H,F,C='eJyFkMENwCAIRe9M8Y/tgTiBGzTpALVxEYcvSFqiNO2DCAb8BgCnVsodu5ZEDceJlm/kPrBSniDsLCY1i6VsNDeZ6uMt1GEKMJU3ARYD1DX7F5DRBGbukZbvKeL7OkJF/nZL/wJxhrlFE6vooYtuviwlrso1JF745GMr'.decode('base64').decode('zlib').split('L')
i=[s.split('\n')for s in map(eval,raw_input()[::-1])]
h=max(sum(map(bool,s))for s in i)
w=initscr()
m=w.getmaxyx()[1]
for o in range(-sum(2+len(t[-2])for t in i),m):
 x=o
 for t in i:
  if m>x>o:w.addnstr(h-2,max(x,0),'--'[max(0,-x):],m-x);x+=2
  [w.addnstr(y,max(x,0),t[y+6-h][max(0,-x):],m-x)for y in range(h)if x<m];x+=len(t[-2])
 w.move(h,0);w.refresh();w.clear();napms(90)
endwin()

10
Wow, ta animacja jest świetna! (+1) Animowane pliki GIF działają w postach, dzięki czemu można edytować rzeczywisty obraz zamiast linku, co sprawi, że Twoje rozwiązanie będzie wyglądało na bardziej wyszukane. ;)
Klamka

2
@Doorknob Thanks. Wstawię obraz - po prostu nie byłem pewien, czy animowany GIF byłby zbyt denerwujący.
grc

24
@grc denerwujące? jesteś pewien, że nie miałeś na myśli AWESOME?
nderscore

4
Nie ma nic lepszego niż gif artystyczny ASCII. +1!
Chris Cirefice,

4
Wyślij to do Homebrew! sl2.0
Kroltan

8

Python ( 582 488 476 450 znaków)

import sys
A=sys.argv[1]
h=0
c='eJyVkrEKAzEIhnef4h97g9x+kOVKS7d2uK0peZE8fNXQS3NCpb+BREU/YnIhfKkUgJKpBfIsgYrnCzV9pIFBE6WDCHcWk1zbMy0PGovg/GMPw+6rujwaAY0CWtb/ESwG6NJTjNhChMxQxMy2g06/R+URtxBRRlGWC3SbY8Q1vkXgh4gz+Qb7v7Jy/US1P7TKP3NvbG3fy/V/Cw=='.decode('base64').decode('zlib').split(':')
C={}
for x in c:X=x.split('\n');C[X[0]]=X[1:-1]
for c in A:h=max(h,1+('F..CE'.find(c)+1or 3))
for y in range(6-h,6):print(' -'[y==4]*2).join(C[c][y]for c in A[::-1])

Sałatka ascii to zakodowany zlib łańcuch znaków skompresowany base64 zawierający cyfry ...


1. 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)
Wcięcia

Ostatnie 6 linii może byćfor l in((y==4and'--'or' ').join(C[c][y]for c in A[::-1])for y in range(6-h,6)):print l
patrz

1
Zaproponowałem edycję z pewnymi ulepszeniami.
patrz

1
Pomyśl o tym, ostatnia linia może byćfor y in range(6-h,6):print(y==4and'--'or' ').join(C[c][y]for c in A[::-1])
patrz

@TheRare Incorporated swoją drugą (!) Poprawę! Twój!
max. Dzielnica czerwca

7

Python, 402 369

import sys
for n in range(6):
 l= sys.argv[1][::-1]
 for x,y in zip("EPBTHFC",range(0,42,6)):
  l=l.replace(x,'eJytktsNgCAMRVfpp340TMAHEziAGBZhePvgLYmGeGosXqQXSAEqIfDbWUElb0SKcF4QbUaljr0srCA6OJCC5jV7cDAyUYY6eQPlic9/kleqoKNVL6QANkmj37zohglElMzK9naJy16hhxRPR6ph/jzXB2XBS76bZpQa3Hex7Qpm1hOtg+Yb0a6PSA=='.decode('base64').decode('zlib').split('A')[y+n]).strip('-')
 print l

Dzięki za ulepszenia, ugoren!


Dziękuję za sformatowanie mojego kodu! Jestem trochę nowy i szczerze mówiąc nie wiem, co robię.
Elveone

1
Zaoszczędzić kilka znaków: range(6),for x,y in zip("EPBTHFC",range(0,42,6)):
ugoren

4

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

function c(i){
    var i=i.replace(/f/,"=15r h 7h").match(/(\D)(\d+)?/g),
    s={
        's':'\\',
        'w':' []',
        'b':' |',
        'h':'O-O',
        't':'-|',
        'r':'\n'
    }
    ,
    a=[];
    for(j in i){
        x=/(\D)(\d+)?/g.exec(i[j]),
        a[j]=x[1],
        n=x[2]/1,
        o="";
        while(x[2]&&0<n--)o+=a[j];
        a[j]=o||a[j];
    }
    r=a.join('');
    for(j in s)r=r.replace(RegExp(j,"g"),s[j]);
    return r;
}
E=" 12_2r=6 6s/r|wb=9r| 14)r=16r h-O 3h-O ss",
P="r2=15r|w4brf",
B="r2=15r|t2 b bt2rf",
T="r2 _5-3_5r( 13)rf",
H="r2_15rsb6 /rf",
F="r4f",
C="r 4=5r=4| 3|=4r|w 4wbr=13r h 5h";
console.log(c(C));

Wystarczy console.log(c(L)); // L=train car letteri wydrukuje pojedynczy samochód na konsoli. Wiem, że istnieje wiele możliwości przycinania, aby to zrobić, ale poddaję się. : P


6
Musiałem to zrobić: jsfiddle.net/34w2z
William Barbosa

3
@WilliamBarbosa haha, jestem opóźniony. Pomyślałem: „Co to za magia? Mój kod się porusza”. i szukając wszędzie tego, co zmieniłeś w skrypcie, aby go przewinąć ... a potem przeniosłem oczy na HTML. Achh, <marquee>diabelski diabeł. Dlaczego kiedykolwiek cię zniechęcili?
Phil Tune

4
@WilliamBarbosa Uważam, że znalazłeś jedyne uzasadnione użycie tego tagu.
Mike Clark

3

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.

class C{public static void main(String[]a){String s="",y="thAthA",x=" *!*h*!* A",q="vjA",r=q+x+y;String[]m=("hP78A^\\#$8A% &' %j.,A%hh) Ajj.A *!*!*8*!*!* /A"+y+q+"% &' &' &' &' %A"+r+q+"%!%!%,%,%!%!%A"+r+" [9[ A(tP)A"+r+"ss+A# % % % % % % $A"+r+y+q+x+"tPADRDAF%8%FA% &'P&' %AvRA *!*P*!* ").split("A");for(int l,z,i,j=0;j<6;j++){for(i=a[0].length()-1;i>=0;i--){z=a[0].charAt(i);r=m["EPBTHFC".indexOf(z)*6+j];for(int c:r.toCharArray()){c-=32;for(l=0;l<=c/12;l++)s+=" -=\\/|[]()O_".charAt(c%12);}if(i>0)for(l=0;l<(z=='E'&&j!=4?1:2);l++)s+=j==4?"-":" ";}s+="\n";}System.out.println(s);}}

Rozłożony:

class C{
    public static void main(String[]a){
        String s="",y="thAthA",x=" *!*h*!* A",q="vjA",r=q+x+y;
        String[]m=("hP78A^\\#$8A% &' %j.,A%hh) Ajj.A *!*!*8*!*!* /A"+y+q+"% &' &' &' &' %A"+r+q+"%!%!%,%,%!%!%A"+r+" [9[ A(tP)A"+r+"ss+A# % % % % % % $A"+r+y+q+x+"tPADRDAF%8%FA% &'P&' %AvRA *!*P*!* ").split("A");
        for(int l,z,i,j=0;j<6;j++){
            for(i=a[0].length()-1;i>=0;i--){
                z=a[0].charAt(i);
                r=m["EPBTHFC".indexOf(z)*6+j];
                for(int c:r.toCharArray()) {
                    c-=32;
                    for(l=0;l<=c/12;l++)
                        s+=" -=\\/|[]()O_".charAt(c%12);
                }
                if(i>0)for(l=0;l<(z=='E'&&j!=4?1:2);l++)s+=j==4?"-":" ";
            }
            s+="\n";
        }
        System.out.println(s);
    }
}

3

C #, 758 664 603 562 bajtów

Niezbyt 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ć.

using c=System.Console;class P{static void Main(){string d=c.ReadLine(),a="",z=@"99 1_5 4=78 5=5 \/1 3=|2 |3=14 29= 4_2-4_ 14_| [] |8= | []4 [] |14 | [] [] [] [] 1|-|-|1 |1 |-|-|(12 )\ | | | | | | /|13 )103= O-O4 O-O1 O-O6 O-O1 O-O6 O-O1 O-O6 O-O1 O-O6 O-O1 O-O6 O-O1 O-O-O2 O-O-O c";int j=0,e;foreach(var h in z)if(h>47&&h<58)j=j*10+h-48;else for(j++;j>0;j--)a+=h;int[]x={0,13,28,43,58,73,88,104};for(;j<6;j++){z="";foreach(var h in d)z=a.Substring(j*104+x[e="CFPBTHE".IndexOf(h)],x[e+1]-x[e])+(j==4?"--":"  ")+z;c.WriteLine(z.Replace("c ",@"\\").Trim('-'));}}}

Trochę sformatowany:

using c=System.Console;
class P{static void Main(){
    string d=c.ReadLine(),a="",z=@"99 1_5 4=78 5=5 \/1 3=|2 |3=14 29= 4_2-4_ 14_| [] |8= | []4 [] |14 | [] [] [] [] 1|-|-|1 |1 |-|-|(12 )\ | | | | | | /|13 )103= O-O4 O-O1 O-O6 O-O1 O-O6 O-O1 O-O6 O-O1 O-O6 O-O1 O-O6 O-O1 O-O-O2 O-O-O c";

    int j=0,e;

    foreach(var h in z)
        if(h>47&&h<58)
            j=j*10+h-48;
        else
            for(j++;j>0;j--)
                a+=h;

    int[]x={0,13,28,43,58,73,88,104};

    for(;j<6;j++)
    {
        z="";
        foreach(var h in d)
            z=a.Substring(j*104+x[e="CFPBTHE".IndexOf(h)],x[e+1]-x[e])+(j==4?"--":"  ")+z;
        c.WriteLine(z.Replace("c ",@"\\").Trim('-'));
    }
}}

Ł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):

string compress(string str)
{
    str += (char)0; // too lazy to write a proper loop
    string res = "";

    char prev = str[0];
    int count = 1;

    for (int i = 1; i < str.Length; i++)
    {
        char cur = str[i];
        if (cur != prev)
        {
            if (count != 1)
                res += (count - 1).ToString();
            res += prev;

            prev = cur;
            count = 1;
        }
        else
        {
            count++;
        }
    }

    return res;
}

3

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

<?php $m=array_combine(str_split('EPBTHFC'),explode('$',gzinflate(base64_decode('jZDBDYAwCEXvfwoOHvRAnKAzOICYLtLhhVYlrY320RQI5BMgcmJEyJRUViTaD0rhRvOKBaEBtLGa1ooXmdA2FdXnJfQ0rgkW9RRYjcieRQMKupzCzNlj/t6jIxBrIDrdbR1QwH+PRaVkn107+cWM971cxPwJ'))));$t=['','','','','',''];$i=str_split(strrev(strtoupper($argv[1])));foreach($i as $w=>$n){$c=$m[$n];$c=explode("\n",$c);foreach($t as $j=>&$p){$p.=str_pad($c[$j],$n=='E'?18:($n=='C'?15:17),$j==4?'-':' ');if($w==count($i)-1)$p=rtrim($p,' -');}}echo implode("\n",$t)."\n";

To jest rozproszona wersja dla łatwego czytania:

<?php
$m=array_combine(
    str_split('EPBTHFC'),
    explode('$',
        gzinflate(
            base64_decode(
                'jZDBDYAwCEXvfwoOHvRAnKAzOICYLtLhhVYlrY320RQI5BMgcmJEyJRUViTaD0rhRvOKBaEBtLGa1ooXmdA2FdXnJfQ0rgkW9RRYjcieRQMKupzCzNlj/t6jIxBrIDrdbR1QwH+PRaVkn107+cWM971cxPwJ'
            )
        )
    )
);
$t=['','','','','',''];
$i=str_split(strrev(strtoupper($argv[1])));
foreach($i as $w=>$n)
{
    $c=$m[$n];
    $c=explode("\n",$c);
    foreach($t as $j=>&$p)
    {
        $p.=str_pad($c[$j],$n=='E'?18:($n=='C'?15:17),$j==4?'-':' ');
        if($w==count($i)-1)$p=rtrim($p,' -');
    }
}
echo implode("\n",$t)."\n";

2

Python, 491 bajtów

import zlib as z,sys,base64 as d
y=eval(z.decompress(d.b64decode('eNqlksEOwiAMhl/lv1WTkd1NdtFovLmDt7HwIOK729LJmJDY6F8SyA/0g6YPOtNhIhQKAaCOhiS1fJ+siGlGHN5Sa6N9vriKLdwcB+/r7D3NHY2fYCRI7dT50kPyiM0zUCKUCiEe/yA6DkCGrKzEu5XIVWc559Iszu5bYdvEq5UYtmLH8/fW6K3Ei/mPP1W+QTxVxCVXbtklk3RnLHtG1OqYkqOU5wsfZZmx')))
w=sys.argv[1][::-1]
x=[""]*6
v=range
u=len(w)
for j in v(6):
 for i in v(u):
  if j==5 and w[i]=='E':k="\\ "
  elif j==4 and i!=u-1:k="--"
  else:k="  "
  x[j]+=y[w[i]][j]+k
for q in x:print q

Podoba mi się to, jak wyszło, chociaż nie będzie zwycięzcą.


Możesz zmienić if j==5...x[j]+=y[w[i]][j]+kna, 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 przed x[j]....)
Hobby Calvina

1

GNU sed , 491 bajtów

s/./& #/g
s:E:0S__s%1esss\\/s%2|bpef %3|Ss)%4E=@5 o-Os o-O \\\\:g
s/P/zE%3|bbbbp%4E@5ut/g
s/B/zE%3|-|-|s|s|-|-|%4E@5ut/g
s/T/z l---l %3(S )%4E@5ut/g
s:H:zlll%3\\pppppp /%4E@5ut:g
s/F/zSs %3Ss %4E@5ut/g
s/C/0S %1ssf==ss%2f=|spf=%3|bssbp%4ee=@5 ts t/g
s/z/0Ss %1Ss %2/g
s/%/s%/g
s/@/--%/g
s/u/ tss /g
s/t/os/g
s/S/ssssss/g
s/s/  /g
s/E/eef/g
s/e/ff/g
s/f/===/g
s/b/ []/g
s/p/ |/g
s/o/O-O/g
s/l/_____/g
s/^/0123456;/
:
s/([0-6])(.*;)\1([^%#]+)[%#](.*)/\1\3!\2\4/
t
s/(--!)?[1-6]/\n/g
s/[0!;]//g

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:

s/./& #/g

Następne 7 wierszy zastępuje każdą literę skompresowaną reprezentacją odpowiedniego obrazu ASCII:

s:E:0S__s%1esss\\/s%2|bpef %3|Ss)%4E=@5 o-Os o-O \\\\:g
s/P/zE%3|bbbbp%4E@5ut/g
s/B/zE%3|-|-|s|s|-|-|%4E@5ut/g
s/T/z l---l %3(S )%4E@5ut/g
s:H:zlll%3\\pppppp /%4E@5ut:g
s/F/zSs %3Ss %4E@5ut/g
s/C/0S %1ssf==ss%2f=|spf=%3|bssbp%4ee=@5 ts t/g

Następne 14 wierszy wykonuje „dekompresję”. Na przykład Sdekompresuje do sześciu ses, a sdekompresuje do dwóch spacji, więc Sstaje się 12 spacjami.

s/z/0Ss %1Ss %2/g
s/%/s%/g
s/@/--%/g
s/u/ tss /g
s/t/os/g
s/S/ssssss/g
s/s/  /g
s/E/eef/g
s/e/ff/g
s/f/===/g
s/b/ []/g
s/p/ |/g
s/o/O-O/g
s/l/_____/g

Po zdekompresowaniu linie każdego samochodu są poprzedzone numerem linii, a każdy samochód jest zakończony przez #. Reszta kodu dołącza 0123456;(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.

s/^/0123456;/
:
  s/([0-6])(.*;)\1([^%#]+)[%#](.*)/\1\3!\2\4/
  t

Na koniec tnie przestrzeń wzoru na linie, dzieląc cyfry i usuwając znaki z zewnątrz:

s/(--!)?[1-6]/\n/g
s/[0!;]//g

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///gbyłoby łatwą wygraną. Mogę z tym jeszcze trochę makaron.


1

Python 3 , 529 bajtów

a=['']*6
T,R="EPBTHFC",{'S':' '*3,'E':'='*3,'W':'[] ','U':'_'*5,'P':'| ','H':'O-O'}
A=('SSSS__  ',)+('S'*5,)*5+('SSSS ',),('EESS\/  ',)+('S'*5,)*5+('S E==S ',),('PW|EEE ','E'*5,'E'*5,' U---U ','U'*3,'S'*5,'E=|S|E='),('P SSSS)','PWWWW|','|-|-P P |-|-|','(SSSS )','\ PPPPPP/','S'*5,'PWS W|'),('E'*5+'=--',)+('E'*5+'--',)*5+('EEEE=--',),(' H-OSH-O \\\\ ',)+(' HSS HS',)*5+(' HS  HS',)
for C in input():
 for I in range(6):
  a[I]=A[I][T.index(C)]+'  '*(I<4)+a[I]
  for k in R:a[I]=a[I].replace(k,R[k])
a[4]=a[4][:-2]
[*map(print,a)]

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.


1

C (GCC) , 501 499 490 489 484 bajtów

-2 -9 -1 -5 bajtów dzięki pułapkowi cat .

#define A": O-Og O-O:o=:"
char*p,*q,s[80];j,k,n;main(i,a)char**a;{for(i=6;i--;puts(q))for(k=strlen(a[1]);k--;*q=0,printf("%-*s%s",j?j^6?15:13:16,s,k?i^1?!j*!i+"  ":"--":q)){j=index(p="EPBTHFC",a[1][k])-p;for(n=j*6+i,p=" O-O-Oc O-O-O \\\\:p=:|n ):| [] |i=:f=f \\/:l __"A"| [] [] [] [] |:o=::"A"|-|-|  |  |-|-|:o=::"A"(m ): e_c-e_::"A"\\ | | | | | | /:o_::"A":::: O-Oe O-O:m=:| []e [] |:d=|c |d=:d e=::";n--;)for(;*p++-58;);for(q=s;*p^58;p++)for(n=*p>96&*p<123?*p++-96:1;n--;)*q++=*p;}}

Wypróbuj online!


@ceilingcat Cheers!
gastropner
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.