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


33

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

Примеры

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

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

Выход:

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

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

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

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

  • Каждый -должен быть заменен на /восходящие линии и позиции.

2
В отличие от игры «Закрой ящик»?
Эддисон Крамп


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

2
+1 за классную анимацию. Как ты это создал?
Gowtham

@Gowtham Я думаю, вы записываете свой экран и обрезаете видео. Затем возьмите это и конвертируйте в GIF. Конечно, просто догадываясь, я не знаю фактического метода
Spotlight

@ awesomebing1 Вы получили это
подземный


8

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

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

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

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


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}\\

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>


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

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

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
\
 \
  \
   \
|  |
|__|

@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

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прямой вместо сохранения в переменной. Великие умы!



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которая принимает строку в качестве входных данных. (Полная программа не была указана в вопросе).


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|__|"
   /
  /
 /
/
|  |
|__|


1

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

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

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

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


Привет и добро пожаловать в 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.

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 байта

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

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;

В вашем коде есть опечатка: вы пропустили символ $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|_____|'
      /
     /
    /
   /
  /
 /
/
|     |
|_____|

0

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

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

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

bash-4.3$ gema -e '-\P/-+/=@subst{-=\\ ;$1}/\n;-=/' <<< $'-------\n|     |\n|_____|'
      /
     /
    /
   /
  /
 /
/
|     |
|_____|


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.