ボックスを開くのを手伝ってください


33

ASCIIアートボックスがあり、それを開くにはプログラムが必要です。

入力:

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

出力:

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

仕様

  • 最初の行は-、少なくとも3 つのみで構成されます
  • 中央の行は|スペースで始まり、次で終わります|
    • すべての中央の行は同じになります
  • 最後の行は|have _で始まり、aで終わる|
  • すべての行は同じ長さになります

ボックスを開く:

  • それぞれ-/昇順の行と位置に置き換えます。

2
ゲーム「箱を閉める」とは対照的に?
アディソンクランプ


28
蓋を開けると長さが2倍になりますか?まあ、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をスペースに置き換えます。

編集:@ edc65のおかげで5バイト保存されました。


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画面を録画してビデオをトリミングすると思います。次に、それを取得してGIFに変換します。もちろん、単なる推測、私は実際の方法を知らない
スポットライト

@ awesomebing1あなたはそれを得た
地下


8

網膜、34 20バイト

-(?=(-*))¶?
$ 1 /¶
-
 

最初のステップでは、every --それに続く '、a、/および改行で置換されます。元の最初の行の最後にある改行は削除されます。2番目のステップでは、新しい-をスペースに変更して、目的の出力にします。

こちらからオンラインでお試しください。


2
それの楽しみのために、それはまた単一の段階で可能である:retina.tryitonline.net/…(しかし同じバイト)
マーティンエンダー

最初の改行を別に食べる場合は$%'、末尾-のs をキャプチャして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}/

オンラインでテストしてください!

OPに応じて受け入れ可能な先頭の改行を出力します。

使い方

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)コードがあります:編集:@Dennisのコード編集で82バイト短くなりました!

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

いずれかを使用するには、「f.txt」と呼ばれる任意の幅または深さのアスキーボックスを含むテキストファイルを同じディレクトリに作成する必要があります。その後、そのボックスが開きます。


1
変数を1文字に短縮し、演算子間の空白を削除することにより、これをさらに短縮できます。Pythonでのゴルフの一般的なヒントについては、こちらをご覧ください
アレックスA.

なぜに地球あなたは時間が必要なのですか?この質問は、単一の出力のみを要求します。
アディソンクランプ

私が言ったように、このパズルの私の解釈はわずかに外れていて、それを出力すると、質問よりも多くのものが表示されます。
モンスター

さて、私は今理解しているように質問が言うことを正確に行う単純な答えを追加しました。きれいではありませんが、機能します。私の代替コードは、それを開いて見たいと思うほど素晴らしい人のためのものです
モンスター

2
いくつかの小さな変更により、バイトカウントが81(STDINからの読み取り)になります。
デニス

3

バッシュ、85 84 79文字

(純粋な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実行可能ファイルは、標準とオペレーティングシステムの適合性のために存在します。今日ではそのいずれかが最大であるようポータビリティが、重要である場合は、1つだけ使用されていることを、標準、しかし、最も近代的なシェルは、独自の組み込み持っechoデフォルトで使用されていますpastebin.com/RnxhweBvあなたが名前の変更/移動お使いの場合は、@Leviを/usr/bin/echo私の、コードは引き続き機能します。
マナトワーク

(冗談でした...)
レヴィ

1
ああ。OK。申し訳ありませんが、私は以前に同じことを主張した人々とすでに会いましたが、真剣です。
マナトワーク

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の(in)famous $'aka $POSTMATCHspecial variable として評価されます。最後に、chompは最後の-文字に追加された末尾の改行文字を取り除きます。

7以上の文字を保存してくれた@manatworkに感謝します。

ボーナス - 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最初の行のみにが含まれている-ので、はい、もっとゴルフできます。ありがとう!
ゴーサム

$.==1$.<2&&chop&chop、余分なカッコのペアを削除しlengthます{chr 39}。1としてカウントします。シェルの構文のためにコマンドラインバージョンでのみ必要ではないためです$.<2&&s^-^" "x(length$')."/\n"^ge&choppastebin.com/iDhUs9XX
manatwork

@manatwork実際、$.==1または$.<2最初の行のみが含まれているため、省略することができる-
Gowtham

はい、私はあなたがそこでしたことを見ました。そして私は驚いた。ちなみに、コードの代わりにリテラル行ラップを使用できます\n
マナトワーク16

ど 短いものを見つけた: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

編集:私のコードは@Monsterの短いPython3コードの@Dennisのコメント編集とほとんど同じであることに気づきました。唯一の違い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、文字列として-split改行のS `n 参照リンクへの最初の行を格納する$d(文字列)とに残り$b(文字列の配列として)。次にlength、最初の行(マイナス1)からループし、0各反復がその数のスペースとaを出力します。/。最後に、出力$b(入力文字列の残り)は、デフォルトで1行に1つ出力します。

実行例

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答えのコメントとして書かれるべきですが、まだコメントを作成できません


こんにちは、PPCGへようこそ。私はあなたがさらにゴルフをしたニールの答えを意味すると思います。回答へのリンクを追加し、作者の名前を修正してクレジットを与えることができます。
ジョナサンフレッチ

@JonathanFrechありがとう、完了
Any3nymousユーザー


1

、14 バイト

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

オンラインで試す(詳細)たり(純粋)オンラインそれを試してみてください

説明:

入力を改行で分割し、最初の行の長さを取得して、その長さの行を右上から下左に印刷します。

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

右に1回移動します。

Move(:Right)
M→

入力を改行で再度分割し、最初の項目を削除して、暗黙的に残っているものを印刷します。

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

(注:変数で改行で分割された入力を行う(上記で2回実行するため)は、わずかに異なる方法を使用して1バイト長くなります(@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の問題を解決しようです。賢い。
クロルタン16

.repeat(n-i-1)=>.repeat(n+~i)
Downgoat

0

パイソン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

Bash、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

sedstdinとパイピングを使用して使用することにより、短くすることが可能かもしれません。


素敵な最初のゴルフの答え。いくつかの簡単な構文変更の提案: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 characters

(44 characters code + 2 characters command line option.)

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

Sample run:

bash-4.3$ awk -F '' '/-/{OFS=RS;for(i=NF;i;i--){$i=s"/";s=s" "}}1' <<< $'-------\n|     |\n|_____|'
      /
     /
    /
   /
  /
 /
/
|     |
|_____|

0

Gema, 51 49 31 characters

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

Sample run:

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.