ASCII Train Golf


60

Рассмотрим эти семь вагонов ASCII.

Двигатель (E)

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

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

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

Вагон (B)

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

Танкер (T)

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

Бункер (H)

_______________
\ | | | | | | /
===============
 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 типов автомобилей в точности так, как они указаны выше.
  • Возьмите ввод из командной строки или непосредственно от пользователя (например, окно сообщения). Вывод на стандартный вывод. (Кавычки вокруг ввода в порядке.)
  • Высота выхода должна быть либо 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

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

Я пошел на подход, используя проклятия. Это не может реально конкурировать, но я немного повеселился (~ 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) Анимированные GIF-файлы работают в сообщениях, поэтому вы можете редактировать реальное изображение вместо ссылки, что сделает ваше решение более привлекательным. ;)
Ручка двери

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

24
@grc раздражает? Вы уверены, что не имели в виду УДИВИТЕЛЬНЫЙ?
nderscore

4
Нет ничего лучше, чем ASCII art gif. +1!
Крис Cirefice

4
Отправь это Homebrew! sl2,0
Кролтан

8

Python ( 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. for c in A[::-1]:i.append(C[c][y])f.append(j(y).join(i)
Отступы с

Кроме того, последние 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

Спасибо тебе за улучшения, угорен!


Спасибо за форматирование моего кода! Я новичок в этом и, честно говоря, я не знаю, что я делаю.
Эльвеоне

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и будет печататься один автомобиль в консоли. Я знаю, что я могу сделать многое, чтобы справиться даже с этим, но я сдаюсь. :П


6
Я должен был сделать это: jsfiddle.net/34w2z
Уильям Барбоза

3
@WilliamBarbosa, ха-ха, я отсталый. Я сказал: «Что это за магия? Мой код движется». и поиск по всему, что вы изменили в скрипте, чтобы сделать его прокруткой ... затем перевел взгляд на HTML. Ах, <marquee>ты дьявольский дьявол. Почему они когда-либо осуждали тебя?
Фил Тьюн

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

Python, 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]....)
Увлечения Calvin's

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 Приветствия!
gastropner
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.