Pesan 40 batang

15

Kami memiliki 40 batang dengan lebar yang sama tetapi ketinggian berbeda. Berapa banyak pengaturan yang mungkin untuk menempatkan mereka di sebelah satu sama lain sehingga ketika kita melihat dari kanan kita melihat 10 batang dan ketika kita melihat dari kiri kita kembali melihat persis 10 batang?

Misalnya pemesanan seperti itu adalah:Contoh pemesanan

Tongkat hitam disembunyikan, tongkat merah adalah yang dapat Anda lihat ketika Anda melihat dari kiri, tongkat biru adalah yang dapat Anda lihat ketika Anda melihat dari kanan dan ungu (yaitu yang terpanjang) adalah yang dapat dilihat. dari kedua sisi.

Sebagai kasus uji:

  • Jika kita memiliki 3 batang jumlah pemesanan untuk melihat 2 dari kiri dan 2 dari kanan adalah 2
  • Jika kita memiliki 5 batang jumlah pemesanan untuk melihat 3 dari kiri dan 3 dari kanan adalah 6
  • Jika kita memiliki 10 batang jumlah pemesanan untuk melihat 4 dari kiri dan 4 dari kanan adalah 90720
Sobat
sumber
13
Anda mungkin ingin menghindari pertanyaan dengan output tetap karena jawaban kode-golf optimal mungkin hanya akan mencetak hasilnya tanpa menghitungnya. Saya akan merekomendasikan membuat pertanyaan memiliki beberapa input variabel, misalnya N tetap sehingga Anda melihat K dari mereka dari kiri / kanan, di mana N dan K adalah bilangan bulat input
Sp3000
4
Jika Anda mengubah spesifikasi sehingga program menerima input (Saya tidak mengerti mengapa tidak - Anda sudah memiliki kasus uji), Anda mungkin ingin memikirkan apakah Anda ingin membatasi waktu pada program atau tidak.
Sp3000
1
"Harus menggunakan program Anda yang diposting untuk menghitung kasus 40/10" harus menjadi batas waktu yang cukup baik.
feersum
1
Saya tidak bisa melupakan fakta bahwa 10!/40 = 90720... apakah itu kebetulan?
Tim
1
@Tim Whats pentingnya 90720? Kode pos untuk Los Alamitos, CA ?
Trauma Digital

Jawaban:

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

Jumlah tongkat yang terlihat juga disebut Angka Pencakar Langit , setelah permainan pensil / kotak. Kode ini didasarkan pada (hanya sedikit diubah) rumus dari OEIS A218531 . Saya tidak tahu banyak PARI, tapi saya benar-benar tidak berpikir ada banyak golf di sini.

Semua test case ditampilkan di ideone.com . Hasilnya f(40,10)adalah:

192999500979320621703647808413866514749680
Geobit
sumber
1
Ada alasan bagus untuk formula ini. Jumlah permutasi dengan vtongkat yang terlihat kiri adalah angka Stirling s(n,v). Jika stik tertinggi berada pada posisi k, maka stik yang terlihat kiri adalah stik itu dan stik yang terlihat di sub-permutasi di sebelah kiri dari k-1nilai di kiri posisi k. Jadi, untuk memiliki vstik yang dapat terlihat kiri dan stik yang vdapat terlihat, seseorang memiliki s(k,v-1)pilihan untuk mengubah bagian kiri, s(n-k-1,v-1)untuk mengubah bagian kanan, dan binomial(n-1,k)pilihan untuk membagi stik menjadi dua bagian.
xnor
@ xnor Mereka pada dasarnya memberikan penjelasan itu dalam PDF tertaut, tetapi IMO Anda jauh lebih baik.
Geobits
Anda dapat menyimpan 11 byte: f(n,v,s=stirling)=abs(sum(k=1,n--,binomial(n,k)*s(k,v-1)*s(n-k,v-1))). Ini menyimpan sterlingke variabel untuk digunakan kembali, meninggalkan argumen terakhirnya, karena 1 adalah default, dan mengurangi 1 dari n satu kali, bukan tiga kali.
Charles
1

Python 3, 259 byte

Tidak terlalu senang dengan ini.

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)

Contoh input dan output:

10 4
90720

Ini menghasilkan semua kombinasi yang mungkin dari rentang yang disediakan, dan kemudian loop melalui mereka, memeriksa setiap angka di dalamnya untuk melihat apakah itu sama dengan maksimum angka-angka sebelumnya. Kemudian melakukan hal yang sama mundur, dan jika hitung maju (t) = hitung mundur (d) = jumlah tampilan yang diberikan (k) itu adalah yang valid. Ia menambahkan ini ke penghitung (c) dan mencetaknya di akhir.

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

De-golfed sedikit:

    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)))
    }
flodel
sumber
0

Pyth - 38 36 byte

Pada dasarnya port jawaban R. Cukup lambat, bahkan tidak bisa selesai 10, 4online.

AGHQLlfqhS<bhT@bTUGlf!-,yTy_TH.pr1hG

Satu-satunya hal yang tidak dimiliki Pyth adalah cummax dan ==vektor-vektor berlebih, tetapi hanya membutuhkan beberapa byte untuk diimplementasikan.

Penjelasan dan golf lebih lanjut segera hadir.

Coba di sini online .

Maltysen
sumber