Помоги мне открыть коробку

33

У меня есть окно ASCII-art, и мне нужна программа, чтобы открыть его.

Примеры

Входные данные:

-------
|     |
|_____|

Выход:

      /
     /
    /
   /
  /
 /
/
|     |
|_____|

Спецификация

  • Первая строка будет состоять только из -, по крайней мере, 3 из них
  • Средние строки будут начинаться с |пробелов и заканчиваться|
    • Все средние ряды будут одинаковыми
  • Последний ряд будет начинаться с |have _и заканчиваться|
  • Все строки будут одинаковой длины

Открытие коробки:

  • Каждый -должен быть заменен на /восходящие линии и позиции.
Downgoat
источник
2
В отличие от игры «Закрой ящик»?
Эддисон Крамп
1
кашель
Аддисон Крамп
28
Крышка становится вдвое длиннее при открытии? Ну да ладно, вините ASCII искусство.
Даррел Хоффман
8
Что в коробке?
Виллихам Тотланд
2
Там нет работающего переводчика, так что я думаю, что нет. Не имеет значения; когда я сделаю переводчика (надеюсь, скоро), я выложу ответ.
ETHproductions

Ответы:

7

CJam, 14 байтов

l,{N'/@S*}%W%q

Попробуйте онлайн!

Как это работает

l               Read the first line from STDIN.
 ,              Compute the line's length. Result: L
  {      }%     Map; for each I in [0 ... L-1]:
                  (implicit) Push I.
   N              Push a linefeed.
    '/            Push a slash.
      @           Rotate I on top of the stack.
       S*         Turn I into a string of I spaces.
           W%   Reverse the resulting array of strings and characters.
             q  Read the remaining input from STDIN.
Деннис
источник
12

JavaScript ES6, 57 байт

s=>s[r="replace"](/-+/,s=>s[r](/-/g,`
$'/`))[r](/-/g,' ')

Выводит ведущий символ новой строки. Работает, взяв строку -s и превратив их в треугольник, затем заменив -s пробелами.

Редактировать: 5 байтов сохранены благодаря @ edc65.

Нил
источник
1
+1 Я узнал что-то новое ($ '). Вместо этого этот старый трюк может сэкономить 4 байта для вас:f=s=>s[R='replace'](/-+/,s=>s[R](/-/g,"\n$'/"))[R](/-/g,' ')
edc65
@ edc65 Спасибо, я на самом деле делаю это 5 байтов; также спасибо за исправление моей опечатки (как вы уже догадались, я разрабатываю \nи конвертирую впоследствии).
Нил
9

pb (НЕКОНКУРСНЫЙ), 125 байт

^w[B!0]{>}w[B!45]{<w[B=10]{t[T+1]b[0]}}v[X]vw[T!0]{vb[124]<[X]b[124]>w[B=0]{>}t[T-1]}w[X!1]{<b[95]}<w[B!0]{^}w[Y!-1]{b[47]>^}

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

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

Проверьте эту забавную анимацию!

Длинная пауза - кисть, проходящая через вход.

Ungolfed:

^w[B!0]{>}                # Go to the end of the input
w[B!45]{<                 # Head left until hitting a hyphen
    w[B=10]{                # For each newline on the way:
            t[T+1]                # Count it
            b[0]                  # Delete it
    }
}

v[X]                      # Move down as far as it is right + the number of \n
v                         # ...plus one

w[T!0]{                   # While the counting variable is nonzero:
    vb[124]                 # Go down and draw a pipe
    <[X]b[124]              # Draw a pipe on the left as well
    >w[B=0]{>}              # Go back to the right side
    t[T-1]                  # Decrement variable
}

w[X!1]{<b[95]}            # Draw the bottom of the box
<w[B!0]{^}                # Go up the left wall
w[Y!-1]{b[47]>^}          # Go up and right, drawing the lid
undergroundmonorail
источник
2
+1 за классную анимацию. Как ты это создал?
Gowtham
@Gowtham Я думаю, вы записываете свой экран и обрезаете видео. Затем возьмите это и конвертируйте в GIF. Конечно, просто догадываясь, я не знаю фактического метода
Spotlight
@ awesomebing1 Вы получили это
подземный
8

Сетчатка, 34 20 байт

знак равно
$ 1 / ¶
-
 

На первом шаге каждый -заменяется -следующим за ним, a /и переводом строки. Новая строка в конце исходной первой строки удаляется. На втором шаге мы заменяем новые -на пробелы, что приводит к желаемому результату.

Попробуйте это онлайн здесь.

randomra
источник
2
Просто для удовольствия, это также возможно в один этап: retina.tryitonline.net/… (те же байты, хотя)
Мартин Эндер
Если вы едите первый символ новой строки отдельно, вы можете использовать $%'для захвата трейлинг, -который экономит 5 байт: попробуйте онлайн!
Нил
7

MATL , 14 15 байт

' /'jnXyPQ)`jt

У ввода должен быть завершающий символ новой строки.

Попробуйте онлайн!

объяснение

' /'       % push string (will be indexed into to generate the open lid)
jn         % read first line of input and push its length
Xy         % identity matrix with that size
P          % flip vertically
Q          % add 1. Now the matrix contains 1 and 2, to be used as indices
)          % index into string. Produces a 2D char array for the lid
`          % do-while loop
  j        %   push input line
  t        %   duplicate. Truthy if nonempty
           % implicitly end loop. The loop condition is the top of the stack,
           % that is, the input line that has just been read.
           % This is truthy if non-empty; and in that case another line will
           % be read in the next iteration.
           % implicitly display stack contents, bottom to top
Луис Мендо
источник
5

Japt, 28 26 25 22 18 17 байт

Ur-@"
{SpUa- -Y}/

Проверьте это онлайн!

Выводит начальный символ новой строки, который является приемлемым в соответствии с ОП.

Как это работает

Ur-@       // Replace each hyphen X in the input and its index Y with this function:
"          //  Start a string that contains a newline.
{        } //  Insert here:  
   Ua- -Y  //   Take the index of the last hyphen in the input, subtract Y,
 Sp        //   and return that many spaces.
/          //  Finish off the string with a slash.

Это будет на 4 байта короче, если шарнир будет находиться на правом краю поля:

Ur-@"
{SpY}\\
ETHproductions
источник
4

JavaScript (ES6), 66

b=>([a,t]=b.split`-
`,[...a+0].map(_=>(t=l+`/
`+t,l+=' '),l=''),t)

ТЕСТ

f=b=>([a,t]=b.split`-\n`,[...a+0].map(_=>(t=l+`/\n`+t,l+=' '),l=''),t)

var box = `-------
|     |
|_____|`

console.log=x=>O.textContent=x

console.log(f(box))
<pre id=O></pre>

edc65
источник
3

Java 8, 158 118 байт

Это только начало, но эй, FGITWFTW.

n->{String o="";int z=n.lastIndexOf("-"),i=z;for(;i-->0;o+="/\n")for(int y=i;y-->0;o+=" ");return o+n.substring(z+2);}

Ожидает ввод в виде строки, возвращает окно.

Аддисон Крамп
источник
3

Python 3, 1̶7̶0̶ 88 байт

Вот мой короткий (er) код: РЕДАКТИРОВАТЬ: теперь на 82 байта короче с правкой кода @Dennis!

f=open('f.txt')
d=len(f.readline())-1
a=f.read()
while d:d-=1;print(' '*d+'/')
print(a)

Python 3, 421 байт

В качестве альтернативы, вы можете использовать тот, который открывает его медленно:

import time
import os
f = open('f.txt', 'r')
e = f.readline()
a = f.read()
d = len(e)
c = 0
t = e + a
g = ''
clear = lambda: os.system('cls')
while c <= d - 1:
    clear()
    print(("\n" * ((d - 1) - (c))) + t)
    c += 1
    e1 = e[0:(d - c)  -1]
    e2 = e[(d - c):len(e)]
    e1 += '/'
    e2 = ' ' * len(e2)
    y = (' ' * len(e1)) + '/' + '\n'
    g += y
    t = (g + e1 + e2 + '\n' + a)[d:len(g + e1 + e2 + '\n' + a)]
    time.sleep(0.2)
f.close()

Чтобы использовать любой из них, вы должны создать текстовый файл в том же каталоге, содержащий поле ascii любой ширины или глубины, называемое «f.txt». Затем он откроет эту коробку.

монстр
источник
1
Вы можете сократить это далее, сократив переменные до отдельных букв и удалив много пробелов между операторами. Общие советы по игре в гольф на Python смотрите здесь .
Алекс А.
С какой стати тебе нужно время? Этот вопрос требует только одного выхода.
Аддисон Крамп
Как я уже сказал, моя интерпретация этой загадки была немного неправильной, и если вы выведете ее, она покажет вам больше, чем заданный вопрос.
Монстр
Хорошо, я добавил более простой ответ, который точно соответствует тому, что говорит вопрос, как я теперь понимаю. Это не красиво, но это работает. Мой альтернативный код для тех, кто достаточно хорош, чтобы захотеть его посмотреть
Monster
2
Несколько небольших изменений уменьшают количество байтов до 81 (чтение из STDIN).
Деннис
3

Баш, 85 84 79 знаков

(Версия Pure Bash, внешние команды не используются.)

r(){
a="${a/-
/
$s/
}"
s+=\ 
[[ $a = -* ]]&&r
}
mapfile a
r
IFS=
echo "${a[*]}"

Выводит ведущий символ новой строки.

Образец прогона:

bash-4.3$ bash open-the-box.sh <<< $'-------\n|     |\n|_____|'

      /
     /
    /
   /
  /
 /
/
|     |
|_____|
manatwork
источник
echoвнешняя команда - /usr/bin/echo;)
Леви
echoИсполняемый файл существует для соответствия операционной системы со стандартами. В настоящее время он используется только в том случае, если важна переносимость, поскольку он соответствует стандарту. Но большинство современных оболочек имеют свои собственные встроенные функции, echoкоторые используются по умолчанию: pastebin.com/RnxhweBv @Levi, если вы переименуете / переместите свой /usr/bin/echo, мой код все еще будет работать.
manatwork
(это была шутка ....)
Леви
1
Ой. Хорошо. Извините, я уже встречал людей ранее, которые утверждали то же самое, но серьезно.
manatwork
3

Perl 61 54 33 + 3 = 36 символов

s^-^" "x(length$')."/\n"^ge&chomp

Запустите это как

perl -ple 's^-^" "x(length${chr 39})."/\n"^ge&chomp' closed_box_file

Каждый -в первой строке заменяется на строку , которая является результатом конкатенации некоторого числа , /и \n. ${chr 39}принимает значение в Perl (в) известный $'ака $POSTMATCHспециальной переменной. Наконец, chomp избавляется от завершающего символа новой строки, который был добавлен для последнего -символа.

Спасибо @manatwork за сохранение более 7 символов.

Бонус - s^-^" "x$i++."\\\n"^ge&&chopоткрывает окно с правого края в 29 + 3 символа :). Запустите его как:

gowtham@ubuntu:~$ cat a
----
|  |
|__|
gowtham@ubuntu:~$ perl -plE 's^-^" "x$i++."\\\n"^ge&&chop' closed_box_file
\
 \
  \
   \
|  |
|__|
Gowtham
источник
@manatwork Только первая строка содержит -, так что да, я могу играть в гольф еще больше. Благодарность!
Gowtham
$.==1$.<2, &&chop&chop, удалите лишнюю пару круглых скобок length, считайте {chr 39}как 1, поскольку это не требуется только для версии командной строки из-за синтаксиса оболочки: $.<2&&s^-^" "x(length$')."/\n"^ge&chop+ 2 символа для параметров командной строки = 40 согласно моему подсчету. pastebin.com/iDhUs9XX
manatwork
@manatwork Фактически, $.==1или $.<2может быть устранено, потому что содержит только первую строку-
Gowtham
Да, я видел, что ты там сделал. И я был поражен. Кстати, вместо кода вы можете использовать перенос буквенных строк \n.
manatwork
Doh. Нашел более короткий:s^-^$'=~y/-/ /r."/\n"^ge&chomp
manatwork
2

Pyth, 26 23 байта

jXK.z0jm+*\ t-lhKd\/lhK

Тьфу. Определенно может быть короче; все еще работаю над этим.

Дверная ручка
источник
2

Python3, 76 байт

f=open(0)
w=len(f.readline())
while w:w-=1;print(' '*w+'/')
print(f.read())
  1. Получите длину первой строки ввода.
  2. Печать строк /предшествует уменьшению числа пробелов.
  3. Нажмите на остальную часть stdinпрямо на stdout.

РЕДАКТИРОВАТЬ: Я только что заметил, что мой код почти идентичен редактированию комментария @Dennis более короткого кода Python3 @ Monster, единственное отличие состоит в том, что выведите остаток от stdinпрямой вместо сохранения в переменной. Великие умы!

josh2112
источник
1

Python 2, 100 байт

def o(b):
 m=b.split('\n')[1:]
 print"\n".join(["/".rjust(i)for i in range(len(m[0]),0,-1)]+m)

Определяет функцию, oкоторая принимает строку в качестве входных данных. (Полная программа не была указана в вопросе).

Scimonster
источник
1

PowerShell, 55 байт

$d,$b=$args-split"`n";($d.length-1)..0|%{" "*$_+"/"};$b

Принимает ввод $argsв виде строки, -splits на новых строках `n ( ссылочная ссылка ) , сохраняет первую строку в $d(в виде строки), а оставшуюся в $b(в виде массива строк). Затем мы выполняем цикл от lengthпервой строки (минус 1) до 0каждой итерации и выводим это число пробелов плюс a /. Наконец, вывод $b(остальная часть входной строки), который по умолчанию будет выводить по одному на строку.

Пример выполнения

PS C:\Tools\Scripts\golfing> .\help-me-open-the-box.ps1 "----`n|  |`n|__|"
   /
  /
 /
/
|  |
|__|
AdmBorkBork
источник
1

JavaScript (Node.js) , 56 байт

a=>a[b="replace"](/-+/,c=>c[b](d=/-/g,`
$'/`))[b](d,' ')

Попробуйте онлайн!

Должно быть написано как комментарий от @Neil «S ответа , но я не могу создать комментарии

Any3nymous пользователь
источник
Привет и добро пожаловать в PPCG. Я полагаю, вы имеете в виду ответ Нейла, который вы продолжили играть в гольф. Вы можете добавить ссылку на их ответ и исправить имя автора, чтобы дать кредит.
Джонатан Фрех
@JonathanFrech спасибо, готово
Any3nymous пользователь
1

05AB1E (legacy) , 9 байтов

g'/1.Λ|»»

Попробуйте онлайн! (Наследство только)

Как это работает

g'/1.Λ|»» – Full program. Takes input from STDIN.
g         - Length. Only takes the first line into account.
 '/       – Push a slash character, "/".
   1.Λ    – And diagonally up-right, draw a line of slashes of the given length.
      |»  – Push the remaining inputs (all other lines) joined on newlines.
        » – Then join the stack on newlines.
Мистер Xcoder
источник
1

Древесный уголь , 14 байтов

↙L§⪪θ¶⁰M→✂⪪θ¶¹

Попробуйте онлайн (многословно) или онлайн (чисто) .

Объяснение:

Разбейте ввод по новым строкам, возьмите длину первой строки и напечатайте строку этой длины сверху вниз и слева внизу:

Print(:DownLeft,Length(AtIndex(Split(q,"\n"),0)))
↙L§⪪θ¶⁰

Двигайтесь один раз вправо:

Move(:Right)
M→

Снова разделите ввод по новым строкам, удалите первый элемент и напечатайте то, что осталось неявно:

Slice(Split(q,"\n"),1)
✂⪪θ¶¹

(ПРИМЕЧАНИЕ. Помещение входных данных, разделенных символами новой строки в переменной (так как я делаю это дважды выше), на 1 байт длиннее и на 14 байтов с использованием немного другого метода (благодаря @Neil ):
≔⮌⪪θ¶θ↙L⊟θM→⮌θ попробуйте онлайн (подробно) или попробуйте онлайн (чистый) ).

Кевин Круйссен
источник
Если вы измените разделение ввода на новые строки, вы можете выскочить из первой строки, после чего вы вернетесь обратно до 14 байтов: попробуйте онлайн!
Нил
0

JavaScript ES6, 106 байт

q=>(q=q.split`
`,n=q[0].length,eval('for(i=0,r="";i<n;i++)r+=" ".repeat(n-i-1)+"/\\n"'),r+q.slice(1).join`
`)

Достаточно просто: получить длину первой строки, создать интервал-треугольник с трейлингом /и добавить его к оригиналу, разрезать и соединить.

Проверьте это! (Только ES6 :()

Конор О'Брайен
источник
2
Я вижу, вы решили проблему XKCD с помощью форматирования. Умная.
Kroltan
.repeat(n-i-1)=>.repeat(n+~i)
Даунгаут
0

Python 2,7, 120 122 символов

Требуется файл fс оригинальным / закрытым ящиком, вывод - открытый. Приветствую @Monster за идею ... постараюсь выяснить многострочный ввод позже и посмотрим, короче ли он.

for l in open('f').readlines():
 if l[1]==('-'):
  for x in range(1,len(l)):print(' '*(len(l)-x+1)+'/')
 else:print l[:-1]

редактировать

  • только заметил, что у самого левого /есть место впереди; +2 байта
janrn
источник
0

Рубин, 59 знаков

(57 символов кода + 2 символа параметров командной строки.)

s=""
$_=$_.chars.map{(s<<" ")[1..-1]+?/}.reverse*$/if$.<2

Образец прогона:

bash-4.3$ ruby -ple 's="";$_=$_.chars.map{(s<<" ")[1..-1]+?/}.reverse*$/if$.<2' <<< $'-------\n|     |\n|_____|'
      /
     /
    /
   /
  /
 /
/
|     |
|_____|
manatwork
источник
0

Баш, 129 знаков

Требуется файл aс закрытым полем, вывод на стандартный вывод.

for i in $(seq `cat a|awk 'NR==1{print length($1)-1}'` -1 1);{ for j in `seq 1 $i`;{ printf " ";};echo "/";};echo "/";tail -n2 a

Можно было бы сделать его короче, используя sedи используя stdin и piping.

Даниэль Пойкерт
источник
Хороший первый ответ в гольф. Несколько простых предложений по изменению синтаксиса:for i in $(seq `awk 'NR<2&&$0=length-1' a` -1 1);{ for j in `seq 1 $i`;{ printf \ ;};echo /;};echo /;tail -n2 a
manatwork
0

PHP, 127 символов

$s=$argv[1];$l=strlen(strtok($s,"\n"));for($i=0;$i<$l;$i++)$s=preg_replace("/-/","\n".str_repeat(" ",$l-$i-1)."/",$s,1);echo$s;

Безголовая версия:

$s=$argv[1];
$l=strlen(strtok($s,"\n"));

for($i=0;$i<$l;$i++){
    $v="\n".str_repeat(" ",$l-$i-1)."/";
    $s=preg_replace("/-/",$v,$s,1);
}
echo $s;
kuldeep.kamboj
источник
В вашем коде есть опечатка: вы пропустили символ $argv. Вы можете применить несколько небольших трюков: $l=strlen(strtok($s=$argv[1],"↵"));while($l)$s=preg_replace("/-/","↵".str_repeat(" ",--$l-$i)."/",$s,1);echo$s;(Используйте буквальный символ новой строки в своем коде, где «↵»: pastebin.com/36t2fb0P )
manatwork
0

Python, 125 байт (110 без коробки)

i="\n---\n| |\n|_|"
l,b,r=i.count("-"),i.split('\n'),range
for x in r(1,l):print" "*(l-x)+"/"
for x in r(2,len(b)):print b[x]

Если у кого-нибудь есть идеи, как его сократить, пожалуйста, дайте мне знать!

Дэйв Лин
источник
0

Awk, 47 46 символов

(44 символа кода + 2 символа командной строки.)

/-/{OFS=RS;for(i=NF;i;i--){$i=s"/";s=s" "}}1

Образец прогона:

bash-4.3$ awk -F '' '/-/{OFS=RS;for(i=NF;i;i--){$i=s"/";s=s" "}}1' <<< $'-------\n|     |\n|_____|'
      /
     /
    /
   /
  /
 /
/
|     |
|_____|
manatwork
источник
0

Гема, 51 49 31 символов

-\P/-+/=@subst{-=\\ ;$1}/\n
-=/

Образец прогона:

bash-4.3$ gema -e '-\P/-+/=@subst{-=\\ ;$1}/\n;-=/' <<< $'-------\n|     |\n|_____|'
      /
     /
    /
   /
  /
 /
/
|     |
|_____|
manatwork
источник