Поле для гольфу ASCII


60

Розглянемо ці сім вагонів ASCII.

Двигун (E)

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

Легковий автомобіль (P)

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

Бокскар (B)

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

Танкер (T)

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

Бункер (Н)

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

Пласка (F)

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

Кабуз (С)

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

Напишіть програму, яка, коли задається послідовність символів EPBTHFC, виводить її представлення поїздів ASCII, використовуючи --для автомобільних з'єднань. Найменше ліві вхідні символи стають крайніми правої вагонами поїздів. Потяг завжди стикається праворуч.

Наприклад, вхід EEHTBPFCповинен виробляти

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

Деталі

  • Це код гольфу; виграє найкоротша програма в байтах.
  • Будь-яка послідовність однієї або декількох літер EPBTHFCє коректним введенням.
  • Ваша програма повинна мати можливість виводити всі 7 типів автомобілів точно так, як вони відображені вище.
  • Візьміть дані з командного рядка або безпосередньо від користувача (наприклад, вікно повідомлень). Вихід у stdout. (Котирування навколо вводу є нормальними.)
  • Висота виходу повинна бути або 6, або максимальна висота, необхідна для вагонів поїздів.
  • Не кладіть муфти ( --) спереду першого автомобіля або задню частину останнього автомобіля.


Чи завжди буде Eфронт і чи може бути Eдесь посередині?
Мартін Ендер

1
"виграє найкоротша програма." => чи вважаємо ми байти чи символи?
xem


1
Ще одне пов'язане питання: codegolf.stackexchange.com/q/4690/9498
Джастін

Відповіді:


21

Perl, 265 байт

Оскільки цей запис містить байти, які не відповідають друкованим символам ASCII, його тут не можна безпосередньо вставити. Натомість я надаю це як шестигранний смітник. Користувачі в системах Unix-ish можуть реконструювати скрипт, подаючи в команду наступний шістнадцятковий дамп xxd -r:

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

У сценарії використовується sayфункція Perl 5.10 , і тому її потрібно запустити perl -M5.010. Він займає єдиний аргумент командного рядка, що складається з літер EPBTHFCта видає відповідне розташування вагона поїзда. Наприклад, вхід FEHвидає такий вихід:

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

Читаний код на початку сценарію просто розпаковує стиснуту zlib рядок, що містить тіло скрипту, і оцінює його. Декомпресований код, у свою чергу, виглядає приблизно так:

@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

Зауважте, що всі вагони поїздів мають свої лінії, прокладені пробілами рівномірної довжини, і містять з'єднання (яке відводиться від крайнього правого вагона вихідним циклом). Стиснення DEFLATE, що використовується zlib, дуже добре стискає такі повторювані дані, тому не потрібно намагатися стискати їх вручну.

Зауважте, що це швидка перша спроба. Я впевнений, що можна було б поголити кілька байт з довжини, граючи з такими варіаціями, як переупорядкування вагонів поїзда в джерелі.


62

Пітона, 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()

Я пішов на підхід, використовуючи прокляття. Він насправді не може змагатися, але я з ним повеселився (~ 630 байт):

поїзд

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
Ух, ця анімація чудова! +1 ;)
Дверна ручка

2
@Doorknob Дякую Я покладу зображення - я просто не був впевнений, чи анімований GIF буде занадто дратувати.
grc

24
@grc дратує? ти впевнений, що не мав на увазі ДУЖЕ?
nderscore

4
Немає нічого кращого, ніж арт-gif ASCII. +1!
Chris Cirefice

4
Надішліть його на Homebrew! sl2.0
Кролтан

8

Пітон ( 582 488 476 450 символів)

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" - це кодована zlib-стиснена рядок base64, що містить фігури ...


1. string.decode('base64')2. j=lambda y:y==4and'--'or' '3. 1-космічні відступи 4. for c in A[::-1]:i.append(C[c][y])5.f.append(j(y).join(i)
seequ

Також останні 6 рядків могли бутиfor 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
Я запропонував редагувати з деякими вдосконаленнями.
seequ

1
Подумайте, останній рядок міг бутиfor y in range(6-h,6):print(y==4and'--'or' ').join(C[c][y]for c in A[::-1])
seequ

@TheRare включив ваше друге (!) Вдосконалення! Твій!
max.haredoom

7

Пітона, 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

Дякую за поліпшення, ugoren!


Дякую за форматування мого коду! Я щось нове в цьому і, чесно кажучи, не знаю, що роблю.
Ельвеоне

1
Зберегти деякі символи: range(6),for x,y in zip("EPBTHFC",range(0,42,6)):
ugoren

4

Javascript,> 471 байт

Ну лайно, вже над найкращим рахунком, і я досі не придумав, щоб він друкував все по черзі. Але я провів південь на цьому і все-таки хотів це показати.

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

Просто console.log(c(L)); // L=train car letterі він надрукує одну машину в консолі. Я знаю, що я можу зробити навіть багато цього, але я здаюсь. : P


6
Мені довелося це зробити: jsfiddle.net/34w2z
Вільям Барбоса

3
@WilliamBarbosa ха-ха, я відсталий. Мені здавалося: "Що це за магія? Мій код рухається". і шукати по всьому, що ви змінили в сценарії, щоб він прокручував ... потім перемістив очі на HTML. Ах, <marquee>ти диявольський диявол. Чому вони вас ніколи зневажили?
Phil Tune

4
@WilliamBarbosa Я вважаю, що ви знайшли одне і єдине законне використання цього тегу.
Майк Кларк

3

Java (583 символи)

З базовим домашнім стисненням - не впевнений, що це настільки ефективно :-) Рядок поїзда (наприклад EEHTBPFC) повинен бути переданий як параметр.

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

Розгорнуто:

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байт

Не чудовий бал, 200 байтів у погано закодованому рядку, і близько 80 байт, присвячених його розшифровці. Розчаровує кількість коду, витрачений на розбирання зчеплення на двигуні! Тепер він залишає пробіл білого простору в передній частині поїзда, який є неохайним, але в межах правил, і він також має розміри жорстко закодованих даних, що я спочатку неохоче робив.

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

Відформатовано трохи:

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

Рядок стискається дуже просто шляхом заміни повторного символу рядковим представленням кількості символів з наступним символом (мінус 1), або просто символом, якщо є лише один (я хотів дотримуватися ASCII і уникати нічого робити на рівні суб-чарів). Енкодер (не включається в бал):

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

Ось моє рішення в PHP (сумісність v5.4), 512 байт. Може бути коротше, але просто зробив швидку збірку, щоб спробувати це.

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

Це розгорнута версія для легкого читання:

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

Пітон, 491 байт

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

Мені подобається, як це вийшло, навіть якщо він не буде переможцем.


Ви можете змінити, if j==5...x[j]+=y[w[i]][j]+kщоб x[j]+=y[w[i]][j]+('\\ 'if j==5 and w[i]=='E'else'--'if j==4 and i!=u-1 else' ')трохи заощадити. (Також ви можете поставити вкладку замість двох пробілів навпроти x[j]....)
Хобі Кальвіна

1

GNU sed , 491 байт

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

Спробуйте в Інтернеті!

Пояснення

Це в основному супер наївна спеціальна схема стиснення. Перший рядок додається до кожної літери у введенні пробілом і #, щоб позначити кінець кожної частини:

s/./& #/g

Наступні 7 рядків замінюють кожну букву стислим поданням відповідного зображення 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

Наступні 14 рядків роблять "декомпресію". Наприклад, Sдекомпресія на шість sес, а sдекомпресія на два проміжки, таким чином, Sстає 12 пробілами.

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

Декомпресовані рядки кожного автомобіля передують номером рядка, а кожен автомобіль закінчується #. Решта коду попередньо 0123456;(номери рядків та роздільник) простір шаблону, а потім у циклі замінює кожну цифру відповідним рядком кожного автомобіля.

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

Нарешті, він розрізає простір візерунка на рядки, розбиваючи на цифри та очищаючи сторонні символи:

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

Тут є багато можливостей для вдосконалення. Я взагалі не був суворим щодо пошуку оптимального набору компресій, а використання таблиці пошуку замість 14 окремих s///gс було б легко виграти. Я можу чи не можу локшини з цим ще трохи.


1

Python 3 , 529 байт

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

Спробуйте в Інтернеті!

Подумав, що я опублікую це, оскільки він не використовує ніякого стиснення, на відміну від більшості інших відповідей тут.


1

C (gcc) , 501 499 490 489 484 байт

-2 -9 -1 -5 байт завдяки стельовій кішці .

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

Спробуйте в Інтернеті!


@ceilingcat Привіт!
гастропнер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.