40 개 주문


15

너비는 같지만 높이가 다른 40 개의 스틱이 있습니다. 우리가 오른쪽에서 볼 때 10 개의 막대기를 볼 수 있고 왼쪽에서 볼 때 정확히 10 개의 막대기를 볼 수 있도록 서로 옆에 배치 할 수있는 배열은 얼마나 있습니까?

예를 들어 이러한 순서는 다음과 같습니다.주문 예

검은 막대기는 숨겨져 있고, 빨간 막대기는 왼쪽에서 볼 때 볼 수있는 것입니다. 파란색 막대기는 오른쪽에서 볼 때 볼 수있는 것입니다. 양쪽에서.

테스트 사례로 :

  • 3 개의 막대기가 있다면 왼쪽에서 2 개, 오른쪽에서 2 개는 2 개입니다.
  • 우리가 5 개의 막대기를 가지고 있다면 왼쪽에서 3 개를보고 오른쪽에서 3 개는 6 개입니다
  • 10 개의 스틱이 있으면 왼쪽에서 4 개, 오른쪽에서 4 개가 90720 인 주문이 90720 인 경우

13
최적의 코드 골프 응답은 결과를 계산하지 않고 인쇄하기 때문에 고정 출력으로 질문을 피할 수 있습니다. 질문에 몇 가지 변수 입력을 지정하는 것이 좋습니다. 예를 들어 N 스틱은 왼쪽 / 오른쪽에서 K를 볼 수 있습니다. 여기서 N과 K는 입력 정수입니다.
Sp3000

4
프로그램이 입력을 받도록 스펙을 변경하는 경우 (이유가없는 이유는 모르겠습니다. 이미 테스트 사례가 있음) 프로그램에 시간 제한을 둘 것인지 여부를 생각할 수 있습니다.
Sp3000

1
"40/10 사례를 계산하려면 게시 된 프로그램을 사용해야합니다"는 시간 제한이 충분해야합니다.
feersum

1
나는 10!/40 = 90720그 우연의 일치 라는 사실을 극복 할 수 없다 ?
Tim

1
@Tim 90720의 중요성은 무엇입니까? Los Alamitos, CA의 우편 번호 ?
Digital Trauma

답변:


8

파리 / 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)))

눈에 띄는 막대기의 수 는 연필 / 격자 게임 후에 Skyscraper Numbers 라고도 합니다. 이 코드는 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이 기본값이므로 3에서가 아니라 n에서 1을 1에서 뺍니다.
찰스

1

파이썬 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))))

약간 골프를 쳤다 :

    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와 ==over vector 뿐이지 만 구현하는 데 몇 바이트 밖에 걸리지 않았습니다.

설명과 추가 골프가 곧 올 것입니다.

온라인으로 사용해보십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.