행렬 변환


16

행렬 A (행렬의 최대 차원 값이 100 임)가 새 행렬 B로 변환되는 프로그램 또는 함수를 작성하십시오. 새 행렬 B의 각 요소는 행렬 A의 해당 요소의 양의 이웃의 합입니다. .

4 개의 직교 방향의 이웃 만이 고려되며, 가장자리는 둘러싸이지 않습니다.

입력 예 :

 1  2  3
 4 -1 -2
-3 -4 10
 1  2 10

산출:

 6  4  2
 1  6 13
 5 12 10
 2 11 12

규칙 :

  • 입력으로 정수를 사용하십시오.
  • 이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다.

3
프로그래밍 퍼즐 및 코드 골프에 오신 것을 환영합니다! 여기에서 모든 과제는 어떤 솔루션을 이길 지 확실하게 결정하기 위해 객관적인 선정 기준이 필요합니다. 일반적으로 이것은 code-golf 이며 바이트 단위의 가장 짧은 코드가 이깁니다. 또한 유효한 입력 / 출력 형식 (2d 배열? 단일 문자열? 등)을 지정하면 도움이됩니다. 마지막으로, 다루지 않은 일부 경우가 있습니다. 예를 들어, 숫자는 음수로만 둘러싸여 있습니까?
Doorknob

감사합니다. 나는 [100] [100]까지 추측합니다. 네, 숫자는 음수로 둘러싸 일 것입니다.
MT

우리는 어떤 방법으로 의견을들을 수 있습니까?
Maltysen

1
@Doorknob 빈 숫자 집합의 합은 0입니다.
orlp

@ Maltysen STDIN, 나는 추측한다.
MT

답변:


10

MATL , 9 바이트

t0>*1Y6Z+

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

설명

입력 행렬은 적절한 마스크로 다중화되어 음수 값을 0으로 만듭니다. 그런 다음 2D 컨벌루션이 적용되어 각 항목의 이웃 합계를 계산합니다.

t     % Take input implicitly: 2D array. Duplicate
0>    % Is each entry positive? This gives a mask of positive values
*     % Multiply: set negative values of input array to zero
1Y6   % Predefined literal: [0 1 0; 1 0 1; 0 1 0]
Z+    % 2D convolution preserving size. Implicitly display

4
전화가 I / O로 허용됩니까?
orlp

그렇다면, 이것이 이길 수 있는지 의심합니다 : p
Adnan

@Adnan 파이썬에서는 그렇지 않습니다
R. Kap

4
이 사람은 내가하는 데, 나는 여기에 전화에있는 동안을했고, 바칩니다 ... 이러한 문제를 해결하기 위해 노력에 내 시간의 일부를
R. 갑

@ R.Kap 나는 "전화로 타이핑했다"( "전화 통화 중에 타이핑하지 않았다")를 의미했다. 내 영어에 대해 죄송합니다 :-)
Luis Mendo

7

옥타브, 46 44 40 바이트

@flawr 덕분에 2 바이트가 절약되었습니다.
@LuisMendo의 커널은 @flawr보다 4 바이트 짧았습니다.

@(M)conv2(M.*(M>0),(x='aba')~=x','same')

@LuisMendo의 답변 처럼 ! 더 적은 ... 골프.

당신은 여기 ideone 에서 볼 수 있습니다 .


COMON, 나는이 정확한 답변을 게시하려고했습니다.
flawr

1
(x='aba')~=x'대신에 6 바이트 저장을 사용할 수 있습니다[0 1 0;1 0 1;0 1 0]
Luis Mendo

2
@LuisMendo이 마법은 무엇입니까?
비이커

1
@cat .*은 요소 별 행렬 곱셈입니다. 부울 행렬은 MATLAB이 대부분 유형이 없으며 숫자로 처리됩니다. 그래서는 M>0단지 마스크 역할을한다.
비이커

1
(x='aba')~=x'. 정말 멋진 @Luis입니다!
Stewie Griffin

2

자바 스크립트 (ES6), 99 94 바이트

a=>a.map((b,i)=>b.map((_,j)=>(g=(c=j,k=j)=>c[k]>0&&c[k])(a[i-1])+g(a[i+1])+g(b,j-1)+g(b,j+1)))

2 차원 배열을 받아들이고 반환합니다.

편집 : 배열의 끝을 색인화 할 때와 같이 명시 적으로 정의되지 않은 값을 전달할 때 기본 인수가 작동한다는 것을 발견했을 때 완전히 다시 작성되었습니다.



@Socialz Neils 버전이 더 오래되었습니다.
flawr

@flawr 일부 사람들은이 메시지 체인을 게시 날짜 순서가 아닌 투표 순서로보고있을 수 있으므로 관련 답변에 댓글을 달았습니다. 이것은 사용자의 것보다 4 바이트 더 깁니다.
ascx

기본적으로 다른 게시물을 광고하고 싶습니까?
flawr

@Socialz는 4 바이트 더 길었습니다. 예 ;-)
Neil

2

자바 스크립트 (ES6), 95 93 바이트

document.write("<pre>"+(

m=>m.map((a,r)=>a.map((_,c)=>(s=(x,y=0)=>(n=(m[r+y]||0)[c+x])>0&&n)(1)+s(-1)+s(0,1)+s(0,-1)))

)([[  1,  2,  3 ],
   [  4, -1, -2 ],
   [ -3, -4, 10 ],
   [  1,  2, 10 ]])

.join`\n`)



0

Mathcad, 바이트

3x3 커널로 필터링 된 배열의 표준 2D 컨벌루션을 사용합니다. 음수 요소 합과 대각선 커널을 가진 변형은 프로그램이 최소 바이트 동안 실행 중이 아닌 부분에 대한 부분 보상으로 추가되었습니다.

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


Mathcad 스코어링으로 입력 한 바이트 수는 아직 결정되지 않았습니다. 그러나 키보드 동등성을 사용하면 매트릭스 입력이 총계에 포함되지 않는다고 가정하면 28 바이트 영역입니다.

위의 이미지에서 보이는 것은 Mathcad에서 솔루션이 입력되고 표시되는 방식과 정확히 일치합니다.


0

젤리, 23 20 18 바이트

0;+ḊṖ
ZÇ€Z+Ç€
+AHÇ

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

연산

[1,2,3,4] 행이 하나만 있다고 가정 해 봅시다.

A가 0을 추가 한 결과, 즉 [0,1,2,3,4]라고 가정 해 봅시다.

B는 첫 번째 항목, 즉 [2,3,4]를 제거한 결과입니다.

그런 다음 최종 결과는 단순히 A + B 벡터화 된 다음 마지막 항목을 제거합니다.

이제 알고리즘은 이것을 모든 행과 모든 열에 적용한 다음 벡터화 된 합계를 찾는 것입니다.

각 열에?! 젤리가 이것을 지원하지 않는다고 생각했습니다 ...

네가 옳아. 따라서 나는 그것을 바꾸고 각 행에 적용 한 다음 다시 바꿨습니다.

음수를 제거하기위한 알고리즘

여기에서는 각 숫자에 절대 값을 추가하기 만하면됩니다. 각 양수를 두 배로 늘리면서 음수를 효과적으로 제거합니다. 그런 다음 전체 행렬을 반으로 줄이십시오.


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