ASCII-Zug Golf


60

Betrachten Sie diese sieben ASCII-Waggons.

Motor (E)

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

PKW (P)

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

Güterwagen (B)

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

Tanker (T)

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

Trichter (H)

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

Pritsche (F)

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

Kombüse (C)

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

Schreiben Sie ein Programm, das bei einer bestimmten Zeichenfolge EPBTHFCdie ASCII-Zugdarstellung --für die Fahrzeugkupplungen ausgibt . Die Eingabezeichen ganz links werden zu den Waggons ganz rechts. Der Zug zeigt immer nach rechts.

Zum Beispiel sollte eine Eingabe von EEHTBPFCerzeugen

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

Einzelheiten

  • Das ist Code Golf; das kürzeste Programm in Bytes gewinnt.
  • Jede Folge von einem oder mehreren Buchstaben EPBTHFCist eine gültige Eingabe.
  • Ihr Programm muss in der Lage sein, alle 7 Fahrzeugtypen genau so auszugeben, wie sie oben angezeigt werden.
  • Nehmen Sie Eingaben über die Befehlszeile oder direkt vom Benutzer (z. B. Meldungsfeld) entgegen. Ausgabe auf Standardausgabe. (Anführungszeichen um die Eingabe sind in Ordnung.)
  • Die Höhe der Ausgabe sollte entweder 6 oder die maximale Höhe sein, die für die zu ziehenden Waggons erforderlich ist.
  • Kupplungen ( --) nicht vorne am ersten oder hinten am letzten Fahrzeug anbringen.


Wird es immer einen Evorne geben und könnte es Eirgendwo in der Mitte einen geben?
Martin Ender

1
"Das kürzeste Programm gewinnt." => Zählen wir Bytes oder Zeichen?
XEM


1
Eine weitere verwandte Frage: codegolf.stackexchange.com/q/4690/9498
Justin

Antworten:


21

Perl, 265 Bytes

Da dieser Eintrag Bytes enthält, die nicht druckbaren ASCII-Zeichen entsprechen, kann er hier nicht direkt kopiert werden. Stattdessen stelle ich es als Hex-Dump zur Verfügung. Benutzer auf Unix-basierten Systemen können das Skript rekonstruieren, indem sie dem xxd -rBefehl den folgenden Hex-Dump hinzufügen:

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

Das Skript verwendet die Perl 5.10- sayFunktion und muss daher mit ausgeführt werden perl -M5.010. Es wird ein einzelnes Befehlszeilenargument aus den Buchstaben verwendet EPBTHFCund die entsprechende Wagenanordnung ausgegeben. Die Eingabe FEHerzeugt beispielsweise die folgende Ausgabe:

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

Der lesbare Code am Anfang des Skripts dekomprimierte einfach den mit zlib komprimierten String, der den Hauptteil des Skripts enthält, und wertet ihn aus. Der dekomprimierte Code sieht folgendermaßen aus:

@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

Beachten Sie, dass bei allen Eisenbahnwaggons die Linien mit gleichlangen Abständen gepolstert sind und die Kupplung enthalten (die durch die Ausgangsschleife vom Wagen ganz rechts entfernt wird). Mit der von zlib verwendeten DEFLATE-Komprimierung können sich wiederholende Daten sehr gut komprimiert werden, sodass Sie nicht versuchen müssen, sie manuell zu komprimieren.

Beachten Sie, dass dies ein schneller erster Versuch ist. Ich bin mir sicher, dass es möglich wäre, einige Bytes weniger Zeit zu verbrauchen, wenn man mit Variationen wie der Neuordnung der Waggons in der Quelle spielt.


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

Ich ging mit Flüchen an die Sache heran. Es kann nicht wirklich mithalten, aber ich hatte ein bisschen Spaß damit (~ 630 Bytes):

Zug

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, diese Animation ist großartig! (+1) Animierte GIFs funktionieren in Posts, sodass Sie das eigentliche Bild anstelle eines Links bearbeiten können, wodurch Ihre Lösung schicker aussieht. ;)
Türklinke

2
@Doorknob Danke. Ich werde das Bild einfügen - ich war mir nur nicht sicher, ob ein animiertes GIF zu ärgerlich wäre.
Grc

24
@grc nervig? Bist du sicher, dass du es nicht FANTASTISCH gemeint hast?
nderscore

4
Es gibt nichts Besseres als ein ASCII-Art-Gif. +1!
Chris Cirefice

4
Sende es an Homebrew! sl2.0
Kroltan

8

Python ( 582 488 476 450 Zeichen)

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

Der Ascii-Salat ist eine Base64-kodierte zlib-komprimierte Saite mit den Zahlen ...


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)
Einrückungen mit einem

Auch könnte letzten 6 Zeilen seinfor 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
Ich habe eine Bearbeitung mit einigen Verbesserungen angeboten.
Siehe auch

1
Kommen Sie und denken Sie darüber nach, die letzte Zeile könnte lautenfor y in range(6-h,6):print(y==4and'--'or' ').join(C[c][y]for c in A[::-1])
siehe dazu

@TheRare Einbindung Ihrer zweiten (!) Verbesserung! Deine!
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

Danke für die Verbesserungen, ugoren!


Vielen Dank für das Formatieren meines Codes! Ich bin ein bisschen neu in diesem Bereich und ehrlich gesagt weiß ich nicht, was ich tue.
Elveone

1
Speichern Sie einige Zeichen: range(6),for x,y in zip("EPBTHFC",range(0,42,6)):
ugoren

4

Javascript,> 471 Bytes

Naja Mist, schon über der besten Punktzahl, und ich bin immer noch nicht dazu gekommen, alles der Reihe nach drucken zu lassen. Aber ich habe einen Nachmittag damit verbracht und wollte es trotzdem zeigen.

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

Nur console.log(c(L)); // L=train car letterund es wird ein einzelnes Auto in der Konsole gedruckt. Ich weiß, dass es eine Menge Trimmen gibt, die ich tun könnte, aber ich gebe auf. : P


6
Ich musste es tun: jsfiddle.net/34w2z
William Barbosa

3
@ WilliamBarbosa haha, ich bin zurückgeblieben. Ich sagte: "Was für eine Magie ist das? Mein Code bewegt sich." und überall nach dem zu suchen, was Sie im Skript geändert haben, damit es scrollt ... dann bewegten sich meine Augen nach oben zum HTML. Ahh, <marquee>du teuflischer Teufel. Warum haben sie dich jemals verachtet?
Phil Tune

4
@ WilliamBarbosa Ich glaube, Sie haben die einzig legitime Verwendung für dieses Tag gefunden.
Mike Clark

3

Java (583 Zeichen)

Bei der einfachen hausgemachten Komprimierung - bin mir aber nicht sicher, ob es so effizient ist :-) Der Zugstring (zB EEHTBPFC) muss als Parameter übergeben werden.

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

Entfaltet:

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 Bytes

Keine große Punktzahl, etwa 200 Bytes in der schlecht codierten Zeichenfolge und etwa 80 Bytes für die Decodierung. Frustrierende Menge Code, die für das Aussortieren der Kupplung am Motor aufgewendet wurde! Es hinterlässt jetzt Leerzeichen an der Vorderseite des Zuges, was unordentlich ist, aber den Regeln entspricht. Außerdem sind die Abmessungen der Datenzeichenfolge fest codiert, was ich anfangs nur ungern getan habe.

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

Ein bisschen formatiert:

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

Die Zeichenfolge wird sehr einfach komprimiert, indem ein sich wiederholendes Zeichen durch eine Zeichenfolgendarstellung der Anzahl der Zeichen gefolgt von dem Zeichen (minus 1) ersetzt wird oder nur das Zeichen, wenn es nur eines davon gibt (ich wollte mich an ASCII halten und alles vermeiden) auf der Ebene der Unterzeichen). Encoder (nicht in der Partitur enthalten):

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

Hier ist meine Lösung in PHP (v5.4 kompatibel), 512 Bytes. Könnte kürzer sein, habe aber einen schnellen Build gemacht, um das auszuprobieren.

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

Dies ist eine verbreitete Version zum einfachen Lesen:

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

Ich mag, wie es herauskam, obwohl es kein Gewinner sein wird.


Sie könnte sich ändern , if j==5...x[j]+=y[w[i]][j]+kum x[j]+=y[w[i]][j]+('\\ 'if j==5 and w[i]=='E'else'--'if j==4 and i!=u-1 else' ')ein wenig zu speichern. (Sie können auch einen Tabulator anstelle von zwei Leerzeichen vor x[j]....)
Calvins Hobbys

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

Probieren Sie es online!

Erläuterung

Dies ist im Grunde ein super naives benutzerdefiniertes Komprimierungsschema. Die erste Zeile fügt jedem Buchstaben in der Eingabe ein Leerzeichen hinzu und #markiert das Ende jedes Teils:

s/./& #/g

Die nächsten 7 Zeilen ersetzen jeden Buchstaben durch eine komprimierte Darstellung des entsprechenden ASCII-Bildes:

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

Die nächsten 14 Zeilen führen die "Dekomprimierung" durch. Zum Beispiel Sdekomprimiert a auf sechs sund sdekomprimiert a auf zwei Leerzeichen, sodass es Szu 12 Leerzeichen wird.

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

Dekomprimiert, steht vor den Zeilen jedes Autos eine Zeilennummer, und jedes Auto wird mit abgeschlossen #. Der Rest des Codes steht vor dem Muster 0123456;(Zeilennummern und Begrenzer) und ersetzt dann in einer Schleife jede Ziffer durch die entsprechende Zeile jedes Wagens.

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

Schließlich wird der Musterraum durch Aufteilen auf Ziffern in Zeilen unterteilt und überflüssige Zeichen entfernt:

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

Hier gibt es viel Raum für Verbesserungen. Ich war überhaupt nicht streng genug, um einen optimalen Satz von Komprimierungen zu finden, und die Verwendung einer Nachschlagetabelle anstelle von 14 separaten s///gs wäre ein einfacher Gewinn. Ich kann oder kann nicht mit diesem etwas mehr nudeln.


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

Probieren Sie es online!

Ich denke, ich würde es posten, weil es keine Komprimierung verwendet, im Gegensatz zu den meisten anderen Antworten hier.


1

C (gcc) , 501 499 490 489 484 Bytes

-2 -9 -1 -5 Bytes dank 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;}}

Probieren Sie es online!


@ceilingcat Prost!
Gastropner
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.