ASCII Train Golf

60

Considérez ces sept wagons de train ASCII.

Moteur (E)

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

Voiture de tourisme (P)

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

Wagon de marchandises (B)

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

Tanker (T)

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

Trémie (H)

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

À plat (F)

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

Le fourgon de queue (C)

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

Ecrivez un programme qui, lorsqu'il reçoit une séquence de caractères EPBTHFC, affiche sa représentation de train ASCII, en utilisant --pour les attelages de voiture. Les caractères saisis le plus à gauche deviennent les wagons les plus à droite. Le train est toujours tourné à droite.

Par exemple, une entrée de EEHTBPFCdevrait produire

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

Détails

  • C'est du code golf; le programme le plus court en octets gagne.
  • Toute séquence d'une ou de plusieurs lettres EPBTHFCconstitue une entrée valide.
  • Votre programme doit pouvoir afficher les 7 types de voiture exactement tels qu'ils apparaissent ci-dessus.
  • Prenez les entrées à partir de la ligne de commande ou directement de l'utilisateur (par exemple, une boîte de message). Sortie sur stdout. (Les citations autour de l'entrée sont très bien.)
  • La hauteur de sortie doit être égale à 6 ou à la hauteur maximale requise pour les wagons de train en train d’être tractés.
  • Ne mettez pas les attelages ( --) à l'avant de la première voiture ou à l'arrière de la dernière voiture.
Les passe-temps de Calvin
la source
Y aura-t-il toujours un Eà l'avant et pourrait-il y avoir un Equelque part au milieu?
Martin Ender
1
"le programme le plus court gagne." => compte-t-on des octets ou des caractères?
xem
1
@xem, octets, sauf indication contraire
Peter Taylor
1
Une autre question connexe: codegolf.stackexchange.com/q/4690/9498
Justin

Réponses:

21

Perl, 265 octets

Étant donné que cette entrée contient des octets qui ne correspondent pas à des caractères ASCII imprimables, elle ne peut pas être copiée-collée directement ici. Au lieu de cela, je le fournis comme un vidage hexadécimal. Les utilisateurs de systèmes Unix-ish peuvent reconstruire le script en fournissant à la xxd -rcommande le vidage hexadécimal suivant :

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

Le script utilise la fonctionnalité Perl 5.10 sayet doit donc être exécuté avec perl -M5.010. Il prend un seul argument de ligne de commande composé des lettres EPBTHFCet génère l'arrangement correspondant du wagon. Par exemple, l'entrée FEHproduit la sortie suivante:

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

Le code lisible au début du script décompresse simplement la chaîne compressée par zlib contenant le corps du script et l’évalue. Le code décompressé, à son tour, ressemble à ceci:

@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

Notez que toutes les voitures de train ont leurs lignes rembourrées d'espaces de longueur uniforme et incluent l'accouplement (qui est retiré de la voiture la plus à droite par la boucle de sortie). La compression DEFLATE utilisée par zlib est très efficace pour la compression de telles données répétitives. Il n'est donc pas nécessaire de tenter de la compresser à la main.

Notez qu'il s'agit d'une première tentative rapide. Je suis sûr qu'il serait possible de gagner plusieurs octets en jouant avec des variantes telles que la réorganisation des wagons dans la source.

Ilmari Karonen
la source
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()

Je suis allé pour une approche en utilisant des malédictions. Il ne peut pas vraiment rivaliser, mais je me suis bien amusé (~ 630 octets):

train

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()
grc
la source
10
Wow, cette animation est géniale! (+1) Les fichiers GIF animés fonctionnent dans les publications. Vous pouvez donc modifier l'image réelle au lieu d'un lien, ce qui donnerait à votre solution une apparence plus sophistiquée. ;)
Poignée de porte
2
@ Doorknob Merci. Je vais mettre l'image dans - je n'étais juste pas sûr si un GIF animé serait trop ennuyeux.
grc
24
@grc ennuyeux? Êtes-vous sûr de ne pas dire génial?
nderscore
4
Il n'y a rien de mieux qu'un gif d'art ASCII. +1!
Chris Cirefice
4
Envoyez-le à Homebrew! sl2.0
Kroltan
8

Python ( 582 488 476 450 Chars)

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

Ascii-salad est une chaîne compressée en zlib codée en base64 contenant les chiffres ...

max.haredoom
la source
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)
Retraits d'une zone
En outre, les 6 dernières lignes pourraient êtrefor l in((y==4and'--'or' ').join(C[c][y]for c in A[::-1])for y in range(6-h,6)):print l
seequ
1
J'ai proposé un montage avec quelques améliorations.
seequ
1
À bien y penser, la dernière ligne pourrait êtrefor y in range(6-h,6):print(y==4and'--'or' ').join(C[c][y]for c in A[::-1])
seequ
@TheRare Incorporated votre deuxième (!) Amélioration! Tes!
max.haredoom
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

Merci pour les améliorations, Ugoren!

Elveone
la source
Merci de formater mon code! Je suis un peu nouveau dans ce domaine et honnêtement, je ne sais pas ce que je fais.
Elveone
1
Enregistrer des caractères: range(6),for x,y in zip("EPBTHFC",range(0,42,6)):
ugoren
4

Javascript,> 471 octets

Bien merde, déjà sur le meilleur score, et je n'ai toujours pas eu à le faire imprimer tout en séquence. Mais j'ai passé un après-midi là-dessus et je voulais toujours le montrer.

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

Juste console.log(c(L)); // L=train car letteret cela imprimera une seule voiture dans la console. Je sais que je pourrais faire beaucoup de retouches pour y arriver, mais j'abandonne. : P

Phil Tune
la source
6
Je devais le faire: jsfiddle.net/34w2z
William Barbosa
3
@ WilliamBarbosa haha, je suis en retard. J'étais comme: "Quelle magie est-ce? Mon code est en mouvement." et en cherchant partout ce que vous avez changé dans le script pour le faire défiler ... puis je me suis tourné vers le HTML. Ahh, <marquee>diable diabolique. Pourquoi vous ont-ils jamais déprécié?
Phil Tune
4
@ WilliamBarbosa Je pense que vous avez identifié le seul et unique usage légitime de cette balise.
Mike Clark
3

Java (583 caractères)

Avec la compression maison basique - pas sûr que ce soit si efficace cependant :-) La chaîne de train (par exemple EEHTBPFC) doit être passée en paramètre.

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

Déplié:

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);
    }
}
Arnaud
la source
3

C #, 758 664 603 562 octets

Pas un gros score, environ 200 octets dans la chaîne mal codée, et environ 80 octets consacrés au décodage. Frustrant quantité de code passé à trier l'accouplement sur le moteur! Cela laisse maintenant un espace blanc derrière le train, ce qui est désordonné mais conforme aux règles, et il a également les dimensions de la chaîne de données codée en dur, ce que j’étais réticent à faire au début.

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

Un peu formaté:

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

La chaîne est compressée très simplement en remplaçant le caractère répété par une représentation sous forme de chaîne du nombre de caractères suivis du caractère (moins 1), ou tout simplement du caractère s'il n'y en a qu'un (je voulais coller avec ASCII et éviter de faire quoi que ce soit au niveau des sous-caractères). Encodeur (non inclus dans la partition):

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;
}
VisualMelon
la source
3

Voici ma solution en PHP (compatible v5.4), 512bytes. Pourrait être plus court, mais juste fait un montage rapide pour essayer ceci.

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

Ceci est une version étendue pour une lecture facile:

<?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";
Matrice de données
la source
2

Python, 491 octets

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

J'aime la façon dont c'est sorti, même si ce ne sera pas un gagnant.

luna
la source
Vous pouvez changer if j==5...x[j]+=y[w[i]][j]+kpour x[j]+=y[w[i]][j]+('\\ 'if j==5 and w[i]=='E'else'--'if j==4 and i!=u-1 else' ')économiser un peu. (Vous pouvez aussi mettre un onglet au lieu de deux espaces devant x[j]....)
Calvin's 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

Essayez-le en ligne!

Explication

Il s’agit d’un schéma de compression personnalisé super naïf. La première ligne ajoute à chaque lettre de l’entrée un espace et #, pour marquer la fin de chaque partie:

s/./& #/g

Les 7 lignes suivantes remplacent chaque lettre par une représentation comprimée de l’image ASCII correspondante:

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

Les 14 lignes suivantes font la "décompression". Par exemple, une Sdécompression à six ses et une sdécompression à deux espaces Sdeviennent ainsi 12 espaces.

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

Décompressé, les lignes de chaque voiture sont précédées d'un numéro de ligne et chaque voiture est terminée par #. Le reste du code ajoute 0123456;le numéro de ligne et le délimiteur à l'espace-modèle, puis, en boucle, remplace chaque chiffre par la ligne correspondante de chaque voiture.

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

Enfin, il divise l’espace du motif en lignes en séparant les chiffres et nettoie les caractères superflus:

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

Il y a beaucoup de place à l'amélioration ici. Je n’étais pas du tout rigoureux dans la recherche d’un ensemble optimal de compressions, et l’utilisation d’une table de correspondance au lieu de 14 secondes s///gserait une solution facile. Je peux ou ne peux pas nouille avec cela un peu plus.

Jordan
la source
1

Python 3 , 529 octets

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

Essayez-le en ligne!

Je pensais le poster car il n'utilise aucune compression, contrairement à la plupart des autres réponses ici.

nedla2004
la source
1

C (gcc) , 501 499 490 489 484 octets

-2 -9 -1 -5 octets grâce à 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;}}

Essayez-le en ligne!

gastropner
la source
@ceilingcat À la vôtre!
gastropner