영구 골프


20

문제는 매트릭스영구적 인 코드 골프를 작성하는 것입니다 .

상설 n-by- n매트릭스 A(= ai,j)으로 정의

여기에 이미지 설명을 입력하십시오

여기에 S_n의 모든 순열 세트가 표시 [1, n]됩니다.

예를 들어 (위키에서) :

여기에 이미지 설명을 입력하십시오

코드는 원하는대로 입력을 할 수 있고 합리적인 형식으로 출력 할 수 있지만 코드에 입력을 제공하는 방법에 대한 명확한 지침을 포함한 완전한 예제를 답에 포함하십시오. 도전을 좀 더 재미있게하기 위해, 행렬에는 복소수가 포함될 수 있습니다.

입력 행렬은 항상 정사각형이며 최대 6 x 6 입니다. 또한 영구 행렬이있는 빈 행렬 을 처리 할 수 ​​있어야합니다. 빈 행렬을 처리 할 필요가 없습니다 (너무 많은 원인이 됨) 문제).

입력:

[[ 0.36697048+0.02459455j,  0.81148991+0.75269667j,  0.62568185+0.95950937j],
 [ 0.67985923+0.11419187j,  0.50131790+0.13067928j,  0.10330161+0.83532727j],
 [ 0.71085747+0.86199765j,  0.68902048+0.50886302j,  0.52729463+0.5974208j ]]

산출:

-1.7421952844303492+2.2476833142265793j

입력:

[[ 0.83702504+0.05801749j,  0.03912260+0.25027115j,  0.95507961+0.59109069j],
 [ 0.07330546+0.8569899j ,  0.47845015+0.45077079j,  0.80317410+0.5820795j ],
 [ 0.38306447+0.76444045j,  0.54067092+0.90206306j,  0.40001631+0.43832931j]]

산출:

-1.972117936608412+1.6081325306004794j

입력:

 [[ 0.61164611+0.42958732j,  0.69306292+0.94856925j,
     0.43860930+0.04104116j,  0.92232338+0.32857505j,
     0.40964318+0.59225476j,  0.69109847+0.32620144j],
   [ 0.57851263+0.69458731j,  0.21746623+0.38778693j,
     0.83334638+0.25805241j,  0.64855830+0.36137045j,
     0.65890840+0.06557287j,  0.25411493+0.37812483j],
   [ 0.11114704+0.44631335j,  0.32068031+0.52023283j,
     0.43360984+0.87037973j,  0.42752697+0.75343656j,
     0.23848512+0.96334466j,  0.28165516+0.13257001j],
   [ 0.66386467+0.21002292j,  0.11781236+0.00967473j,
     0.75491373+0.44880959j,  0.66749636+0.90076845j,
     0.00939420+0.06484633j,  0.21316223+0.4538433j ],
   [ 0.40175631+0.89340763j,  0.26849809+0.82500173j,
     0.84124107+0.23030393j,  0.62689175+0.61870543j,
     0.92430209+0.11914288j,  0.90655023+0.63096257j],
   [ 0.85830178+0.16441943j,  0.91144755+0.49943801j,
     0.51010550+0.60590678j,  0.51439995+0.37354955j,
     0.79986742+0.87723514j,  0.43231194+0.54571625j]]

산출:

-22.92354821347135-90.74278997288275j

기존 기능을 사용하여 지속 물을 계산할 수 없습니다.


12
복잡한 요구 사항을 제거 할 수 있습니까? 나는 그것이 다른 좋은 도전을 망칠 것이라고 생각합니다. 복잡한 산술을 내장하지 않은 모든 언어는 이제 완전히 별개의 작업을 수행해야합니다.
xnor

6
빈 행렬을 처리해야하는 경우이를 테스트 사례로 추가해야합니다. 목록으로 0x0 행렬을 실제로 나타낼 수 없다는 사실은 이것을 조금 어렵게 만듭니다. 개인적으로 나는 그 요구 사항을 제거하고 싶습니다.
Dennis

4
샌드 박스에 3 시간 동안 무언가를 넣는 것은 의미가 없습니다. 3 일이 지나면 사람들은 의견을 줄 기회가 있습니다.
피터 테일러

7
1. 그것은 단지 esolangs가 아닙니다. 예를 들어 Bash는 기본적으로 float을 처리 할 수 ​​없습니다 . 원하는 알고리즘을 쉽게 구현할 수 있더라도 특정 숫자 유형이 없기 때문에 경쟁에서 언어를 제외하는 것은 아무 이유없이 까다 롭습니다. 2. 여전히 빈 행렬에 대해 잘 모르겠습니다. 목록 형식 으로 [[]](하나의 행이 있고, 빈 행렬이 없거나) [](깊이 2가없고, 행렬이없는) 것입니까?
Dennis

4
1. 나는 Bash 에서이 도전을 해결 하는 것이 불가능하다는 것을 원치 않지만 코드의 사자 몫이 복잡한 수의 산술을 다루는 데 사용된다면 영속성에 대한 도전은 중단됩니다. 2. 대부분의 현재 답변은 아니지만 입력에 대한 행렬 유형 나누기가없는 언어 [[]]입니다.
Dennis

답변:


11

J, 5 바이트

+/ .*

J는 영구 또는 결정자에 대한 기본 제공 기능을 제공하지 않지만, 부 (minor)를 따라 u . v y재귀 적으로 확장 하고 보조 요소와 부 호출에 대한 재귀 호출의 출력 사이의 가변성을 y계산 하는 연결 을 제공합니다 u . v. 의 선택 u과는 v다를 수 있습니다. 예를 들어, 사용 u =: -/및하면 v =: *-/ .*행렬식된다. 선택은 %/ .!어디에서나 u=: %/, 나눗셈으로 줄이고, v =: !이항 계수입니다. 그 결과가 무엇을 의미하는지 잘 모르겠지만 동사를 자유롭게 선택할 수 있습니다.

내 Mathematica 답변 에서 동일한 방법을 사용하여 47 바이트에 대한 대체 구현 .

_1{[:($@]$[:+//.*/)/0,.;@(<@(,0#~<:)"+2^i.@#)"{

이것은 2의 거듭 제곱으로 한 변수를 갖는 다항식을 생성하여 n 개의 변수를 갖는 다항식을 시뮬레이션합니다 . 이것은 계수 목록으로 유지되며 다항식 곱셈은 컨볼 루션을 사용하여 수행되며, 2 n 의 지수 는 결과를 포함합니다.

31 바이트에 대한 또 다른 구현 은

+/@({.*1$:\.|:@}.)`(0{,)@.(1=#)

이것은 J 결정 에 대한 J 에세이에서 가져온 Laplace 확장을 기반으로 약간 골프 화 된 버전 입니다.

용법

   f =: +/ .*
   f 0 0 $ 0 NB. the empty matrix, create a shape with dimensions 0 x 0
1
   f 0.36697048j0.02459455 0.81148991j0.75269667 0.62568185j0.95950937 , 0.67985923j0.11419187  0.50131790j0.13067928 0.10330161j0.83532727 ,: 0.71085747j0.86199765 0.68902048j0.50886302 0.52729463j0.5974208
_1.7422j2.24768
   f 0.83702504j0.05801749 0.03912260j0.25027115 0.95507961j0.59109069 , 0.07330546j0.8569899 0.47845015j0.45077079 0.80317410j0.5820795 ,: 0.38306447j0.76444045 0.54067092j0.90206306 0.40001631j0.43832931
_1.97212j1.60813
   f 0.61164611j0.42958732 0.69306292j0.94856925 0.4386093j0.04104116 0.92232338j0.32857505 0.40964318j0.59225476 0.69109847j0.32620144 , 0.57851263j0.69458731 0.21746623j0.38778693 0.83334638j0.25805241 0.6485583j0.36137045 0.6589084j0.06557287 0.25411493j0.37812483 , 0.11114704j0.44631335 0.32068031j0.52023283 0.43360984j0.87037973 0.42752697j0.75343656 0.23848512j0.96334466 0.28165516j0.13257001 , 0.66386467j0.21002292 0.11781236j0.00967473 0.75491373j0.44880959 0.66749636j0.90076845 0.0093942j0.06484633 0.21316223j0.4538433 , 0.40175631j0.89340763 0.26849809j0.82500173 0.84124107j0.23030393 0.62689175j0.61870543 0.92430209j0.11914288 0.90655023j0.63096257 ,: 0.85830178j0.16441943 0.91144755j0.49943801 0.5101055j0.60590678 0.51439995j0.37354955 0.79986742j0.87723514 0.43231194j0.54571625
_22.9235j_90.7428

1
와우가 말할 수있는 전부입니다.

13

하스켈, 59 바이트

a#((b:c):r)=b*p(a++map tail r)+(c:a)#r
_#_=0
p[]=1
p l=[]#l

이것은 첫 번째 열을 따라 Laplace와 같은 개발을 수행하며 행의 순서는 중요하지 않습니다. 모든 숫자 유형에서 작동합니다.

입력은 목록의 목록입니다.

Prelude> p [[1,2],[3,4]]
10

2
항상 Haskell 솔루션을 환영합니다!

8

젤리 , 10 9 바이트

Œ!ŒDḢ€P€S

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

작동 원리

Œ!ŒDḢ€P€S  Main link. Argument: M (matrix / 2D array)

Œ!         Generate all permutations of M's rows.
  ŒD       Compute the permutations' diagonals, starting with the main diagonal.
    Ḣ€     Head each; extract the main diagonal of each permutation.
      P€   Product each; compute the products of the main diagonals.
        S  Compute the sum of the products.

너무 좋다!

7

파이썬 2, 75 바이트

멍청한 것 같아요.

P=lambda m,i=0:sum([r[i]*P(m[:j]+m[j+1:],i+1)for j,r in enumerate(m)]or[1])

6

05AB1E , 19 14 13 바이트

œvyvyNè}Pˆ}¯O

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

설명

œ              # get all permutations of rows
 v        }    # for each permutation
  yv   }       # for each row in the permutation
    yNè        # get the element at index row-index
        P      # product of elements
         ˆ     # add product to global array
           ¯O  # sum the products from the global array

약간 충격적인 크기의 답변! 설명 좀 해 주시겠습니까?

@Lembik : 여전히 짧아 질 것 같습니다. 지금까지 같은 크기의 두 번째 솔루션이 있습니다.
Emigna

빈 행렬 처리는 더 이상 필요하지 않습니다.
Dennis

(8)지도를 사용하여 바이트 . 새로운 05AB1E는 가상의 숫자를 지원하지 않습니다 œ€Å\PO.
Kevin Cruijssen

5

파이썬 2, 139 바이트

from itertools import*
def p(a):c=complex;r=range(len(a));return sum(reduce(c.__mul__,[a[j][p[j]]for j in r],c(1))for p in permutations(r))

반복

정의를 맹목적으로 따르는 순진한 알고리즘을 구현합니다.


4

MATL, 17 14 바이트

tZyt:tY@X])!ps

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

설명

t       % Implicitly grab input and duplicate
Zy      % Compute the size of the input. Yields [rows, columns]
t:      % Compute an array from [1...rows]
tY@     % Duplicate this array and compute all permutations (these are the columns)
X]      % Convert row/column to linear indices into the input matrix
)       % Index into the input matrix where each combination is a row
!p      % Take the product of each row
s       % Sum the result and implicitly display

1
매우 인상적.

4

루비, 74 63 바이트

->a{p=0;a.permutation{|b|n=1;i=-1;a.map{n*=b[i+=1][i]};p+=n};p}

공식의 간단한 번역. ezrast 덕분에 몇 바이트가 절약되었습니다.

설명

->a{
    # Initialize the permanent to 0
    p=0
    # For each permutation of a's rows...
    a.permutation{|b|
        # ... initialize the product to 1,
        n=1
        # initialize the index to -1; we'll use this to go down the main diagonal
        # (i starts at -1 because at each step, the first thing we do is increment i),
        i=-1
        # iteratively calculate the product,
        a.map{
            n*=b[i+=1][i]
        }
        # increase p by the main diagonal's product.
        p+=n
    }
    p
}

1
reduce실제로 수동 집계와 비교하여 바이트 수를 아프게합니다.->a{m=0;a.permutation{|b|n=1;a.size.times{|i|n*=b[i][i]};m+=n};m}
ezrast

@ezrast 감사합니다! 그 times루프도 골프 다운 처리했습니다 .
m-chrzan

3

루비 2.4.0, 59 61 바이트

재귀 Laplace 확장 :

f=->a{a.pop&.map{|n|n*f[a.map{|r|r.rotate![0..-2]}]}&.sum||1}

덜 골프 :

f=->a{
  # Pop a row off of a
  a.pop&.map{ |n|
    # For each element of that row, multiply by the permanent of the minor
    n * f[a.map{ |r| r.rotate![0..-2]}]
  # Add all the results together
  }&.sum ||
  # Short circuit to 1 if we got passed an empty matrix
  1
}

루비 2.4는 공식적으로 출시되지 않았습니다. 이전 버전에서는 7 바이트를 추가 .sum하여로 교체해야 .reduce(:+)합니다.


2

수학, 54 바이트

Coefficient[Times@@(#.(v=x~Array~Length@#)),Times@@v]&

빈 행렬은 더 이상 고려되지 않으므로이 솔루션은 유효합니다. 이것은 지속 물에 대한 MathWorld 페이지에서 시작됩니다 .


@alephalpha 이것은 행을 사용하여 계수를 식별하는 깔끔한 아이디어이지만 행이 고유하지 않은 경우 중단되지 않습니까?
마일

2

자바 스크립트 (ES6), 82 바이트

f=a=>a[0]?a.reduce((t,b,i)=>t+b[0]*f(a.filter((_,j)=>i-j).map(c=>c.slice(1))),0):1

물론 빈 행렬과 함께 작동합니다.


@ETHproductions 나는 결코 배우지 않는다 ...
Neil

1
정확히 단지 14시간 이전에 발행 된 내 코드는, 나는 복잡한 번호를 추가하려고합니다
edc65

2

줄리아 0.4 , 73 바이트

f(a,r=1:size(a,1))=sum([prod([a[i,p[i]] for i=r]) for p=permutations(r)])

줄리아의 최신 버전에서 당신은 삭제할 수 있습니다 []함축 주위에 있지만, 필요 using Combinatorics에 대한 permutations기능. 를 포함하여 Julia의 모든 숫자 유형과 호환됩니다 Complex. 기본 함수 인수로 정의 된 객체 r이며 UnitRange이전 함수 인수에 따라 달라질 수 있습니다.

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

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