Stapel läuft über

47

(Inspiriert von dieser Frage )

Zielsetzung

Ihre Aufgabe ist es, ein Programm oder eine Funktion zum Drucken einer ASCII-Version des Stack Overflow-Logos an STDOUT zu schreiben

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

Ihr Programm sollte zwei Eingaben annehmen, die hier als H und N bezeichnet werden. Die Höhe des Stapels "Container" (die Klammern) wird durch H bestimmt. Die Anzahl der Elemente im Stapel wird durch N bestimmt Stapel wird "überlaufen".

Input-Output

H bestimmt die Höhe der Container

Zum Beispiel:

H = 1:

( )

H = 2:

( )
( )

H = 3:

( )
( )
( )

H wird immer mindestens 1 sein

N bestimmt, wie viele Elemente sich im Stapel befinden. Die folgenden Beispiele sind alle H = 2:

N = 0

( )
( )

N = 1

( )
(-)

N = 2

(-)
(-)

N = 3

 \
(-)
(-)

N = 4

 \|
(-)
(-)

N = 5

 \|/
(-)
(-)

N = 6

 \|/
(-)-
(-)

N = 7

 \|/
(-)-
(-)-

N wird niemals größer sein als 2H+3(mit anderen Worten, der Stapel wird niemals durch den Boden gehen).

Regeln

  • Keine Standardlücken.
  • Ihr Programm darf keine Fehler erzeugen.
  • Alle Testfälle müssen bestanden werden.
  • Sie können H und N nach Belieben eingeben.
  • Ich bezweifle ernsthaft, dass Ihre Sprache eine eingebaute dafür hat.
  • Jede Zeile kann optional ein zusätzliches Leerzeichen am Ende enthalten. Eine leere Zeile oberhalb eines Stapels, wobei N <= H optional ist, sowie eine nachgestellte Zeile.
  • Das ist , also gewinnt der kürzeste Code in Bytes!

Testfälle

Zusätzlich zu allen H = 2-Testfällen aus dem Bereich Eingabe / Ausgabe müssen alle folgenden Testfälle bestanden werden:

H = 1, N = 1

(-)

H = 1, N = 5

 \|/
(-)-

H = 4, N = 7

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

H = 5, N = 0

( )
( )
( )
( )
( )

Bestenlisten

Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

# Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

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

Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

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

Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:

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

Daniel M.
quelle
4
Darf ich ein nicht konkurrierendes Programm veröffentlichen, das den Stapel tatsächlich überläuft, anstatt das Logo zu drucken?
Dorukayhan
@ Dorukayhan Wenn es nur überläuft, wenn n> h :)
Daniel M.
Darf ich ein Programm erstellen, das nach einem Stapelüberlauf abstürzt?
Dorukayhan
@ Dorukayhan nur, wenn es abstürzt, wenn es mehr Elemente als der Stapel halten kann
Daniel M.

Antworten:

14

Pyth, 43 41 40 Bytes

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

Probieren Sie es online aus. Testsuite.

Erster Durchgang, schnell und dreckig. Eingabe in STDIN als N\nH.

Erläuterung

  1. Speichern Sie die zweite Eingabe (Höhe) bis J( JE) und subtrahieren Sie sie von der ersten Eingabe (Anzahl der Elemente). ( -QJE)
  2. Speichern Sie die Differenz (Anzahl der überlaufenden Artikel) zu K. ( K-QJE)
  3. Addiere 1 zu der Zahl. ( hK-QJE)
  4. Nehmen max(0, previous). Dies ist erforderlich, da negative Zahlen den nächsten Schritt unterbrechen würden. ( g#0hK-QJE)
  5. Nehmen Sie höchstens so viele Buchstaben aus der Zeichenfolge " \|/", um die erste Zeile zu erhalten und zu drucken. ( <" \|/"g#0hK-QJE)
  6. Schleife Nüber range(0, J). ( VJ) Für jeden NDruck die Verkettung von Folgendem: ( s[)
    • "("( \()
    • " "wenn es mindestens N+1freie Plätze im Stack gibt ( <N_K), "-"sonst. ( ?<N_Kd\-)
    • ")"( \))
    • "-"wenn sich mindestens N+4überlaufende Teile im Stapel befinden ( <N-K3), ""andernfalls. ( *<N-K3\-)
PurkkaKoodari
quelle
13

JavaScript (ES6), 105 bis 102 Byte

@Edit: 3 Bytes dank @PatrickRoberts gespeichert.

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>

Neil
quelle
Sie können ersetzen substringmit substr3 Bytes zu speichern, und ersetzt i+n<h?' ':'-'mit '- '[i+n<h]zu speichern 2 Bytes und ersetzen i+h+3<n?'-':''mit ' -'[i+h+3<n]1 Byte zu speichern. Das bringt dich unter 100
Patrick Roberts
@PatrickRoberts Ich konnte mich nicht erinnern, ob substrnegative Indizes ignoriert wurden oder nicht, aber ich kann Ihre anderen Tipps nicht verwenden, da Zeichenfolgen-Indizes Zeichenfolgen sind, also sind Boolesche Werte nicht gut genug.
Neil
Mist, das habe ich vergessen, guter Punkt
Patrick Roberts
Wirklich kluger Gebrauch der getaggten Vorlage, um diese beiden Zeichen zu speichern!
Benjamin Gruenbaum
@BenjaminGruenbaum was ist eine "tagged template"?
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)

Prüfung

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

Alternativer Test (falls Ihr Browser ES6 nicht unterstützt)

Sehen Sie den Test auf Babeljs.io und überprüfen Sie "auswerten".

Interessante Alternative bei 136 Bytes

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

Dadurch werden die Wiederholungsbeträge in die Vorlagenzeichenfolge verschoben, und es werden reguläre Ausdrücke und Ersetzungen zum Einfügen der sich wiederholenden Gruppen verwendet. Leider ist die Signatur dafür .replace()einfach zu lang.

Patrick Roberts
quelle
Ich bekomme eine Fehlermeldung ...?
Addison Crump
1
@VTCAKAVSMoACE Ihr Browser muss die ES6-Syntax unterstützen. Es funktioniert gut für mich. Fühlen Sie sich frei, den Test in Babel einzufügen .
Patrick Roberts
@VTCAKAVSMoACE Chrome 52 (in der Beta-Version ab Juni 2016) unterstützt alle ES6- und ES7-Versionen, mit Ausnahme der Tail-Call-Optimierung und des Ladens von Modulen.
Gcampbell
10

C ++ 14 (Lambda-Funktion), 196

Dank Quentin 1 Byte gespeichert.

2 Bytes gespart dank 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';}

Die Funktion selbst benötigt 157 Bytes.

Sehen sie in Aktion hier .

Ungolfed-Version:

[](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';
    }
};
Vaultah
quelle
2
Ich sehe keinen Sinn darin, includes und die using namespace std;Byteanzahl einzuschließen, es sei denn, Ihre Antwort ist ein vollständiges Programm (was es nicht ist).
Alexander Revo
9

CJam, 57 Bytes

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

Teste es hier.

Könnte definitiv eine Verbesserung gebrauchen. Die Idee ist, ein Gitter aufzubauen, in dem die -\|/-Zellen durch aufeinanderfolgende ganze Zahlen ersetzt werden, z

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

Und dann, um sie am Ende durch die richtigen Zeichen (möglicherweise Leerzeichen) zu ersetzen.

Martin Ender
quelle
6

Python 2, 101 100 98 Bytes

def f(h,n):
 print" \|/"[:max(0,n-h+1)]
 for i in range(h):print("(-)","( )")[h-i>n]+"-"*(n>i+h+3)
Chuck Morris
quelle
Leerzeichen nach printsind nicht
erforderlich
@Cyoce Danke, das spart 2 Zeichen.
Chuck Morris
4

JavaScript (ES6), 87 bis 80 Byte

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

Verwendet die Rekursion, um die Ausgabezeichenfolge von unten nach oben zu erstellen.

EDIT : Dank @Neil zum Rasieren 7 Bytes aus 87 Bytes aus

Original

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

Testschnipsel:

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>

George Reith
quelle
danke für den netten schnipsel! Sollte einen zusätzlichen Punkt geben: P
Kimmax
1
@Kimmax Danke Kumpel, niemand möchte mit der Konsole herumspielen
George Reith
Zumindest als ich es versuchte, war der Stapel ziemlich groß und es wären nur 78 Bytes mit gewöhnlicher Rekursion.
Neil
Die Snippet-Konsole zeigt eine SyntaxErrorfür mich.
ArtOfCode
1
@ArtOfCode Benötigt einen ES6-kompatiblen Browser
George Reith
3

JavaScript (ES6), 149 139 137 Bytes

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

Ich mochte die Idee von @ MartinEnder, die -\|/Zeichen zu indizieren , und ich wollte sehen, wie es sich in ES6 entwickeln würde. Anscheinend habe ich es nicht so gut gemacht. Versuche herauszufinden, ob dies mit verbessert werden könnte for...of.

Bearbeitungen

  • Ich habe es geschafft, reguläre Ausdrücke und den Aufruf von zu entfernen und stattdessen .replacedie Indizierung direkt in g()zu verschieben.
  • Ich habe versehentlich f=in der zweiten Byteanzahl gezählt

Prüfung

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

Patrick Roberts
quelle
3

Java, 186 177 Bytes

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 online versuchen

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;
}
Khaled.K
quelle
Sie können Bytes sparen, indem Sie ein Lambda verwenden - Sie können wahrscheinlich sogar den Lambda-Körper weglassen
Daniel M.
2
Benötige ich eine benutzerdefinierte IDE, um nicht gelöschten Java- Code zu kompilieren ? : D
Kimmax
@ Kimmax .. D'oh!
Khaled.K
3

Excel, 131 Bytes

Eingabe als Tupel, Höhe Hin A1, Nin B1. Für Zellen mit Formeln muss der Textumbruch aktiviert sein. Schlagen Sie die Verwendung einer Mono-Spaced-Schriftart vor.

=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))
Wernisch
quelle
Wunderbare Lösung! Sie sollten hinzufügen, dass dies Eingaben als 2-Tupel von A1und annimmt, und B1die einfache Anmerkung hinzufügen, dass dies erfordert, dass die aufrufende Zelle die Option zum Umbrechen von Text aufweist, um wahr zu sein. Um die richtige Ausrichtung zu erreichen, sollte die Schrift auch in einem einzigen Abstand angeordnet sein, z. B. Courier New oder Lucidia Console
Taylor Scott,
1
Vielen Dank an TaylorScott. Aktualisierte Antwort mit Ihren Vorschlägen.
Wernisch,
2

C ++ 11, 155 148 145 Bytes

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

Verwendung :

#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);
}
Alexander Revo
quelle
137 Bytes
Ceilingcat
1

Python 3, 134 121 118 111 Bytes

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

Testen Sie es hier: https://repl.it/CYL1/0

Nicht golfen:

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

Ich hätte den Seitenüberlauf gerne zum Listenverständnis hinzugefügt, konnte ihn aber nicht einklemmen, also musste ich mit der while-Schleife fortfahren. 13 Bytes gespart!

Atlasologe
quelle
Die Ausgabe ist ausgeschaltet, Sie müssen wahrscheinlich die ändern '\|/'[:max(0,n-h)], um wie die Python 2-Lösung zu sein.
Busfehler
1

Pip , 50 Bytes

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

Probieren Sie es online!

Ach, das ist zu lang ... ich weiß aber nicht, wie ich es noch kürzen soll. Die in der Regel hilfreiche zyklische Indizierung kostet diesmal zusätzliche Bytes.

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

Probieren Sie es online!

Hat viel an teurer Indexierung verloren, ist aber immer noch anständig. Ich bin mir jedoch nicht sicher, ob meine Indexberechnung optimal ist. Stahl eine Logik aus den anderen Antworten, um ein Byte zu speichern. Es wurde auch an den Vorrang erinnert, einige Parens für -4 Bytes zu platzieren.

Veskah
quelle
0

05AB1E , 45 Bytes

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

Kann auf jeden Fall golfen werden .. Nicht allzu glücklich darüber in seiner jetzigen Form tbh.

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

-                # 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(-)"
Kevin Cruijssen
quelle
Wenn du dich besser fühlst, habe ich das getan: LR'(ì')«¹x‚3+¬UŸ¦ζJ¹XŸJ¦1úr)˜»und das ist nur zur Hälfte erledigt.
Magic Octopus Urn