접힌 행렬 빼기


21

도전:

2 이고 8 개의 고유 한 '폴딩 옵션'중 하나 인 NxN 행렬이 주어지면 빼는 값으로 2D 배열 / 목록을 출력합니다.

여덟 가지 접는 옵션은 다음과 같습니다. 왼쪽에서 오른쪽; 오른쪽에서 왼쪽으로; 위에서 아래로; 아래에서 위로; 왼쪽 상단에서 오른쪽 하단; 오른쪽 위에서 아래로; 왼쪽 아래에서 오른쪽으로; 오른쪽 아래에서 왼쪽으로.

단계별 예제 :

입력 매트릭스 :

[[ 1, 3, 5, 7],
 [ 0, 8, 6, 4],
 [ 1, 1, 1, 1],  (a'th row in the explanation below)
 [ 1,25, 0,75]]

접기 옵션을 위에서 아래로 사용하면 다음과 같은 결과가 출력됩니다.

[[ 1,-7,-5,-3],
 [ 0,22,-5,68]]

왜? 우리는 위에서 아래로 접습니다. 행렬 크기는 짝수이므로 그대로 보존 할 중간 레이어가 없습니다. '번째 행 에 의해 감산된다 ( - 1 ) '번째 행 (했을 ( - 2 ) '홀수 차원 매트릭스 용 번째 행); 그렇게 됩니다 . 그런 다음 ( a + 1 ) '행 은 ( a - 2 ) '행 ( 홀수 차원 행렬의 경우 ( a - 3 ) '행 이 되었음 )을 뺍니다 . 그래서에이[1, 1, 1, 1](에이1)(에이2)[1-0, 1-8, 1-6, 1-4][1, -7, -5, -3](에이+1)[1, 25, 0, 75](에이2)(에이)[1-1, 25-3, 0-5, 75-7]됩니다 [0, 22, -5, 68].

대신 오른쪽 아래에서 왼쪽으로 접는 옵션 (위의 동일한 입력 행렬 사용)을 사용하면 다음과 같은 결과가 출력됩니다.

[[-74,  2,  1,  7],
 [  0,  7,  6],
 [-24,  1],
 [  1]]

다음과 같은 접기 빼기

[[1-75,  3-1,  5-4,    7],
 [ 0-0,  8-1,    6],
 [1-25,    1],
 [   1]]

도전 규칙 :

  • 당신은 어떤 팔 개 별개의 문자를 사용할 수있는 [A-Za-z]범위 또는 별개의 번호를 [99,99] 접히는 옵션. 숫자 [1..8] 또는 [0..7] 이 가장 일반적인 옵션 일 수 있지만 일부 스마트 계산에 대해 범위 내에서 다른 숫자를 사용하려는 경우 자유롭게 수행하십시오. 답에 사용한 접는 옵션을 명시하십시오.
  • 입력 행렬은 항상 정사각형 NxN 행렬이므로 직사각형 NxM 행렬을 처리 할 필요가 없습니다. 비어 있거나 1x1 행렬을 접을 수 없으므로 도 항상 2 이상입니다.
  • 매트릭스의 입력 범위에서 항상 음이 아닌 숫자를 포함하는 것 [0,999] (출력의 개수 따라서 범위 일 것이다 [999,999] ).
  • (대각선) 접힘 또는 홀수 치수 수직 / 수평 접힘의 경우 중간 '레이어'는 변경되지 않습니다.
  • I / O는 유연합니다. 정수의 2D 배열 / 목록 일 수 있습니다. 공백과 줄 바꾸기로 구분 된 문자열로 반환하거나 인쇄 할 수 있습니다. 입력 행렬을 수정하고 없어야 null하는 숫자 또는 [-999, 999]범위를 벗어난 숫자를 바꿔서 사라 졌음 을 나타낼 수 있습니다. 등

일반적인 규칙:

  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다.
    코드 골프 언어가 코드 골프 언어 이외의 언어로 답변을 게시하지 못하게하지 마십시오. '모든'프로그래밍 언어에 대한 가능한 한 짧은 대답을 생각해보십시오.
  • 표준 규칙기본 I / O 규칙으로 답변에 적용 되므로 STDIN / STDOUT, 적절한 매개 변수 및 반환 유형의 전체 프로그램과 함께 함수 / 방법을 사용할 수 있습니다. 당신의 전화.
  • 기본 허점 은 금지되어 있습니다.
  • 가능하면 코드 테스트 (예 : TIO ) 링크를 추가하십시오 .
  • 또한 답변에 대한 설명을 추가하는 것이 좋습니다.

테스트 사례 :

입력 매트릭스 1 :

Input-matrix (for the following eight test cases):
[[ 1, 3, 5, 7],
 [ 0, 8, 6, 4],
 [ 1, 1, 1, 1],
 [ 1,25, 0,75]]

Input-folding option: left-to-right
Output: [[2,6],[-2,4],[0,0],[-25,74]]

Input-folding option: right-to-left
Output: [[-6,-2],[-4,2],[0,0],[-74,25]]

Input-folding option: top-to-bottom
Output: [[1,-7,-5,-3],[0,22,-5,68]]

Input-folding option: bottom-to-top
Output: [[0,-22,5,-68],[-1,7,5,3]]

Input-folding option: topleft-to-bottomright
Output: [[7],[6,-1],[1,-7,-2],[1,24,0,74]]

Input-folding option: topright-to-bottomleft
Output: [[1],[-3,8],[-4,-5,1],[-6,21,-1,75]]

Input-folding option: bottomleft-to-topright
Output: [[1,3,4,6],[8,5,-21],[1,1],[75]]

Input-folding option: bottomright-to-topleft
Output: [[-74,2,1,7],[0,7,6],[-24,1],[1]]

입력 매트릭스 2 :

Input-matrix (for the following eight test cases):
[[17, 4, 3],
 [ 8, 1,11],
 [11, 9, 7]]

Input-folding option: left-to-right
Output: [[4,-14],[1,3],[9,-4]]

Input-folding option: right-to-left
Output: [[14,4],[-3,1],[4,9]]

Input-folding option: top-to-bottom
Output: [[8,1,11],[-6,5,4]]

Input-folding option: bottom-to-top
Output: [[6,-5,-4],[8,1,11]]

Input-folding option: topleft-to-bottomright
Output: [[3],[1,7],[11,1,-10]]

Input-folding option: topright-to-bottomleft
Output: [[17],[4,1],[8,-2,7]]

Input-folding option: bottomleft-to-topright
Output: [[17,-4,-8],[1,2],[7]]

Input-folding option: bottomright-to-topleft
Output: [[10,-7,3],[-1,1],[11]]

접기 옵션의 순서가 중요합니까?
만료 된 데이터

또한 가능한 모든 접기의 8xNxN 행렬을 출력 할 수 있습니까?
만료 된 데이터

이 테스트 샘플 입력 폴딩 옵션 : 하단에서 상단으로의 출력 : [[-1,7,5,3], [0, -22,5, -68]]을 뒤집어 야합니까?
OrangeCherries

또한 행렬 2의 경우 17-11은 4가 아닌 6입니까?
OrangeCherries

@ExpiredData 규칙에 지정된 대로 A-Za-z범위 내에서 문자 나 정수를 사용할 수 [-999,999]있으므로 순서는 중요하지 않습니다. 죄송하지만 입력을 기반으로 올바른 접기를 출력해야하므로 8 개를 모두 출력 할 수 없습니다.
케빈 크루이 ssen

답변:


5

옥타브 , 256 248 244 248 바이트

m=d=x=@(a,b=1)rot90(a,b)
y=@(a,b=2)flip(a,b)
z=@(a,b=1)tril(a+1e3,-1)+a-x(y(tril(a)))+b*diag(diag(a))
f=@(a,b){m=((a-y(a))(:,1:(d=size(a,2)/2))),-y(m),m=y(x((a=x(a))-y(a)))(d+1:end,:),y(m,1),-y(z(a,-1)),x(z(x(a,2)),2),z(a=x(a,3)),x(z(x(a,2)),2)}{b}

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

Luis Mendo 덕분에 -2 바이트 (그리고 약간의 정리)

TB 수정으로 +2 바이트

1-8의 b 값에 ​​대한 1- 인덱스 연산 :

R-L
L-R
B-T
T-B
BR-TL
TR-BL
BL-TR
TL-BR

이것은 나에게 두통을 줬다, 나는 나중에 제대로 골프를 할 것이다


rows(a)대신 추천size(a,2)
천장 고양이

5

젤리 ,  39  34 바이트

두 가지 "기능"중 일부를 결합하여 추가 골프가 가능할 수 있습니다.
... yep :NickKennedy에게 -5 감사합니다!

ṃ“Z“Ṛ“U“ “ŒDṙL ZZṚ”ŒḄFḲj“ŒH_Ṛ}¥/”v

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

정수 (명령)와 숫자 목록 (매트릭스)을 허용하는 2 진 링크.

[99,99]

           Instruction  |  integer
------------------------+---------
         left-to-right  |     4
         right-to-left  |    14
         top-to-bottom  |     9
         bottom-to-top  |    39
topleft-to-bottomright  |    65
topright-to-bottomleft  |    15
bottomleft-to-topright  |    10
bottomright-to-topleft  |     0

방법?

링크는 Jelly 코드를 생성 한 다음 M을 입력으로 사용하여 평가됩니다.

ṃ“Z“Ṛ“U“ “ŒDṙL ZZṚ”ŒḄFḲj“ŒH_Ṛ}¥/”v - Link: integer, I; matrix, M
 “Z“Ṛ“U“ “ŒDṙL ZZṚ”                - list of lists of characters = ["Z", "Ṛ", "U", " ", "ŒDṙL ZZṚ"]
ṃ                                  - base decompress (I) using those lists as the digits
                                   -  ...i.e. convert to base 5 and then convert the digits:
                                   -          [1,2,3,4,0] -> ["Z", "Ṛ", "U", " ", "ŒDṙL ZZṚ"]
                   ŒḄ              - bounce
                                   -  ...e.g. [a, b, c] -> [a, b, c, b, a]
                     F             - flatten to a list of characters
                      Ḳ            - split at spaces
                       j           - join with:
                        “ŒH_Ṛ}¥/”  -   list of characters = "ŒH_Ṛ}¥/"
                                 v - evaluate as Jelly code with an input of M

그러면 8 가지 옵션 각각은 다음과 같습니다.

left-to-right           (4): ŒH_Ṛ}¥/
right-to-left          (14): ṚŒH_Ṛ}¥/Ṛ
top-to-bottom           (9): ZŒH_Ṛ}¥/Z
bottom-to-top          (39): ZṚŒH_Ṛ}¥/ṚZ
topleft-to-bottomright (65): ṚUŒDṙLŒH_Ṛ}¥/ZZṚUṚ
topright-to-bottomleft (15): UŒDṙLŒH_Ṛ}¥/ZZṚU
bottomleft-to-topright (10): ṚŒDṙLŒH_Ṛ}¥/ZZṚṚ
bottomright-to-topleft  (0): ŒDṙLŒH_Ṛ}¥/ZZṚ

이들 각각 ( 0및 제외 4) MZ(조옮김), (반전) 및 U(각각 역) 중 일부 를 사용하여 변환을 적용합니다 . 그런 다음 두 기능 중 하나 (아래 참조), 설정 변환의 역수 (있는 경우)가 코드의 역으로 ​​구현됩니다.

두 가지 내부 기능은 다음과 같습니다.

ŒH_Ṛ}¥/ - Function A: Fold bottom-to-top: matrix, M
ŒH       - split M into two equal lists of rows (first half bigger by 1 if need be)
      / - reduce by:
     ¥  - last two links as a dyad:
    }   -  using the right argument (i.e. second half):
   Ṛ    -    reverse
  _     -  subtract

ŒDṙLŒH_Ṛ}¥/ZZṚ - Function B: Fold topright-to-bottomleft: matrix, M
ŒD             - diagonals of M
  ṙ            - rotate left by:
   L           -   length of M (puts them in order from bottom left most)
    ŒH_Ṛ}¥/    - same action as calling Function A on the diagonals
           Z   - transpose
            Z  - transpose
             Ṛ - reverse

1
아, 누군가가 다소 유연한 입력 옵션을 사용할지 궁금합니다! Jelly 코드로 편리한 기본 변환 값을 사용하여 원하는 폴딩을 평가 한 방법을 살펴보십시오. :)
Kevin Cruijssen

: 내 대답에서 코드의 일부를 사용하고, 모두에 코드 공통 재사용, 여기에 34 byter의 tio.run/##y0rNyan8///...
닉 케네디

16 비트 정수를 허용하면 더 짧을 수 있습니다.
Nick Kennedy

fold를 선택하기위한 매개 변수로 16 비트 정수를 사용하는 비경쟁 23 바이트 응답 : tio.run
Nick Kennedy

@NickKennedy-감사합니다. 나는 나누기를 좋아하고 가입한다! 설명을 완전히 변경하려면 나중에 다시 방문해야합니다.
Jonathan Allan

3

자바 스크립트 (ES6),  149 ...  133128 바이트

(matrix)(d)07NaN

0=1=2==4=5=6=7=

m=>d=>m.map((r,y)=>r.map((v,x)=>v-=(w=m.length+~y)-(p=[x+x-y,y,x,q=w+y-x][d&3])&&[r[q],m[w][x],m[q][w],m[x][y]][d>3^p>w?d&3:m]))

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

댓글

m => d =>                   // m[] = matrix; d = direction
  m.map((r, y) =>           // for each row r[] at position y in m[]:
    r.map((v, x) =>         //   for each value v at position x in r[]:
      v -=                  //     subtract from v:
        (                   //       define w as:
          w = m.length + ~y //         the width of input matrix - y - 1
        ) - (               //       and compare it with
          p = [             //       p defined as:
            x + x - y,      //         2 * x - y for vertical folding
            y,              //         y for horizontal folding
            x,              //         x for diagonal folding
            q = w + y - x   //         q = w + y - x for anti-diagonal folding
          ][d & 3]          //       using d MOD 4
        ) &&                //       if p is equal to w, leave v unchanged
        [                   //       otherwise, subtract:
          r[q],             //         r[q] for vertical folding
          m[w][x],          //         m[w][x] for horizontal folding
          m[q][w],          //         m[q][w] for diagonal folding
          m[x][y]           //         m[x][y] for anti-diagonal folding
        ][                  //       provided that we're located in the target area:
          d > 3 ^           //         test p < w if d > 3 
          p > w ? d & 3     //         or p > w if d <= 3
                : m         //         and yield either d MOD 4 or m[]
        ]                   //       (when using m[], we subtract 'undefined' from v,
                            //       which sets it to NaN instead)
    )                       //   end of inner map()
  )                         // end of outer map()

3

젤리 , 71 34 바이트

ḃ2ŒḄ,UZṚŒDṙLƊŒH_Ṛ}¥/$ZZṚƊṚZ8ƭ$ị@¥ƒ

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

테스트 스위트

전체 프로그램. 올바른 주장은 매트릭스입니다. 왼쪽 인수는 접기 유형입니다.

44 = L-R
40 = R-L
36 = T-B
32 = B-T
50 = TL-BR
34 = TR-BR
54 = BL-TR
38 = BR-TL

5 비트 이항 이진을 입력으로 사용하도록 다시 작성되었습니다. 위에 제공된 프로그램은 여러 번 접히는 경우 반복적으로 작동하지 않습니다.


1

옥타브 , 482 바이트 , 459 바이트

접기 방향을 결정하기위한 입력은 다음과 같습니다.
1) 왼쪽에서 오른쪽으로
2) 아래에서 위로
3) 오른쪽에서 왼쪽으로
4) 위에서 아래로
5) tr에서 bl
6) br에서 tl
7) bl에서 tr
8) tl에서 br
각 호출 지정된 폴드를 모두 생성하는 것이 아니라 지정된 폴드 만 생성합니다 (아마도 적은 바이트를 사용함). 가장 큰 문제는이 경우 동일한 루프에 접힘 1-4와 5-8을 넣는 방법을 알 수 없다는 것입니다. 그러나 적어도 한 옥타브에는 멋진 매트릭스가 있습니다.

    function[m]=f(n,o)
    k=length(n);m=NaN(k);if(o<5)
    if(mod(o,2)>0)n=n'end
    q=[0,0,k+1,k+1](o)
    for x=1:ceil(k/2)if(x*2>k)m(x,:)=n(x,:)else
    for a=1:k
    m(abs(q-x),a)=n(abs(q-x),a)-n(abs(q-(k+1-x)),a)end
    end
    end
    if(mod(o,2)>0)m=flipud(m')end
    else
    if(mod(o,2)>0)n=flip(n)end
    q=[0,0,k+1,k+1](o-4)
    for x=1:k
    for a=1:k+1-x
    if(a==k+1-x)m(x,a)=n(x,a)else
    m(abs(q-x),abs(q-a))=n(abs(q-x),abs(q-a))-n(abs(q-(k+1-a)),abs(q-(k+1-x)))end
    end
    end
    end
    if(mod(o,2)>0)m=flip(m)end
    end

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

출력 억제는 바이트 비용이므로 return 문 (ans =)이 아닌 모든 것을 무시하십시오.


"end"를 쓰는 데 몇 바이트가 빠졌습니까?
만료 된 데이터

끝을 쓸 필요가 없습니까?
OrangeCherries

당신은 그것을 재구성하지 않으면 많은 if / else 및 for 문이 아닙니다
Expired Data

와우 tbh 코드를 보면 matlab에서 할 수조차 없었던 수많은 것들이 있습니다.
OrangeCherries

나는 옥타브 tbh에 대해 잘 모른다. 아마 50-100 바이트를 아주 쉽게 절약 할 수있을 것이다
Expired Data

1

, 78 77 바이트

F⁴«UMηE⮌η§μλ¿⁼ιθUMηEκ⎇‹⊕⊗νLη⁻μ§⮌κν⎇›⊕⊗νLηωμ¿⁼ι﹪θ⁴UMηEκ⎇‹λν⁻짧ηνλ⎇›λνωμ»Eη⪫ι,

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 다음과 같은 접기 옵션을 사용합니다.

0   top-to-bottom
1   left-to-right
2   bottom-to-top
3   right-to-left
4   bottomright-to-topleft
5   topright-to-bottomleft
6   topleft-to-bottomright
7   bottomleft-to-topright

접힌 값은 빈 문자열로 바뀝니다. 설명:

F⁴«≔UMηE⮌η§μλ

배열을 네 번 회전시킵니다.

¿⁼ιθUMηEκ⎇‹⊕⊗νLη⁻μ§⮌κν⎇›⊕⊗νLηωμ

적절한 경우 어레이를 수평으로 접습니다.

¿⁼ι﹪θ⁴UMηEκ⎇‹λν⁻짧ηνλ⎇›λνωμ

적절한 경우 배열을 대각선으로 접습니다.

»Eη⪫ι,

배열을 원래 방향으로 다시 회전하면 배열을 출력합니다.

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