กองล้นมากเกินไป


47

(ได้รับแรงบันดาลใจจากคำถามนี้ )

วัตถุประสงค์

งานของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นเพื่อพิมพ์โลโก้ ASC Overflow ของ Stack Overflow ไปที่ STDOUT

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

โปรแกรมของคุณควรใช้สองอินพุตเรียกที่นี่ว่า H และ N ความสูงของสแต็ก "คอนเทนเนอร์" (วงเล็บ) ถูกกำหนดโดย H จำนวนของไอเท็มในสแต็กจะถูกกำหนดโดย N หาก N> H สแต็คจะ "ล้น"

Input / Output

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> ชั่วโมง :)
แดเนียลเอ็ม

ฉันหมายถึงฉันสามารถสร้างโปรแกรมที่ล้มเหลวจากการล้นสแต็กได้หรือไม่?
dorukayhan

@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

JavaScript (ES6), 105 102 ไบต์

@Edit: บันทึกแล้ว 3 ไบต์ขอบคุณ @PatrickRoberts

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ละเว้นตัวห้อยเชิงลบหรือไม่ แต่ฉันไม่สามารถใช้เคล็ดลับอื่น ๆ ของคุณได้เนื่องจากตัวห้อยสตริงเป็นสตริงดังนั้นบูลีนจึงไม่ดีพอ
Neil

อึฉันลืมเกี่ยวกับเรื่องนั้นจุดที่ดี
แพทริคโรเบิร์ต

การใช้เทมเพลตที่ติดแท็กอย่างชาญฉลาดจริงๆเพื่อประหยัดอักขระสองตัวนี้!
Benjamin Gruenbaum

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

สิ่งนี้ย้ายจำนวนการทำซ้ำลงในสตริงแม่แบบและใช้ regexp และแทนที่เพื่อฉีดกลุ่มการทำซ้ำ น่าเสียดายที่ลายเซ็นของ.replace()ยาวเกินไป


ฉันได้รับข้อผิดพลาด ... ?
Addison Crump

1
@VTCAKAVSMoACE เบราว์เซอร์ของคุณต้องรองรับไวยากรณ์ ES6 มันใช้งานได้ดีสำหรับฉัน รู้สึกอิสระที่จะวางการทดสอบลงใน Babel
Patrick Roberts

@VTCAKAVSMoACE Chrome 52 (เป็นเบต้า ณ เดือนมิถุนายน 2559) รองรับ ES6 และ ES7 ทั้งหมดยกเว้นการเพิ่มประสิทธิภาพการโทรหางและการโหลดโมดูล
gcampbell

10

C ++ 14 (ฟังก์ชันแลมบ์ดา), 196

บันทึก 1 ไบต์ขอบคุณ Quentin

บันทึก 2 ไบต์ด้วย 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';}

ฟังก์ชันใช้เวลา 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

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สำหรับการโกน 7 ไบต์จาก 87 ไบต์

เป็นต้นฉบับ

(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

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 และการเรียกร้องให้.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

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

คุณสามารถบันทึกไบต์โดยใช้แลมบ์ดา
Daniel M.

2
ฉันต้องใช้ IDE ที่กำหนดเองเพื่อรวบรวมโค้ดJava ที่ไม่ได้ใช้งานหรือไม่ : D
Kimmax

@Kimmax .. D'oh!
Khaled.K

3

Excel, 131 ไบต์

ป้อนข้อมูลนำมาเป็นอันดับที่สูงHในA1, ในN 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-tuple จากA1และB1เพิ่มบันทึกย่อที่ต้องใช้เซลล์การโทรเพื่อให้ตัวเลือกการตัดข้อความเป็นจริง อาจเป็นไปได้ว่าการจัดตำแหน่งที่เหมาะสมนั้นควรมีแบบอักษรแบบเว้นระยะเช่น Courier New หรือ Lucidia Console
Taylor Scott

1
ขอบคุณ @TaylorScott อัปเดตคำตอบพร้อมคำแนะนำของคุณ
Wernisch

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

ฉันต้องการเพิ่มส่วนเกินด้านข้างลงในรายการความเข้าใจ แต่ฉันไม่สามารถบีบมันได้ดังนั้นฉันจึงต้องไปพร้อมกับลูปในขณะนั้น บันทึก 13 ไบต์!


เอาต์พุตปิดอยู่คุณอาจต้องเปลี่ยนการ'\|/'[:max(0,n-h)]เป็นโซลูชั่น Python 2
busfault


1

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

ลองออนไลน์!

เสียมากในการจัดทำดัชนีราคาแพง แต่ก็ยังดี - ish ฉันไม่แน่ใจว่าคณิตศาสตร์ดัชนีของฉันนั้นเหมาะสมที่สุด ขโมยตรรกะบางอย่างจากคำตอบอื่น ๆ เพื่อบันทึกไบต์ ยังจำความสำคัญที่จะปรากฏ parens บางส่วนสำหรับ -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)˜»และนั่นทำเพียงครึ่งเดียว
Magic Octopus Urn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.