스택 오버플로


47

( 이 질문에서 영감을 얻음 )

객관적인

귀하의 작업은 ASCII 버전의 Stack Overflow 로고를 STDOUT에 인쇄하는 프로그램이나 기능을 작성하는 것입니다

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

프로그램은 여기에서 H와 N이라고하는 두 개의 입력을 가져야합니다. 스택 "컨테이너"(괄호)의 높이는 H에 의해 결정됩니다. 스택의 항목 수는 N에 의해 ​​결정됩니다. N> H이면 스택이 "오버플로"됩니다.

입출력

H는 컨테이너의 높이를 결정합니다

예를 들면 다음과 같습니다.

H = 1 :

( )

H = 2 :

( )
( )

H = 3 :

( )
( )
( )

H는 항상 1 이상입니다

N은 스택에있는 항목 수를 결정합니다. 다음 예제는 모두 H = 2입니다.

N = 0

( )
( )

N = 1

( )
(-)

N = 2

(-)
(-)

N = 3

 \
(-)
(-)

N = 4

 \|
(-)
(-)

N = 5

 \|/
(-)
(-)

N = 6

 \|/
(-)-
(-)

N = 7

 \|/
(-)-
(-)-

N은 절대로 초과하지 않습니다 2H+3(즉, 스택은 절대지면을 통과하지 않습니다).

규칙

  • 표준 허점 없음.
  • 프로그램에서 오류가 발생하지 않아야합니다.
  • 모든 테스트 사례를 통과해야합니다.
  • 원하는 방식으로 H와 N을 입력 할 수 있습니다.
  • 나는 당신의 언어가 이것을 위해 내장되어 있다는 것을 진지하게 의심합니다.
  • 각 줄에는 선택적으로 끝에 추가 공간이있을 수 있습니다. 마지막 줄 바꿈처럼 N <= H가 선택 사항 인 스택 위의 빈 줄입니다.
  • 이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다!

테스트 사례

입력 / 출력 섹션의 모든 H = 2 테스트 사례 외에도 다음 테스트 사례가 모두 통과해야합니다.

H = 1, N = 1

(-)

H = 1, N = 5

 \|/
(-)-

H = 4, N = 7

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

H = 5, N = 0

( )
( )
( )
( )
( )

리더 보드

다음은 일반 리더 보드와 언어 별 수상자 개요를 생성하는 스택 스 니펫입니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

# Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

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

헤더에 여러 숫자를 포함하려는 경우 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

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

언어 이름을 링크로 만들어 리더 보드 스 니펫에 표시 될 수도 있습니다.

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


4
로고를 인쇄하는 대신 실제로 스택을 오버플로하는 비경쟁 프로그램을 게시 할 수 있습니까?
dorukayhan 2016 년

@dorukayhan n> h :) 때에 만 오버플로가 발생하는 경우
Daniel M.

내 말은, 스택 오버플로로 인해 충돌하는 프로그램을 만들 수 있습니까?
dorukayhan 2016 년

@dorukayhan 스택이 보유 할 수있는 것보다 많은 항목이있을 때 충돌이 발생하는 경우에만
Daniel M.

답변:


14

Pyth, 43 41 40 바이트

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

온라인으로 사용해보십시오. 테스트 스위트.

첫 번째 패스는 빠르고 더럽습니다. STDIN에로 입력하십시오 N\nH.

설명

  1. 두 번째 입력 (높이)을 J( JE)에 저장하고 첫 번째 입력 (항목 수)에서 뺍니다. ( -QJE)
  2. 차이 (넘치는 항목 수)를에 저장하십시오 K. ( K-QJE)
  3. 숫자에 1을 더하십시오. ( hK-QJE)
  4. 가져 가라 max(0, previous). 음수는 다음 단계를 어길 수 있기 때문에 필수입니다. ( g#0hK-QJE)
  5. " \|/"첫 줄을 가져 와서 인쇄 하려면 문자열에서 최대 많은 문자 를 가져옵니다. ( <" \|/"g#0hK-QJE)
  6. 루프 N오버 range(0, J). ( VJ) 각 N인쇄에 대해 다음을 연결합니다. ( s[)
    • "("( \()
    • " "N+1스택에 여유 공간이 적어도 있는 경우 ( <N_K) "-"그렇지 않은 경우 ( ?<N_Kd\-)
    • ")"( \))
    • "-"N+4스택 ( <N-K3) 에 넘친 조각 이 있으면 ""그렇지 않은 경우 ( *<N-K3\-)

13

자바 스크립트 (ES6) 105 102 바이트

@Edit : @PatrickRoberts 덕분에 3 바이트가 절약되었습니다.

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>


당신은 대체 할 수 substringsubstr3 바이트를 저장하고 교체 i+n<h?' ':'-''- '[i+n<h]할인율 2 바이트 대체 i+h+3<n?'-':''' -'[i+h+3<n]1 바이트를 저장합니다. 100 세 미만입니다
Patrick Roberts

@PatrickRoberts substr부정적인 첨자를 무시 했는지 여부를 기억할 수 없었지만 문자열 첨자가 문자열이기 때문에 다른 팁을 사용할 수 없으므로 부울이 충분하지 않습니다.
Neil

쓰레기 내가 그것에 대해 잊어 버린 좋은 점
Patrick Roberts

이 두 문자를 저장하기 위해 태그가 달린 템플릿을 실제로 영리하게 사용합니다!
Benjamin Gruenbaum 2016 년

@BenjaminGruenbaum "태그 된 템플릿"이란 무엇입니까?
Patrick Roberts

12

자바 스크립트 (ES6) 126 122 112 바이트

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)

테스트

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

대체 테스트 (브라우저가 ES6를 지원하지 않는 경우)

Babeljs.io 의 테스트를 보고 "평가"를 확인하십시오.

136 바이트에서 흥미로운 대체 접근법

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

반복 금액을 템플릿 문자열로 이동하고 정규 표현식을 사용하여 반복 그룹을 주입합니다. 불행히도에 대한 서명 .replace()이 너무 깁니다.


오류가 발생했습니다 ...?
애디슨 크럼

1
@VTCAKAVSMoACE 브라우저가 ES6 구문을 지원해야합니다. 그것은 나를 위해 잘 작동합니다. 테스트를 Babel에 자유롭게 붙여 넣으십시오 .
Patrick Roberts

@VTCAKAVSMoACE Chrome 52 (2016 년 6 월 현재 베타 버전)는 테일 콜 최적화 및 모듈 로딩을 제외한 모든 ES6 및 ES7을 지원합니다.
gcampbell

10

C ++ 14 (람다 함수), 196

Quentin 덕분에 1 바이트를 절약했습니다.

Adam Martin 덕분에 2 바이트를 절약했습니다.

#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';}

함수 자체는 157 바이트를 사용합니다.

여기 에서 실제로 확인 하십시오 .

언 골프 버전 :

[](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
나는 포함에서 어떤 점을 볼 includes와 using namespace std;당신의 대답은 완전한 프로그램이 (가하지 않은) 경우를 제외하고, 바이트 수에.
Alexander Revo 2016 년

9

CJam, 57 바이트

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

여기에서 테스트하십시오.

확실히 약간의 개선을 사용할 수 있습니다. 아이디어는 -\|/-셀이 연속 정수로 대체 되는 그리드를 만드는 것입니다.

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

그런 다음 끝에 올바른 문자 (잠재적으로 공백)로 바꾸십시오.


6

파이썬 (2), 101 (100) 98 바이트

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

공백 print은 불필요
Cyoce

@Cyoce 감사합니다, 그것은 2 문자를 절약합니다.
척 모리스

4

자바 스크립트 (ES6), 87 80 바이트

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

재귀를 사용하여 아래에서 위로 출력 문자열을 만듭니다.

편집 : 87 바이트에서 7 바이트를 면도 해주신 @Neil 덕분에

기발한

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

테스트 스 니펫 :

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>


좋은 스 니펫 주셔서 감사합니다! 추가 포인트를 주어야합니다 : P
Kimmax

1
@ Kimmax 고마워 친구, 아무도 콘솔에 엉망이되고 싶어
조지 Reith

적어도 내가 시도했을 때 스택은 꽤 커서 보통의 재귀를 가진 78 바이트입니다.
Neil

스 니펫 콘솔 SyntaxError에 나에게 표시됩니다.
ArtOfCode

1
@ArtOfCode ES6 호환 브라우저를 사용해야합니다
George Reith

3

자바 스크립트 (ES6), 149 (139) 137 바이트

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

-\|/문자 인덱싱에 대한 @MartinEnder의 아이디어가 마음에 들었고 ES6에서 어떻게 작동하는지보고 싶었습니다. 분명히 나는 ​​그렇게 잘하지 않았다. 를 사용하여 이것이 향상 될 수 있는지 알아 내려고 노력 중 for...of입니다.

편집

  • 정규 표현식과에 대한 호출을 제거 .replace하여 인덱싱을 g()대신 직접 이동했습니다 .
  • 실수로 f=두 번째 바이트 수로 계산했습니다.

테스트

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

자바, 186177 바이트

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 온라인 시도

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

당신은 당신이 아마 람다 몸 떠날 수있는 lambda-를 사용하여 바이트 저장할 수 있습니다
다니엘 M.

2
Ungoled Java 코드 를 컴파일 하려면 사용자 정의 IDE가 필요 합니까? : D
Kimmax 2016 년

@Kimmax .. D' oh!
Khaled.K

3

엑셀, 131 바이트

입력 튜플, 높이로 촬영 HA1, NB1. 수식이 포함 된 셀에는 텍스트 줄 바꿈이 설정되어 있어야합니다. 고정 폭 글꼴 사용을 제안하십시오.

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

훌륭한 해결책! 당신은에서 2 튜플로이 걸릴 입력 것을 추가해야 A1하고 B1이 사실이 될 수있는 랩 텍스트 옵션을 가지고 호출 셀을 필요 않는다는 간단한 메모를 추가 할 수 있습니다. 또한 올바른 정렬을 위해서는 Courier New 또는 Lucidia Console과 같은 고정 폭 글꼴이 있어야합니다
Taylor Scott

1
@TaylorScott에게 감사합니다. 당신의 제안으로 답변을 업데이트했습니다.
베르니 슈

2

C ++ 11 155 148 145 바이트

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");}

언 골프 :

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");
}

사용법 :

#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

파이썬 3 134 121 118 111 바이트

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

여기에서 테스트하십시오 : https://repl.it/CYL1/0

언 골프 :

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

목록 오버플로에 측면 오버플로를 추가하고 싶지만 그것을 짜낼 수 없으므로 while 루프를 사용해야했습니다. 13 바이트를 절약했습니다!


출력이 꺼져 '\|/'[:max(0,n-h)]있으므로 Python 2 솔루션과 같이 되도록 변경해야합니다 .
busfault


1

, 50 바이트

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

온라인으로 사용해보십시오!

어이, 너무 길어요 ... 더 이상 단축하는 법을 모르겠어요. 일반적으로 유용한 순환 인덱싱은 이번에 추가 바이트 비용이 듭니다.


1

PowerShell을 , 109 (108) 104 바이트

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

온라인으로 사용해보십시오!

비싼 인덱싱에서 많은 손실을 입었지만 여전히 괜찮습니다. 그러나 내 인덱스 수학이 최적인지 확실하지 않습니다. 바이트를 저장하기 위해 다른 답변의 논리를 훔쳤습니다. 또한 -4 바이트에 대한 일부 parens를 팝하는 우선 순위를 기억했습니다.


0

05AB1E , 45 바이트

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

확실히 골프를 칠 수 있습니다 .. 현재 형태 tbh에 너무 행복하지 않습니다.

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

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

기분이 나아지면 여기에 내가 가진 것이 있습니다 LR'(ì')«¹x‚3+¬UŸ¦ζJ¹XŸJ¦1úr)˜».
매직 문어 Urn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.