Допоможіть мені відкрити коробку


33

У мене є вікно ASCII-art, і мені потрібна програма, щоб відкрити його.

Приклади

Вхід:

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

Вихід:

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

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

  • Перший рядок буде складатися лише з -, принаймні, 3 з них
  • Середні ряди починатимуться з |пробілів, а закінчуватимуться з|
    • Всі середні ряди будуть однаковими
  • Останній рядок розпочнеться з " |has" _і закінчиться "a"|
  • Всі ряди будуть однакової довжини

Відкриття коробки:

  • Кожну -слід замінити на /висхідні лінії та положення.

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 у правій частині коробки, спускається туди, де це має бути, і малює стіни та підлогу, закінчуючи кришкою.

Перевірте цю веселу анімацію!

Довга пауза - кисть, що йде над входом.

Безголівки:

^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 ви його отримали
undergroundmonorail


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) код: EDIT: Зараз 82 байти Коротше З @Dennis's Code Edit!

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, мій код все одно буде працювати.
манатура

(це був жарт ....)
Леві

1
Ой. Добре. Вибачте, я вже зустрічав людей, які раніше заявляли те саме, але серйозно.
манатура

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's (in) відомої $'ака $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їх можна усунути, оскільки містить лише перший рядок-
Гоутем

Так, я бачив, що ти там робив. І я був вражений. До речі, ви можете використовувати в коді буквальне обертання рядків \n.
манатура

До. Знайшов коротший:s^-^$'=~y/-/ /r."/\n"^ge&chomp
манатура


2

Python3, 76 байт

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

EDIT: Я щойно помітив, що мій код майже ідентичний редагуванню коментарів @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 (спадщина) , 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 за допомогою форматування. Розумний.
Кролтан

.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із закритим вікном, виводить у stdout.

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 та трубопроводи.


Приємна перша відповідь про гольф. Деякі прості пропозиції щодо зміни синтаксису: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 )
манатура

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.