ASCII 기차 골프


60

이 7 개의 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

카 부스 (C)

    =====
====|   |====
| []     [] |
=============
 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가운데에 어딘가에 있을 수 있습니까?
Martin Ender

1
"가장 짧은 프로그램이 이깁니다." => 우리는 바이트 또는 문자를 계산합니까?
xem


1
또 다른 관련 질문 : codegolf.stackexchange.com/q/4690/9498
Justin

답변:


21

펄, 265 바이트

이 항목에는 인쇄 가능한 ASCII 문자와 일치하지 않는 바이트가 포함되어 있으므로 여기에서 직접 복사하여 붙여 넣을 수 없습니다. 대신 16 진수 덤프로 제공하고 있습니다. Unix-ish 시스템 사용자는 다음 16 진 덤프를 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..'

이 스크립트는 Perl 5.10 say기능을 사용 하므로로 실행해야합니다 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

모든 열차 차량에는 일정한 길이의 공간으로 채워진 선이 있으며 커플 링 (가장 오른쪽 차에서 출력 루프로 벗겨짐)을 포함합니다. zlib에서 사용하는 DEFLATE 압축은 이러한 반복적 인 데이터를 압축하는 데 매우 뛰어나므로 직접 압축하거나 시도 할 필요가 없습니다.

이것은 빠른 첫 번째 시도입니다. 나는 소스에서 열차를 재정렬하는 것과 같은 변형으로 재생하여 길이에서 몇 바이트를 줄일 수 있다고 확신합니다.


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) 애니메이션 GIF는 게시물에서 작동하므로 링크 대신 실제 이미지를 편집하면 솔루션이 더 멋지게 보일 수 있습니다. ;)
손잡이

2
@Doorknob 감사합니다. 이미지를 넣을 것입니다. 애니메이션 GIF가 너무 성가신 것인지 확실하지 않았습니다.
grc

24
@grc 짜증나? 당신은 굉장하지 않았다고 확신합니까?
nderscore

4
ASCII 아트 GIF보다 더 좋은 것은 없습니다. +1!
Chris Cirefice

4
Homebrew에 보내십시오! sl2.0
Kroltan

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-salad는 숫자가 포함 된 base64로 인코딩 된 zlib 압축 문자열입니다.


1. string.decode('base64')2. j=lambda y:y==4and'--'or' '3. 1 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

개선에 감사드립니다, ugoren!


내 코드를 포맷 해 주셔서 감사합니다! 나는 이것에 익숙하지 않으며 솔직히 내가하고있는 일을 모른다.
Elveone

1
몇 가지 문자를 저장하십시오 : range(6),for x,y in zip("EPBTHFC",range(0,42,6)):
ugoren

4

자바 스크립트,> 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
William Barbosa

3
@WilliamBarbosa haha, 나는 지체된다. "이것은 어떤 마법입니까? 코드가 움직이고 있습니다." 스크립트에서 변경 한 내용을 스크롤하여 스크롤하도록 검색 한 다음 HTML로 눈을 옮겼습니다. 아, <marquee>당신은 악마입니다. 그들은 왜 당신을 더 이상 사용하지 않습니까?
Phil Tune

4
@WilliamBarbosa 나는 당신 이이 태그에 대한 유일한 사용을 찾았다 고 생각합니다.
Mike Clark

3

자바 (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 562bytes

제대로 인코딩되지 않은 문자열에는 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]+kx[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 Hobbies

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 줄은 "압축 해제"를 수행합니다. 예를 들어, S6 개의 ses로 s압축 해제하고 2 개의 공백으로 압축 해제 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

파이썬 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 바이트

ceilingcat 덕분에 -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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.