Усі на борту поїзда 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-'

Якщо представник #є представником того персонажа, який знаходиться всередині трюму. Прив’язування двигуна до кожного автомобіля також є частиною вашої роботи, оскільки вам було поставлено завдання контролювати плинність та успішність усього цього вантажу. Отже, як тільки ви позначили всі вагони та вивели двигун на колії, ви повинні переконатися, що поїзд зібраний та готовий до кочення.

Правила

  • Єдиний вхід, який має взяти ваша програма, - це один рядок.
  • Двигун повинен завжди бути вихідним, навіть якщо ваші відправлення порожні.
  • Кожен автомобіль може містити лише один символ, не наполягайте на удачі, якщо ви можете пошкодити товар.
  • Вам потрібно лише підтримати наступні символи для друку ASCII: _-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
    Якщо ви закінчите робити більше, це теж добре, але це мінімальний мінімум.
  • 1-2 пробіли є прийнятними, як і один останній новий рядок.
  • Це , найкоротший виграш у кількості байтів.


1
Я не думаю, що це насправді колгогоров-складність . Виходячи з цього мета-повідомлення, це питання, безумовно, знаходиться на межі між підгонкою та невідповідністю нашому визначенню, і я особисто сказав би, що він не відповідає тегу, подібному до цього питання, який також запитує тип обгортання рядків.
Пшеничний майстер

5
Це прекрасне ascii-art
CAD97

@WheatWizard - це суміш декількох жанрів. Двигун потрапляв би під складність колмогрів, вся справа в ASCII-Art, і він, ймовірно, також трохи підпадає під строкову маніпуляцію.
Чарівна урва восьминога

Я мав враження, що стиснення фактичного шаблону поїзда було б гідним мітки; але я просто видалю його, щоб зупинити аргумент.
Чарівна урва восьминога

Відповіді:



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
Оголошений головним чином, оскільки код нагадує потяг
Рохан Джунхунвалала

Бонусні бали, оскільки він працює прямо там, у браузері!
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. Значення символів відключаються на 1, щоб уникнути виникнення подвійних лапок, які не можуть бути використані в рядку Befunge.

Код працює, створюючи повний набір символів, необхідний для візуалізації поїзда на стек. Для кожного рядка виводу спочатку до стеку додається відповідна вагона рядок, повторюється стільки разів, скільки потрібно для вантажу, а потім одна копія відповідної рядки двигуна.

Після побудови кожного рядка пару стрілок вниз ліворуч від рядків замінюють стрілкою праворуч, тому наступна ітерація циклу йде іншим шляхом через код, використовуючи іншу пару рядків для автомобіля та двигун.

Після того, як всі дані накопичені на стеку, відбувається остаточний цикл візуалізації, який записує символи, віднімаючи 1 кожен раз для обліку початкового кодування.

Як бонус, джерело розроблено у формі башти гармати , якщо потяг потрапить під обстріл. Гольфісти знищили мою башту пістолета.


Гольфісти знищили мою башту пістолета, LOL. +1. І все-таки це побиття C # та Java.
Zacharý

6

PHP, 218 211 204 187 183 байт

    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

Пітон 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-'

Можливо, недійсний! Якщо працювати без аргументів, він спробує надрукувати один порожній рядок і мати вигляд:

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

Якщо запустити порожній рядок, він повернеться правильно:

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

(своєрідно)

$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 - знак, а x - кількість повторень, і це лише для повторних чи ведучих повторів, будь-які повтори в центральній струні вимагатимуть додаткового +та додаткового "- тому немає сенсу в цьому, де Я бачу стиснення, що економить будь-який простір, і єдиний повторний набір символів - ___це лише 3 символи.

Пояснення:

$l=($a=$args[0]).Length Візьміть перший аргумент, вставте його в $ a, потім візьміть довжину $ a і вставте його в $ l, це єдині необхідні вам змінні.

" o O O"+" ___ "*$l більшість інших бітів дотримуються цього формату лівої частини, а потім права частина перевищує кількість необхідних символів.

" o "+([char[]]$a|%{" | $_ |"})цикл ( |%{}) через $ a як масив char, тому foreach (char $_ in $a)для неконвеєрної версії тоді вставте char у текст.

це надзвичайно простий підхід, але оскільки я не можу знайти хороший спосіб стиснути струни повз це, це здається найбільш корисним.

врятував 1 байт завдяки брианісту! і тут я думав, що це не стане більше


Вам не довелося обробляти жодних аргументів :).
Чарівна урва восьминога

@carusocomputing так, дякую, що повідомили мені.
colsw

Приємно! Ви можете зберегти 1 байт, змінивши [char[]]$aна $a[0..$l] :)
британіст

ах, використовуючи масив char, перш ніж я заявляв $lі зовсім забув про це. Дякую за це!
colsw

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 байт ) Спробуйте тут .
Кевін Круїссен

2

Perl, 137 байт

132 байти коду + 5 байт для -pFпрапорів.

ascii_train.pl:

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

Зауважте, що я додав -aпрапор у код, але це лише тому, що -aколи -Fвикористовуються старі версії Perl .

Щоб запустити його:

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

Вхід повинен надходити без остаточного нового рядка ( echo -nнаприклад, з).

Пояснення:
З того, що я бачив, це приблизно та сама ідея, що і відповідь JavaScript ETHProduction.
Тут багато чого не відбувається: на жаль, шаблонів трохи не вистачає, щоб зробити xоператором варто використовувати.
По-перше, s/./ | $& | /gоточує кожен символ вводу |(і пробіли), щоб сформувати другий рівень поїзда.
Тоді всередині цієї довгої струни все між а !та новою лінією - це шаблон, який ми хочемо повторити, щоб побудувати машини. Це повторення здійснюється завдяки регулярному вираженню 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.12 , 57 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 байт

Анонімна функція негайного вікна VBE, яка приймає вхід з діапазону [A1]та виводить у безпосереднє вікно 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-'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.