ASCII Tren Golfü


60

Bu yedi ASCII tren vagonunu düşünün.

Motor (E)

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

Binek araç (P)

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

Boxcar (B)

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

Tanker (T)

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

Hazne (H)

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

Düz yatak (F)

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

Kabotaj (C)

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

Bir dizi karakter verildiğinde EPBTHFC, bunun --otomobil bağlantıları için kullanılan ASCII tren gösterimini veren bir program yazın . En soldaki giriş karakterleri en sağdaki tren araçları haline gelir. Tren her zaman sağa bakar.

Örneğin, bir girdi EEHTBPFCüretmeli

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

ayrıntılar

  • Bu kod golf; Bayt cinsinden en kısa program kazanır.
  • Harflerden bir veya daha fazlasının herhangi bir dizisi EPBTHFCgeçerli girdidir.
  • Programınız 7 araç tipini de yukarıda göründüğü gibi verebilmelidir.
  • Komut satırından veya doğrudan kullanıcıdan girdi alın (örn. Mesaj kutusu). Stdout'a çıktı. (Giriş çevresindeki tırnaklar iyidir.)
  • Çıktının yüksekliği 6 veya çekilen tren vagonları için gereken maksimum yükseklik olmalıdır.
  • Bağlantıları ( --) ilk arabanın önüne veya son arabanın arkasına koymayın .


Her zaman Eön tarafta olacak ve ortada bir Eyerde olabilir mi?
Martin Ender,

1
"en kısa program kazanır." => Bayt mı yoksa karakter mi sayarız?
xem


1
Başka bir ilgili soru: codegolf.stackexchange.com/q/4690/9498
Justin

Yanıtlar:


21

Perl, 265 bayt

Bu girdi yazdırılabilir ASCII karakterlerine karşılık gelmeyen baytlar içerdiğinden doğrudan buraya kopyalanamaz. Bunun yerine, bir hex dökümü olarak veriyorum. Unix-ish sistemlerindeki kullanıcılar, aşağıdaki hex boşluğunu xxd -rkomuta besleyerek komut dosyasını yeniden yapılandırabilir :

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

Betik, Perl 5.10 sayözelliğini kullanır ve bu nedenle çalıştırılması gerekir perl -M5.010. Harflerden oluşan tek bir komut satırı argümanı alır EPBTHFCve karşılık gelen tren vagonu düzenlemesini çıkarır. Örneğin, giriş FEHaşağıdaki çıkışı üretir:

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

Betiğin başlangıcındaki okunabilir kod, betiğin gövdesini içeren zlib sıkıştırılmış dizenin kodunu çözer ve onu değiştirir. Dekompresyon kodu sırayla şöyle görünür:

@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

Tüm tren arabalarının hatlarının eşit bir uzunlukta boşluklarla doldurulduğuna ve kaplin (en sağdaki arabadan çıkış halkası tarafından sıyrılmış olan) içerdiğine dikkat edin. Zlib tarafından kullanılan DEFLATE sıkıştırması, bu tekrarlayan verilerin sıkıştırılmasında çok iyidir, bu nedenle elle denemeye ve sıkıştırmaya gerek yoktur.

Bunun hızlı bir ilk deneme olduğunu unutmayın. Kaynaktaki tren arabalarını yeniden düzenlemek gibi çeşitlerle oynayarak birkaç bayt uzunluğunu tıraş etmenin mümkün olacağından eminim.


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

Lanetleri kullanarak bir yaklaşıma gittim. Gerçekten rekabet edemez, ama onunla biraz eğlendim (~ 630 bytes):

tren

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
Vay, bu animasyon harika! (+1) Animasyonlu GIF'ler yayınlarda çalışır, böylece bir bağlantı yerine gerçek görüntüyü düzenleyebilirsiniz; bu, çözümünüzü daha çekici gösterecektir. ;)
Doorknob

2
@Doorknob Teşekkürler. Görüntüyü koyacağım - Sadece bir animasyonlu GIF'in çok sinir bozucu olacağından emin değildim.
grc

24
@grc can sıkıcı? harika demek istemediğine emin misin?
nderscore,

4
Bir ASCII sanat gifinden daha iyi bir şey yok. 1!
Chris Cirefice

4
Homebrew'e gönder! sl2.0
Kroltan

8

Python ( 582 488 476 450 Karakter)

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 rakamları içeren bir base64 kodlu zlib-sıkıştırılmış dizedir ...


1. string.decode('base64')2. j=lambda y:y==4and'--'or' '3. 1 boşluk girintileri 4. for c in A[::-1]:i.append(C[c][y])5.f.append(j(y).join(i)
14:45

Ayrıca, son 6 satır olabilirfor 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
Bazı iyileştirmeler içeren bir düzenleme teklif ettim.
seequ

1
Bir düşününce, son satır olabilirfor y in range(6-h,6):print(y==4and'--'or' ').join(C[c][y]for c in A[::-1])
bkz.

@TheRare İkinci (!) Geliştirmenizde birleşti! Senin!
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

Gelişmeler için teşekkürler, ugoren!


Kodumu biçimlendirdiğiniz için teşekkür ederiz! Bunun için biraz yeniyim ve dürüst olmak gerekirse ne yaptığımı bilmiyorum.
Elveone

1
Bazı karakter kaydet: range(6),for x,y in zip("EPBTHFC",range(0,42,6)):
ugoren

4

Javascript,> 471 bayt

Kahretsin, zaten en iyi skoru aştım ve hala her şeyi sırayla yazdırmasını istemedim. Ama bunun için bir öğleden sonra geçirdim ve hala göstermek istedim.

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

Sadece console.log(c(L)); // L=train car letterve konsolda tek bir araba yazdıracak. Bunun için bile yapabileceğim çok fazla düzeltme olduğunu biliyorum, ama pes ediyorum. : P


6
Yapmam gerekiyordu: jsfiddle.net/34w2z
William Barbosa

3
@WilliamBarbosa haha, gerizekalıyım. "Bu sihir nedir? Kodum hareket ediyor." Dedim. ve betiğin içinde neleri değiştirdiğini araştırmak için kaydırma yapmak ... sonra gözlerimi HTML’e taşımak. Ahh, <marquee>seni şeytan herif. Neden seni hiç küçümsemediler?
Phil Tune,

4
@WilliamBarbosa Bu etiket için meşru bir kullanım bulduğunuzu düşünüyorum.
Mike Clark

3

Java (583 karakter)

Temel ev yapımı sıkıştırma ile - bu kadar verimli olduğundan emin değilsiniz :-) Tren dizgisi (örneğin EEHTBPFC) parametre olarak iletilmelidir.

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

Kırımsız:

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 bayt

Harika bir skor, kötü kodlanmış dizgideki 200 bayt ve kod çözme için ayrılmış yaklaşık 80 bayt. Sinir bozucu kod, motordaki kaplinleri ayırmak için harcandı! Şimdi, trenin önünde düzensiz, ancak kurallar dahilindeki boşluk bırakıyor ve aynı zamanda başlangıçta yapmak istediğim bir şey olan kodlanmış veri dizisinin boyutlarına da sahip.

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

Biraz biçimlendirilmiş:

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

Dize çok basit bir şekilde tekrarlanan karakterin ardından gelen karakter sayısını (eksi 1) veya sadece bunlardan bir tane varsa (ASCII'ye bağlı kalmak ve herhangi bir şey yapmak istemiyorsanız karakterin dizgi gösterimini) dizgi gösterimi ile değiştirmek suretiyle sıkıştırılır. alt-char seviyesinde). Enkoder (skora dahil değil):

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

İşte PHP'deki çözümüm (v5.4 uyumlu), 512 bayt. Daha kısa olabilir, ancak bunu denemek için hızlı bir yapı oluşturdu.

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

Bu kolay okuma için yayılmış bir versiyonudur:

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

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

Kazanan olmasa da nasıl çıktığını seviyorum.


Biraz tasarruf if j==5...x[j]+=y[w[i]][j]+ketmek x[j]+=y[w[i]][j]+('\\ 'if j==5 and w[i]=='E'else'--'if j==4 and i!=u-1 else' ')için değişebilirsin . (Ayrıca önünde iki boşluk yerine bir sekme ekleyebilirsiniz x[j]....)
Calvin's Hobbies

1

GNU sed , 491 bayt

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

Çevrimiçi deneyin!

açıklama

Bu temelde süper naif bir özel sıkıştırma şemasıdır. İlk satır girişteki her harfe bir boşluk ekler ve #her bölümün sonunu işaretler:

s/./& #/g

Sonraki 7 satır, her bir harfin karşılık gelen ASCII görüntüsünün sıkıştırılmış bir gösterimi ile değiştirilmesi:

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

Sonraki 14 satır "dekompresyon" yapar. Örneğin, Saltı seslik bir sdekompresyon yapar ve iki boşluklu bir dekompresyon yapar, böylece S12 boşluk olur.

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ıkıştırılmış halde, her bir arabanın çizgileri bir satır numarasından önce gelir ve her araba tarafından sonlandırılır #. Kodun geri kalanı 0123456;desen satırına (satır numaraları ve sınırlayıcı) hazırlanır ve ardından bir döngüde her basamağı, her arabanın karşılık gelen satırı ile değiştirir.

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

Son olarak, desen alanını rakamlara bölerek satırlara böler ve yabancı karakterleri temizler:

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

Burada iyileştirme için çok yer var. Optimal bir kompresyon seti bulmak konusunda hiç titiz değildim ve 14 ayrı s///gs yerine bir arama tablosu kullanmak kolay bir kazanç olurdu. Bununla biraz daha fazla erişte olabilir ya da olmayabilir.


1

Python 3 , 529 bayt

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

Çevrimiçi deneyin!

Buradaki diğer cevapların çoğundan farklı olarak herhangi bir sıkıştırma kullanmadığı için göndereceğimi düşündüm.


1

C (gcc) , 501 499 490 489 484 bayt

Ceilingcat sayesinde -2 -9 -1 -5 bayt .

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

Çevrimiçi deneyin!


@ceilingcat Şerefe!
gastropner
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.