Hayaletler ve Kabaklar


15

İşte Jack-o-Lantern'e oyulmuş bir ASCII balkabağı. Sevimli değil mi?

((^v^))

İşte bir ASCII hayaleti. Bak ne kadar ürkütücü!

\{O.O}/

Açıkçası, kabaklar yerde olmalı, aralarında boşluk olmalı, böylece çürümezler.

Bununla birlikte, hayaletler balkabağının üstünde durmayı severler, bu yüzden onlar bile spookier . Bununla birlikte, iki balkabağının üzerinde durmaları gerekir , aksi takdirde hayalet ağırlıkları altındaki balkabağını ezecektir. Ancak, hayalet sihirlerinin nasıl çalıştığı nedeniyle , hayaletlerin ya alt balkabaklarına ya da alt hayaletlere eşit olarak bölünmesi şartıyla, birden fazla hayalet kabakları istifleyebilir ve paylaşabilir. Başka bir deyişle, bir insan piramidi gibi bir şekil oluşturmak . Altında balkabağı olmadığı sürece hayaletlerin hayaletlerin üzerine istiflenemeyeceğini unutmayın (sihir böyle çalışır).

Negatif olmayan iki tamsayı göz önüne alındığında gve konakçıların ve umpkins psayısını temsil eden, yukarıdaki piramit yığınlama kurallarına uyarak mümkün olan en kompakt en soldaki formasyonu çıkarır. Artık kabaklar ve hayaletler (yani, piramidi oluşturmayanlar) sağa doğru yere gider.gp

Açıklamak için, bu oluşumlar TAMAM (boş satırsonu ayrılmış) ve örnek G / Ç olarak işlev görür:

0p 1g
\{O.O}/

1p 0g
((^v^))

1p 1g
((^v^)) \{O.O}/

2p 1g
    \{O.O}/
((^v^)) ((^v^))

2p 2g
    \{O.O}/
((^v^)) ((^v^)) \{O.O}/

3p 1g
    \{O.O}/
((^v^)) ((^v^)) ((^v^))

3p 2g
    \{O.O}/ \{O.O}/
((^v^)) ((^v^)) ((^v^))

3p 3g
        \{O.O}/
    \{O.O}/ \{O.O}/
((^v^)) ((^v^)) ((^v^))

0p 4g
\{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/

3p 0g
((^v^)) ((^v^)) ((^v^))

7p 6g
            \{O.O}/
        \{O.O}/ \{O.O}/
    \{O.O}/ \{O.O}/ \{O.O}/
((^v^)) ((^v^)) ((^v^)) ((^v^)) ((^v^)) ((^v^)) ((^v^))

Bu oluşumlar iyi değil

\{O.O}/
((^v^))

    \{O.O}/
((^v^))

((^v^)) ((^v^)) \{O.O}/

    \{O.O}/
    \{O.O}/
((^v^)) ((^v^))

            \{O.O}/
\{O.O}/ ((^v^)) ((^v^))

    ((^v^))
((^v^)) ((^v^))

      \{O.O}/
((^v^)) ((^v^))

Giriş

Herhangi bir uygun biçimde iki negatif olmayan tamsayı . Sayılardan en az biri sıfırdan farklı olacaktır. Girişleri her iki sırayla da alabilirsiniz (yani, önce balkabağım olan örneklerde) - lütfen cevabınızda nasıl girdi alacağınızı belirtin.

Çıktı

Yukarıdaki kurallara uyarak hayaletlerin ve kabakların ASCII-sanat temsili. Öncü / sondaki yeni satırlar veya diğer boşluklar, hayaletlerin ve kabakların uygun şekilde hizalanması koşuluyla isteğe bağlıdır.

kurallar

  • Tam bir program veya bir işlev kabul edilebilir. Bir işlev varsa, çıktıyı yazdırmak yerine döndürebilirsiniz.
  • Standart boşluklar yasaktır.
  • Bu bu nedenle her zamanki golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.

7 balkabağı ve 6 hayalet için doğru oluşum nedir?
Neil

@Neil Kurallar en kompakt en soldaki çıktıyı istediğinden, bu 4 balkabağının üstünde 6 hayalet ve sağda 3 balkabağı olan bir piramit olurdu. Örnek olarak ekleyeceğim.
AdmBorkBork

Kompakt kullanımınız beni şaşırttı - tüm hayaletleri aynı sıraya koyabilirim, bu yüzden dikey olarak daha kompakt!
Neil

Kabaklar her zaman hayaletlerden önce sağlanacak mı?
Gabriel Benamy

2
Ben hayaletler ve kabaklar bir insan piramidi yapıyor gibi
MayorMonty

Yanıtlar:


5

JavaScript (ES7), 166 164 159 bayt

Neil sayesinde 5 bayt kurtardı

f=(p,g,j=(g*2)**.5+.5|0,G=j>p-1?p?p-1:0:j,P=`
`,i=~j?g-G*++G/2:G,n=i>0?i>g?g:i:0)=>p|g?f(0,g-n,-1,G-1,P+'    ')+P+'((^v^)) '.repeat(p)+'\\{O.O}/ '.repeat(n):''

Biçimlendirilmiş ve yorumlanmış

f = (                                    // given:
  p,                                     // - p = number of pumpkins
  g,                                     // - g = number of ghosts
  j = (g * 2) ** .5 + .5 | 0,            // - j = ceil(triangular root of g)
  G = j > p - 1 ? p ? p - 1 : 0 : j,     // - G = max(0, min(p - 1, j))
  P = '\n',                              // - P = padding string (+ line-break)
  i = ~j ?                               // - i =
    g - G * ++G / 2                      //   first iteration: g - G * (G + 1) / 2
  : G,                                   //   next iterations: G
  n = i > 0 ? i > g ? g : i : 0          // - n = max(0, min(i, g)) = number of
) =>                                     //   ghosts to print at this iteration
p | g ?                                  // if there's still something to print:
  f(                                     //   do a recursive call with:
    0,                                   //   - no pumpkin anymore
    g - n,                               //   - the updated number of ghosts
    -1,                                  //   - j = -1 (so that ~j == 0)
    G - 1,                               //   - one less ghost on the pyramid row
    P + '    '                           //   - updated padding string
  ) +                                    //   
  P +                                    //   append padding string
  '((^v^)) '.repeat(p) +                 //   append pumpkins
  '\\{O.O}/ '.repeat(n)                  //   append ghosts
: ''                                     // else: stop

Temel matematik

Zor kısım, Ghayalet piramidin optimal genişliğini bulmaktır .

gBöyle bir piramitteki hayalet sayısı şu şekilde verilir:

g = 1 + 2 + 3 + ... + G = G(G + 1) / 2

Karşılıklı olarak, ghayalet içeren bir piramidin genişliği , elde edilen ikinci dereceden denklemin gerçek köküdür:

G² + G - 2g = 0

Δ = 1² - 4(-2g)
Δ = 8g + 1

G = (-1 ± √Δ) / 2

Bu, aşağıdaki gerçek köke ( üçgen kök olarak da bilinir) yol açar :

G = (√(8g + 1) - 1) / 2

Bununla birlikte, piramidin genişliği de kabak sayısı ile sınırlıdır: kabaklar p-1üzerinde hayaletlerden daha fazlasına sahip polmayabiliriz. Bu nedenle kodda kullanılan son formül:

j = ⌈(√(8g + 1) - 1) / 2⌉
G = max(0, min(p - 1, j))

ES6 versiyonu, 173 171 166 bayt

f=(p,g,j=Math.pow(g*2,.5)+.5|0,G=j>p-1?p?p-1:0:j,P=`
`,i=~j?g-G*++G/2:G,n=i>0?i>g?g:i:0)=>p|g?f(0,g-n,-1,G-1,P+'    ')+P+'((^v^)) '.repeat(p)+'\\{O.O}/ '.repeat(n):''

Test senaryoları (ES6)


1
Bence j=(g+g)**.5+.5|0çalışmalı.
Neil

Güzel açıklama!
AdmBorkBork

@Neil Bu daha kısa ve daha güvenilirdir. (Yöntemimin g = 5051'den başlayan bazı geçersiz değerleri vardı.) Teşekkürler.
Arnauld

3

Perl, 246 bayt (yeni satırlar kodun bir parçası değildir ve yalnızca okunabilirlik için sağlanmıştır)

($c,$d)=<>=~/(\d+)/g;
$p="((^v^)) ";$g="\\{O.O}/ ";
for($f[0]=$c;$d>0;$d--){$f[$b+1]+1<$f[$b]?$f[++$b]++:$f[$b]++;$f[0]+=$d,$d=0 if$b==$c-1;$f[$b]==1?$b=0:1}
$h[0]=($p x$c).$g x($f[0]-$c);$h[$_].=$"x(4*$_).$g x$f[$_]for(1..$#f);
say join$/,reverse@h;

İki sayıyı kabul eder: önce kabaklar, ardından hayaletler. Örnek giriş:

5 20

Örnek çıktı:

                \{O.O}/ 
            \{O.O}/ \{O.O}/ 
        \{O.O}/ \{O.O}/ \{O.O}/ 
    \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ 
((^v^)) ((^v^)) ((^v^)) ((^v^)) ((^v^)) \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ 

Oh, ifadelerimi istediğimden biraz farklı okuyorsun - Hayaletler sadece altında bir balkabağı varsa hayaletlerin üstünde istiflenebilir, aksi takdirde doğru tek dosyaya gitmeleri gerekir. Bu yüzden 0p 4gtest senaryosunda tüm hayaletler bir satırda değil, bir satırda bulunur.
AdmBorkBork

@TimmyD Pekala, şimdi düzelttim. Gerçi azaltmak için biraz golf yapmam gerekecek.
Gabriel Benamy
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.