堆栈溢出


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

( )
( )
( )
( )
( )

排行榜

这是一个堆栈片段,用于按语言生成常规排行榜和获胜者概述。

为确保您的答案显示出来,请使用以下Markdown模板以标题开头。

# 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

@dorukayhan如果仅在n> h时溢出:)
Daniel M.

我的意思是,我可以制作一个由于堆栈溢出而崩溃的程序吗?
dorukayhan

@dorukayhan仅在当有更多物品无法容纳堆栈时崩溃时
Daniel M.

Answers:


14

Pyth,43 41 40字节

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

在线尝试。 测试套件。

第一遍,又快又脏。输入到STDIN作为N\nH

说明

  1. 将第二个输入(高度)保存到JJE),然后从第一个输入(项目数)中减去。(-QJE
  2. 将差异(溢出项目的数量)保存到K。(K-QJE
  3. 将数字加1。(hK-QJE
  4. max(0, previous)。这是必需的,因为负数会破坏下一步。(g#0hK-QJE
  5. 从字符串" \|/"中获取最多字母以获取第一行并打印。(<" \|/"g#0hK-QJE
  6. Nrange(0, J)。(VJ)对于每个N打印,以下内容的串联:(s[
    • "("\(
    • " "如果N+1堆栈中至少有可用空间(<N_K),"-"否则。(?<N_Kd\-
    • ")"\)
    • "-"如果N+4堆栈中至少有溢出的碎片(<N-K3),""否则。(*<N-K3\-

13

的JavaScript(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>


您可以替换substring使用substr,以节省3个字节,并更换i+n<h?' ':'-''- '[i+n<h]保存2个字节,替换i+h+3<n?'-':''' -'[i+h+3<n]保存1个字节。那会让您低于100岁
Patrick Roberts

@PatrickRoberts我不记得是否substr忽略了负下标,但是我无法使用您的其他技巧,因为字符串下标是字符串,所以布尔值还不够好。
尼尔

废话,我忘了,好点
Patrick Roberts

真正聪明地使用带标签的模板以保存这两个字符!
本杰明·格伦鲍姆

@BenjaminGruenbaum什么是“标签模板”?
Patrick Roberts

12

的JavaScript(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()太长了。


我得到一个错误...?
Addison Crump

1
@VTCAKAVSMoACE您的浏览器必须支持ES6语法。这对我来说可以。随时将测试粘贴到Babel中
Patrick Roberts

@VTCAKAVSMoACE Chrome 52(截至2016年6月为beta)支持除尾调用优化和模块加载之外的所有ES6和ES7。
gcampbell '16

10

C ++ 14(lambda函数),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;字节数毫无意义。
亚历山大·雷沃

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

然后在最后用正确的字符(可能是空格)替换它们。



4

JavaScript(ES6),87个 80字节

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

使用递归从下至上创建输出字符串。

编辑:感谢@Neil从87字节减少了7字节

原版的

(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,2016年

1
@Kimmax谢谢队友,没人想弄弄控制台
George Reith 2016年

至少当我尝试时,堆栈非常大,普通的递归只有78个字节。
尼尔

摘要控制台SyntaxError为我显示了一个。
ArtOfCode

1
@ArtOfCode需要使用兼容ES6的浏览器
George Reith,

3

的JavaScript(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

编辑

  • 我设法删除了regexp和对的调用.replaceg()而是直接将索引移到其中。
  • 我不小心计入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

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

取消高尔夫 在线尝试

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来保存字节-您甚至可以省去lambda主体
Daniel M.

2
是否需要一些自定义IDE来编译Ungoled Java代码?:D
Kimmax

@ Kimmax..D'哦!
Khaled.K,

3

Excel,131个字节

输入为元组,高度Hin A1Nin B1。包含公式的单元格需要启用“文字环绕”功能。建议使用等宽字体。

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

很棒的解决方案!您应该添加此输入作为from的2元组A1B1并添加简单的注释,即这确实要求调用单元格的wrap text选项为true。也可能是为了获得正确的对齐方式,它应该使用等距字体,例如Courier New或Lucidia Console
Taylor Scott

1
谢谢@TaylorScott。更新了您的建议的答案。
Wernisch '17

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

Ungolfed

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

Python 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]

在线尝试!

gh,这太长了……不过,不知道如何再缩短它。循环索引通常会很有帮助,这次会花费额外的字节。


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

在线尝试!

在昂贵的索引上损失很多,但仍然不错。我不确定我的索引数学是否最佳。从其他答案中窃取了一些逻辑以节省字节。还记住了将一些paren弹出-4字节的优先级。


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)˜»仅完成了一半。
魔术章鱼缸
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.