Taşan yığın


47

( Bu sorudan ilham aldı )

Amaç

Göreviniz, Yığın Taşması logosunun ASCII sürümünü STDOUT'a yazdırmak için bir program veya işlev yazmaktır.

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

Programınız burada H ve N olarak adlandırılan iki girdi almalıdır. "Container" (parantez) yığınının yüksekliği H ile belirlenir. yığın "taşacak".

Giriş çıkış

H konteynerlerin yüksekliğini belirleyecektir

Örneğin:

H = 1:

( )

H = 2:

( )
( )

H = 3:

( )
( )
( )

H her zaman en az 1 olacak

N yığında kaç tane öğe olduğunu belirleyecektir. Aşağıdaki örneklerin tümü H = 2'dir:

K = 0

( )
( )

N = 1

( )
(-)

N = 2

(-)
(-)

N = 3

 \
(-)
(-)

K = 4

 \|
(-)
(-)

K = 5

 \|/
(-)
(-)

N = 6

 \|/
(-)-
(-)

N = 7

 \|/
(-)-
(-)-

N hiçbir zaman daha fazla olmayacak 2H+3(Başka bir deyişle, yığın asla yerden geçmeyecek).

kurallar

  • Standart Loopholes yok.
  • Programınız herhangi bir hata üretmemelidir.
  • Tüm test durumları geçmelidir.
  • H ve N'yi istediğiniz şekilde girebilirsiniz.
  • Dilinizde bunun için bir yerleşik olduğundan şüpheliyim.
  • Her satır isteğe bağlı olarak sonunda bir boşluk bırakabilir. N <= H'nin isteğe bağlı olduğu yığının yukarısındaki boş satır, izleyen satırsonunda olduğu gibi.
  • Bu , bayt cinsinden en kısa kod kazanır!

Test Kılıfları

Giriş / Çıkış bölümündeki H = 2 test durumunun tümüne ek olarak, aşağıdaki test durumlarının tümü geçmelidir:

H = 1, N = 1

(-)

H = 1, N = 5

 \|/
(-)-

H = 4, N = 7

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

H = 5, N = 0

( )
( )
( )
( )
( )

Liderler

Burada hem düzenli bir lider tablosu hem de kazananların dile göre genel bir bakış oluşturması için bir Stack Snippet'i var.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

# Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğundan veya tercüman bayrağı cezalarını ayrı ayrı listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını, daha sonra büyük afiş snippet'inde görünecek bir bağlantı da yapabilirsiniz:

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


4
Logoyu basmak yerine yığından taşan rekabet dışı bir program gönderebilir miyim?
dorukayhan

@dorukayhan Yalnızca n> h :) olduğunda taşarsa
Daniel M.

Yığın taşması nedeniyle çöken bir program yapabilir miyim?
dorukayhan

@dorukayhan sadece yığının tutabileceğinden daha fazla eşya olduğunda çökerse
Daniel M.

Yanıtlar:


14

Pyth, 43 41 40 bayt

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

Çevrimiçi deneyin. Test odası.

İlk geçiş, hızlı ve kirli. STDIN olarak giriş yapın N\nH.

açıklama

  1. İkinci girişi (yükseklik) 'e J( JE) kaydedin ve ilk girişten (öğe sayısı) çıkarın. ( -QJE)
  2. Farkı (taşan öğe sayısı) olarak kaydedin K. ( K-QJE)
  3. Numaraya 1 ekleyin. ( hK-QJE)
  4. Al max(0, previous). Negatif sayılar bir sonraki adımı atacağından bu gereklidir. ( g#0hK-QJE)
  5. " \|/"İlk çizgiyi almak ve yazdırmak için dizedeki birçok harften yararlanın. ( <" \|/"g#0hK-QJE)
  6. Döngü Nüzerinden range(0, J). ( VJ) Her Nbaskı için aşağıdakilerin birleştirilmesi: ( s[)
    • "("( \()
    • " "Aksi takdirde N+1, yığında ( <N_K) en az boş alan varsa "-". ( ?<N_Kd\-)
    • ")"( \))
    • "-"N+4yığınında ( <N-K3) en az taşan parçalar varsa , ""aksi halde. ( *<N-K3\-)

13

JavaScript (ES6), 105 102 bayt

@Edit: @PatrickRoberts sayesinde 3 bayt kaydedildi.

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>


Sen yerini alabilir substringile substr3 bayt kaydetmek ve değiştirmek i+n<h?' ':'-'ile '- '[i+n<h]kaydet 2 byte ve değiştirme i+h+3<n?'-':''ile ' -'[i+h+3<n]1 byte kaydedin. Bu sizi 100'ün altında
Patrick Roberts

@PatrickRoberts substrNegatif aboneleri görmezden gelip gelmediğini hatırlayamadım , ancak dize aboneleri dizeler olduğu için diğer ipuçlarını kullanamıyorum, bu nedenle booleanlar yeterince iyi değil.
Neil

Bu konuda unuttum, iyi bir nokta
Patrick Roberts

Bu iki karakteri kaydetmek için etiketli şablonun gerçekten zekice kullanılması!
Benjamin Gruenbaum

@BenjaminGruenbaum "etiketli şablon" nedir?
Patrick Roberts,

12

JavaScript (ES6), 126 122 112 bayt

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)

Ölçek

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

Alternatif Test (tarayıcınız ES6'yı desteklemiyorsa)

Babeljs.io'daki teste bakın ve "değerlendir" i işaretleyin.

136 byte'da ilginç alternatif yaklaşım

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

Bu, tekrar miktarlarını şablon dizgisine taşır ve yinelenen gruplara enjekte etmek için bir regexp ve replasmanı kullanır. Maalesef imzası .replace()çok uzun.


Bir hata alıyorum ...?
Addison Crump,

1
@VTCAKAVSMoACE tarayıcınız ES6 sözdizimini desteklemelidir. Benim için iyi çalışıyor. Testi Babel'e yapıştırmaktan çekinmeyin .
Patrick Roberts

@VTCAKAVSMoACE Chrome 52 (Haziran 2016 itibariyle beta sürümünde), kuyruk çağrısı optimizasyonu ve modül yükleme hariç tüm ES6 ve ES7'yi destekler.
gcampbell

10

C ++ 14 (lambda işlevi), 196

Quentin sayesinde 1 byte kurtarıldı.

Adam Martin sayesinde 2 bayt kaydedildi.

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

İşlev, 157 bayt alır.

Burada çalışırken görün .

Ungolfed versiyonu:

[](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
Cevabınız tam bir program değilse (ki değil) includes ve using namespace std;bayt sayısı dahil hiçbir anlamı göremiyorum .
Alexander Revo,

9

CJam, 57 bayt

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

Burada test et.

Kesinlikle bazı iyileştirmeler kullanabilirdi. Fikir, -\|/-hücrelerin ardışık tamsayılarla değiştirildiği bir ızgara oluşturmaktır;

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

Ve sonra onları sonunda doğru karakterlerle (potansiyel boşluklar) değiştirmek için.


6

Python 2, 101 100 98 bayt

def f(h,n):
 print" \|/"[:max(0,n-h+1)]
 for i in range(h):print("(-)","( )")[h-i>n]+"-"*(n>i+h+3)

print
Sonradan

@Cyoce Teşekkürler, bu 2 karakter kazandırır.
Chuck Morris,

4

JavaScript (ES6), 87 80 bayt

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

Çıkış dizesini aşağıdan yukarıya oluşturmak için özyineleme kullanır.

EDIT : 87 bayttan 7 baytlık tıraş için @Neil'e teşekkürler

orijinal

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

Test pasajı:

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>


güzel snippet için teşekkürler! Fazladan puan vermeliyim: P
Kimmax

1
@Kimmax Teşekkürler dostum, kimse konsolla uğraşmak istemiyor
George Reith

En azından denedim, yığın oldukça büyüktü ve sıradan özyinelemeli sadece 78 bayt olurdu.
Neil

Pasaj konsolu SyntaxErrorbenim için bir gösteriyor .
ArtOfCode

1
@ArtOfCode ES6 uyumlu bir tarayıcı kullanmanız gerekiyor
George Reith

3

JavaScript (ES6), 149 139 137 bayt

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'in -\|/karakterleri indeksleme konusundaki fikrini beğendim ve ES6'da nasıl çalışacağını görmek istedim. Anlaşılan o kadar iyi yapmadım. Bu kullanarak geliştirilebilir olup olmadığını anlamaya çalışıyorum for...of.

Düzenlemeler

  • Regexp ve çağrıyı kaldırmayı başardım .replace, g()bunun yerine indekslemeyi doğrudan içine aldım .
  • Yanlışlıkla f=ikinci bayt sayımda saydım

Ölçek

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 bayt

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 çevrimiçi deneyin

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

Bir lambda kullanarak baytları kurtarabilirsin - muhtemelen lambda gövdesini bile dışarıda bırakabilirsin
Daniel M.

2
Ungoled Java kodunu derlemek için özel IDE'ye ihtiyacım var mı? : D
Kimmax

@Kimmax .. Düh!
Khaled.K

3

Excel, 131 bayt

Girdi değerleri bir demet, Yükseklik olarak alınan Hyılında A1, Niçinde B1. Formül içeren hücrenin Metin Sarma işleminin açık olması gerekir. Mono aralıklı bir font kullanarak önerin.

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

Harika çözüm! Sen 2-tuple olarak bu almak girişi olduğunu eklemek gerekir A1ve B1bu gerçek olamayacak kadar sarma metin seçeneği çağıran hücreyi gerektirir kadar basit not eklemek. Ayrıca belki de böyle Courier New ya Lucidia Konsolu gibi bir mono-aralıklı yazı tipi olmalıdır düzgün hizalama almak için o
Taylor Scott

1
@TaylorScott'a teşekkürler. Önerilerinizle cevap güncellendi.
Wernisch

2

C ++ 11, 155 148 145 bayt

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

Kullanım :

#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 bayt

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

Burada test edin : https://repl.it/CYL1/0

Un-golfed:

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

Yandan taşmayı listenin kavranışına eklemek isterdim, ancak sıkıştıramadım, bu yüzden while döngüsü ile devam etmek zorunda kaldım. 13 bayt kaydedildi!


Çıktı kapalı, muhtemelen '\|/'[:max(0,n-h)]Python 2 çözümü gibi olmanız gerekiyor.
busfault


1

Pip , 50 bayt

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

Çevrimiçi deneyin!

Ugh, bu çok uzun ... nasıl olsa kısaltacağımı bilmiyorum. Genellikle yararlı olan konjonktürel indeksleme bu sefer ekstra bayt tutar.


1

PowerShell , 109 108 104 bayt

param($n,$h)-join" \|/"[0..(($d=$n-$h),0)[$d-lt0]]
1..$h|%{("( )","(-)")[$h-$_-lt$n]+"-"*($h+$_+2-lt$n)}

Çevrimiçi deneyin!

Pahalı endekslemede çok şey kaybettim ama yine de düzgün. Ancak, endeks matematiğimin optimal olduğundan emin değilim. Bir baytı kaydetmek için diğer cevaplardan bir miktar mantık çaldı. Ayrıca bazı parenleri -4 bayt için patlamasının önceliğini de hatırladım.


0

05AB1E , 45 bayt

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

Kesinlikle golf olabilir .. Şu anki haliyle tbh hakkında bu kadar mutlu değil.

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

-                # 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(-)"

Seni daha iyi hissettirecekse, işte sahip olduklarım: LR'(ì')«¹x‚3+¬UŸ¦ζJ¹XŸJ¦1úr)˜»ve bu sadece yarısı oldu.
Magic Octopus Urn,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.