Giúp tôi mở hộp


33

Tôi có một hộp nghệ thuật ASCII và tôi cần một chương trình để mở nó.

Ví dụ

Đầu vào:

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

Đầu ra:

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

Đặc điểm kỹ thuật

  • Dòng đầu tiên sẽ chỉ bao gồm -, ít nhất 3 trong số họ
  • Các hàng ở giữa sẽ bắt đầu bằng |khoảng trắng và kết thúc bằng|
    • Tất cả các hàng giữa sẽ giống nhau
  • Hàng cuối cùng sẽ bắt đầu bằng |_và kết thúc bằng một|
  • Tất cả các hàng sẽ có cùng độ dài

Mở hộp:

  • Mỗi cái -nên được thay thế bằng một /dòng tăng dần và vị trí.

2
Trái ngược với trò chơi "Shut the Box"?
Addison Crump


28
Cái nắp trở nên dài gấp đôi khi mở ra? Ồ, đổ lỗi cho nghệ thuật ASCII.
Darrel Hoffman

8
Có cái gì trong hộp vậy?
Williham Totland

2
Không có một thông dịch viên làm việc, vì vậy tôi đoán là không. Không quan trọng; Khi tôi làm phiên dịch viên (sớm thôi, hy vọng), tôi sẽ đăng câu trả lời.
Sản xuất ETH

Câu trả lời:


7

CJam, 14 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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 byte

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

Đầu ra một dòng mới hàng đầu. Hoạt động bằng cách lấy hàng của -s và chuyển đổi chúng thành một hình tam giác, sau đó thay thế- s bằng dấu cách.

Chỉnh sửa: Đã lưu 5 byte nhờ @ edc65.


1
+1 Tôi đã học được điều gì đó mới ($ '). Thay vào đó, thủ thuật cũ này có thể tiết kiệm 4 byte cho bạn:f=s=>s[R='replace'](/-+/,s=>s[R](/-/g,"\n$'/"))[R](/-/g,' ')
edc65

@ edc65 Cảm ơn, tôi thực sự làm cho nó 5 byte; cũng cảm ơn vì đã sửa lỗi đánh máy của tôi (như bạn có thể đoán tôi đã phát triển \nvà chuyển đổi sau đó).
Neil

9

pb (KHÔNG GIỚI HẠN), 125 byte

^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]>^}

Phiên bản pbi mà bạn cần để chạy câu trả lời này mới hơn câu hỏi. Nó sẽ hoạt động trong các phiên bản cũ hơn ngoại trừ việc tôi không bao giờ có thể cho phép các dòng mới trong đầu vào. Ồ tốt

Đầu tiên, điều này xác định chiều cao của hộp bằng cách đếm dòng mới trong đầu vào. Một khi nó biết điều đó, nó đi đến vị trí Y của bên phải của hộp, đi xuống nơi cần đến và vẽ các bức tường và sàn nhà, hoàn thiện bằng nắp.

Kiểm tra hoạt hình vui nhộn này!

Tạm dừng dài là bàn chải đi qua đầu vào.

Ung dung:

^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 cho hình ảnh động thú vị. Làm thế nào bạn tạo ra nó?
Gowtham

@Gowtham Tôi đoán bạn sẽ ghi lại màn hình của mình và cắt video. Sau đó, lấy nó và chuyển đổi nó thành một GIF. Tất nhiên, chỉ cần đoán, tôi không biết phương pháp thực tế
Spotlight

@ awesomebing1 bạn đã nhận nó
undergroundmonorail


8

Võng mạc, 34 20 byte

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

Trong bước đầu tiên, mọi thứ -được thay thế bằng các bước -tiếp theo, a /và một dòng mới. Dòng mới ở cuối dòng đầu tiên bị xóa. Trong bước thứ hai, chúng tôi thay đổi các -không gian mới thành không gian dẫn đến đầu ra mong muốn.

Hãy thử trực tuyến tại đây.


2
Chỉ để giải trí, nó cũng có thể trong một giai đoạn duy nhất: retina.tryitonline.net/ (mặc dù cùng một byte)
Martin Ender

Nếu bạn ăn riêng dòng mới đầu tiên, bạn có thể sử dụng $%'để ghi lại dấu vết -giúp bạn tiết kiệm 5 byte: Hãy thử trực tuyến!
Neil

7

MATL , 14 15 byte

' /'jnXyPQ)`jt

Đầu vào nên có một dòng mới.

Hãy thử trực tuyến!

Giải trình

' /'       % 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 byte

Ur-@"
{SpUa- -Y}/

Kiểm tra nó trực tuyến!

Xuất ra một dòng mới hàng đầu, được chấp nhận theo OP.

Làm thế nào nó hoạt động

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.

Điều này sẽ ngắn hơn 4 byte nếu bản lề được phép ở cạnh phải của hộp:

Ur-@"
{SpY}\\

4

JavaScript (ES6), 66

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

KIỂM TRA

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 byte

Đây chỉ là một sự khởi đầu, nhưng hey, 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);}

Yêu cầu đầu vào dưới dạng một chuỗi, trả về hộp.


3

Python 3, 1̶7̶0̶ 88 byte

Đây là mã (er) ngắn của tôi: EDIT: Bây giờ 82 byte ngắn hơn với mã của @Dennis Chỉnh sửa!

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

Python 3, 421 byte

Ngoài ra, chỉ để giải trí, bạn có thể sử dụng một cái mở từ từ:

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

Để sử dụng một trong hai, bạn phải tạo một tệp văn bản trong cùng thư mục chứa hộp ascii có chiều rộng hoặc chiều sâu bất kỳ được gọi là 'f.txt'. Sau đó nó sẽ mở hộp đó.


1
Bạn có thể rút ngắn điều này hơn nữa bằng cách rút ngắn các biến thành các chữ cái đơn và loại bỏ rất nhiều khoảng trắng giữa các toán tử. Để biết các mẹo chung để chơi gôn trong Python, xem tại đây .
Alex A.

Tại sao trên trái đất bạn cần thời gian? Câu hỏi này chỉ yêu cầu một đầu ra duy nhất.
Addison Crump

Như tôi đã nói, cách giải thích của tôi về câu đố này hơi bị tắt và nếu bạn xuất nó, nó sẽ cho bạn thấy nhiều hơn câu hỏi được yêu cầu.
Quái vật

Được rồi, tôi đã thêm một câu trả lời đơn giản hơn, chính xác những gì câu hỏi nói khi tôi hiểu nó. Nó không đẹp nhưng nó hoạt động. Mã thay thế của tôi dành cho bất kỳ ai đủ tuyệt vời để muốn xem nó mở
Monster

2
Một vài thay đổi nhỏ làm giảm số byte của bạn xuống 81 (đọc từ STDIN).
Dennis

3

Bash, 85 84 79 ký tự

(Phiên bản Pure Bash, không sử dụng lệnh bên ngoài.)

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

Đầu ra một dòng mới hàng đầu.

Chạy mẫu:

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

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

echolà một lệnh bên ngoài - /usr/bin/echo;)
Levi

Việc echothực thi tồn tại cho sự phù hợp của hệ điều hành với các tiêu chuẩn. Ngày nay rằng người duy nhất được sử dụng nếu tính di động là quan trọng, vì đó là một trong lên đến tiêu chuẩn , Nhưng hầu hết vỏ hiện đại có BUILTIN riêng của họ echođược sử dụng bởi mặc định: pastebin.com/RnxhweBv @Levi, nếu bạn đổi tên / di chuyển của bạn /usr/bin/echo, của tôi mã vẫn sẽ hoạt động.
manatwork

(đó là một trò đùa ....)
Levi

1
Oh. Được. Xin lỗi, tôi đã gặp những người trước đó đã tuyên bố như vậy, nhưng nghiêm túc.
manatwork 4/2/2016

3

Perl, 61 54 33 + 3 = 36 ký tự

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

Chạy nó như

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

Mỗi -dòng đầu tiên được thay thế bằng một chuỗi là kết quả của việc ghép một số số , /\n. ${chr 39}đánh giá biến perl's (in) nổi tiếng $'hay còn gọi là $POSTMATCHbiến đặc biệt. Cuối cùng, chomp thoát khỏi ký tự dòng mới được thêm vào cho -ký tự cuối cùng .

Cảm ơn @manatwork vì đã tiết kiệm được hơn 7 ký tự.

Phần thưởng - s^-^" "x$i++."\\\n"^ge&&chopmở hộp từ cạnh phải trong 29 + 3 ký tự :). Chạy nó như:

gowtham@ubuntu:~$ cat a
----
|  |
|__|
gowtham@ubuntu:~$ perl -plE 's^-^" "x$i++."\\\n"^ge&&chop' closed_box_file
\
 \
  \
   \
|  |
|__|

@manatwork Chỉ dòng đầu tiên có chứa -, vì vậy, tôi có thể chơi gôn nhiều hơn. Cảm ơn!
Gowtham

$.==1$.<2, &&chop&chop, xóa cặp dấu ngoặc đơn bổ sung xung quanh length, được tính {chr 39}là 1, vì phiên bản dòng lệnh không chỉ cần thiết do cú pháp của shell: $.<2&&s^-^" "x(length$')."/\n"^ge&chop+ 2 ký tự cho các tùy chọn dòng lệnh = 40 theo cách đếm của tôi. pastebin.com/iDhUs9XX
manatwork

@manatwork Trên thực tế, $.==1hoặc $.<2có thể bị loại vì chỉ có dòng đầu tiên chứa-
Gowtham

Vâng, tôi đã thấy những gì bạn đã làm ở đó. Và tôi đã rất ngạc nhiên. Nhân tiện, bạn có thể sử dụng một dòng chữ trong mã thay vì \n.
manatwork 2/2/2016

Doh. Tìm thấy một cái ngắn hơn:s^-^$'=~y/-/ /r."/\n"^ge&chomp
manatwork

2

Bình thường, 26 23 byte

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

Kinh quá. Chắc chắn có thể ngắn hơn; vẫn đang làm việc trên nó


2

Python3, 76 byte

f=open(0)
w=len(f.readline())
while w:w-=1;print(' '*w+'/')
print(f.read())
  1. Lấy chiều dài của dòng đầu vào đầu tiên.
  2. Các dòng in /trước số lượng không gian giảm dần.
  3. Đẩy phần còn lại stdinthẳng đến stdout.

EDIT: Tôi vừa nhận thấy rằng mã của tôi gần giống với chỉnh sửa nhận xét của @Dennis về mã Python3 ngắn hơn của @ Monster, sự khác biệt duy nhất là in stdintrực tiếp phần còn lại thay vì lưu trữ trong một biến. Những đầu óc vĩ đại!


2

Canvas , 6 4 byte

jL/o

Hãy thử nó ở đây!

Giải trình:

j      remove 1st line of the input
 L     get the width of the remaining input
  /    push a diagonal of that size
   o   and output that diagonal
       and implicitly output the remaining input

1

Python 2, 100 byte

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

Xác định hàm olấy một chuỗi làm đầu vào của nó. (Chương trình đầy đủ không được chỉ định trong câu hỏi).


1

PowerShell, 55 byte

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

Đưa đầu vào $argsdưới dạng một chuỗi, -splits trên dòng mới `n ( liên kết tham chiếu ) , lưu trữ dòng đầu tiên vào $d(dưới dạng chuỗi) và còn lại vào $b(dưới dạng một chuỗi các chuỗi). Sau đó, chúng tôi lặp từ lengthdòng đầu tiên (trừ 1) đến 0và mỗi lần lặp đầu ra số lượng khoảng trắng cộng với a /. Cuối cùng, đầu ra $b(phần còn lại của chuỗi đầu vào) theo mặc định sẽ xuất một đầu ra trên mỗi dòng.

Chạy ví dụ

PS C:\Tools\Scripts\golfing> .\help-me-open-the-box.ps1 "----`n|  |`n|__|"
   /
  /
 /
/
|  |
|__|


1

JavaScript (Node.js) , 56 byte

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

Hãy thử trực tuyến!

Nên được viết như một lời nhận xét của @Neil 's câu trả lời nhưng tôi không thể tạo bình luận nào


Xin chào và chào mừng đến với PPCG. Tôi giả sử bạn có nghĩa là câu trả lời của Neil mà bạn đã chơi gôn hơn nữa. Bạn có thể muốn thêm một liên kết đến câu trả lời của họ và sửa tên tác giả để cung cấp tín dụng.
Jonathan Frech


1

05AB1E (di sản) , 9 byte

g'/1.Λ|»»

Hãy thử trực tuyến! (chỉ kế thừa)

Làm thế nào nó hoạt động

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

Than , 14 byte

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

Dùng thử trực tuyến (dài dòng) hoặc thử trực tuyến (thuần túy) .

Giải trình:

Tách đầu vào theo dòng mới, lấy độ dài của dòng đầu tiên và in một dòng có độ dài đó từ trên cùng bên phải xuống dưới bên trái:

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

Di chuyển một lần sang phải:

Move(:Right)
M→

Tách đầu vào theo dòng mới một lần nữa và xóa mục đầu tiên và in những gì còn lại ngầm:

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

(LƯU Ý: Đặt phân tách đầu vào theo dòng mới trong một biến (vì tôi thực hiện hai lần ở trên) dài hơn 1 byte cũng bằng 14 byte bằng cách sử dụng một phương thức hơi khác (nhờ @Neil ):
≔⮌⪪θ¶θ↙L⊟θM→⮌θ Thử trực tuyến (dài dòng) hoặc thử trực tuyến (nguyên chất) ).


Nếu bạn đảo ngược phân tách đầu vào theo dòng mới, bạn có thể bật ra dòng đầu tiên sau đó đưa bạn trở lại xuống 14 byte: Hãy thử trực tuyến!
Neil

0

JavaScript ES6, 106 byte

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

Đủ đơn giản: lấy chiều dài của dòng đầu tiên, tạo ra một hình tam giác cách đều có dấu / và thêm nó vào bản gốc, được cắt và nối.

Kiểm tra nó ra! (Chỉ ES6 :()


2
Tôi thấy bạn đã giải quyết vấn đề XKCD bằng định dạng. Tài giỏi.
Kroltan

.repeat(n-i-1)=>.repeat(n+~i)
Hạ cấp

0

Con trăn 2.7, 120 122 ký tự

Cần một tệp fvới hộp ban đầu / đóng, đầu ra là tệp đã mở. Chúc mừng ý tưởng @Monster cho ý tưởng ... sẽ cố gắng tìm ra đầu vào đa dòng sau và xem nó có ngắn hơn không.

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]

Chỉnh sửa

  • chỉ cần lưu ý rằng ngoài cùng bên trái /có một không gian phía trước; +2 byte

0

Ruby, 59 ký tự

(Mã 57 ký tự + 2 ký tự tùy chọn dòng lệnh.)

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

Chạy mẫu:

bash-4.3$ ruby -ple 's="";$_=$_.chars.map{(s<<" ")[1..-1]+?/}.reverse*$/if$.<2' <<< $'-------\n|     |\n|_____|'
      /
     /
    /
   /
  /
 /
/
|     |
|_____|

0

Bash, 129 ký tự

Yêu cầu một tệp được gọi avới hộp kín, xuất ra thiết bị xuất chuẩn.

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

Có thể làm cho nó ngắn hơn bằng cách sử dụng sedvà sử dụng stdin và đường ống.


Câu trả lời golf đầu tiên tốt đẹp. Một số gợi ý thay đổi cú pháp đơn giản: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 ký tự

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

Phiên bản bị đánh cắp:

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

Có một lỗi đánh máy trong mã của bạn: bạn đã bỏ lỡ sigil của $argv. Có một vài thủ thuật nhỏ bạn có thể áp dụng: $l=strlen(strtok($s=$argv[1],"↵"));while($l)$s=preg_replace("/-/","↵".str_repeat(" ",--$l-$i)."/",$s,1);echo$s;(Sử dụng một dòng chữ mới trong mã của bạn, nơi là ↵ ↵: pastebin.com/36t2fb0P )
manatwork

0

Python, 125 byte (110 không có hộp)

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]

Nếu bất cứ ai có ý tưởng làm thế nào để rút ngắn nó, xin vui lòng cho tôi biết!


0

Awk, 47 46 ký tự

(Tùy chọn dòng lệnh 44 ký tự + 2 ký tự.)

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

Chạy mẫu:

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

0

Gema, 51 49 31 ký tự

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

Chạy mẫu:

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


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.