나에게 극을 물 들여라


22

당신의 임무는 극을 페인트하는 것이고, 클라이언트는 당신에게 4 개의 빨간 부분과 3 개의 노란 부분으로 극을 칠하라고 요청합니다. 다음과 같이 쉽게 할 수 있습니다.

r y r y r y r

노란색과 빨간색 줄무늬 만 있습니다. 이제 고객이 2 개의 빨간색 섹션, 2 개의 노란색 섹션 및 1 개의 녹색 섹션 으로 기둥을 페인트하도록 요청한다고 가정하겠습니다 . 극을 칠할 수있는 몇 가지 방법이 있습니다

g y r y r
y g r y r
y r g y r
y r y g r
y r y r g
g r y r y
r g y r y
r y g r y
r y r g y
r y r y g
y r g r y
r y g y r

더 정확하게는 극점을 그리는 12 가지 방법입니다. 이로 인해 더 많은 색상과 섹션이 나옵니다

이제 고객이 3 개의 빨간색 섹션과 1 개의 노란색 섹션을 원한다고 말하면 그런 극을 그릴 방법이 없습니다. 섹션 정렬 방법에 관계없이 두 개의 빨간색 섹션이 닿아 두 개의 빨간색 섹션이 닿으면 단일 빨간색 섹션이됩니다.

그리고 그것은 극을 그리는 우리의 하나의 규칙입니다.

인접 섹션의 색상이 다를 수 있습니다

태스크

필요한 색상 및 섹션 목록이 제공되면 요청에 따라 극을 칠하는 가능한 방법의 수를 출력하십시오. 합리적인 방식으로 색상을 표현할 수 있지만 (정수, 문자, 문자열) 한 번에 255 가지 이상의 색상을 부여 할 수 없습니다. 원하는 경우 색상에 이름을 지정하지 않고 더 쉬운 경우 섹션 수 목록을 가져갈 수도 있습니다.

테스트 사례

이들은 손으로 계산하기가 특히 어렵습니다. 누구든지 제안 된 테스트 사례가있는 경우 추가 할 것입니다.

[4,3]    -> 1
[2,2,1]  -> 12
[3,1]    -> 0
[8,3,2]  -> 0
[2,2,1,1]-> 84

예를 들어 [4,3]에 "rrrryyy"로 입력 할 수 있습니까?
Leo

@Leo Sure는 완벽하게 합리적입니다.
밀 마법사

입력을받을 수 있습니까 [1, 1, 1, 1, 2, 2, 2]? 나는 그렇게 생각.
Outgolfer Erik


4
매우 중요하지는 않지만 폴란드라는 단어를 대문자로 쓰면 폴란드 사람에 대해 이야기하는 것처럼 들립니다.
NH.

답변:


9

매스 매 티카, 37 44 48 60 62 바이트

정수 목록으로 입력하십시오 {1, 1, 1, 2, 2}. Wolfram Sandbox 에서 사용해보십시오 .

패턴 매칭 방법, @Not a tree!

Count[Split/@Permutations@#,{{_}..}]&

Split예를 들어 연속 요소의 하위 목록에 하나의리스트 분할 {1, 1, 2, 3, 4, 4}로를{{1, 1}, {2}, {3}, {4, 4}}

{{_}..}{{_}, {_}, {_}, ...}. 이 패턴은 단항 하위 목록과 일치합니다.

Differences 방법, 48 바이트 :

Tr@Abs@Clip[1##&@@@Differences/@Permutations@#]&

이 코드는 Differences인접한 요소가 동일한 지 확인하는 데 사용 합니다.

단계별 :

  1. Permutations@# 입력 목록의 모든 순열을 N! * N 목록으로 생성합니다.
  2. Differences/@ N 요소의 차이를 계산하고 N! * (N-1) 목록을 생성합니다.
  3. 1##&@@@모든 목록의 곱셈을 계산합니다. 목록에 0(두 개의 인접한 요소가 동일 함)이 포함 된 경우 결과는 00이 아닌 경우 N이됩니다! 명부.
  4. Clip[]처럼 작동 Sign[]하고 목록을 (-inf, inf)에서 [-1, 1]로 변환
  5. Tr@Abs모든 회전 -11지금 N은! - 길이 목록에는 포함 0(무효) 및 1(유효한). 그래서 우리는 목록을 요약합니다.

4
패턴 일치로 4 바이트를 저장할 수 있습니다 Permutations@#~Count~Except@{___,x_,x_,___}&.
나무가 아님

2
나는 또 하나 : Count[Split/@Permutations@#,{{_}..}]&37 바이트!
나무가 아님

7

젤리 , 7 바이트

Œ!QIẠ€S

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

예를 들어 입력을받습니다 [1,1,1,1,2,2,2] 를 로 합니다 [4,3]. [8,3,2]테스트 케이스는 TIO에서 실행하는 데 시간이 너무 오래 걸립니다.

작동 원리

Œ!QIẠ€S - main link, input as a list
Œ!      - all permutations
  Q     - remove duplicates
   I    - take increments (returns a 0 for two adjacent identical numbers)
    Ạ€  - apply “all” atom to each: 0 for containing 0 and 1 otherwise
      S - sum

유예 기간을 남용했습니다 ...;)
Outgolfer Erik

합니까의 Œ!QIẠ€S작업? 온라인으로 사용해보십시오!
nmjcman101

@ nmjcman101 작동하는 것 같습니다. 좋은 발견! 나는 P그것의 단순성을 위해 어떤 원자보다 모든 원자를 선호했다 .
fireflame241241

@ fireflame241 기술적으로 그것은 모든 원자가 아니라 모든 원자입니다.
Outgolfer Erik

P€대신 BTW Ạ€가 여전히 작동합니다.
Outgolfer Erik


5

수학, 50 바이트

Expand[1##&@@(LaguerreL[#,-1,x](-1)^#)]/._^i_:>i!&

Mathics 또는 Wolfram 샌드 박스 에서 사용해보십시오. !

테스트 사례와 같이 입력을받습니다. 예 : {4,3} 받습니다. "4 개의 빨간색 줄무늬, 3 개의 노란색 줄무늬"를 의미합니다.

이것은 내가 여기서 찾은 공식의 순진한 구현입니다 . "Naive"는 "수학이 어떻게 작동하는지 잘 모르겠 기 때문에 설명을 요청하지 마십시오 ..."


1
이 답변에 주어진 수학에 대한 설명을 할 수 있습니까?
TheLethalCoder

@ TheLethalCoder 둘째, 누군가 나에게 수학을 설명해 줄 수 있습니까?
나무가 아님


3

루비 2.4, 47 바이트

입력 문자 목록이다 : 테스트 케이스의 경우 [4,3], 입력 할 수있는 %w[a a a a b b b], "1111222".chars또는 루비 유효한 배열의 다른 포맷 방법.

->x{x.permutation.uniq.count{|a|a*''!~/(.)\1/}}

에 2.4가 필요합니다 Enumerator#uniq(이전 버전은 Array수업 에서만 사용 가능했습니다 ). 따라서 TIO 링크는 5 바이트를 더하여 to_a위의 함수가 없기 때문에 순열 열거자를 먼저 통해 배열로 변환합니다 .

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


3

R, 72 바이트

pryr::f(sum(sapply(unique(combinat::permn(x)),pryr::f(!sum(!diff(x))))))

함수를 만듭니다

function (x) 
{
    sum(sapply(unique(combinat::permn(x)), pryr::f(!sum(!diff(x)))))
}

[1,1,1,1,2,2,2]아웃 골퍼 Erik의 의견 에 따라 형식 으로 입력합니다 . 용도 combinatpermn기능은 모든 순열의 목록을 작성하고하는 unique모든 별개의 항목을 얻을 수 있습니다. sapply그런 다음 모든 항목에 다음 기능을 적용합니다.

pryr::f(!sum(!diff(x)))

어느 것으로 평가

function (x) 
!sum(!diff(x))

이것은 큰 함수의 입력 x과 동일하지 않습니다 x. 이 함수에서 다른 문자를 사용하면 바보가됩니다pryr::f 하면 큰 함수가 다른 인수가 필요하다고 믿는 데 됩니다.

어쨌든 순열이 주어지면이 함수는 벡터의 차이를 취합니다 2 1 3 4 2 1 -> -1 2 1 -2 -1. !0이 아닌 FALSE값을 0으로 변환 TRUE하여 벡터가됩니다 FALSE FALSE FALSE FALSE FALSE. TRUEs 가 있는지 확인하기 위해 합산하면 ( 두 개의 동일한 연속 번호를 TRUE의미 함 diff=0). !순열에 연속적인 값이 있는지 여부에 대한 부울을 얻기 위해 이것을 다시 뒤집을 수 있습니다 .

이 부울을 합하면 이것이 아닌 총 치환 수를 우리에게 제공합니다.

[8,3,2]이러한 순열을 저장하려면 46GB의 벡터가 필요하기 때문에 테스트 케이스에서 작동하지 않습니다 .




2

껍질 , 8 바이트

#ȯ¬ṁtguP

온라인으로 사용해보십시오! 형식으로 입력 "aaabb"[3,2]받습니다. 가장 긴 테스트 케이스에서 시간이 초과되었습니다.

설명

인접한 요소의 모든 그룹의 길이가 1 인 고유 순열을 세는 것만으로도 멋진 것은 없습니다.

#ȯ¬ṁtguP
       P  Permutations.
      u   Remove duplicates.
#ȯ        Count how many satisfy the following condition:
     g    group adjacent elements,
   ṁt     concatenate tails of groups
  ¬       and negate.

2

루비, 84 76 바이트

f=->a,x=p{i=s=0;a.map{a[i-=1]-=1;a[i]<0||i!=x&&s+=f[a,i];a[i]+=1}.max>0?s:1}

재귀 람다 함수. 가능한 모든 색상을보고 재귀 트리 검색을 수행하고 모든 스트라이프를 사용하는 횟수를 계산합니다.

설명 (이전 버전의 경우) :

f=->
  a, # a is the input array in [3,3,4] form
  x = -1 # x is the last color placed (-1 when run normaly, used in recursive calls)
{
  j = i = s = 0;
  # i is the index
  # s is the sum of valid final patterns (the answer)
  # j is used to count the total stripes

  a.map{|e| # Iterate over array of colors

    a[i] -= 1; # remove a stripe of current color (the array will be used in recursive call)

    s += f[a,i] if i!=x && e>0;
      # add to sum recursively if:
        # we are not using the same color as the last color AND
        # we have stripes of the current color left to paint

    a[i] += 1; # replace the stripe we removed above 

    j += a[i]; # add stripes to j

    i+=1 # increment the index

  }; # End loop

  j == 0 ? 1 : s
  # if we had stripes, give the recursive sum, otherwise return 1 
}

x=p초기 조건으로? 이 경우 p별칭 nil으로 사용되며 사용중인 확인을 충족해야합니다.
가치 잉크

1

MATL , 11 8 바이트

Y@Xu!dAs

입력 형식은 [1 1 1 1 2 2 2]위해 [4 3]등등

마지막 테스트 사례에 대한 메모리가 부족합니다.

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

설명

Y@    % Implicit input. Matrix of all permutations. Each row is a permutation
Xu    % Unique rows
!     % Transpose
d     % Consecutive differences along each column
A     % All: true for columns such that all its entries are nonzero
s     % Sum. Implicitly display
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.