2D 어레이의 시계 반대 방향 안쪽 나선형 출력


15

에서 유래 질문

크기가 M×N 인 2D 배열이 주어지면 시계 반대 방향으로 값을 출력합니다. 출력은 외부에서 내부로 시작해야하며 초기 지점은 항상 (0,0) 됩니다.

주어진 :

[12345678910111213141516]

반 시계 방향의 가장자리 값은 1,5,9,13,14,15,16,12,8,4,3,2 입니다.

이제 우리는 내부 가치에 대한 과정을 반복합니다. 이것은 다음과 같은 행렬로 끝납니다

[671011]

그리고 내부 값은 6,10,11,7

최종 결과는 1,5,9,13,14,15,16,12,8,4,,2,6,10,11,7


규칙

  • 비어 있지 않은 입력 가정
  • 행렬 값을 양의 정수로 가정
  • 표준 I / O 방법 적용
  • 표준 규칙 및 당첨 기준이 적용됩니다

일부 테스트 사례

Input
[
  [1, 2, 3, 4, 5, 6, 7],
  [8, 9, 10,11,12,13,14],
  [15,16,17,18,19,20,21]
]
Output
1,8,15,16,17,18,19,20,21,14,7,6,5,4,3,2,9,10,11,12,13

--------------------------------------------------------

Input
[
    [1,2,3],
    [3,2,1],
    [4,5,6],
    [6,5,4],
    [7,8,9],
    [9,8,7]
]
Output
1,3,4,6,7,9,8,7,9,4,6,1,3,2,2,5,5,8

-----------------------------------------------------
Input
[
    [1]
]
Output
1
-----------------------------------
Input
[
    [1, 2],
    [2, 1]
]
Output
1,2,1,2
-----------------------------------------------------
Input
[
    [1,2,3,6,7],
    [2,4,3,2,1],
    [3,2,4,5,6],
    [6,5,6,5,4],
    [10,4,7,8,9],
    [12,4,9,8,7]
]
Output
1,2,3,6,10,12,4,9,8,7,9,4,6,1,7,6,3,2,4,2,5,4,7,8,5,5,2,3,4,6

시계 방향이나 반 시계 방향입니까?
LegionMammal978

@ LegionMammal978 시계 반대 방향으로 (이 반 시계 방향 불렀다하지만 I)
루이스 펠리페 드 예수님 무 노즈

7
반 시계 방향과 반 시계 방향은 모두 정확하며 BrEng와 AmEng에서 각각 더 일반적입니다. 정말로 혼동을 원한다면 widdershin 을 사용할 수도 있습니다 .
Digital Trauma

답변:


12

R , 54 바이트

@Giuseppe와 @ J.Doe가 몇 바이트를 절약했습니다.

f=function(m)if(ncol(m))c(m[,1],f(t(m[nrow(m):1,-1])))

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

첫 번째 열을 반복적으로 제거하고 맨 아래 열만 남을 때까지 나머지 행렬을 행 역전 / 전치 (하단 행을 새 첫 번째 열로 만들기)합니다. Ungolfed "전통적인"버전 :

f <- function(m) {
 if(ncol(m) == 1) {
    m
  } else {
    c(m[,1], f(t(m[nrow(m):1,-1])))
  }
}

양의 정수 행렬 값을 가정 할 수 있기 때문에 다른 바이트를 절약하기 위해 ncol(m)골프를 칠 수 있다고 지적되었습니다 sum(m). 그러나 모든 행렬 (열의 행렬조차도)에서 작동하기 때문에 이것을 그대로 두겠습니다.


와! 나는 기본값을 사용 하여 조건 을 망치 는 t()것을 방지하는 방법을 좋아합니다 ! drop=TRUE`[`if
Giuseppe

그리고 전체 공개, 나는 심지어 작동하지 않는 약 200 바이트 솔루션을 가지고 있었으므로 나중에 그래! 질문이 현상금을받을 수있게되면 이것에 대해 현상금을 수여 할 것입니다.
Giuseppe

@Giuseppe를 다시 59 바이트로! 나는 원래 시도했던 테스트 t()를 사용할 필요가 없다는 것에 놀랐습니다 is.null.
ngm

m어쨌든 마지막 으로 null이 아니므로 if 문을 54 바이트로 변경할 수 있습니다 . 테스트 케이스에서 작동하는 것 같습니다.
J.Doe


7

Pyth , 9 바이트

shMM.utC_

여기 사용해보십시오!

어떻게?

shMM.utC_     Full program. Takes a 2D array (matrix) from STDIN.
    .u        Until a result that has occurred before is found, loop and collect...
        _     Reverse the matrix (reverse the order of its rows).
       C      Transpose.
      t       Remove first element.
 hMM          For each element in the resulting 3D array, get the heads of its elements.
s             Flatten.

멋지다. Pyth 초보자로서 나는 배울 것이 많다는 것을 알고 있습니다.
ElPedro

5

Stax , 7 바이트

ôQÖG·í<

실행 및 디버깅

한 줄에 행 배열을 취하여 줄 바꿈으로 구분 된 출력을 생성합니다.

포장을 풀고 포장을 풀고 주석을 달았습니다.

W       repeat the rest of the program until cancelled explicitly
  rM    rotate matrix *clock-wise* (yes, this is the opposite of the challenge)
  |c    assert matrix is truthy. (has rows) cancel otherwise.
  B     remove the top row of the matrix, and push separately to main stack
  rm    reverse the top row (this fixes the rotation direction), and print each value

이것을 실행


4

Pyth, 20 바이트

J.TQWJ=+YhJ=J_.TtJ)Y

여기 사용해보십시오

설명

J.TQWJ=+YhJ=J_.TtJ)Y
J.TQ                    Call the transposed input J.
    WJ            )     While J is not empty...
      =+YhJ             ... put the top row into Y (initially [])...
           =J   tJ      ... remove the top row...
             _.T        ... reverse and transpose (rotate clockwise).
                   Y    Output the result.

4

oK , 12 바이트

*+,/(1_+|:)\

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

이것은 oK가 ​​전치의 모양에 너무 신경 쓰지 않는다는 사실을 남용합니다. K에서이 될 13 바이트를 : *:',/(1_+|:)\.

       +|:   /reverse, then transpose (rotate right)
     1_      /remove first line
    (     )\ /fixpoint of the above, keeping intermediate results (scan)
  ,/         /concatenate all the rows
*+           /get the first element of each row

3

깨끗 하고 69 바이트

import StdEnv,StdLib
? =transpose
@[h:t]=h++ @(reverse(?t))
@_=[]

@o?

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

다음 행 / 열을 목록의 헤드로 이동하여 인수에서 패턴 일치되도록합니다.

도전 과제의 첫 번째 예는 다음과 같습니다.

@o? [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]
@ h=:[1, 5, 9, 13] t=:[[2, 6, 10, 14], [3, 7, 11, 15], [4, 8, 12, 16]]
[1, 5, 9, 13] ++ @ h=:[14, 15, 16] t=:[[10, 11, 12], [6, 7, 8], [2, 3, 4]]
[1, 6, 9, 13, 14, 15, 16] ++ @ h=:[12, 8, 4] t=:[[11, 7, 3], [10, 6, 2]]
[1, 6, 9, 13, 14, 15, 16, 12, 8, 4] ++ @ h=:[3, 2] t=:[[7, 6], [11, 10]]
[1, 6, 9, 13, 14, 15, 16, 12, 8, 4, 3, 2] ++ @ h=:[6, 10] t=:[[7, 11]]
[1, 6, 9, 13, 14, 15, 16, 12, 8, 4, 3, 2, 6, 10] ++ @ h=:[11, 7] t=:[]
[1, 6, 9, 13, 14, 15, 16, 12, 8, 4, 3, 2, 6, 10, 11, 7] ++ @ []

3

Julia 0.7 , 47 바이트

f(m)=[m[:,1];sum(m)<1?[]:f(rotr90(m[:,2:end]))]

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

Julia는 매트릭스를 90도 회전 할 수있는 편리한 내장 기능을 갖추고있어, 역변환 작업이 필요 없습니다.

컴파일러 경고에서 알 수 있듯이 삼항 조건의 모든 구성 요소는 공백으로 구분해야하며 v. 1.0에서는 실제로 시행되었습니다.

이상하게 도이 상황에서 재귀를 벗어나는 가장 짧은 방법은 try-catch 블록을 사용하는 것입니다.

Julia 1.0 , 50 바이트

f(m)=[m[:,1];try f(rotr90(m[:,2:end]))catch;[]end]

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



2

APL (Dyalog) , 24 22 바이트

{×≢⍵:⍵[;1],∇⍉⊖0 1↓⍵⋄⍬}

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

어떻게?

{×≢⍵:⍵[;1],∇⍉⊖0 1↓⍵⋄⍬}
{                    } - a function
 ×≢⍵:                  - if non-empty:
     ⍵[;1]             - the left column
          ,∇⍉⊖0 1↓⍵    - repeat this function without the left column, rotated counter clockwise
                   ⋄⍬  - otherwise, return an empty vector

운영자에 대한 설명이 좋을 것입니다.
Arc676

1
@ Arc676가 추가되었습니다!
Zacharý

2

05AB1E , 13 11 10 바이트

ΔRøćRˆ}¯˜þ

@Emigna 덕분에 -2 바이트 .

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

Δ         # Loop until the stack no longer changes:
 R        #  Reverse the order of the rows
          #   i.e. [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
          #    → [[13,14,15,16],[9,10,11,12],[5,6,7,8],[1,2,3,4]]
  ø       #  Zip, swapping rows and column
          #   → [[13,9,5,1],[14,10,6,2],[15,11,7,3],[16,12,8,4]]
   ć      #  Head extracted
          #   → [[14,10,6,2],[15,11,7,3],[16,12,8,4]] and [13,9,5,1]
    R     #  Reverse this row
          #   → [1,5,9,13]
     ˆ    #  Pop and push it to the global array
}         # After the loop:
 ¯        #  Push the global array
          #   i.e. [[1,5,9,13],[14,15,16],[12,8,4],[3,2],[6,10],[11],[7],"",""]
  ˜       #  Flatten it
          #   → [1,5,9,13,14,15,16,12,8,4,3,2,6,10,11,7,"",""]
   þ      #  Remove all empty string by only leaving all digits
          #   → ["1","5","9","13","14","15","16","12","8","4","3","2","6","10","11","7"]
          # (and output it implicitly)


1

, 25 바이트

≔⮌EA⮌ιθWθ«≔E§θ⁰⮌Eθ§μλθI⊟θ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

≔⮌EA⮌ιθ

입력을 180 ° 회전시킵니다. 이것은 두 가지 이유 때문입니다. a) 마지막 행이 제거하기 가장 쉽고 b) 루프 끝에서 행을 제거하면 루프하기가 더 쉽습니다. (나는 시계 방향으로 반영하고 출력하려고 시도했지만 여분의 바이트가 필요했습니다.)

Wθ«

배열이 비워 질 때까지 반복하십시오.

≔E§θ⁰⮌Eθ§μλθ

어레이를 90 ° 회전시킵니다.

I⊟θ

배열의 마지막 행을 제거하고 요소를 별도의 행에 문자열로 인쇄하십시오.



1

PowerShell , 266 바이트

예 .. PowerShell은 매트릭스 처리에 가장 적합하지 않습니다. 그러나 알고리즘은 기본적으로 위와 동일합니다. 각 행은 쉼표로 구분 된 문자열로 표시되며 기본적으로 각 레이어에 대해 회전 및 조옮김을 수행합니다. 아마 ... 더 면도 할 수 있지만, 나는 나는 내 잠옷 이미 ...

Filter F{$a=$_-replace"],|]|\s",''-split'\['|?{$_-ne''};$b=@();while($a-ne $null){$N=($a[0]-split',').Count-1;$a=0..$N|%{$i=$_;($a|%{($_-split',')[$i]})-join','};if($d){[array]::Reverse($a)}if($N-gt0){$b+=$a[0];$a=$a[1..$N]}else{$b+=$a;$a=$null};$d=$true}$b-join','}

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

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