Stack Overflow

47

(Terinspirasi oleh pertanyaan ini )

Objektif

Tugas Anda adalah menulis program atau fungsi untuk mencetak versi ASCII dari logo Stack Overflow ke STDOUT

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

Program Anda harus mengambil dua input, disebut di sini sebagai H dan N. Ketinggian tumpukan "wadah" (tanda kurung) ditentukan oleh H. Jumlah item dalam tumpukan ditentukan oleh N. Jika N> H, tumpukan akan "meluap".

Input output

H akan menentukan ketinggian wadah

Sebagai contoh:

H = 1:

( )

H = 2:

( )
( )

H = 3:

( )
( )
( )

H akan selalu setidaknya 1

N akan menentukan berapa banyak item dalam tumpukan. Contoh-contoh berikut semuanya adalah H = 2:

N = 0

( )
( )

N = 1

( )
(-)

N = 2

(-)
(-)

N = 3

 \
(-)
(-)

N = 4

 \|
(-)
(-)

N = 5

 \|/
(-)
(-)

N = 6

 \|/
(-)-
(-)

N = 7

 \|/
(-)-
(-)-

N tidak akan pernah lebih dari 2H+3(Dengan kata lain, tumpukan tidak akan pernah melewati tanah).

Aturan

  • Tidak Ada Celah Standar.
  • Program Anda tidak boleh menghasilkan kesalahan.
  • Semua test case harus lulus.
  • Anda dapat memasukkan H dan N dengan cara apa pun yang Anda inginkan.
  • Saya sangat ragu bahwa bahasa Anda memiliki built-in untuk ini.
  • Setiap baris secara opsional memiliki ruang tambahan di bagian akhir. Baris kosong di atas tumpukan di mana N <= H adalah opsional, seperti juga baris tambahan.
  • Ini adalah , jadi kode terpendek dalam byte menang!

Uji Kasus

Selain semua kasus uji H = 2 dari bagian Input / Output, semua kasus uji berikut harus lulus:

H = 1, N = 1

(-)

H = 1, N = 5

 \|/
(-)-

H = 4, N = 7

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

H = 5, N = 0

( )
( )
( )
( )
( )

Papan peringkat

Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Misalnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:

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

Daniel M.
sumber
4
Bolehkah saya memposting program yang tidak bersaing yang sebenarnya melebihi tumpukan alih-alih mencetak logo?
dorukayhan ingin Monica kembali pada
@dorukayhan Jika hanya meluap ketika n> h :)
Daniel M.
Maksud saya, bolehkah saya membuat program yang macet karena stack overflow?
dorukayhan ingin Monica kembali
@dorukayhan hanya jika crash ketika ada lebih banyak item daripada yang bisa ditumpuk oleh stack
Daniel M.

Jawaban:

14

Pyth, 43 41 40 byte

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

Cobalah online. Suite uji.

Lulus pertama, cepat dan kotor. Masukkan ke STDIN sebagai N\nH.

Penjelasan

  1. Simpan input kedua (tinggi) ke J( JE), dan kurangi dari input pertama (jumlah item). ( -QJE)
  2. Simpan perbedaan (jumlah item melimpah) ke K. ( K-QJE)
  3. Tambahkan 1 ke nomor. ( hK-QJE)
  4. Ambil max(0, previous). Ini diperlukan karena angka negatif akan mematahkan langkah berikutnya. ( g#0hK-QJE)
  5. Ambil paling banyak surat dari string " \|/"untuk mendapatkan baris pertama dan cetak. ( <" \|/"g#0hK-QJE)
  6. Lingkaran Nlebih range(0, J). ( VJ) Untuk masing-masing Ncetak rangkai sebagai berikut: ( s[)
    • "("( \()
    • " "jika setidaknya ada N+1ruang kosong di stack ( <N_K), "-"jika tidak. ( ?<N_Kd\-)
    • ")"( \))
    • "-"jika ada setidaknya N+4potongan meluap di stack ( <N-K3), ""jika tidak. ( *<N-K3\-)
PurkkaKoodari
sumber
13

JavaScript (ES6), 105 102 byte

@ Edit: Disimpan 3 byte berkat @ Patrickrickoberts.

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
sumber
Anda dapat mengganti substringdengan substruntuk menyimpan 3 byte, dan ganti i+n<h?' ':'-'dengan '- '[i+n<h]untuk menyimpan 2 byte dan ganti i+h+3<n?'-':''dengan ' -'[i+h+3<n]untuk menyimpan 1 byte. Itu akan membuat Anda di bawah 100
Patrick Roberts
@ PatrickRoberts Saya tidak bisa mengingat apakah substrmengabaikan subscript negatif atau tidak, tetapi saya tidak bisa menggunakan tips Anda yang lain karena subscript string adalah string, jadi boolean tidak cukup baik.
Neil
omong kosong saya lupa tentang itu, poin bagus
Patrick Roberts
Penggunaan tagged tag yang benar-benar pintar untuk menyelamatkan kedua karakter itu!
Benjamin Gruenbaum
@BenjaminGruenbaum apa itu "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)

Uji

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

Tes Alternatif (jika browser Anda tidak mendukung ES6)

Lihat tes pada Babeljs.io dan periksa "evaluasi".

Pendekatan alternatif yang menarik pada 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))

Ini memindahkan jumlah pengulangan ke string template dan menggunakan regexp dan ganti untuk menyuntikkan grup berulang. Sayangnya tanda tangannya .replace()terlalu lama.

Patrick Roberts
sumber
Saya mendapatkan kesalahan ...?
Addison Crump
1
@VTCAKAVSMoACE browser Anda harus mendukung sintaks ES6. Ini bekerja dengan baik untuk saya. Jangan ragu untuk menempelkan tes ke Babel .
Patrick Roberts
@VTCAKAVSMoACE Chrome 52 (dalam versi beta per Juni 2016) mendukung semua ES6 dan ES7 kecuali pengoptimalan panggilan ekor dan pemuatan modul.
gcampbell
10

C ++ 14 (fungsi lambda), 196

Disimpan 1 byte berkat Quentin.

Disimpan 2 byte berkat 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';}

Fungsi itu sendiri membutuhkan 157 byte.

Lihat beraksi di sini .

Versi tidak disatukan:

[](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';
    }
};
kubah
sumber
2
Saya tidak melihat gunanya termasuk includes dan using namespace std;dalam hitungan byte, kecuali jawaban Anda adalah program yang lengkap (yang bukan).
Alexander Revo
9

CJam, 57 byte

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

Uji di sini.

Pasti bisa menggunakan beberapa perbaikan. Idenya adalah untuk membangun kotak di mana -\|/-sel-sel diganti dengan bilangan bulat berturut-turut, misalnya

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

Dan kemudian untuk menggantinya dengan karakter yang benar (berpotensi spasi) di akhir.

Martin Ender
sumber
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)
Chuck Morris
sumber
Spasi setelah printtidak perlu
Cyoce
@Cyoce Terima kasih, itu menghemat 2 karakter.
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)

Menggunakan rekursi untuk membuat string keluaran dari bawah ke atas.

EDIT : Terima kasih kepada @Neil untuk mencukur 7 byte dari 87 byte

Asli

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

Cuplikan uji:

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
sumber
terima kasih untuk cuplikan yang bagus! Harus memberikan poin tambahan: P
Kimmax
1
@Kimmax Terima kasih sobat, tidak ada yang mau mengotak-atik konsol
George Reith
Setidaknya ketika saya mencoba, tumpukan itu cukup besar, dan itu hanya akan menjadi 78 byte dengan rekursi biasa.
Neil
Konsol cuplikan menunjukkan SyntaxErroruntuk saya.
ArtOfCode
1
@ArtOfCode Perlu menggunakan browser yang sesuai dengan 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``}`

Saya menyukai ide @ MartinEnder tentang pengindeksan -\|/karakter dan saya ingin melihat bagaimana hal itu terjadi di ES6. Tampaknya saya tidak melakukannya dengan baik. Mencoba mencari tahu apakah ini dapat ditingkatkan menggunakan for...of.

Suntingan

  • Saya berhasil menghapus regexp dan panggilan untuk .replace, memindahkan pengindeksan langsung ke g()gantinya.
  • Saya tidak sengaja menghitung f=dalam byte kedua

Uji

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

Tidak dicoba coba online

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
sumber
Anda dapat menyimpan byte dengan menggunakan lambda - Anda mungkin bahkan dapat meninggalkan tubuh lambda
Daniel M.
2
Apakah saya memerlukan IDE khusus untuk mengkompilasi kode Java Ungoled ? : D
Kimmax
@ Kimmax .. Doh!
Khaled.K
3

Excel, 131 byte

Input diambil sebagai tuple, Height Hin A1, Nin B1. Formula yang berisi sel harus mengaktifkan Pembungkus Teks. Sarankan menggunakan font spasi-Mono.

=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
sumber
Solusi luar biasa! Anda harus menambahkan bahwa ini mengambil input sebagai 2-tupel dari A1dan B1dan menambahkan catatan sederhana bahwa ini memang membutuhkan sel panggilan untuk memiliki opsi teks pembungkus untuk menjadi kenyataan. Mungkin juga untuk mendapatkan keselarasan yang tepat itu harus memiliki font satu spasi seperti Courier New atau Lucidia Console
Taylor Scott
1
Terima kasih @TaylorScott. Jawaban diperbarui dengan saran Anda.
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");}

Tidak Disatukan :

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

Penggunaan :

#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
sumber
137 bytes
ceilingcat
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)))

Uji di sini: https://repl.it/CYL1/0

Tidak golf:

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

Saya ingin menambahkan side overflow ke daftar pemahaman, tapi saya tidak bisa memerasnya, jadi saya harus pergi dengan loop sementara. Disimpan 13 byte!

ahli atlasologi
sumber
Outputnya mati, Anda mungkin perlu mengubah '\|/'[:max(0,n-h)]menjadi seperti solusi Python 2.
busfault
1

Perl 5 , 91 byte

say((' \|/'=~/./g)[0..-($a=<>)+($b=<>)]);say$b<=$a-$_?'( )':'(-)'.'-'x($b-2>$a+$_)for 1..$a

Cobalah online!

Xcali
sumber
1

Pip , 50 byte

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

Cobalah online!

Ugh, ini terlalu lama ... tidak tahu bagaimana memperpendeknya lagi. Pengindeksan siklis, yang biasanya bermanfaat, menghabiskan byte ekstra kali ini.

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

Cobalah online!

Kehilangan banyak pada pengindeksan mahal tetapi masih layak-ish. Namun saya tidak yakin indeks matematika saya optimal. Mencuri beberapa logika dari jawaban lain untuk menyimpan byte. Juga ingat prioritas untuk membuat beberapa parens untuk -4 byte.

Veskah
sumber
0

05AB1E , 45 byte

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

Pasti bisa main golf .. Tidak terlalu senang dengan tbh saat ini.

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

-                # 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
sumber
Jika itu membuat Anda merasa lebih baik inilah yang saya miliki: LR'(ì')«¹x‚3+¬UŸ¦ζJ¹XŸJ¦1úr)˜»dan itu baru setengah dilakukan.
Magic Octopus Mm