ASCII Train Golf


60

Considere estes sete vagões de trem ASCII.

Motor (E)

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

Carro de passageiro (P)

===============
| [] [] [] [] |
===============
 O-O       O-O

Vagão coberto (B)

===============
|-|-|  |  |-|-|
===============
 O-O       O-O

Petroleiro (T)

 _____---_____
(             )
===============
 O-O       O-O

Funil (H)

_______________
\ | | | | | | /
===============
 O-O       O-O

Mesa (F)

===============
 O-O       O-O

Caboose (C)

    =====
====|   |====
| []     [] |
=============
 O-O     O-O

Escreva um programa que, ao receber uma sequência de caracteres EPBTHFC, produza sua representação de trem ASCII, usando --para os acoplamentos de carro. Os caracteres de entrada mais à esquerda se tornam os vagões de trem mais à direita. O trem está sempre voltado para a direita.

Por exemplo, uma entrada de EEHTBPFCdeve produzir

                                                                                                                __                __
    =====                                                                                           ======      \/    ======      \/
====|   |====                   ===============  ===============   _____---_____   _______________  | [] |=========   | [] |=========
| []     [] |                   | [] [] [] [] |  |-|-|  |  |-|-|  (             )  \ | | | | | | /  |              )  |              )
=============--===============--===============--===============--===============--===============--================--================
 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 \\

Detalhes

  • Isso é código de golfe; o programa mais curto em bytes vence.
  • Qualquer sequência de uma ou mais letras EPBTHFCé entrada válida.
  • Seu programa deve ser capaz de produzir todos os 7 tipos de carros exatamente como eles aparecem acima.
  • Receba as informações da linha de comando ou diretamente do usuário (por exemplo, caixa de mensagem). Saída para stdout. (As cotações em torno da entrada são boas.)
  • A altura da saída deve ser 6 ou a altura máxima necessária para os vagões de trem sendo puxados.
  • Não coloque acoplamentos ( --) na frente do primeiro carro ou na traseira do último carro.


Sempre haverá um Ena frente e pode haver um Eno meio?
Martin Ender

11
"o programa mais curto vence." => contamos bytes ou caracteres?
xem


11
Outra questão relacionada: codegolf.stackexchange.com/q/4690/9498
Justin

Respostas:


21

Perl, 265 bytes

Como essa entrada contém bytes que não correspondem a caracteres ASCII imprimíveis, ela não pode ser copiada e colada aqui diretamente. Em vez disso, estou fornecendo-o como um dump hexadecimal. Usuários em sistemas Unix-ish podem reconstruir o script, alimentando o seguinte hex dump no xxd -rcomando:

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

O script usa o sayrecurso Perl 5.10 e, portanto, precisa ser executado perl -M5.010. É necessário um único argumento de linha de comando que consiste nas letras EPBTHFCe gera o arranjo correspondente do vagão. Por exemplo, a entrada FEHproduz a seguinte saída:

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

O código legível no início do script simplesmente descompacta a sequência compactada em zlib que contém o corpo do script e o avalia. O código descompactado, por sua vez, fica assim:

@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

Observe que todos os vagões de trem têm suas linhas preenchidas com espaços de comprimento uniforme e incluem o acoplamento (que é retirado do vagão mais à direita pelo loop de saída). A compactação DEFLATE usada pelo zlib é muito boa para compactar esses dados repetitivos; portanto, não há necessidade de tentar compactá-los manualmente.

Observe que esta é uma primeira tentativa rápida. Tenho certeza de que seria possível reduzir vários bytes de comprimento jogando com variações como reordenar os vagões de trem na fonte.


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()

Eu fui para uma abordagem usando maldições. Realmente não pode competir, mas me diverti um pouco (~ 630 bytes):

trem

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
Uau, essa animação é ótima! (+1) GIFs animados funcionam em postagens, para que você possa editar a imagem real em vez de um link, o que tornaria sua solução mais sofisticada. ;)
Maçaneta da porta

2
@Doorknob Thanks. Vou colocar a imagem - eu não tinha certeza se um GIF animado seria muito chato.
grc 20/07

24
@grc irritante? tem certeza de que não quis dizer IMPRESSIONANTE?
Ndscore

4
Não há nada melhor do que um gif de arte ASCII. +1!
22814 Chris Cirefice

4
Envie para Homebrew! sl2,0
Kroltan

8

Python ( 582 488 476 450 caracteres)

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

A salada ascii é uma cadeia compactada com zlib codificada em base64 contendo as figuras ...


1. string.decode('base64')2. j=lambda y:y==4and'--'or' '3. recuos de 1 espaço 4. for c in A[::-1]:i.append(C[c][y])5.f.append(j(y).join(i)
consulte

Além disso, as últimas 6 linhas podem serfor l in((y==4and'--'or' ').join(C[c][y]for c in A[::-1])for y in range(6-h,6)):print l
Veja também

11
Eu ofereci uma edição com algumas melhorias.
see

11
Venha para pensar sobre isso, a última linha poderia serfor y in range(6-h,6):print(y==4and'--'or' ').join(C[c][y]for c in A[::-1])
seequ

@TheRare Incorporou sua segunda (!) Melhoria! Teus!
21414

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

Obrigado pelas melhorias, ugoren!


Obrigado por formatar meu código! Eu sou meio novo nisso e honestamente não sei o que estou fazendo.
Elveone

11
Salvar alguns caracteres: range(6),for x,y in zip("EPBTHFC",range(0,42,6)):
ugoren

4

Javascript,> 471 bytes

Bem, porcaria, já acima da melhor pontuação, e ainda não consegui imprimir tudo em sequência. Mas passei uma tarde nisso e ainda queria mostrá-lo.

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

Apenas console.log(c(L)); // L=train car lettere imprimirá um único carro no console. Eu sei que há muito corte que eu poderia fazer para justamente isso, mas desisto. : P


6
Eu tinha que fazer isso: jsfiddle.net/34w2z
William Barbosa /

3
@WilliamBarbosa haha, sou retardado. Eu fiquei tipo: "Que mágica é essa? Meu código está se movendo". e pesquisando por tudo o que você alterou no script para fazê-lo rolar ... depois movi meus olhos para o HTML. Ahh, <marquee>seu diabo diabólico. Por que eles te depreciam?
Phil Tune

4
@WilliamBarbosa Acredito que você localizou o único e legítimo uso dessa tag.
Mike Clark

3

Java (583 caracteres)

Com a compactação caseira básica - embora não seja tão eficiente :-) A cadeia de trem (por exemplo EEHTBPFC) deve ser passada como parâmetro.

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

Desdobrado:

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 562bytes

Não é uma pontuação excelente, 200 bytes ou mais na cadeia mal codificada e cerca de 80 bytes dedicados à decodificação. Quantidade frustrante de código gasto resolvendo o acoplamento no motor! Agora, deixa um espaço em branco à frente do trem, que é desarrumado, mas dentro das regras, e também tem as dimensões da cadeia de dados codificada, algo que eu relutava em fazer inicialmente.

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

Formatado um pouco:

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 string é compactada de maneira muito simples, substituindo o caractere repetido por uma representação do número de caracteres seguido pelo caractere (menos 1), ou apenas o caractere se houver apenas um deles (eu queria ficar com o ASCII e evitar fazer qualquer coisa no nível sub-char). Codificador (não incluído na partitura):

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

Aqui está a minha solução em PHP (compatível com a v5.4), 512 bytes. Poderia ser mais curto, mas fez uma compilação rápida para tentar isso.

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

Esta é uma versão expandida para facilitar a leitura:

<?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 bytes

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

Eu gosto de como saiu, mesmo que não seja um vencedor.


Você poderia mudar if j==5...x[j]+=y[w[i]][j]+kpara x[j]+=y[w[i]][j]+('\\ 'if j==5 and w[i]=='E'else'--'if j==4 and i!=u-1 else' ')economizar um pouco. (Além disso, você pode colocar uma página em vez de dois espaços na frente x[j]....)
de Calvino Hobbies

1

GNU sed , 491 bytes

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

Experimente online!

Explicação

Este é basicamente um esquema de compactação personalizado super ingênuo. A primeira linha anexa a cada letra na entrada um espaço e #, para marcar o final de cada parte:

s/./& #/g

As próximas 7 linhas substituem cada letra por uma representação compactada da imagem ASCII correspondente:

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

As próximas 14 linhas fazem a "descompressão". Por exemplo, um Sdescompacta para seis ses e um sdescomprime para dois espaços, Stornando - se 12 espaços.

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

Descomprimida, as linhas de cada carro são precedidas por um número de linha e cada carro é terminado por #. O restante do código é anexado 0123456;(o número da linha e o delimitador) ao espaço do padrão e, em um loop, substitui cada dígito pela linha correspondente de cada carro.

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

Por fim, corta o espaço do padrão em linhas dividindo dígitos e limpa caracteres estranhos:

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

Há muito espaço para melhorias aqui. Não fui rigoroso em encontrar um conjunto ideal de compressões, e usar uma tabela de pesquisa em vez de 14 s///gs separados seria uma vitória fácil. Eu posso ou não macarrão com isso um pouco mais.


1

Python 3 , 529 bytes

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

Experimente online!

Imaginei que o postaria porque não usa nenhuma compressão, ao contrário da maioria das outras respostas aqui.


1

C (GCC) , 501 499 490 489 484 bytes

-2 -9 -1 -5 bytes graças ao ceilingcat .

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

Experimente online!


@ceilingcat Cheers!
Gastropner
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.