Chồng tràn


47

(Lấy cảm hứng từ câu hỏi này )

Mục tiêu

Nhiệm vụ của bạn là viết chương trình hoặc chức năng để in phiên bản ASCII của logo Stack Overflow sang STDOUT

 \|/
(-)
(-)
(-)
(-)

Chương trình của bạn nên lấy hai đầu vào, được gọi ở đây là H và N. Chiều cao của ngăn xếp "container" (dấu ngoặc đơn) được xác định bởi H. Số lượng vật phẩm trong ngăn xếp được xác định bởi N. Nếu N> H, ngăn xếp sẽ "tràn".

Đầu ra đầu vào

H sẽ xác định chiều cao của container

Ví dụ:

H = 1:

( )

H = 2:

( )
( )

H = 3:

( )
( )
( )

H sẽ luôn có ít nhất 1

N sẽ xác định có bao nhiêu mục trong ngăn xếp. Các ví dụ sau đây đều là H = 2:

N = 0

( )
( )

N = 1

( )
(-)

N = 2

(-)
(-)

N = 3

 \
(-)
(-)

N = 4

 \|
(-)
(-)

N = 5

 \|/
(-)
(-)

N = 6

 \|/
(-)-
(-)

N = 7

 \|/
(-)-
(-)-

N sẽ không bao giờ nhiều hơn 2H+3(Nói cách khác, stack sẽ không bao giờ đi qua mặt đất).

Quy tắc

  • Không có sơ hở tiêu chuẩn.
  • Chương trình của bạn không được tạo ra bất kỳ lỗi nào.
  • Tất cả các trường hợp thử nghiệm phải vượt qua.
  • Bạn có thể nhập H và N bất kỳ cách nào bạn muốn.
  • Tôi thực sự nghi ngờ rằng ngôn ngữ của bạn được tích hợp sẵn cho việc này.
  • Mỗi dòng tùy chọn có thể có thêm một khoảng trống ở cuối. Một dòng trống phía trên ngăn xếp trong đó N <= H là tùy chọn, như là một dòng mới.
  • Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!

Các trường hợp thử nghiệm

Ngoài tất cả các trường hợp thử nghiệm H = 2 từ phần Đầu vào / Đầu ra, tất cả các trường hợp thử nghiệm sau phải vượt qua:

H = 1, N = 1

(-)

H = 1, N = 5

 \|/
(-)-

H = 4, N = 7

 \|/
(-)
(-)
(-)
(-)

H = 5, N = 0

( )
( )
( )
( )
( )

Bảng xếp hạng

Dưới đây là một Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

# Perl, 43 + 2 (-p flag) = 45 bytes

Bạn cũng có thể đặt tên ngôn ngữ thành một liên kết mà sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


4
Tôi có thể đăng một chương trình không cạnh tranh thực sự tràn ra ngăn xếp thay vì in logo không?
dorukayhan muốn Monica trở lại vào

@dorukayhan Nếu nó chỉ tràn khi n> h :)
Daniel M.

Ý tôi là, tôi có thể tạo một chương trình gặp sự cố từ tràn ngăn xếp không?
dorukayhan muốn Monica trở lại vào

@dorukayhan chỉ khi nó gặp sự cố khi có nhiều vật phẩm hơn ngăn xếp có thể giữ
Daniel M.

Câu trả lời:


14

Pyth, 43 41 40 byte

<" \|/"g#0hK-QJEVJs[\(?<N_Kd\-\)*<N-K3\-

Hãy thử trực tuyến. Bộ thử nghiệm.

Đầu tiên vượt qua, nhanh chóng và bẩn. Nhập vào STDIN như N\nH.

Giải trình

  1. Lưu đầu vào thứ hai (chiều cao) vào J( JE) và trừ nó khỏi đầu vào thứ nhất (số lượng vật phẩm). ( -QJE)
  2. Lưu sự khác biệt (số lượng vật phẩm tràn) vào K. ( K-QJE)
  3. Thêm 1 vào số. ( hK-QJE)
  4. Đi max(0, previous). Điều này là bắt buộc vì số âm sẽ phá vỡ bước tiếp theo. ( g#0hK-QJE)
  5. Lấy tối đa nhiều chữ cái trong chuỗi " \|/"để có dòng đầu tiên và in. ( <" \|/"g#0hK-QJE)
  6. Vòng Nqua range(0, J). ( VJ) Đối với mỗi Nbản in, việc ghép các phần sau: ( s[)
    • "("( \()
    • " "nếu có ít nhất N+1không gian trống trong stack ( <N_K), "-"nếu không. ( ?<N_Kd\-)
    • ")"( \))
    • "-"nếu có ít nhất là N+4tràn các mảnh trong stack ( <N-K3), ""nếu không. ( *<N-K3\-)

13

JavaScript (ES6), 105 102 byte

@Edit: Đã lưu 3 byte nhờ @PatrickRoberts.

f=
(n,h)=>` \\|/`.substr(0,n+1-h)+[...Array(h)].map((_,i)=>`
(${i+n<h?` `:`-`})${i+h+3<n?`-`:``}`).join``
;
<div oninput=o.textContent=f(+n.value,+h.value)>n<input id=n type=number min=0 value=0>h<input id=h type=number min=0 value=0><pre id=o>


Bạn có thể thay thế substringbằng substrđể lưu 3 byte và thay thế i+n<h?' ':'-'bằng '- '[i+n<h]để lưu 2 byte và thay thế i+h+3<n?'-':''bằng ' -'[i+h+3<n]để lưu 1 byte. Điều đó sẽ giúp bạn dưới 100 tuổi
Patrick Roberts

@PatrickRoberts Tôi không thể nhớ liệu có substrbỏ qua các đăng ký phủ định hay không, nhưng tôi không thể sử dụng các mẹo khác của bạn vì các đăng ký chuỗi là các chuỗi, vì vậy booleans không đủ tốt.
Neil

tào lao tôi quên mất điều đó, điểm tốt
Patrick Roberts

Sử dụng thông minh mẫu được gắn thẻ để lưu hai ký tự đó!
Benjamin Gruenbaum

@BenjaminGruenbaum "mẫu được gắn thẻ" là gì?
Patrick Roberts

12

JavaScript (ES6), 126 122 112 byte

h=>n=>' \\|/'.substr(0,(o=n-h)+1)+`
( )`[r='repeat'](0>-o?0:-o)+`
(-)-`[r](o=0>o-3?0:o-3)+`
(-)`[r](n<h-o?n:h-o)

Kiểm tra

f=h=>n=>' \\|/'.substr(0,(o=n-h)+1)+`
( )`[r='repeat'](0>-o?0:-o)+`
(-)-`[r](o=0>o-3?0:o-3)+`
(-)`[r](n<h-o?n:h-o)
document.write(`<pre>${[[2,0],[2,1],[2,2],[2,3],[2,4],[2,5],[2,6],[2,7],[1,1],[1,5],[4,7],[5,0]].map(a=>f(a.shift())(a.shift())).join`

`}</pre>`)

Kiểm tra thay thế (nếu trình duyệt của bạn không hỗ trợ ES6)

Xem thử nghiệm trên Babeljs.io và kiểm tra "đánh giá".

Cách tiếp cận thay thế thú vị ở 136 byte

h=>n=>' \\|/'.substr(0,(o=n-h)+1)+`
( )${0>-o?0:-o}
(-)-${o=0>o-3?0:o-3}
(-)${n<h-o?n:h-o}`.replace(/(\n.*)(\d+)/g,(_,s,r)=>s.repeat(r))

Thao tác này sẽ di chuyển số lượng lặp lại vào chuỗi mẫu và sử dụng biểu thức chính quy và thay thế để thêm vào các nhóm lặp lại. Thật không may, chữ ký cho .replace()quá dài.


Tôi gặp lỗi ...?
Addison Crump

1
@VTCAKAVSMoACE trình duyệt của bạn phải hỗ trợ cú pháp ES6. Việc này ổn với tôi. Hãy dán thử nghiệm vào Babel .
Patrick Roberts

@VTCAKAVSMoACE Chrome 52 (bản beta kể từ tháng 6 năm 2016) hỗ trợ tất cả ES6 và ES7 ngoại trừ tối ưu hóa cuộc gọi đuôi và tải mô-đun.
gcampbell

10

C ++ 14 (chức năng lambda), 196

Đã lưu 1 byte nhờ Quentin.

Lưu được 2 byte nhờ Adam Martin.

#include<iostream>
using namespace std;[](int h,int n){auto s=" \\|/( ) (-) (-)-"s;int t=max(min(n-h,3),0);n-=t;cout<<s.substr(0,t+1)+'\n';for(;h;h--)n-=t=n>h?2:h<=n,cout<<s.substr(4+4*t,4)+'\n';}

Hàm này mất 157 byte.

Xem nó trong hành động ở đây .

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

[](int h, int n) {
    auto s = " \\|/( ) (-) (-)-"s;
    int t = max(min(n - h, 3), 0);
    n -= t;
    cout << s.substr(0, t + 1) + '\n';
    for(; h; h--) {
        if (n > h) t = 2;
        else if (h > n) t = 0;
        else t = 1;
        n -= t;
        cout << s.substr(4 + 4 * t, 4) + '\n';
    }
};

2
Tôi thấy không có điểm nào bao gồm includes và using namespace std;số byte, trừ khi câu trả lời của bạn là một chương trình hoàn chỉnh (không có).
Alexander Revo

9

CJam, 57 byte

Sri:X'(*+X),W%X)X')*+X),X))f+]zN*X5*,X'-*_"\|/"\++ri<S+er

Kiểm tra nó ở đây.

Chắc chắn có thể sử dụng một số cải tiến. Ý tưởng là xây dựng một lưới nơi các -\|/-ô được thay thế bằng các số nguyên liên tiếp, vd

 345
(2)6
(1)7
(0)8

Và sau đó để thay thế chúng bằng các ký tự chính xác (có khả năng khoảng trắng) ở cuối.


6

Python 2, 101 100 98 byte

def f(h,n):
 print" \|/"[:max(0,n-h+1)]
 for i in range(h):print("(-)","( )")[h-i>n]+"-"*(n>i+h+3)

Không gian sau printlà không cần thiết
Cyoce

@Cyoce Cảm ơn, tiết kiệm được 2 ký tự.
Chuck Morris

4

JavaScript (ES6), 87 80 byte

F=(h,n)=>h?F(h-1,n-1)+`
(${n>0?'-':' '})${n>2*h+2?'-':''}`:' \\|/'.substr(0,n+1)

Sử dụng đệ quy để tạo chuỗi đầu ra từ dưới lên.

EDIT : Cảm ơn @Neil vì đã loại bỏ 7 byte từ 87 byte

Nguyên

(h,n)=>(E=s=>h--?E(`
(${n>0?'-':' '})${--n>2*h+3?'-':''}`+s):` \\|/`.substr(0,n+1)+s)``

Đoạn kiểm tra:

F=(h,n)=>h?F(h-1,n-1)+`
(${n>0?'-':' '})${n>2*h+2?'-':''}`:' \\|/'.substr(0,n+1)


h.oninput = n.oninput = () => output.innerHTML = F(+h.value, +n.value);
<label>h <input type="number" min="0" value="0" id="h" /></label>
<label>n <input type="number" min="0" value="0" id="n" /></label>
<hr />
<pre id="output"></pre>


cảm ơn vì đoạn trích hay Nên cho thêm một điểm: P
Kimmax

1
@Kimmax Cảm ơn người bạn đời, không ai muốn gây rối với bảng điều khiển
George Reith

Ít nhất là khi tôi đã thử, ngăn xếp khá lớn và nó sẽ chỉ là 78 ​​byte với đệ quy thông thường.
Neil

Bảng điều khiển đoạn trích đang hiển thị SyntaxErrorcho tôi.
ArtOfCode

1
@ArtOfCode Cần sử dụng trình duyệt tuân thủ ES6
George Reith

3

JavaScript (ES6), 149 139 137 byte

h=>n=>` ${[(g=(j,m=1)=>` -\\|/`[(j<n)*m])(h,2),g(h+1,3),g(h+2,4)].join``}${[...Array(h)].map((_,i)=>`
(${g(h-i-1)})${g(h+i+3)}`).join``}`

Tôi thích ý tưởng của @ MartinEnder về việc lập chỉ mục các -\|/ký tự và tôi muốn xem nó sẽ có giá như thế nào trong ES6. Rõ ràng tôi đã không làm tốt như vậy. Cố gắng tìm hiểu nếu điều này có thể được cải thiện bằng cách sử dụng for...of.

Chỉnh sửa

  • Tôi quản lý để loại bỏ regrec và cuộc gọi đến .replace, g()thay vào đó chuyển trực tiếp chỉ mục .
  • Tôi vô tình đếm f=trong số byte thứ hai

Kiểm tra

f=h=>n=>` ${[(g=(j,m=1)=>` -\\|/`[(j<n)*m])(h,2),g(h+1,3),g(h+2,4)].join``}${[...Array(h)].map((_,i)=>`
(${g(h-i-1)})${g(h+i+3)}`).join``}`
document.write(`<pre>${[[2,0],[2,1],[2,2],[2,3],[2,4],[2,5],[2,6],[2,7],[1,1],[1,5],[4,7],[5,0]].map(a=>f(a.shift())(a.shift())).join`

`}</pre>`)


3

Java, 186 177 byte

void f(int h,int n){for(int i=0;i<h+1;i++)System.out.print((i>0?"(":" ")+(i>0?n>h-i-2?"-":" ":n>h+0?"\\":" ")+(i>0?")":n>h+1?"|":" ")+(i>0?n>h+2+i?"-":" ":n>h+2?"/":" ")+"\n");}

Ungolfed thử trực tuyến

String f(int h, int n)
{
    String s=" ";
    s+=n>h+0?"\\":" ";
    s+=n>h+1? "|":" ";
    s+=n>h+2? "/":" ";
    s+="\n";

    for(int i=0; i<h; i++)
    {
        s+="(";
        s+=n>h-i-1?"-":" ";
        s+=")";
        s+=n>h+3+i?"-":" ";
        s+="\n";
    }

    return s;
}

Bạn có thể lưu byte bằng cách sử dụng lambda
Daniel M.

2
Tôi có cần một số IDE tùy chỉnh để biên dịch mã Java không? : D
Kimmax

@Kimmax .. Ôi!
Khaled.K

3

Excel, 131 byte

Đầu vào được lấy dưới dạng một tuple, Chiều cao Htrong A1, Ntrong B1. Ô có chứa công thức cần phải bật Text Wrapping. Đề xuất sử dụng phông chữ đơn cách.

=LEFT(" \|/",MAX(0,B1-A1+1))&"
"&REPT("(-)-
",MAX(0,B1-A1-3))&REPT("( )
",MAX(0,A1-B1))&REPT("(-)
",A1-MAX(0,B1-A1-3)-MAX(0,A1-B1))

Giải pháp tuyệt vời! Bạn nên thêm rằng cái này lấy đầu vào là 2-tuple từ A1B1thêm ghi chú đơn giản rằng điều này đòi hỏi ô gọi phải có tùy chọn bao bọc văn bản là đúng. Ngoài ra, để có được sự căn chỉnh phù hợp, nó phải có một phông chữ đơn sắc như Courier New hoặc Lucidia Console
Taylor Scott

1
Cảm ơn @TaylorScott. Cập nhật câu trả lời với đề xuất của bạn.
Wernisch

2

C ++ 11, 155 148 145 byte

void f(int h,int n){cout<<string{" \\|/",max(min(3,n-h),0)+1}<<'\n';for(int i=0;i<h;++i)cout<<(h-i<=n?"(-)":"( )")<<(i<max(n-h-3,0)?"-\n":"\n");}

Ung dung :

void f(int h,int n)
{
  cout << string{" \\|/", max(min(3, n-h), 0) + 1} << '\n';
  for(int i=0; i<h; ++i)
    cout << (h-i <= n ? "(-)" : "( )") << (i < max(n-h-3,0) ? "-\n" : "\n");
}

Cách sử dụng :

#include <iostream>
#include <string>
using namespace std;

void f(int h,int n){cout<<string{" \\|/",max(min(3,n-h),0)+1}<<'\n';for(int i=0;i<h;++i)cout<<(h-i<=n?"(-)":"( )")<<(i<max(n-h-3,0)?"-\n":"\n");}

int main()
{
  int h,n;
  cin >> h >> n;
  f(h, n);
}


1

Python 3, 134 121 118 111 byte

def f(h,n):print('\|/'[:max(0,n-h)]+'\n'+'\n'.join('(-)-'if h<n-x-3else('(-)','( )')[x+n<h] for x in range(h)))

Kiểm tra nó ở đây: https://repl.it/CYL1/0

Chưa chơi gôn:

def f(h,n):
  top=['\|/'[:max(0,n-h)]]
  stack=['( )'if x+n<h else'(-)'for x in range(h)]
  overflow=top+stack
  v=n-3
  while v>h:
      overflow[h-v]+='-' #add side overflow
      v-=1

  print('\n'.join(overflow))

Tôi muốn thêm phần tràn vào bên để hiểu danh sách, nhưng tôi không thể nén nó vào, vì vậy tôi phải đi theo vòng lặp while. Đã lưu 13 byte!


Đầu ra bị tắt, có lẽ bạn cần thay đổi '\|/'[:max(0,n-h)]để giống như giải pháp Python 2.
busfault


1

Pip , 50 byte

Ps.(0Xa."\|/")@<bDC0Fi,aP"()"WV"- "@[b<a-ib<a+4+i]

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

Ugh, điều này quá dài ... mặc dù vậy, không biết làm thế nào để rút ngắn nó nữa. Lập chỉ mục theo chu kỳ, thường hữu ích, chi phí thêm byte lần này.


1

PowerShell , 109 108 104 byte

param($n,$h)-join" \|/"[0..(($d=$n-$h),0)[$d-lt0]]
1..$h|%{("( )","(-)")[$h-$_-lt$n]+"-"*($h+$_+2-lt$n)}

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

Mất rất nhiều vào việc lập chỉ mục đắt tiền nhưng vẫn đàng hoàng. Tôi không chắc toán học chỉ số của tôi là tối ưu. Lấy trộm một số logic từ các câu trả lời khác để lưu một byte. Cũng nhớ ưu tiên bật một số parens cho -4 byte.


0

05AB1E , 45 byte

-U…( )¸¹иε²N›ið'-:]RεX4-N@i'-«]" \|/"XdX*>£š»

Chắc chắn có thể được chơi golf .. Không quá vui về nó ở dạng hiện tại của nó.

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

-                # Subtract the 2nd (implicit) input `n` from the 1st (implicit) input `h`
                 #  i.e. `h`=3, `n`=8 → 5
 U               # Pop and store it in variable `X`
…( )             # Push string "( )"
    ¸            # Wrap it into a list: ["( )"]
     ¹и          # Repeat it the first input (`h`) amount of times
                 #  i.e. 3 → ["( )","( )","( )"]
ε                # Map each to:
 ²Ni            #  If the second input `n` is larger than the map-index N:
                 #    i.e. `n`=8 >= N=0 → 1 (truthy)
     ð'-:       '#   Replace the space with a "-"
                 #    i.e. "( )" → "(-)"
]                # Close both the if and map
 R               # Reverse the list
ε                # Map each to:
 X4-N@i          #  If `X` minus 4 is larger than or equal to the map-index N:
                 #     i.e. `X`=5 and N=0 → 5-4 >= 0 → 1 (truthy)
                 #     i.e. `X`=5 and N=2 → 5-4 >= 2 → 0 (falsey)
       '-«      '#   Append a "-"
]                # Close both the if and map
 " \|/"          # Push String " \|/"
       Xd        # Check if `X` is 0 or positive (0 if negative, 1 if 0 or positive)
                 #  i.e. `X`=5 → 1 (truthy)
         X*      # Multiply it by `X`
                 #  i.e. 1 * 5 → 5
           >     # Increase it by 1
                 #  i.e. 5 → 6
            £    # Take that many character of the string " \|/"
                 #  i.e. 6 → " \|/"
             š   # Prepend it to the list
                 #  i.e. ["(-)-","(-)-","(-)"] and " \|/" → [" \|/","(-)-","(-)-","(-)"]
              »  # Join the list by newlines (and output implicitly)
                 #  i.e. [" \|/","(-)-","(-)-","(-)"] → " \|/\n(-)-\n(-)-\n(-)"

Nếu nó làm cho bạn cảm thấy tốt hơn thì đây là những gì tôi đã có: LR'(ì')«¹x‚3+¬UŸ¦ζJ¹XŸJ¦1úr)˜»và điều đó chỉ thực hiện được một nửa.
Bạch tuộc ma thuật Urn
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.