Sân gôn ASCII


60

Hãy xem xét bảy chiếc xe lửa ASCII này.

Động cơ (E)

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

Xe khách (P)

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

Xe chở hàng (B)

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

Tàu chở dầu (T)

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

Phễu (H)

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

Mặt phẳng (F)

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

Cóc (C)

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

Viết chương trình khi được cung cấp một chuỗi các ký tự EPBTHFC, xuất ra biểu diễn đào tạo ASCII, sử dụng --cho khớp nối xe hơi. Các nhân vật đầu vào ngoài cùng bên trái trở thành những chiếc xe lửa ngoài cùng bên phải. Tàu luôn phải đối mặt.

Ví dụ, một đầu vào EEHTBPFCnên sản xuất

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

Chi tiết

  • Đây là mã golf; chương trình ngắn nhất tính bằng byte thắng.
  • Bất kỳ chuỗi nào của một hoặc nhiều chữ cái EPBTHFClà đầu vào hợp lệ.
  • Chương trình của bạn phải có khả năng xuất ra tất cả 7 loại xe chính xác như chúng xuất hiện ở trên.
  • Lấy đầu vào từ dòng lệnh hoặc trực tiếp từ người dùng (ví dụ hộp thông báo). Đầu ra cho thiết bị xuất chuẩn. (Báo giá xung quanh đầu vào là tốt.)
  • Chiều cao của đầu ra phải là 6 hoặc chiều cao tối đa cần thiết cho những chiếc xe lửa được vẽ.
  • Không đặt khớp nối ( --) ở phía trước của chiếc xe đầu tiên hoặc phía sau của chiếc xe cuối cùng.


Sẽ luôn có một cái Eở phía trước và có thể có một Enơi nào đó ở giữa không?
Martin Ender

1
"chương trình ngắn nhất sẽ thắng." => chúng ta đếm byte hay ký tự?
xem


1
Một câu hỏi liên quan khác: codegolf.stackexchange.com/q/4690/9498
Justin

Câu trả lời:


21

Perl, 265 byte

Vì mục này chứa các byte không tương ứng với các ký tự ASCII có thể in, nên nó không thể được sao chép trực tiếp ở đây. Thay vào đó, tôi đang cung cấp nó như một bãi chứa hex. Người dùng trên các hệ thống Unix-ish có thể xây dựng lại tập lệnh bằng cách cung cấp kết xuất hex sau cho xxd -rlệnh:

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

Kịch bản sử dụng saytính năng Perl 5.10 và do đó cần phải được chạy với perl -M5.010. Nó nhận một đối số dòng lệnh duy nhất bao gồm các chữ cái EPBTHFCvà đưa ra sự sắp xếp xe lửa tương ứng. Ví dụ: đầu vào FEHtạo ra đầu ra sau:

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

Mã có thể đọc được ở phần đầu của tập lệnh chỉ đơn giản là giải nén chuỗi nén zlib chứa phần thân của tập lệnh và bỏ qua nó. Mã giải nén, lần lượt, trông như thế này:

@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

Lưu ý rằng tất cả các toa tàu đều có các đường được đệm với các khoảng cách đến một chiều dài đồng nhất và bao gồm khớp nối (được tước từ ô tô ngoài cùng bên phải bởi vòng lặp đầu ra). Nén DEFLATE được sử dụng bởi zlib rất tốt trong việc nén dữ liệu lặp đi lặp lại như vậy, do đó không cần phải thử và nén bằng tay.

Lưu ý rằng đây là một nỗ lực đầu tiên nhanh chóng. Tôi chắc chắn rằng có thể loại bỏ một vài byte theo chiều dài bằng cách chơi với các biến thể như sắp xếp lại các toa tàu trong nguồn.


62

Con trăn, 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()

Tôi đã đi đến một cách tiếp cận bằng cách sử dụng những lời nguyền. Nó không thực sự cạnh tranh, nhưng tôi đã có một số niềm vui với nó (~ 630 byte):

xe lửa

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, hoạt hình đó thật tuyệt! (+1) GIF hoạt hình hoạt động trong các bài đăng, vì vậy bạn có thể chỉnh sửa hình ảnh thực tế thay vì một liên kết, điều này sẽ làm cho giải pháp của bạn trông lạ hơn. ;)
Doorknob

2
@Doorknob Cảm ơn. Tôi sẽ đưa hình ảnh vào - Tôi chỉ không chắc chắn nếu một GIF hoạt hình sẽ quá khó chịu.
grc

24
@grc phiền phức? bạn có chắc là bạn không có ý TUYỆT VỜI?
nderscore

4
Không có gì tốt hơn một gif nghệ thuật ASCII. +1!
Chris Cirefice

4
Gửi cho 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 là một chuỗi nén zlib được mã hóa cơ sở64 chứa các số liệu ...


1. string.decode('base64')2. j=lambda y:y==4and'--'or' '3. thụt lề 1 không gian 4. for c in A[::-1]:i.append(C[c][y])5.f.append(j(y).join(i)
seequ

Ngoài ra, 6 dòng cuối cùng có thể là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
Tôi đã cung cấp một chỉnh sửa với một số cải tiến.
xem

1
Hãy nghĩ về nó, dòng cuối cùng có thể làfor y in range(6-h,6):print(y==4and'--'or' ').join(C[c][y]for c in A[::-1])
seequ

@TheRare Kết hợp cải tiến thứ hai (!) Của bạn! Của mày!
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

Cảm ơn bạn đã cải thiện, xấu xí!


Cảm ơn bạn đã định dạng mã của tôi! Tôi mới làm quen với điều này và thật lòng tôi không biết mình đang làm gì.
Elveone

1
Lưu một số ký tự : range(6),for x,y in zip("EPBTHFC",range(0,42,6)):
ugoren

4

Javascript,> 471 byte

Chà, tào lao, đã vượt qua điểm số tốt nhất, và tôi vẫn chưa có được nó in mọi thứ theo trình tự. Nhưng tôi đã dành một buổi chiều về điều này và vẫn muốn thể hiện nó.

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

Chỉ console.log(c(L)); // L=train car lettervà nó sẽ in một chiếc xe duy nhất trong bảng điều khiển. Tôi biết có rất nhiều cách cắt tỉa tôi có thể làm ngay cả điều này, nhưng tôi từ bỏ. : P


6
Tôi đã phải làm điều đó: jsfiddle.net 432w2z
William Barbosa

3
@WilliamBarbosa haha, tôi bị chậm phát triển. Tôi giống như, "Đây là ma thuật gì? Mã của tôi đang di chuyển." và tìm kiếm tất cả những gì bạn đã thay đổi trong tập lệnh để làm cho nó cuộn ... sau đó chuyển mắt lên HTML. Ahh, <marquee>bạn quỷ dữ. Tại sao họ không bao giờ phản đối bạn?
Phil Tune

4
@WilliamBarbosa Tôi tin rằng bạn đã tìm thấy một và chỉ sử dụng hợp pháp cho thẻ này.
Mike Clark

3

Java (583 ký tự)

Với tính năng nén tự chế cơ bản - không chắc là nó rất hiệu quả mặc dù :-) Chuỗi tàu (ví dụ EEHTBPFC) phải được truyền dưới dạng tham 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);}}

Mở ra:

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

Không phải là một điểm số tuyệt vời, 200 hoặc hơn byte trong chuỗi được mã hóa kém và khoảng 80 byte dành cho việc giải mã nó. Số lượng mã đáng thất vọng dành cho việc phân loại khớp nối trên động cơ! Bây giờ nó để lại dấu vết không gian trắng ở phía trước tàu, không gọn gàng nhưng theo quy tắc, và nó cũng có kích thước của chuỗi dữ liệu cứng được mã hóa, điều mà ban đầu tôi không muốn làm.

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

Định dạng một chút:

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

Chuỗi được nén rất đơn giản bằng cách thay thế ký tự lặp lại bằng một chuỗi đại diện cho số lượng ký tự được theo sau bởi ký tự (trừ 1) hoặc chỉ ký tự nếu chỉ có một trong số chúng (tôi muốn gắn bó với ASCII và tránh làm bất cứ điều gì ở cấp độ phụ). Bộ mã hóa (không bao gồm trong điểm):

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

Đây là giải pháp của tôi trong PHP (tương thích v5.4), 512byte. Có thể ngắn hơn, nhưng chỉ cần thực hiện một bản dựng nhanh để thử điều này.

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

Đây là phiên bản dàn trải để dễ đọc:

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

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

Tôi thích cách nó xuất hiện, mặc dù nó sẽ không phải là người chiến thắng.


Bạn có thể thay đổi 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' ')tiết kiệm một chút. (Ngoài ra, bạn có thể đặt một tab thay vì hai khoảng trắng ở phía trước x[j]....)
Sở thích của Calvin

1

GNU sed , 491 byte

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

Hãy thử trực tuyến!

Giải trình

Đây về cơ bản là một chương trình nén tùy chỉnh siêu ngây thơ. Dòng đầu tiên nối vào mỗi chữ cái trong đầu vào một khoảng trắng và #, để đánh dấu phần cuối của mỗi phần:

s/./& #/g

7 dòng tiếp theo thay thế mỗi chữ cái bằng một biểu diễn nén của hình ảnh ASCII tương ứng:

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 dòng tiếp theo thực hiện "giải nén". Ví dụ: Sgiải nén thành sáu ses và sgiải nén thành hai khoảng trắng, do đó Strở thành 12 khoảng trắng.

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

Được giải nén, các dòng của mỗi chiếc xe được đặt trước một số dòng và mỗi chiếc xe được chấm dứt bởi #. Phần còn lại của mã đặt trước 0123456;(số dòng và dấu phân cách) vào không gian mẫu và sau đó, trong một vòng lặp, thay thế mỗi chữ số bằng dòng tương ứng của mỗi chiếc xe.

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

Cuối cùng, nó cắt không gian mẫu thành các dòng bằng cách chia trên các chữ số và xóa các ký tự bên ngoài:

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

Có rất nhiều chỗ để cải thiện ở đây. Tôi hoàn toàn không khắt khe trong việc tìm kiếm một bộ nén tối ưu và sử dụng bảng tra cứu thay vì 14 s///gs riêng biệt sẽ là một chiến thắng dễ dàng. Tôi có thể hoặc không thể ăn mì với điều này thêm một số.


1

Python 3 , 529 byte

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

Hãy thử trực tuyến!

Hình tôi sẽ đăng nó vì nó không sử dụng bất kỳ nén nào, không giống như hầu hết các câu trả lời khác ở đây.


1

C (gcc) , 501 499 490 489 484 byte

-2 -9 -1 -5 byte nhờ trần .

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

Hãy thử trực tuyến!


@ceilingcat Chúc mừng!
dạ dày 11/12/18
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.