สั่งซื้อ 40 แท่ง


15

เรามีความกว้าง 40 แท่งที่เหมือนกัน แต่มีความสูงต่างกัน มีวิธีใดบ้างที่สามารถจัดวางไว้ติดกันเพื่อที่ว่าเมื่อเรามองจากด้านขวาเราเห็น 10 แท่งและเมื่อมองจากซ้ายเราจะเห็นว่ามี 10 แท่งแน่นอน

ตัวอย่างเช่นการสั่งซื้อคือ:ตัวอย่างการสั่งซื้อ

แท่งสีดำซ่อนอยู่แท่งสีแดงเป็นแท่งที่คุณสามารถมองเห็นได้จากด้านซ้ายแท่งสีฟ้าเป็นแท่งที่คุณสามารถมองเห็นได้จากด้านขวาและสีม่วง (เช่นแท่งที่ยาวที่สุด) คือแท่งที่สามารถมองเห็นได้ จากทั้งสองด้าน

ในกรณีทดสอบ:

  • ถ้าเรามีจำนวนการเรียง 3 แท่งเพื่อดู 2 จากซ้ายและ 2 จากขวาคือ 2
  • ถ้าเรามีจำนวนการเรียง 5 แท่งเพื่อดู 3 จากซ้ายและ 3 จากขวาคือ 6
  • หากเรามีจำนวนการสั่งไม้ 10 ครั้งเพื่อดู 4 จากซ้ายและ 4 จากขวาคือ 90720

13
คุณอาจต้องการหลีกเลี่ยงคำถามที่มีเอาต์พุตคงที่เพราะคำตอบของ golf-code ที่ดีที่สุดอาจจะแค่พิมพ์ผลลัพธ์โดยไม่ต้องคำนวณ ฉันขอแนะนำให้ทำให้คำถามมีอินพุตตัวแปรไม่กี่ตัวเช่น N แท่งเช่นที่คุณเห็น K ของพวกเขาจากซ้าย / ขวาที่ N และ K เป็นจำนวนเต็มอินพุต
Sp3000

4
หากคุณเปลี่ยนข้อมูลจำเพาะเพื่อให้โปรแกรมรับเข้า (ฉันไม่เห็นสาเหตุ - คุณมีกรณีทดสอบอยู่แล้ว) คุณอาจต้องการพิจารณาว่าคุณต้องการกำหนดเวลาในโปรแกรมหรือไม่
Sp3000

1
"ต้องใช้โปรแกรมที่โพสต์ของคุณในการคำนวณกรณี 40/10" ควรมีเวลา จำกัด ที่ดีพอ
feersum

1
ฉันไม่สามารถเข้าใจความจริงที่ว่า10!/40 = 90720... เป็นเรื่องบังเอิญหรือไม่
ทิม

1
@Tim 90720 มีความสำคัญอะไร? รหัสไปรษณีย์สำหรับLos Alamitos, CA ?
Digital Trauma

คำตอบ:


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

จำนวนแท่งที่มองเห็นได้จะเรียกว่าหมายเลขแท่งทรงสูงหลังเกมดินสอ / กริด รหัสนี้จะขึ้นอยู่กับ (เฉพาะที่มีการเปลี่ยนแปลงเล็กน้อย) สูตรจากOEIS A218531 ฉันไม่รู้จัก PARI มากนัก แต่ฉันไม่คิดว่าจะมีสนามกอล์ฟที่นี่มากนัก

กรณีทดสอบทั้งหมดที่แสดงที่ ideone.com ผลลัพธ์สำหรับf(40,10):

192999500979320621703647808413866514749680

1
มีเหตุผลที่ดีสำหรับสูตรนี้ จำนวนพีชคณิตกับแท่งซ้ายมองเห็นได้คือจำนวนสเตอร์ลิงv s(n,v)หากติดที่สูงที่สุดอยู่ที่ตำแหน่งkแล้วแท่งซ้ายมองเห็นว่าติดและไม้ซ้ายมองเห็นได้ในย่อยเปลี่ยนแปลงไปทางซ้ายของค่าด้านซ้ายของตำแหน่งk-1 kดังนั้นเพื่อให้มีvแท่งที่มองเห็นได้ด้านซ้ายและแท่งที่มองเห็นได้vด้านขวามีs(k,v-1)ตัวเลือกให้เปลี่ยนครึ่งซ้ายs(n-k-1,v-1)เพื่อเปลี่ยนครึ่งขวาและbinomial(n-1,k)เลือกที่จะแยกแท่งออกเป็นสองครึ่ง
xnor

@xnor พวกเขาให้คำอธิบายโดยทั่วไปใน PDF ที่เชื่อมโยง แต่คุณพูดดีกว่า IMO มาก
Geobits

คุณสามารถบันทึก 11 f(n,v,s=stirling)=abs(sum(k=1,n--,binomial(n,k)*s(k,v-1)*s(n-k,v-1)))ไบต์: สิ่งนี้บันทึกsterlingลงในตัวแปรเพื่อนำมาใช้ซ้ำปล่อยให้อาร์กิวเมนต์สุดท้ายเป็น 1 เนื่องจากเป็นค่าเริ่มต้นและลบ 1 จาก n หนึ่งครั้งแทนที่จะเป็นสามครั้ง
ชาร์ลส์

1

Python 3, 259 ไบต์

ไม่ค่อยมีความสุขกับสิ่งนี้

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)

ตัวอย่างอินพุตและเอาต์พุต:

10 4
90720

มันสร้างชุดค่าผสมที่เป็นไปได้ทั้งหมดของช่วงที่มีให้แล้ววนรอบผ่านตรวจสอบแต่ละหมายเลขในนั้นเพื่อดูว่าเท่ากับจำนวนสูงสุดของตัวเลขก่อนหน้านี้หรือไม่ มันจะทำแบบเดียวกันย้อนหลังและถ้าการนับส่งต่อ (t) = การนับถอยหลัง (d) = จำนวนมุมมองที่กำหนด (k) มันเป็นค่าที่ถูกต้อง มันจะเพิ่มสิ่งนี้ลงในตัวนับ (c) และพิมพ์ออกมาในตอนท้าย


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 เล็กน้อย:

    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 ไบต์

โดยทั่วไปพอร์ตของคำตอบ R ค่อนข้างช้าไม่สามารถทำ10, 4ออนไลน์ให้เสร็จสมบูรณ์ได้

AGHQLlfqhS<bhT@bTUGlf!-,yTy_TH.pr1hG

สิ่งเดียวที่ Pyth ไม่มีคือ cummax และ ==เวกเตอร์เกิน แต่สิ่งเหล่านั้นใช้เวลาเพียงไม่กี่ไบต์ในการติดตั้ง

คำอธิบายและการเล่นกอล์ฟที่กำลังจะมาในเร็ว ๆ นี้

ลองมันนี่เกมออนไลน์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.