전치 및 대각선


21

이 문제를 해결하려면 주어진 정사각 행렬의 대각선을 출력하는 프로그램이나 함수를 작성해야합니다. 그러나 솔루션 소스 코드의 행과 열을 바꾸면 대신 행렬의 반 대각선을 반환하는 프로그램이나 함수가되어야합니다. 자세한 내용을 읽어보십시오 ...

규칙

  • 솔루션의 소스 코드는 선택한 표준 개행 (줄 바꿈, 캐리지 리턴 또는 둘의 조합)으로 구분 된 2D 문자 그리드로 간주됩니다.
  • 소스 코드의 줄은 이전 줄보다 길 수 없습니다. 유효한 레이아웃의 예는 다음과 같습니다.

    ###
    ###
    ###
    

    ########
    #######
    ###
    ###
    #
    

    다음은 유효하지 않은 레이아웃의 예입니다 (세 번째 줄이 두 번째 줄보다 길기 때문에).

    ######
    ####
    #####
    ###
    
  • 두 솔루션은 서로의 전치가되어야합니다. 즉, 행과 열을 교환하여 다른 솔루션을 가져와야합니다. 유효한 두 쌍은 다음과 같습니다.

    abc
    def
    ghi
    

    adg
    beh
    cfi
    

    print 10
    (~^_^)~
    foo
    bar
    !
    

    p(fb!
    r~oa
    i^or
    n_
    t^
     )
    1~
    0
    

    공백은 다른 문자와 같이 취급됩니다. 특히, 후행 공백은 조옮김에서 후행 공백이 아닐 수 있으므로 중요합니다.

  • 각 솔루션은 한 자리 정수의 비어 있지 않은 제곱 행렬을 입력으로 사용하는 프로그램 또는 함수 여야합니다. 한 솔루션은 행렬의 모든 대각선 목록을 출력하고 다른 솔루션은 모든 대각 대각선 목록을 출력해야합니다. 합리적이고 명확한 입력 및 출력 형식을 사용할 수 있지만 두 솔루션간에 동일해야합니다 (두 기능 또는 두 프로그램 모두에 해당해야 함을 의미 함).

  • 각 대각선은 왼쪽 위에서 오른쪽 아래로 이어지며 위에서 아래로 정렬되어야합니다.
  • 각 대각 대각선은 왼쪽 아래에서 오른쪽 위로 뻗어 있으며 위에서 아래로 주문해야합니다.

채점

가능한 "사각형"인 솔루션을 권장하기 위해 기본 점수는 솔루션의 행 수 또는 열 수 중 더 큰 값입니다. . 적은 것이 좋습니다. 타이는 줄 바꿈을 계산하지 않고 솔루션 의 문자 수로 구분됩니다 . 다시, 적은 것이 좋습니다. 예:

abcd
efg
h

이것과 전치의 기본 점수는 4 이고 열이 4 개이므로 동점 점수는 8입니다. (새줄이 아닌 문자가 8 개이므로)입니다. 답의 머리글에 두 값을 모두 인용하십시오.

테스트 사례

두 솔루션이 수행하는 실제 작업은 여기서 가장 큰 도전이되어서는 안되지만 다음은 솔루션 테스트에 도움이되는 두 가지 예입니다.

Input:
1 2 3
4 5 6
7 8 9
Diagonals:
3
2 6
1 5 9
4 8
7
Antidiagonals:
1
4 2
7 5 3
8 6
9

Input:
1 0 1 0
0 1 0 1
1 0 1 0
0 1 0 1
Diagonals:
0
1 1
0 0 0 
1 1 1 1
0 0 0
1 1
0
Antidiagonals:
1
0 0
1 1 1
0 0 0 0
1 1 1
0 0
1


내가 깨달았 샌드 박스 포스트는 내가 이미이 게시 깨달았다 아침 SE에 도착하기 전에 내가 심령해야합니다 생각하기 시작하고이 시점에서 ... 그것을 통해 중간 얻기 전에 옆에 있었다 : P
ETHproductions

답변:


19

자바 스크립트, 득점 (20) (14), ( 258 176이 아닌 줄 바꿈 문자)

///mmm()mu[=+r
///=.av=a,pr"=
///> p,>px=[ [
m=>//(yv()xp"]
m. ////.(=+]+)
map((////>y?u&
v,y)=>v//r]r:&
.map((u,x//[ur
)=>r[p=m.//p)
length-1-//],
x+y]=r[p]////
?r[p]+" "+u//
:u),r=[])&&r

///mmmv.)lx?:
///=.a,m=e+ru
///> pya>ny[)
m=>//()prg]p,
m. //(=([t=]r
map(//>(phr+=
(v,y//vu=-["[
)=>v.//,m1p ]
map((//x.-]")
u,x)=>r////+&
[p=x+y]////u&
=r[p]?r[p]//r
+" "+u:u),//
r=[])&&r

코드 스 니펫 예제 :

f=

///mmm()mu[=+r
///=.av=a,pr"=
///> p,>px=[ [
m=>//(yv()xp"]
m. ////.(=+]+)
map((////>y?u&
v,y)=>v//r]r:&
.map((u,x//[ur
)=>r[p=m.//p)
length-1-//],
x+y]=r[p]////
?r[p]+" "+u//
:u),r=[])&&r

console.log(f([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]))

f=

///mmmv.)lx?:
///=.a,m=e+ru
///> pya>ny[)
m=>//()prg]p,
m. //(=([t=]r
map(//>(phr+=
(v,y//vu=-["[
)=>v.//,m1p ]
map((//x.-]")
u,x)=>r////+&
[p=x+y]////u&
=r[p]?r[p]//r
+" "+u:u),//
r=[])&&r

console.log(f([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]))


구문 강조를 활성화 할 수 있습니까? 장소 <!-- language-all: lang-javascript -->첫 번째 코드 블록 전에.
CalculatorFeline

8

MATL , 10 점 (줄 바꿈이 아닌 문자 100 개)

%P!       
  Q&%     
  TXd!    
  %d      
     P!   
      "@% 
       Xz 
      %z  
         q
         !

10 자로 된 10 줄이 있습니다 (뒤 공백을 참고하십시오).

위의 코드는 대각선을 생성합니다. 온라인으로 사용해보십시오!

전치 버전은 대각 대각선을 생성합니다. 온라인으로 사용해보십시오!

설명

참고

  • % 주석 기호이며, 나머지 행은 무시됩니다.

  • 같은 두 문자의 기능 Xd캔은로 분할 할 수 없습니다 Xd연속 선이다.

원본 코드

주석 처리 된 부분이없는 선형화 된 원래 코드는

Q&TXd!P!"@Xzq!

다음과 같이 작동합니다.

Q      % Implicit input. Add 1 to each entry to make them positive
&      % This modifes default inputs/ouputs of next function, which is Xd
       % Specifically, it specifies 2 inputs and 1 ouput
T      % Push true
Xd     % Diagonals of matrix. With second input true, it gives all diagonals,
       % starting from below. The columns are arranged as columns of a matrix,
       % padding with zeros
!P!    % Flip horizontally. This is to produce the correct display order
"      % For each column
  @    %   Push current column
  Xz   %   Remove zeros
  q    %   Subtract 1
  !    %   Transpose into a row
       % Implicit end. Implicit display of stack contents

전치 된 코드

변환 된 코드는 다음과 같습니다.

P!QT&Xd!P!"@Xzq!

원래 코드와 비교하여 다음 두 가지 차이점이 있습니다.

  • T&교환된다. 이것은 T함수가 아닌 리터럴 이기 때문에 효과가 없으므로 &사양을 가로 채지 않습니다 .
  • P! 처음에 추가됩니다.

추가 된 코드는 수정 된 행렬의 대각선이 입력의 대각 대각선이되도록 입력 행렬을 수정합니다.

P      % Implicit input. Flip vertically
!      % Transpose

7

젤리 , 점수 7, 49 비줄 바꿈 바이트

대각선 인쇄 프로그램

......U
......Œ
......D
......ṙ
......L
......Ṛ
ŒDṙLṚUU

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

대각 인쇄 프로그램

......Œ
......D
......ṙ
......L
......Ṛ
......U  
UŒDṙLṚU

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

이전 답변 (정렬되지 않은 출력), 점수 3, 6 줄 바꿈이 아닌 바이트

대각선 인쇄 프로그램

UU
UŒ
ŒD

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

대각 인쇄 프로그램

UUŒ
UŒD

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


6

젤리 , 4 점 (12 자)

이전 점수 : 5 (16 자), 4 (16 자)

기발한

ŒDṙṚ
D  ñ
ṙLñL

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

바꾸어 놓다

ŒDṙ
D L
ṙ ñ
ṚñL

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

배경

대각선

정사각 행렬의 대각선 (최고에서 최하단)을 얻는 간단한 방법은 다음과 같습니다.

ŒDṙLṚ

입력 매트릭스 용 M , ŒD나열 M 의 대각선은 주 대각선 시작하여 위쪽으로 이동.

입력

1 2 3
4 5 6
7 8 9

이 결과

1 5 9
2 6
3
7
4 8

ṙL그런 다음 M 의 길이 를 계산 L하고 결과 길이를 회전시킵니다 (M) 단위를 왼쪽으로 .

이 예에서는 길이가 3 이고

7
4 8
1 5 9
2 6
3

마지막으로 대각선의 순서를 반대로하여

3
2 6
1 5 9
4 8
7

예제 입력을 위해.

대각선

동일한 빌딩 블록을 사용하여 정사각형 행렬의 대각 대각선을 구할 수 있습니다.

ṚŒDṙL

입력 행렬 M의 경우 먼저 행의 순서를 반대로 바꿉니다.

입력

1 2 3
4 5 6
7 8 9

이 결과

7 8 9
4 5 6
1 2 3

이전 ŒDṙL과 같이 결과의 대각선 (맨 아래에서 맨 위)을 생성합니다.

이 예에서는

1
4 2
7 5 3
8 6
9

바라는대로.

작동 원리

Jelly에서 각 줄은 링크 (기능)를 정의합니다 . 특히 마지막 줄은 프로그램이 시작될 때 실행되는 메인 링크를 정의 합니다.

다른 링크를 호출해야합니다. 이 답변은을 사용 ñ하여 아래 링크를 dyadically 실행합니다. ñ랩 어라운드하므로 메인 링크에서 호출 될 때 첫 번째 라인에서 링크를 실행합니다.

기발한

메인 링크

ṙLñL

입력 행렬 얻어 M을 그것의 길이를 계산 L하고, 입력 회전 길이 (M) 을 단위를 왼쪽 (이되지 바꾼다 않습니다 M , 마지막 결과 (과 제 링크 호출) M )과 길이 ( 엠) 인수로.

첫 번째 링크

ŒDṙṚ

의 대각선 계산 M 과를 ŒD(이전 섹션에서와 같이), 그 결과 회전 길이 (M) 와 함께 왼쪽으로 단위를 다음과 결과의 순서를 반전 .

두 번째 링크는 호출되지 않습니다.

바꾸어 놓다

메인 링크

 ṚñL

입력 행렬 M을 취하고로 역행을 계산합니다 . 그런 다음의 길이를 계산 M 과를 L과 인수를 첫 번째 링크를 호출 역 (M)길이 (M) .

첫 번째 링크

ŒDṙ

그런 다음 (이전 섹션에서 볼 수 있듯이 )reverse (M) 의 대각선을 계산 ŒD하고 마지막으로 결과 길이 (M) 단위를 왼쪽 으로 회전합니다. .

나머지 링크는 호출되지 않습니다.


5

R, 점수 14 13 11 ( 99 95 개행 문자 제외)

점수를 1만큼 향상시킨 @Giuseppe에게 감사합니다. 조옮김에서 중복을 사용하여 몇 개의 문자를 제거했습니다. 골프가 아닌 언어에 대한 현재 최고 점수!

######`,scr
`::`(#:fpoo
pryr,#:)llw
f)(###`(i((
split (#tmm
p,col(p#())
)+row#r#m-)
(p)))#y#,#)
######r

그리고 전치 :

#`pfsp)(#
#:r)p,+p#
#:y(lcr)#
#`r#ioo)#
#(,#tlw)#
#### (###
`::`(pryr
,f)(####
split(m,
col(m)-#
row(m)))

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


1
row(m)+col(m)반 대각선이 더 짧습니다.
Giuseppe

@Giuseppe 물론입니다. 감사합니다! 지금 편집했습니다.
rturnbull

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