매트릭스를 접어!


13

행렬이 주어지면 값을 위 / 아래 또는 왼쪽 / 오른쪽으로 합산하여 X를 형성하고 접은 다음 목록을 반환합니다. 여기에 알고리즘을 설명합니다.

연산

입력 한 값은 언어의 합리적인 수치 범위 내에서 홀수 크기의 정수로 구성된 행렬입니다.

다음 행렬을 예로 들어 보겠습니다.

1 2 3 2 1
0 3 2 3 0
4 2 5 6 3
7 4 7 9 4
0 6 7 2 5

먼저 주 대각선 또는 대각선에있는 가장 가까운 숫자에 모든 숫자를 추가하십시오. 즉, 행렬을 기본 대각선과 대각 대각선을 따라 네 개의 섹션으로 나누고 각 섹션의 모든 숫자를 중앙을 향해 합산합니다.

1   2   3   2   1
    ↓   ↓   ↓    
0 → 3   2   3 ← 0
        ↓        
4 → 2 → 5 ← 6 ← 3
        ↑        
7 → 4   7   9 ← 4
    ↑   ↑   ↑    
0   6   7   2   5

이 단계는 다음과 같은 결과를 제공합니다.

1        1
  5    5
    39
  17  15
0        5

그런 다음 X를 평평하게하고 요소를 왼쪽 상단부터 왼쪽 하단과 마지막으로 엮어서 접습니다. 결과는 다음과 같습니다.

1, 0, 5, 17, 39, 5, 15, 1, 5

이것을 메인 대각선을 늘리고 시계 반대 방향으로 회전시키는 것으로 상상할 수 있습니다.

이것이 최종 결과입니다.

도전

이 알고리즘을 구현하십시오. 표준 허점이 적용됩니다. 모든 합리적인 I / O 형식이 허용됩니다.

테스트 사례

Input
Output

1 2 3 2 1
0 3 2 3 0
4 2 5 6 3
7 4 7 9 4
0 6 7 2 5

1, 0, 5, 17, 39, 5, 15, 1, 5

1 2 3 4 5
5 4 3 2 1
1 3 5 7 9
0 9 8 7 6
6 7 8 9 0

1, 6, 11, 16, 47, 7, 22, 5, 0

1 3 7 4 8 5 3
8 4 7 5 3 8 0
0 6 3 6 9 8 4
2 6 5 8 7 4 2
0 6 4 3 2 7 5
0 6 7 8 5 7 4
8 5 3 2 6 7 9

1, 8, 15, 11, 23, 20, 62, 32, 25, 13, 18, 3, 9

"5x5 아님"매트릭스 테스트 사례를 추가 할 수 있습니까?
완전히 인간적인

1
@icrieverytim 당신이 간다
HyperNeutrino

답변:


7

자바 스크립트, 113 바이트

s=>(l=s.length-1,a=[],s.map((v,y)=>v.map((n,x)=>a[q=2*[x,y,l-y].sort((u,v)=>u-v)[1]+(y>l/2),q-=q>l]=~~a[q]+n)),a)


음 .. 왜 ~~? 그들은 서로를 중화하므로 필요하지 않습니다.
Kevin Cruijssen

2
@KevinCruijssen ~~undefined==0, 그래서 이것은보다 골퍼 (a[q]||0)입니다.
Neil

@Neil Ah,에 대해 생각하지 않았습니다 undefined. 사용 된 테스트 사례를 복사했을 때 tsh 없이 작동하는 것으로 나타났습니다 ~~. 그리고 서로 ~~x비슷한 -(-x)중화 이기 때문에 우연히 거기에 놓인 것으로 생각했습니다. 수정 해 주셔서 감사합니다.
Kevin Cruijssen

5

젤리 , 25 23 21 바이트

AṂ×ṠṚ
LHŒRṗ2Ç€ḅLĠịFS€

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

대체 버전, 19 바이트

AṂ×ṠṚ
LHŒRṗ2Ç€ĠịFS€

Ġ중첩 배열에 대해 부적절하게 동작 했기 때문에 작동 하지 않았습니다 . 유일한 차이점은 작동 방법 에서 언급 한 [q, p] 쌍 은 정렬 하기 전에 p + nq 에 매핑하는 대신 사전 식으로 정렬한다는 것입니다 .

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

배경

먼저 요소를 좌표로 바꾸고 왼쪽과 아래쪽으로 늘리고 행렬 중앙에 (0, 0) 을 배치 합니다.

7x7 행렬 M의 경우 다음 좌표를 얻습니다.

(-3,-3) (-3,-2) (-3,-1) (-3, 0) (-3, 1) (-3, 2) (-3, 3)
(-2,-3) (-2,-2) (-2,-1) (-2, 0) (-2, 1) (-2, 2) (-2, 3)
(-1,-3) (-1,-2) (-1,-1) (-1, 0) (-1, 1) (-1, 2) (-1, 3)
( 0,-3) ( 0,-2) ( 0,-1) ( 0, 0) ( 0, 1) ( 0, 2) ( 0, 3)
( 1,-3) ( 1,-2) ( 1,-1) ( 1, 0) ( 1, 1) ( 1, 2) ( 1, 3)
( 2,-3) ( 2,-2) ( 2,-1) ( 2, 0) ( 2, 1) ( 2, 2) ( 2, 3)
( 3,-3) ( 3,-2) ( 3,-1) ( 3, 0) ( 3, 1) ( 3, 2) ( 3, 3)

이제 각 좌표 쌍의 최소 절대 값을 계산하고 두 좌표의 부호에 곱하여 (i, j)(sign (i) m, sign (j) m)에 매핑합니다 . 여기서 m = min (| i | , | j |) .

(-3,-3) (-2,-2) (-1,-1) ( 0, 0) (-1, 1) (-2, 2) (-3, 3)
(-2,-2) (-2,-2) (-1,-1) ( 0, 0) (-1, 1) (-2, 2) (-2, 2)
(-1,-1) (-1,-1) (-1,-1) ( 0, 0) (-1, 1) (-1, 1) (-1, 1)
( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0)
( 1,-1) ( 1,-1) ( 1,-1) ( 0, 0) ( 1, 1) ( 1, 1) ( 1, 1)
( 2,-2) ( 2,-2) ( 1,-1) ( 0, 0) ( 1, 1) ( 2, 2) ( 2, 2)
( 3,-3) ( 2,-2) ( 1,-1) ( 0, 0) ( 1, 1) ( 2, 2) ( 3, 3)

동일한 쌍에 해당하는 행렬 요소를 합산해야합니다. 합의 순서를 결정하기 위해 각 쌍 (p, q)p + nq에 매핑합니다 . 여기서 nM 의 행 / 열 수입니다 .

-24 -16  -8   0   6  12  18
-16 -16  -8   0   6  12  12
 -8  -8  -8   0   6   6   6
  0   0   0   0   0   0   0
 -6  -6  -6   0   8   8   8
-12 -12  -6   0   8  16  16
-18 -12  -6   0   8  16  24

합계의 순서는 정수의 순서에 해당하고 그 합계에 해당합니다.

작동 원리

LHŒRṗ2Ç€ḅLĠịFS€  Main link. Argument: M (matrix)

L                Compute n, the length (number of rows) of M.
 H               Halve it.
  ŒR             Symmetric range; map t to [-int(t), ..., 0, int(t)].
    ṗ2           Compute the second Cartesian power, yielding all pairs [i, j]
                 with -t ≤ i, j ≤ t.
      ǀ         Map the helper link over the resulting array of pairs.
         L       Yield n.
        ḅ        Unbase; map each pair [q, p] to (p + nq).
          Ġ      Group the indices of the resulting array of n² integers by their
                 corresponding values, ordering the groups by the values.
            F    Flatten M.
           ị     Index into the serialized matrix.
             S€  Compute the sum of each group.


AṂ×ṠṚ            Helper link. Argument: [i, j] (index pair)

A                Absolute value; yield [|i|, |j|].
 Ṃ               Minimum; yield m := min(|i|, |j|).
   Ṡ             Sign; yield [sign(i), sign(j)].
  ×              Multiply; yield [p, q] := [sign(i)m, sign(j)m].
    Ṛ            Reverse; yield [q, p].

5
이것은 훌륭하다.
Uriel



2

APL (Dyalog) , 60 바이트 *

내 동료와 협력하여 마샬 .

익명 접두사 람다. 행렬을 인수로 받아서 벡터를 반환합니다. 많은 시스템에서 기본값 인 0 ⎕IO ( I ndex O rigin)을 0으로 가정 합니다.

{(,⍉{+/,(s×-×⍺)↓⍵×i∊¨⍨s←⌊⊃r÷2}⌺r⊢⍵)/⍨,(⊢∨⌽)=/¨i←⍳r←⍴⍵}

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

{} 익명의 람다; 옳은 논쟁 (그리스 알파벳의 가장 오른쪽 글자) :

⍴⍵ 인수의 모양 (두 개의 동일한 요소 목록)

r← 로 저장 r( r ho 에서와 같이 )

 모든 ɩ의 해당 크기의 배열의 ndices, 즉 (0 0), (0 1)...

i← 에 저장 i(같이 OTA)

=/¨ 좌표가 동일한 부울 (예 : 대각선)

() 이 익명의 암묵적 접두사 기능을 적용하십시오 :

   논쟁을 뒤집다

  ⊢∨ 또는 수정되지 않은 인수로

, 라벨 (간단한 목록으로 정리)

 이제 대각선에 대한 부울 마스크가 있습니다.

(… 이것을 )/⍨ 사용하여 다음을 필터링하십시오.

  ⊢⍵r인수  를 산출하다

  {… -neighbourhood (필요에 따라 0으로 채워짐)를 오른쪽 인수 ( )로 표시하고 숫자로 채워진 행, 열 (아래쪽 / 오른쪽에는 음수, 없음에 대해서는 0)의 두 요소 목록을 }⌺r 사용하여 각 요소에 대해 다음 익명 접두어 람다를 호출합니다. 왼쪽 인수 ( )로 :r

   r÷2 분할 r2 개와

    첫 번째 요소를 선택하십시오 (동일합니다)

    그것을 바닥

   s← 로 저장 s( s hape)

   i∊⍨¨ 의 각 요소에 대해 i, s멤버 인 경우 부울

   ⍵× 이웃을 곱하다

   ()↓ 다음과 같은 수의 행과 열을 삭제하십시오 (하단 / 음수는 음수).

    ×⍺ 왼쪽 인수의 부호 (즉, 패딩 방향)

    - 부정하다

     곱셈 s그와

   , 라벨 (목록으로 바로 잡기)

   +/ 합계 (플러스 감소)

이제 전체 합계 행렬이 있지만 열 단위로 읽은 모든 값을 필터링해야합니다.

   바꾸어 놓다

  , 라벨 (간단한 목록으로 정리)


*로 계산 합니다 ⎕U233A . 온라인으로 사용해보십시오!

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