40 çubuk sipariş et


15

Aynı genişlikte ancak farklı yüksekliklerde 40 çubukumuz var. Onları yan yana koymak için kaç düzenleme var, böylece sağdan baktığımızda 10 çubuk görüyoruz ve soldan baktığımızda tekrar tam olarak 10 çubuk görüyoruz?

Örneğin, böyle bir sipariş:Örnek bir sipariş

Siyah çubuklar gizlidir, kırmızı çubuklar soldan baktığınızda görebileceğiniz, mavi çubuklar sağdan ve mor olandan (yani en uzun olandan) gördüğünüzde görebilenlerdir. Iki taraftan.

Test durumları olarak:

  • 3 çubuk varsa, soldan 2 ve sağdan 2 görmek için sıra sayısı 2
  • Eğer 3 tane soldan ve 3 tane sağdan görmek için 5 çubuklu siparişimiz varsa 6
  • Eğer 4 çubuk soldan 4 ve sağdan 4 görmek için sıra sayısı 90720

13
Sabit bir çıktı ile soruları önlemek isteyebilirsiniz, çünkü en uygun kod-golf cevabı muhtemelen sonucu hesaplamadan yazdıracaktır. Sorunun birkaç değişken girişi olmasını öneriyorum, örneğin K çubuklarını sol / sağdan görecek şekilde N çubukları, burada N ve K giriş tamsayılarıdır
Sp3000 12:15

4
Spesifikasyonu, programların girdi almasını sağlayacak şekilde değiştirirseniz (nedenini göremiyorum - zaten test senaryolarına sahipsiniz), programlara bir zaman sınırı koymak isteyip istemediğinizi düşünmek isteyebilirsiniz.
Sp3000

1
"40/10 durumunu hesaplamak için yayınlanan programınızı kullanmalısınız" yeterince iyi bir zaman sınırı olmalıdır.
feersum

1
Ben gerçeği unutamıyorum 10!/40 = 90720... bu tesadüf mü?
Tim

1
@Tim 90720'nin önemi nedir? Los Alamitos, CA için posta kodu ?
Dijital Travma

Yanıtlar:


8

PARI / GP, 80

f(n,v)=abs(sum(k=1,n-1,binomial(n-1,k)*stirling(k,v-1,1)*stirling(n-k-1,v-1,1)))

Kalem / ızgara oyunundan sonra görünür çubukların sayısına Gökdelen Numaraları da denir . Bu kod, OEIS A218531'deki formüle dayanır (sadece biraz değiştirilmiş) . Çok PARI bilmiyorum, ama burada golf oynamak için çok fazla şey olduğunu düşünmüyorum.

Test senaryolarının tümü ideone.com'da gösterilir . Sonuç f(40,10):

192999500979320621703647808413866514749680

1
Formül için güzel bir neden var. vSoldan görülebilir çubuklu permütasyon sayısı Stirling sayısıdır s(n,v). En uzun çubuk konumdaysa k, soldan görünen çubuklar o çubuktur ve soldan görünen çubuklar k-1, konumun solundaki değerlerin solundaki alt permütasyondadır k. Bu nedenle, vsoldan görünen çubuklara ve vsağdan görünen çubuklara sahip olmak için, birinin s(k,v-1)sol yarısına izin verme, s(n-k-1,v-1)sağ yarısına izin verme binomial(n-1,k)seçenekleri ve çubukları iki yarıya bölme seçenekleri vardır.
xnor

@xnor Temelde bağlantılı PDF'de bu açıklamayı verirler, ancak sizinki daha iyi IMO ile ifade edilmiştir.
Geobits

Sen 11 bayt kaydedebilirsiniz: f(n,v,s=stirling)=abs(sum(k=1,n--,binomial(n,k)*s(k,v-1)*s(n-k,v-1))). Bu, sterlingyeniden kullanım için bir değişkene kaydedilir , 1 varsayılan olduğu için son argümanından çıkar ve 1'i üç kez yerine n'den bir kez çıkarır.
Charles

1

Python 3, 259 bayt

Bundan pek memnun değil.

import itertools as i
x=input().split()
y,k=x
y=int(y)
c=0
x=list(i.permutations(list(range(1,y+1))))
for s in x:
 t=d=0;l=s[::-1]
 for i in range(y):
  if max(s[:i+1])==s[i]:t+=1
 for i in range(y):
  if max(l[:i+1])==l[i]:d+=1
 if t==d==int(k):c+=1
print(c)

Örnek giriş ve çıkış:

10 4
90720

Sağlanan aralığın tüm olası kombinasyonlarını oluşturur ve daha sonra, önceki sayıların maksimumuna eşit olup olmadığını görmek için aralarındaki her bir sayıyı kontrol eder. Daha sonra aynı şeyi geriye doğru yapar ve ileriye doğru sayım (t) = geriye doğru sayım (d) = verilen görüntüleme numarası (k) geçerliyse. Bunu bir sayaca (c) ekler ve sonunda yazdırır.


0

R, 104

function(N,K)sum(sapply(combinat::permn(N),function(x)(z=function(i)sum(cummax(i)==i)==K)(x)&z(rev(x))))

Biraz golf oynadım:

    function(N,K) {
      all_perm <- combinat::permn(N)
      can_see_K_from_left <- function(i)sum(cummax(i) == i) == K
      can_see_K_from_both <- function(x)can_see_K_from_left(x) &
                                        can_see_K_from_left(rev(x))
      return(sum(sapply(all_perm, can_see_K_from_both)))
    }

0

Pyth - 38 36 bayt

Temelde R cevabının bir limanı. Oldukça yavaş, 10, 4çevrimiçi olarak tamamlanamıyor bile .

AGHQLlfqhS<bhT@bTUGlf!-,yTy_TH.pr1hG

Pyth'in sahip olmadığı tek şey cummax ve ==üzeri vektörler, ancak bunların uygulanması sadece birkaç bayt aldı.

Açıklama ve daha fazla golf yakında.

Burada çevrimiçi deneyin .

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.