ASCIIトレインに乗るすべて


45

ASCIIトレインにすべて乗ろう!

    o O O   ___     ___     ___     ___     ___     ___     ___     ___     ___  
   o       | C |   | O |   | D |   | E |   |   |   | G |   | O |   | L |   | F | 
  TS__[O]  |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___| 
 {======|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|
./o--000'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'

乗る予定の列車を組み立てようとしているので、列車に乗る準備をするのが最善です。文字列が与えられると、s上記のように完全に形成されたトレインを出力します。最初に出力されるのは、以下に単独で示すように、常に文字列を引き付けるエンジンです。

    o O O 
   o      
  TS__[O] 
 {======| 
./o--000' 

機関車に続いて、貴重な貨物の各キャラクターを含む鉄道車両があります。荷降ろしの際の混乱を避けるために、あなたの会社はこれらの車の外側にラベルを貼ることをあなたに任せました。問題の車は常に次のようになります。

   ___ 
  | # |
  |___|
_|"""""|
"`-0-0-'

どこで#「貨物」ホールド内にある文字の代表です。エンジンを各車に連結することも仕事の一部です。これは、この出荷全体の流動性と成功を監督することを任されているからです。そのため、すべての車にラベルを付けて、トラックにエンジンを取り付けたら、列車が組み立てられて転がる準備ができていることを確認する必要があります。

ルール

  • あなたのプログラムがとるべき唯一の入力は、単一の文字列です。
  • 荷物が空であっても、エンジンは常に出力されている必要があります。
  • 各車にはキャラクターを1つしか入れることができません。運を押し込まないでください。商品が破損する可能性があります。
  • 次の印刷可能なASCII文字のみをサポートする必要があり _-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
    ます。より多くの作業を行うことになった場合も、それで問題ありませんが、これは最低限の要件です。
  • 1つの末尾の改行と同様に、1〜2の末尾スペースを使用できます。
  • これは、最短バイト数が勝ちです。


1
これは実際にはkolmogorov-complexityではないと思います。このメタ投稿に基づいてこの質問は確かにフィッティングの定義とフィッティングの不一致の間にあり、個人的には、この質問に似たタイプの文字列の折り返しを要求するタグには適合しないと言います。
小麦ウィザード

5
これは美しいアスキーアート
CAD97

@WheatWizardそれは複数のジャンルの混合です。エンジンはkolmogrovの複雑さ、つまりASCIIアートのすべてに該当し、おそらく文字列操作にも少し該当します。
魔法のタコUr

私は列車の実際のパターンを圧縮することはタグに値するだろうという印象を受けていました。ただし、引数を停止するために削除します。
魔法のタコUr

回答:



37

JavaScript(ES6)、149 144バイト

s=>`    o O Oa   ___  
   o     a  | $& | 
  TS__[O]a  |___| 
 {======|a_|"""""|
./o--000'a"\`-0-0-'`.replace(/a(.*)/g,(_,c)=>s.replace(/./g,c))

エンジン自体を圧縮できるとは思いませんが、おそらく可能です。

テストスニペット


繰り返される文字がたくさんあり、そこからさらにバイトを絞り出すことができるはずです。
オリオン

17
ソースコードに詰め込まれた電車をほとんど見ることができます:-)
ルイスメンドー

15
主にコードbecuase Upvotedは電車に似ている
ロハンJhunjhunwala

ボーナスは、ブラウザですぐに実行されるためです!
DGM

6

Befunge、276 270バイト

p1p~:7>7+#:`#~_$:v
>#p0p10:p00:+1g00_v#:
v"!!```!!!"v>0p01g\-0g1+53p  
v"!}!#!}!!"v0 p115<
v"!}```}!!"v^:-1<
v"}#####}`">00g:|
>"(.1.1.a#"^+<v1<
v"P!P!p!!! "v5>g00p
v"!!!!!p!!!"v6
v"^P\``TU!!"vp
v"}>>>>>>|!"v+
>"(111..p0/"v6
v-1:g110">>"<g
>:11p!#v_p011^
#-:#1_@>$$$$>,#

オンラインでお試しください!

説明

車とエンジンは、3行目から12行目までの5つの文字列の2つのセットとしてエンコードされます。Befunge文字列では使用できない二重引用符を処理する必要がないように、文字値は1ずつずれています。

コードは、スタック上でトレインをレンダリングするために必要な文字の完全なセットを構築することにより機能します。出力の各行に対して、適切な車の文字列が最初にスタックに追加され、貨物に必要な回数だけ繰り返され、次に適切なエンジン文字列のコピーが1つコピーされます。

各行が作成された後、文字列の左にある下向きの矢印のペアが右向きの矢印に置き換えられるため、ループの次の繰り返しは、コードの異なるパスをたどり、carとエンジン。

すべてのデータがスタックに蓄積されると、最初のエンコードを説明するために毎回1を減算して、文字を書き込む最終レンダリングループがあります。

ボーナスとして、列車が攻撃を受けた場合に備えて、ソースは砲塔の形で設計されています。ゴルファーが私の砲塔を破壊しました。


ゴルファーは私の砲塔、LOLを破壊しました。+1。それでも、C#とJavaを破っています。
ザカリー16

6

PHP、218 211204187183バイト

    o O O<?for(;$y<5;print"\n".["   o     ","  TS__[O]"," {======|","./o--000'"][+$y++])for($p=0;$c=a&$argn[$p++];)echo["   ___  ","  | $c | ","  |___| ",'_|"""""|',"\"`-0-0-'"][+$y];

STDINから入力を受け取ります。で実行し-nRます。

エンジンまたはワゴンを圧縮するには、ストレージに保存するよりも多くのコードを解凍する必要があります。
ここにはこれ以上の可能性はありません。


a&$c=$argn 代わりに""<$c=$argv[1]
ヨルクヒュルサーマン

@JörgHülsermannええ、この投稿は古代のものでした。:)
タイタス

4

Python 2、176バイト

lambda i:'\n'.join(map(''.join,zip(*[["    o O O","   o     ","  TS__[O]"," {======|","./o--000'"]]+[["   ___  ",'  | '+x+' | ',"  |___| ",'_|"""""|',"\"`-0-0-'"]for x in i])))

例:

print f('Python')

与える

    o O O   ___     ___     ___     ___     ___     ___  
   o       | P |   | y |   | t |   | h |   | o |   | n | 
  TS__[O]  |___|   |___|   |___|   |___|   |___|   |___| 
 {======|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|
./o--000'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'

4

Powershell、167 166バイト

$l=($a=$args[0]).Length;"    o O O"+"   ___  "*$l;"   o     "+($a[0..$l]|%{"  | $_ |"});"  TS__[O]"+"  |___| "*$l;" {======|"+'_|"""""|'*$l;"./o--000'"+'"`-0-0-'''*$l

例:

.\train.ps1 "PowerShell!"
    o O O   ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___  
   o       | P |   | o |   | w |   | e |   | r |   | S |   | h |   | e |   | l |   | l |   | ! |
  TS__[O]  |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___| 
 {======|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|
./o--000'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'

おそらく無効です!引数なしで実行すると、空の文字列が1つ出力され、次のように表示されます。

    o O O
   o       |  |
  TS__[O]
 {======|
./o--000'

ただし、空の入力文字列で実行すると、正しく返されます。

.\train.ps1 ""
    o O O
   o     
  TS__[O]
 {======|
./o--000'

(ちょっと)Ungolfed:

$l=($a=$args[0]).Length
"    o O O"+"   ___  "*$l
"   o     "+($a[0..$l]|%{"  | $_ |"})
"  TS__[O]"+"  |___| "*$l
" {======|"+'_|"""""|'*$l
"./o--000'"+'"`-0-0-'''*$l

Powershellでの最短圧縮+'c'*xは、cがcharでxが繰り返しの数になります。これは末尾または先頭の繰り返しの場合のみです。中央の文字列の繰り返しには追加+と追加が必要になります"。圧縮によってスペースを節約できます。繰り返される文字セットは___3文字のみです。

説明:

$l=($a=$args[0]).Length 最初の引数を取得し、それを$ aに入れてから、$ aの長さを取得して$ lに入れます。これらが必要な唯一の変数です。

" o O O"+" ___ "*$l 他のビットのほとんどは、左部分のこのフォーマットに従い、次に右部分に必要な文字数を掛けます。

" o "+([char[]]$a|%{" | $_ |"})ループ(|%{})でchar配列として$ aを通るのでforeach (char $_ in $a)、非パイプラインバージョンの場合は、charをテキストに挿入します。

これは非常に単純なアプローチですが、これを超えて文字列を圧縮する良い方法を見つけることができないため、最も便利なようです。

briantistのおかげで1バイト節約できました!そして、ここでこれが短くなることはないと思っていました。


引数を処理する必要はありませんでした:)。
魔法のタコUr

@carusocomputing yay、私に知らせてくれてありがとう。
colsw 16

いいね!あなたは、変更することで、1つのバイトを保存することができます[char[]]$a$a[0..$l] :)
briantist

ああ、宣言する前にchar配列を使用し$lていて、それを完全に忘れていました。ありがとう!
colsw 16

2

Java、361バイト

class C {static void main(String[]v){Scanner q = new Scanner(System.in);String i = q.nextLine();String[] t = {"    o O O   ", "   o       ", "  TS__[O]  ", " {======|", "./o--000'",};for (char c: i.toCharArray()) {t[0]+="___     ";t[1]+="| # |   ".replace('#',c);t[2]+="|___|   ";t[3]+="_|\"\"\"\"\"|";t[4]+="\"`-0-0-'";}for(String p:t) System.out.println(p);}}
class C {
    static void main(String[]v)  {
        Scanner q = new Scanner(System.in);
        String i = q.nextLine();
        String[] t = {
                "    o O O   ",
                "   o       ",
                "  TS__[O]  ",
                " {======|",
                "./o--000'",
        };
        for (char c: i.toCharArray()) {
            t[0]+="___     ";
            t[1]+="| # |   ".replace('#',c);
            t[2]+="|___|   ";
            t[3]+="_|\"\"\"\"\"|";
            t[4]+="\"`-0-0-'";
        }
        for(String p:t)
            System.out.println(p);

    }
}

java
    o O O   ___     ___     ___     ___     
   o       | j |   | a |   | v |   | a |   
  TS__[O]  |___|   |___|   |___|   |___|   
 {======|_|"""""|_|"""""|_|"""""|_|"""""|
./o--000'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'

1
私はそれが半体年をされている知っている、しかし、あなたは(削除スペースでも)ゴルフかなりすることができます:interface C{static void main(String[]v){String n="\n",b=" o O O ",c=" o ",d=" TS__[O] ",e=" {======|",f="./o--000'";for(String x:new java.util.Scanner(System.in).nextLine().split("")){b+="___ ";c+="| "+x+" | ";d+="|___| ";e+="_|\"\"\"\"\"|";f+="\"`-0-0-'";}System.out.print(b+n+c+n+d+n+e+n+f);}}318バイト)またはそれ以上を使用すると、交換した場合new java.util.Scanner(System.in).nextLine()v[0]代替入力として(279バイトここでそれを試してみてください
ケビンCruijssen

2

Perl、137バイト

132バイトのコード+ -pFフラグ用の5バイト。

ascii_train.pl

#!/usr/bin/perl -apF
s/./  | $& | /g;$_="    o O O!   ___  
   o     $_
  TS__[0]!  |___| 
 {======|!".'_|"""""|'."
./o--000'!\"`-0-0-'";s/!(.*)/$1x@F/ge

-aコードにフラグを追加したことに注意してください。これは、Perlの古いバージョンが-aいつ-F使用されるかを要求するためです。

実行するには:

echo -n "code-golf" | perl ascii_train.pl

入力は、最後の改行なしで(echo -nたとえば、)指定する必要があります。

説明:
私が見たものから、それはETHProductionのJavaScriptの答えとほぼ同じ考えです。
あまり多くはありません:悲しいことに、パターンはxオペレーターが使う価値があるようにするために少し短いです。
まず、s/./ | $& | /g入力の各文字を|(およびスペースで)囲み、トレインの第2レベルを形成します。
次に、その長い文字列内で、a !と改行の間のすべてが、自動車を構築するために繰り返したいパターンです。その繰り返しは正規表現のおかげで行われs/!(.*)/$1x@F/geます。(!入力に含めることができないため使用しました)。


1

C#、277バイト

ゴルフ:

string T(string s){var o=new string[]{"     o O O","   o        ","   TS__[O]","  {======|","./ o--000'" };for(int i=0;i<s.Length;i++){o[0]+="   ___  ";o[1]+="| # |   ".Replace("#",s[i]+"");o[2]+="  |___| ";o[3]+="_|\"\"\"\"\"|";o[4]+="\"`-0-0-'";}return string.Join("\r\n",o);

ゴルフをしていない:

public string T(string s)
{
  var o = new string[] { "     o O O", "   o        ", "   TS__[O]",
    "  {======|", "./ o--000'" };

  for (int i = 0; i < s.Length; i++)
  {
    o[0] += "   ___  ";
    o[1] += "| # |   ".Replace("#", s[i] + "");
    o[2] += "  |___| ";
    o[3] += "_|\"\"\"\"\"|";
    o[4] += "\"`-0-0-'";
  }

  return string.Join("\r\n", o);
}

テスト:

Console.Write(new AllAboardTheASCIITrain().T(""));

     o O O
   o        
   TS__[O]
  {======|
./ o--000'

そして...

Console.Write(new AllAboardTheASCIITrain().T("Programming Puzzles & Code Golf"));

     o O O   ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___  
   o        | P |   | r |   | o |   | g |   | r |   | a |   | m |   | m |   | i |   | n |   | g |   |   |   | P |   | u |   | z |   | z |   | l |   | e |   | s |   |   |   | & |   |   |   | C |   | o |   | d |   | e |   |   |   | G |   | o |   | l |   | f |   
   TS__[O]  |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___| 
  {======|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|
./ o--000'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'

1

C#221バイト

ここでは特別なことは何もありません。各行を作成して、新しい行と結合するだけです。

s=>{var t=new[]{"    o O O","   o     ","  TS__[O]"," {======|","./o--000'"};foreach(var c in s){t[0]+="   ___  ";t[1]+=$"  | {c} | ";t[2]+="  |___| ";t[3]+="_|\"\"\"\"\"|";t[4]+="\"`-0-0-'";}return string.Join("\n",t);};

1

C、217の 212の 208バイト

i;f(char*t){char d[]="    o O O   o       TS__[O] {======|./o--000'   ___    | C |   |___| _|\"\"\"\"\"|\"`-0-0-'",*p;for(;i<5;i++){printf("%.9s",d+i*9);for(p=t;d[57]=*p++;)printf("%.8s",d+45+i*8);puts("");}}

オンラインで試す

出力:

    o O O   ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___  
   o       | C |   | O |   | D |   | E |   |   |   | G |   | O |   | L |   | F |   |   |   | I |   | N |   |   |   | C | 
  TS__[O]  |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___| 
 {======|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|
./o--000'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'

1

SOGL V0.1257の 56 バイト

Τ¡ā↓mΛC┌─⁵℮Ƨ⅛□→(š;∞⅟¹°⅔Ζ‽ζ÷⁴‘9n,{"s=Ο!NθæιžGš‼t╬¼Xg`‘8n┼

ここで試してみてください!

説明:

..‘             push a compressed string of the locomotive in a single line
   9n           split in line lengths of 9
     ,{         for each character in the input
       "..‘       push a compressed string of a wagon in a single line
           8n     split to line lengths of 8
             ┼    add horizontally

1

Jq 1.5、178バイト

[["    o O O   o       TS__[O] {======|./o--000'"|_nwise(9)]]+[range(length)as$i|[.[$i:$i+1]|"   ___    | \(.) |   |___| _|\"\"\"\"\"|\"`-0-0-'"|_nwise(8)]]|transpose|map(add)[]

拡大

# engine
def E:"    o O O   o       TS__[O] {======|./o--000'"|_nwise(9);

# car (note string interpolation)
def C:"   ___    | \(.) |   |___| _|\"\"\"\"\"|\"`-0-0-'"|_nwise(8);

  # generate train
  [[E]] + [range(length) as $i| [.[$i:$i+1] |C]]

  # combine rows and concatenate strings     
| transpose | map(add)[]

サンプル実行

$ jq -MRr train.jq <<< "golf"
    o O O   ___     ___     ___     ___  
   o       | g |   | o |   | l |   | f | 
  TS__[O]  |___|   |___|   |___|   |___| 
 {======|_|"""""|_|"""""|_|"""""|_|"""""|
./o--000'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'

$ wc -c < train.jq
  178

オンラインで試す


0

Excel VBA、218バイト

範囲から入力を受け取り[A1]、VBEイミディエイトウィンドウに出力する匿名VBEイミディエイトウィンドウ関数

[B1]=[Len(A1)]:?"    o O O"[Rept("   ___  ",B1)]:?"   o     ";:For i=1To[B1]:?"  | "Mid([A1],i,1)" | ";:Next:?:?"  TS__[O]"[Rept("  |___| ",B1)]:?" {======|"[Rept("_|""""""""""|",B1)]:?"./o--000'"[Rept("""`-0-0-'",B1)]

読みやすい形式

[B1]=[Len(A1)]
?"    o O O"[Rept("   ___  ",B1)]
?"   o     ";:For i=1To[B1]:?"  | "Mid([A1],i,1)" | ";:Next:?:
?"  TS__[O]"[Rept("  |___| ",B1)]:
?" {======|"[Rept("_|""""""""""|",B1)]:
?"./o--000'"[Rept("""`-0-0-'",B1)]

サンプル出力

    o O O   ___     ___     ___     ___     ___     ___     ___     ___     ___     ___     ___  
   o       | V |   | B |   | A |   |   |   | E |   | x |   | p |   | r |   | e |   | s |   | s | 
  TS__[O]  |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___|   |___| 
 {======|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|
./o--000'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.