Все на борту поезда 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
Голосование в первую очередь связано с тем, что код напоминает поезд
Рохан 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. Значения символов отключены на 1, чтобы избежать необходимости иметь дело с двойными кавычками, которые нельзя использовать в строке Befunge.

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

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

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

В качестве бонуса источник выполнен в форме орудийной башни на случай, если поезд подвергнется атаке. Игроки в гольф уничтожили мою пушку.


Игроки в гольф уничтожили мою пушку, LOL. +1. Тем не менее, это побеждает C # и Java.
Захари

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

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

Возможно, неверно! Если запустить без аргументов, он попытается вывести одну пустую строку и выглядеть так:

    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|%{" | $_ |"})loop ( |%{}) через $ a как массив символов, так что foreach (char $_ in $a)для неконвейерной версии, затем поместите символ в текст.

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

спас 1 байт благодаря бриантисту! и здесь я думал, что это не станет немного короче ..


Вам не нужно было обращаться с аргументами :).
Волшебная Урна Осьминога

@carusocomputing yay, спасибо, что сообщили мне об этом.
colsw

Ницца! Вы можете сохранить 1 байт, изменив [char[]]$aна $a[0..$l] :)
briantist

Я использовал массив символов до того, как я объявил об этом, $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
Я знаю , что это было Halve год, но вы можете играть в гольф совсем немного ( в том числе путем удаления пробелов): 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флаг в код, но это только потому, что старые версии Perl требуют, -aкогда -Fиспользуется.

Чтобы запустить это:

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

Ввод должен быть введен без окончательного перевода строки ( echo -nнапример, с).

Пояснения:
Из того, что я видел, это примерно та же идея, что и в ответе ETHProduction на JavaScript.
Здесь не так много работы: к сожалению, шаблоны немного коротки, чтобы xоператор был полезен.
Сначала s/./ | $& | /gокружает каждый символ ввода символами |(и пробелами), чтобы сформировать второй уровень поезда.
Затем внутри этой длинной строки все между a !и символом новой строки - это шаблон, который мы хотим повторить для построения автомобилей. Это повторение сделано благодаря регулярному выражению s/!(.*)/$1x@F/ge. (Я использовал, !потому что вход не может содержать его).


1

C #, 277 байт

Golfed:

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

Ungolfed:

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.