반 대각선 회전


32

배경

가장 합리적인 프로그래밍 언어에서는 2D 배열의 행이나 열을 회전하는 것이 매우 쉽습니다. 이 도전에서, 당신의 임무는 대신 대각 대각선 을 회전시키는 것입니다. 2D 배열의 대각 대각선은 북동 방향 ↗에서 취한 1D 슬라이스입니다.

입력

적당한 형식의 한 자리 숫자의 비어 있지 않은 직사각형 2D 배열입니다. 배열은 정사각형이 아닐 수 있습니다.

산출

동일한 배열이지만 각 대각 대각선이 오른쪽으로 한 단계 씩 회전합니다.

3x4입력 배열을 고려하십시오

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

이 배열의 대각 대각선은

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

회전 된 버전은

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

따라서 올바른 출력은

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

규칙과 득점

전체 프로그램이나 함수를 작성할 수 있습니다. 언어에서 허용하는 경우 입력 배열을 수정하는 함수를 작성하는 것도 가능합니다. 바이트 수가 가장 적고 표준 허점이 허용되지 않습니다.

리더 보드

다음은 일반 리더 보드와 언어 별 수상자 개요를 생성하는 스택 스 니펫입니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

## Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 헤더에 여러 개의 숫자를 포함 시키려면 (예 : 점수가 두 파일의 합계이거나 통역사 플래그 페널티를 별도로 나열하거나 개선 된 이전 점수를 표시하려는 경우) 실제 점수를 확인하십시오 헤더 의 마지막 숫자입니다.

추가 테스트 사례

Input:
4
Output:
4

Input:
5 6 1
Output:
5 6 1

Input:
0 1
6 2
Output:
0 6
1 2

Input:
6 3 0 8
4 6 1 4
6 2 3 3
9 3 0 3
Output:
6 4 6 1
3 6 2 3
0 9 3 0
8 4 3 3

Input:
5 8 2
6 7 3
2 6 1
6 0 6
6 4 1
Output:
5 6 7
8 2 6
2 6 0
3 6 4
1 6 1

Input:
9 9 4 0 6 2
2 3 2 6 4 7
1 5 9 3 1 5
0 2 6 0 4 7
Output:
9 2 3 2 6 4
9 1 5 9 3 1
4 0 2 6 0 4
0 6 2 7 5 7 

답변:


20

CJam, 20

{z_)\zLa+(@+\.+s\,/}

기능 블록으로 작성되었습니다. 온라인으로 사용해보십시오

설명:

입력은 다음과 같이 볼 수 있습니다 :

입력 다이어그램

즉, 나머지 행렬에서 맨 위 행과 오른쪽 열을 분리하고 화살표로 표시된 순서대로 해당 요소를 고려합니다.

그런 다음 출력은 다음과 같습니다.

출력 다이어그램

나머지 직사각형 블록은 전체적으로 대각선으로 이동하고 모서리 요소는 새 화살표로 표시되는 순서 / 위치로 재 배열됩니다.

코드는 화살표가 똑바로 아래로 내려 가서 출력이 생성되고 (매트릭스 P와 같은 꼬리가 있음) 출력을 제외하고는 거의 정확하게 작동합니다.

z      zip (transpose) the matrix
_      make a copy
)      take out the last row (right column before transposing)
\      swap with the rest of the matrix
z      transpose back
La+    append an empty row (needed for the single-column case,
        which leaves an empty matrix here)
(      take out the first row (top row without the corner)
@+     bring the right column to the top of the stack and concatenate
        obtaining an array of the edge elements (marked with the blue arrow)
\      swap with the remaining part (big white block in the diagrams)
.+     concatenate element by element
        each edge element is concatenated with a row of the white block
        after the white block runs out, the remaining elements form new rows
s      convert the whole thing to a string (concatenating all rows)
\      swap with the copy of the transposed matrix
,      get its length (number of original columns)
/      split the string into rows of that length

Pyth 답변도 20 바이트이지만 귀하의 답변은 이전에 받아 들였습니다.
Zgarb

9

CJam, 44 43 42 40 바이트

qN/:ReeSf.*:sz1fm<{Rz,{(S-(o\}*~]{},No}h

여기에서 테스트하십시오.

흠, 내 첫 번째 시도보다 훨씬 낫지 만 Dennis가 어쨌든이 문제를 훨씬 덜 해결할 것이라고 생각합니다 ...

입력 및 출력은 ASCII 그리드입니다.

0123
4567
8901

준다

0456
1890
2371


3
@TimmyD 유예 기간이 끝날 때까지 47에서 43으로 편집하기 위해 기다려야했습니다. : P
Martin Ender

예! meme 되고 있습니다.
intrepidcoder

1
나는 마지막으로 가서 골프 언어를 배워서 4 바이트에서 3로 골프를하고 링크 체인에 참여할 수있었습니다 :)
Khuldraeseth na'Barya

6

J, 24 자

하나의 인수를 취하는 함수.

$$<@(1&|.)/./:&;</.@i.@$

J에는 Oblique/. 라는 연산자 가 있습니다. 역전시킬 수 없으므로 재구성이 쉽지는 않지만 "경사 나열"을 배열 요소의 순열로 간주 할 수 있습니다. 따라서 오른쪽에 해당 크기 ( )에 대한 "목록 경사"순열을 배치하고 왼쪽에 새 경사 값을 올바로 회전 하여 (dyadic Sort )를 사용하여 순열을 반전시킵니다 . 그런 다음 good old를 사용하여이 목록을 이전 사각형 배열로 재구성합니다 ./:</.@i.@$$$

   3 4$i.10
0 1 2 3
4 5 6 7
8 9 0 1
   ($$<@(1&|.)/./:&;</.@i.@$) 3 4$i.10
0 4 5 6
1 8 9 0
2 3 7 1

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


여기가 피크 J입니다. 잘 했어.
요나

5

J, 38 30 바이트

@algorithmshark 덕분에 8 바이트가 절약되었습니다.

{./.((}.~#),~({.~#),.])}:"1@}.   

이 기능은 상단 및 왼쪽 가장자리를 목록으로 수집하고 목록을 충분한 크기의 두 조각으로 자르고 코어 부분의 오른쪽 및 하단에 연결합니다.

용법:

   ]input=.0 1 2 3, 4 5 6 7,: 8 9 0 1
0 1 2 3
4 5 6 7
8 9 0 1
   ({./.((}.~#),~({.~#),.])}:"1@}.) input
0 4 5 6
1 8 9 0
2 3 7 1

여기에서 온라인으로 사용해보십시오.


1
30 자 이하로 char :를 {./.대체 }:@{.,{:"1하고 기차를 뒤집어 두 개의 물결표를 절약 할 수 있습니다 {./.((}.~#),~({.~#),.])}:"1@}..
algorithmshark

4

줄리아 153 149 139 바이트

A->(length(A)>1&&((m,n)=size(A);r(X)=for i=1:n X[:,i]=reverse(X[:,i])end;r(A);for i=-m:m A[diagind(A,i)]=circshift(diag(A,i),1)end;r(A));A)

이것은 이름없는 함수를 만들어 배열을 받아들이고 수정 된 입력 배열을 반환합니다.

언 골프 드 :

# Create a function to reverse the columns of a matrix
function revcols!(X)
    for = 1:size(X, 2)
        X[:,i] = reverse(X[:,i])
    end
    return X
end

# Our main function
function zgarb!(A)
    # Only perform operations if the array isn't one element
    if length(A) > 1
        # Record the number of rows
        m = size(A, 1)

        # Reverse the columns in place
        revcols!(A)

        # Shift each diagonal
        for i = -m:m
            A[diagind(A, i)] = circshift(diag(A, i), 1)
        end

        # Reverse the columns back
        revcols!(A)
    end
    return A
end

알고리즘 조언과 4 바이트 절약을위한 Martin Büttner에게 감사합니다!


3

ES6, 75 바이트

이것은 배열의 배열을 매개 변수로 받아 들여 제자리에서 수정합니다.

a=>{t=a.shift();a.map(r=>{t.push(r.pop());r.unshift(t.shift())});a.push(t)}

언 골프 드 :

function anti_diagonal(array) {
    var temp = array.shift(); // strip off the first row
    array.forEach(row => temp.push(row.pop())); // strip off the last elements of each row
    array.forEach(row => row.unshift(temp.shift())); // distribute the elements to the beginning of each row
    array.push(temp); // the remaining elements become the last row
}

자세한 설명은 @aditsu 다이어그램을 참조하십시오.


당신은 변경하여 2 바이트를 절약 할 수 {t.push(r.pop());r.unshift(t.shift())}t.push(r.pop())+r.unshift(t.shift())
user81655

3

Pyth, 20 바이트

J+PhQ.)MQ++L.(J0tQ]J

Adistu의 상단 행과 오른쪽 열을 제거한 다음 왼쪽과 아래쪽에 붙이는 방식을 사용합니다. 그러나 전치가 아닌 변경 가능한 데이터 구조가 있습니다.


2

옥타브, 85 바이트

@(a)[(b=[a(1,1:end),a(2:end,end)'])(1:(s=size(a)(1)))',[a(2:end,1:end-1);b(s+1:end)]]

나는 ends를 제거 할 수 있기를 바랍니다 .


1

파이썬 (2) , 113 (104) 94 바이트

f=lambda i,b=[]:i and[b and b[:1]+i[0][:-1]]+f(i[1:],b[1:]or i[0][:-1]+[l[-1]for l in i])or[b]

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

이것은 @aditsu의 방법에 대한 문자 그대로의 해석입니다. 빈 목록을 False로 취급하는 Python의 구문은 추가 10 바이트를 절약하는 데 도움이되었습니다.


행을 삭제하여 8 바이트를 절약했습니다.
SmileAndNod


1
당신은 아마 필요하지 않습니다 0[0:1]
조 왕
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.