スタックオーバーフロー


47

この質問に触発された)

目的

あなたの仕事は、スタックオーバーフローロゴのASCIIバージョンをSTDOUTに印刷するプログラムまたは関数を書くことです。

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

プログラムは、ここでHおよびNと呼ばれる2つの入力を受け取る必要があります。スタックの「コンテナー」の高さ(括弧)はHによって決定されます。スタック内のアイテムの数はNによって決定されます。スタックは「オーバーフロー」します。

入出力

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

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

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

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

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


4
ロゴを印刷する代わりに、実際にスタックをオーバーフローさせる競合しないプログラムを投稿できますか?
ドルカハンはモニカを

@dorukayhan n> hのときにのみオーバーフローする場合:)
ダニエルM.

つまり、スタックオーバーフローからクラッシュするプログラムを作成できますか?
ドルカハンはモニカを

@dorukayhanスタック以上の項目がある場合、それがクラッシュした場合にのみ保持することができる
ダニエルM.

回答:


14

Pyth、43 41 40バイト

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

オンラインでお試しください。 テストスイート。

最初のパス、迅速かつ汚い。としてSTDINに入力しますN\nH

説明

  1. 2番目の入力(高さ)をJJE)に保存し、最初の入力(アイテムの数)から減算します。(-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

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>


で置換substringsubstrて3バイトを保存し、置換i+n<h?' ':'-''- '[i+n<h]て2バイトを保存し、置換i+h+3<n?'-':''' -'[i+h+3<n]て1バイトを保存できます。それはあなたを100歳未満にさせるでしょう
パトリックロバーツ

@PatrickRoberts substr負の添え字を無視したかどうかは思い出せませんが、文字列の添え字は文字列であるため、他のヒントは使用できません。したがって、ブール値では十分ではありません。
ニール

私はそれを忘れてしまった、良い点
パトリックロバーツ

これらの2つのキャラクターを保存するために、タグ付きテンプレートを本当に巧妙に使用します!
ベンジャミングリュンバウム

@BenjaminGruenbaum「タグ付きテンプレート」とは何ですか?
パトリックロバーツ

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()は長すぎます。


エラーが発生します...?
アディソンクランプ

1
@VTCAKAVSMoACEは、ブラウザがES6構文をサポートする必要があります。それは私のためにうまく機能します。テストをBabelに自由に貼り付けてください
パトリックロバーツ

@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;バイト数に意味はありません。
アレクサンドル・レボ

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)

再帰を使用して、ボトムアップで出力文字列を作成します。

編集: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-
キムマックス

1
@Kimmaxおかげで仲間、誰もコンソールをいじりたくありません
ジョージリース

少なくとも試してみたところ、スタックはかなり大きく、通常の再帰では78バイトしかありませんでした。
ニール

スニペットコンソールが表示さSyntaxErrorれます。
ArtOfCode

1
@ArtOfCode ES6準拠のブラウザーを使用する必要があります
ジョージリース

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ます。

編集

  • 正規表現との呼び出しを削除して.replaceg()代わりにインデックスを直接移動しました。
  • 誤っf=て2番目のバイトカウントにカウントした

テスト

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バイト

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

ラムダを使用することでバイトを節約できます
ダニエルM.

2
Ungoled Javaコードをコンパイルするには、カスタムIDEが必要ですか?:D
キムマックス

@Kimmax .. D'oh!
-Khaled.K

3

Excel、131バイト

タプルとしての入力、Height 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))

素晴らしい解決策!あなたはから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

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ソリューションのように変更する必要があります。
バスフォール


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バイトのいくつかの括弧をポップする優先順位を記憶しました。


0

05AB1E、45 バイト

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

間違いなくゴルフができます。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

-                # 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)˜»それは半分だけです。
魔法のタコ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.