인덱스 합계 및 내 행렬 제거


9

인덱스 합계 및 내 행렬 제거

선호하는 언어로 된 행렬 / 2d 배열

입력:

  • 행렬은 항상 홀수 길이를 갖습니다
  • 행렬은 항상 완벽하게 정사각형입니다.
  • 행렬 값은 사용자 언어의 정수일 수 있습니다 (양수 또는 음수)

예:

1  2  3  4  5  6  7
2  3  4  5  6  7  8
3  4  50 6  7  8  9
4  5  6 100 8  9  10
5  6  7  8 -9  10 11
6  7  8  9  10 11 12
7  8 900 10 11 12 0

정의 :

  • "중심 수"는 왼쪽, 오른쪽, 위 및 아래에 같은 양의 숫자를 갖는 숫자로 정의됩니다.

이 경우 가장 중간에 100

  • "외부 쉘"은 x 및 y 인덱스가 0 또는 행렬 크기 인 숫자의 모음입니다.

1  2  3  4  5  6  7
2                 8
3                 9
4                 10
5                 11
6                 12
7  8 900 10 11 12 0

당신의 작업 :

각각의 값에 1 기반 인덱스를 곱한 후 각 행과 열의 합계를 중앙 수에 더합니다.

예를 들어 단일 행

4  5  6  7  8

각 번호마다

number * index + number * index.....

4*1 + 5*2 + 6*3 + 7*4 + 8*5 => 100

예:

 2 -3 -9  4  7  1  5  => 61
-2  0 -2 -7 -7 -7 -4  => -141
 6 -3 -2 -2 -3  2  1  => -10
 8 -8  4  1 -8  2  0  => -20
-5  6  7 -1  8  4  8  => 144
 1  5  7  8  7 -9 -5  => 10
 7  7 -2  2 -7 -8  0  => -60
                         |
78 65 60 45 -15 -89 10   => 154
                     |
                     => -16
  • 모든 행과 열에 대해이 값을 결합합니다.
  • 이제 이것들을 합산하면 => 154-16 = 138
  • 해당 번호를 "중앙 번호"에 추가하고 매트릭스의 "외부 쉘"을 제거합니다.

 0 -2 -7 -7 -7     => -88
-3 -2 -2 -3  2     => -15
-8  4 1+138 -8  2  => 395
 6  7 -1  8  4     => 69
 5  7  8  7 -9     => 26

19 69 442 30 -26

당신이 하나의 숫자로 끝날 때까지 이것을하십시오

-2 -2 -3     => -15
 4  1060 -8  => 2100
 7 -1  8     => 29

27 2115 5
  • 2114 + 2147을 1060에 추가
  • "외부 쉘"을 제거하고 5321을 얻으십시오
  • 이제 우리는 하나의 숫자가 남았습니다

이것은 출력입니다!

테스트 사례 :

-6

-6

-7 -1  8
-4 -6  7
-3 -6  6

2

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

-365

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

17611

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

-28473770

이것은 코드 골프 도전이므로 바이트 수가 가장 적은 프로그램이 승리합니다.


당신은 맞습니다, 오타입니다
downrep_nation

3
음수가 문제가되는 이유는 무엇입니까? 난 도전이 esolangs에 적응해야한다고 생각하지 않지만 어쩌면 다른 방법이 더 적합합니다
downrep_nation

@LuisMendo 문제가 아니라고 생각합니다. "매트릭스 값은 사용자 언어의 정수일 수 있습니다"라는 규칙은 언어에 음수가 없으면 지원하지 않아야한다는 의미입니다.
Fatalize

실제로 맞습니다. 하지만 테스트 케이스가 제대로 작동 실 거예요
downrep_nation

2
"나는 도전 esolangs를 조정해야한다고 생각 해달라고하지만 어쩌면 다른 방법은 주위에 더 적합"돌에 새겨진해야 그
edc65

답변:


4

MATL , 36 34 바이트

tnq?`t&+stn:*sytn2/)+ 7M(6Lt3$)tnq

입력은 ;행 분리 자로 2D 배열입니다

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

설명

tnq       % Take input. Duplicate, get number of elements, subtract 1
?         % If greater than 0
  `       %   Do...while
    t     %     Duplicate
    &+    %     Sum matrix with its transpose
    s     %     Sum each column. Gives a row vector
    tn:   %     Vector [1 2 ...] with the same size
    *     %     Multiply element-wise
    s     %     Sum of vector. This will be added to center entry of the matrix
    y     %     Duplicate matrix
    tn2/  %     Duplicate, get half its number of elements. Gives non-integer value
    )     %     Get center entry of the matrix, using linear index with implicit rounding
    +     %     Add center entry to sum of previous vector
    7M    %     Push index of center entry again
    (     %     Assgined new value to center of the matrix
    6Lt   %     Array [2 j1-1], twice. This will be used to remove shell
    3$)   %     Apply row and col indices to remove outer shell of the matrix
    tnq   %     Duplicate, number of elements, subtract 1. Falsy if matrix has 1 entry
          %   End do...while implicitly. The loop is exited when matrix has 1 entry
          % End if implicitly
          % Display stack implicitly

4

파이썬 2.7, 229 바이트

이것은 이와 같은 것에 대한 첫 번째 시도 이므로이 제출물과 함께 모든 규칙을 따르기를 바랍니다. 이것은리스트의 목록을 매개 변수로 취하는 함수일뿐입니다. 나는 합계와 목록 이해가 약간 단축 된 것처럼 느껴지지만 너무 어려웠습니다. :디

def r(M):
  t=len(M)
  if t==1:return M[0][0]
  M[t/2][t/2]+=sum(a*b for k in [[l[x] for l in M]for x in range(0,t)]for a,b in enumerate(k,1))+sum([i*j for l in M for i,j in enumerate(l,1)])
  return r([p[+1:-1]for p in M[1:-1]])

몇 바이트를 줄일 수 있도록 도와 주신 Easter Irk to Thx.


1
연산자 ( ...) + sum([i*j...-> ...)+sum([i*j...) 사이의 공백을 제거 할 수 있지만 전반적으로 훌륭한 첫 번째 게시물입니다!!
Rɪᴋᴇʀ

oooh는 그것을 놓쳤다. 감사!
Jeremy

1
또한 ...]for ...작동합니다. 그런 공간을 2 개 이상 제거 할 수 있습니다. (목록의 끝은 for 루프를 친다)
Rɪᴋᴇʀ

3

C #, 257 바이트

여기에 esolang 답변입니다

void f(int[][]p){while(p.Length>1){int a=p.Length;int r=0;for(int i=0;i<a;i++)for(int j=0;j<a;j++)r+=(i+j+2)*p[i][j];p[a/2][a/2]+=r;p=p.Where((i,n)=>n>0&&n<p.Length-1).Select(k=>k.Where((i,n)=>n>0&&n<p.Length-1).ToArray()).ToArray();}Console.Write(p[0][0]);

언 골프 :

void f(int[][]p)
    {
        while (p.Length>1)
        {
            int a=p.Length;
            int r=0; //integer for number to add to middle
            for (int i = 0; i < a; i++)
                for (int j = 0; j < a; j++)
                    r +=(i+j+2)*p[i][j]; //add each element to counter according to their 1 based index
            p[a / 2][a / 2] += r; //add counter to middle
            p = p.Where((i, n) => n > 0 && n < p.Length - 1).Select(k => k.Where((i, n) => n > 0 && n < p.Length - 1).ToArray()).ToArray(); //strip outer shell from array
        }
        Console.Write(p[0][0]); //print last and only value in array
    }

2
이봐, J는 esolang이 아니야.
마일

using System.Linqand를 포함하지 않으면 컴파일되지 않습니다 using System. 그래도 규칙에 필요한지 확실하지 않습니다.
Yytsi 2016 년

그것은 완전한 프로그램이 아니며, 유일한 기능이므로 내가 아는 한 괜찮습니다. 내 속성, makefile에 App.config와 모든 바이트를 포함시켜야합니까? no
downrep_nation

@downrep_nation 함수일 뿐이고 점수에 바이트를 포함했을 때 일부 사람들이 소스에 포함하는 것을 보았 기 때문에 이상합니다.
Yytsi 2016 년

이제 그것에 대해 생각할 때 atleast를 가져와야하는 라인에 있습니다 System.Linq. 특정 기능을 사용하기 위해 가져 오기가 필요한 다른 언어는 동일한 프로세스를 거치므로 모든 모듈이 C #의 메모리에로드되었다고 가정하는 것은 불공평하다고 생각합니다.
Yytsi 2016 년

2

J, 66 바이트

([:}:@}."1@}:@}.]+(i.@,~=](]+*)<.@-:)@#*[:+/^:2#\*]+|:)^:(<.@-:@#)

당면 과제에 설명 된 프로세스를 기반으로하는 간단한 접근 방식입니다.

[:+/^:2#\*]+|:합계를 얻습니다. ]+(i.@,~=](]+*)<.@-:)@#*중심을 합하여 증분하는 특히 추한 방법입니다. [:}:@}."1@}:@}.외부 쉘을 제거합니다. 이 작업을 수행하는 더 좋은 방법이있을 것입니다.

용법

   f =: ([:}:@}."1@}:@}.]+(i.@,~=](]+*)<.@-:)@#*[:+/^:2#\*]+|:)^:(<.@-:@#)
   f _6
_6
   f _7 _1 8 , _4 _6 7 ,: _3 _6 6
2
   f 6 7 _2 5 1 , _2 6 _4 _2 3 , _1 _4 0 _2 _7 , 0 1 4 _4 8 ,: _8 _6 _5 0 2 
_365
   f 8 3 5 6 6 _7 5 , 6 2 4 _2 _1 8 3 , 2 1 _5 3 8 2 _3 , 3 _1 0 7 _6 7 _5 , 0 _8 _4 _9 _4 2 _8 ,8 _9 _3 5 7 8 5 ,: 8 _1 4 5 1 _4 8
17611
   f (13 13 $ _9 _7 2 1 1 _2 3 _7 _3 6 7 1 0 _7 _8 _9 _2 7 _2 5 4 7 _7 8 _9 8 _4 4 _1 0 1 5 _3 7 1 _2 _9 4 8 4 8 1 _1 0 7 4 6 _9 3 _9 3 _9 _6 _8 _4 _8 _9 2 1 1 _8 8 2 6 _4 _8 _5 1 1 2 _9 3 7 2 5 _6 _1 2 _8 _5 _7 _4 _9 _2 5 0 2 _4 2 0 _2 _3 _6 _3 2 _9 8 1 _5 5 0 _4 _1 _9 _9 _9 _8 0 _5 _7 1 _2 1 _4 _1 5 7 _6 _9 4 _2 8 7 _9 _5 3 _1 1 8 4 _6 6 _3 _4 3 5 6 8 _2 5 _1 _7 _9 _1 7 _9 4 6 7 6 _8 5 1 0 _3 0 _3 _2 5 _4 0 0 0 _1 7 4 _9 _4 2)
_28473770

2

Brachylog , 114 바이트

{l1,?hh.|:{:Im:I:?:{[L:I:M]h:JmN,Ll:2/D(IJ,M{$\:?c:{:{:ImN,I:1+:N*.}f+.}a+.}:N+.;'(DIJ),N.)}f.}f:7a$\:7a&.}.
brbr.

나는 이것이 정직하게 작동한다고 놀랐습니다. 적어도 Brachylog는 내장 요소로 "해당 요소의 값 변경"이 필요하다는 것을 깨달았습니다.

사용 예 :

?- run_from_file('code.brachylog', '[[0:_2:_7:_7:_7]:[_3:_2:_2:_3:2]:[_8:4:139:_8:2]:[6:7:_1:8:4]:[5:7:8:7:_9]]', Z).
Z = 5321 .

설명

더 읽기 쉽고 더 긴 버전 :

{l1,?hh.|:2f:7a$\:7a&.}.
:Im:I:?:3f.
[L:I:M]h:JmN,Ll:2/D(IJ,M:4&:N+.;'(DIJ),N.)
$\:?c:5a+.
:6f+.
:ImN,I:1+:N*.
brbr.

각 술어 (즉, Main Predicate + 술어 1 인 첫 번째 행을 제외한 각 행)가 수행하는 작업을 대략적으로 설명하려고합니다.

  • 기본 술어 + 술어 1 {l1,?hh.|:2f:7a$\:7a&.}.: 입력에 하나의 행만있는 경우 알고리즘을 종료하고 유일한 값을 리턴하십시오. 그렇지 않으면 술어 2를 만족시키는 모든 행을 찾은 다음 결과 행렬에 술어 7을 적용한 다음 전치에 술어 7을 적용한 다음 재귀 적으로 호출하십시오.

  • 술어 2 :Im:I:?:3f.: I행렬 의 세 번째 행을 가져 와서 술어 3을 만족하는 행의 모든 ​​값 I과 행렬을 추가 입력으로 찾습니다 .

  • 술어 3 [L:I:M]h:JmN,Ll:2/D(IJ,M:4&:N+.;'(DIJ),N.): L행이고 행 I의 인덱스이며 M행렬입니다. NJth 요소입니다 L. 길이 경우 L2로 나눈 값이 모두 동일 I하고 J, 그 출력의 합 N행렬에 술어 (4)의 결과는. 그렇지 않으면 출력은 단지 N입니다. 이 술어의 핵심은 중심 요소가 합에 추가되는 것을 제외하고 행렬을 재생성합니다.

  • 술어 4 $\:?c:5a+.: 행렬의 각 행과 열에 술어 5를 적용하고 결과의 합으로 출력을 통합하십시오.

  • 술어 5 :6f+.: 행에서 술어 6의 모든 유효한 출력을 찾고 결과 목록의 합계로 출력을 통합하십시오.

  • 술어 6 :ImN,I:1+:N*.:  행 NIth 값이며로 출력을 통합하십시오 N * (I+1).

  • 술어 7 brbr.: 행렬의 첫 번째 행과 마지막 행을 제거합니다.


2

APL, 56 자

{{1 1↓¯1 ¯1↓⍵+(-⍴⍵)↑(⌈.5×⍴⍵)↑+/(⍵⍪⍉⍵)+.×⍳≢⍵}⍣(⌊.5×≢⍵)⊣⍵}

영어로:

  • ⍣(⌊.5×≢⍵) "반올림 된 크기의 절반"시간 반복
  • (⍵⍪⍉⍵)+.×⍳≢⍵ 행렬의 내부 곱과 인덱스 벡터로 전치
  • (-⍴⍵)↑(⌈.5×⍴⍵)↑ 0으로 채워진 행렬로 결과 변환
  • 1 1↓¯1 ¯1↓ 외피를 제거합니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.