Đặt 40 que


15

Chúng tôi có 40 thanh có cùng chiều rộng nhưng chiều cao khác nhau. Có bao nhiêu cách sắp xếp có thể đặt chúng cạnh nhau để khi chúng ta nhìn từ bên phải chúng ta thấy 10 cây gậy và khi chúng ta nhìn từ bên trái, chúng ta lại thấy chính xác 10 cây gậy?

Ví dụ, một thứ tự như vậy là:Một ví dụ đặt hàng

Các que màu đen được ẩn đi, các que màu đỏ là những cây bạn có thể nhìn thấy khi bạn nhìn từ bên trái, các que màu xanh là những cây bạn có thể nhìn thấy khi bạn nhìn từ bên phải và màu tím (tức là cái dài nhất) là thứ có thể nhìn thấy từ cả hai phía.

Như trường hợp thử nghiệm:

  • Nếu chúng ta có 3 que số thứ tự để thấy 2 từ trái và 2 từ phải là 2
  • Nếu chúng ta có 5 gậy, số thứ tự để thấy 3 từ trái và 3 từ phải là 6
  • Nếu chúng ta có 10 que số thứ tự để thấy 4 từ trái và 4 từ phải là 90720

13
Bạn có thể muốn tránh các câu hỏi với đầu ra cố định vì câu trả lời golf-code tối ưu có thể sẽ chỉ in kết quả mà không tính toán. Tôi khuyên bạn nên đặt câu hỏi có một vài đầu vào biến đổi, ví dụ N gậy sao cho bạn thấy K của chúng từ trái / phải, trong đó N và K là các số nguyên đầu vào
Sp3000

4
Nếu bạn thay đổi thông số kỹ thuật để các chương trình đưa vào đầu vào (tôi không hiểu tại sao không - bạn đã có các trường hợp thử nghiệm), bạn có thể muốn suy nghĩ về việc bạn có muốn đặt giới hạn thời gian cho các chương trình hay không.
Sp3000

1
"Phải sử dụng chương trình đã đăng của bạn để tính toán trường hợp 40/10" phải là giới hạn thời gian đủ tốt.
frageum

1
Tôi không thể vượt qua thực tế rằng 10!/40 = 90720... đó có phải là sự trùng hợp?
Tim

1
@Tim Ý nghĩa của 90720 là gì? Mã zip cho Los Alamitos, CA ?
Chấn thương kỹ thuật số

Câu trả lời:


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

Số lượng gậy có thể nhìn thấy còn được gọi là Số nhà chọc trời , sau trò chơi bút chì / lưới. Mã này dựa trên (chỉ thay đổi một chút) công thức từ OEIS A218531 . Tôi không biết nhiều PARI, nhưng tôi thực sự không nghĩ rằng có nhiều thứ để chơi golf ở đây.

Các trường hợp thử nghiệm đều được hiển thị tại ideone.com . Kết quả cho f(40,10)là:

192999500979320621703647808413866514749680

1
Có một lý do tốt đẹp cho công thức. Số lượng hoán vị với vcác que nhìn trái là số Stirling s(n,v). Nếu cây gậy cao nhất ở vị trí k, thì cây gậy có thể nhìn thấy được là cây gậy và cây gậy có thể nhìn thấy bên trái trong phép hoán vị bên trái của các k-1giá trị bên trái của vị trí k. Vì vậy, để có vgậy có thể nhìn thấy bên trái và gậy có thể nhìn thấy vbên phải, người ta có các s(k,v-1)lựa chọn để hoán vị nửa bên trái, s(n-k-1,v-1)hoán vị nửa bên phải và các binomial(n-1,k)lựa chọn để tách gậy thành hai nửa.
xnor

@xnor Về cơ bản, họ đưa ra lời giải thích đó trong tệp PDF được liên kết, nhưng IMO của bạn được dùng từ IMO tốt hơn nhiều.
Geobits

Bạn có thể lưu 11 byte : f(n,v,s=stirling)=abs(sum(k=1,n--,binomial(n,k)*s(k,v-1)*s(n-k,v-1))). Điều này lưu sterlingvào một biến để sử dụng lại, bỏ đi đối số cuối cùng của nó, vì 1 là mặc định và trừ 1 từ n một lần thay vì ba lần.
Charles

1

Python 3, 259 byte

Không hài lòng lắm với điều này.

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)

Ví dụ đầu vào và đầu ra:

10 4
90720

Nó tạo ra tất cả các kết hợp có thể có của phạm vi được cung cấp, sau đó lặp qua chúng, kiểm tra từng số trong chúng để xem nó có bằng với số tối đa của các số trước đó không. Sau đó, nó thực hiện tương tự ngược lại và nếu đếm ngược (t) = đếm ngược (d) = số lượt xem đã cho (k) thì đó là số hợp lệ. Nó thêm phần này vào một bộ đếm (c) và in nó ở cuối.


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

Bỏ chơi gôn một chút:

    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 byte

Về cơ bản là một cổng của câu trả lời R. Khá chậm, thậm chí không thể hoàn thành10, 4 trực tuyến.

AGHQLlfqhS<bhT@bTUGlf!-,yTy_TH.pr1hG

Điều duy nhất Pyth không có là cummax và các ==vectơ trên, nhưng những thứ đó chỉ mất một vài byte để thực hiện.

Giải thích và chơi golf tiếp theo đến sớm.

Hãy thử nó ở đây trực tuyến .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.