내 대각선 위치를 제곱으로 출력


18

숫자가 주어지면 정사각 행렬 n의 대각선 중 하나에 해당하는 1 기반 인덱스의 정렬 된 목록을 출력합니다 n*n.

예:

입력 3:

사각형은 다음과 같아야합니다.

1 2 3
4 5 6
7 8 9

이제 우리가 나타내는 모든 지표를 선택 \, /또는 X( #또는 비 대각선 위치는 거부됩니다)

\ # /
# X #
/ # \

출력은 다음과 같아야합니다.

[1,3,5,7,9]

테스트 사례 :

1=>[1]
2=>[1,2,3,4]
3=>[1,3,5,7,9]
4=>[1,4,6,7,10,11,13,16]
5=>[1,5,7,9,13,17,19,21,25]

수락 된 답변이 없습니다. 각 언어에 대한 가장 짧은 코드를 알고 싶습니다.


1
질문은 이미지에서 \, / 및 X 문자의 (1 인덱스) 색인을 요구합니다. 나쁜 질문은 아니지만 설명이 부족합니다.
Arfie

당신이 원하는 것에 대해 간단하고 명확한 설명을 기꺼이 제공하려는 경우, 우리는 아마도 이것이 어려운 도전이 아니기 때문에 이것을 다시 열 것입니다. 지금까지, 그것은 매우 불분명합니다
Mr. Xcoder

혼란을 피하기 위해 ASCII 이미지를 예제 영역 밖으로 옮기고 싶을 수도 있지만 다시 열기로 투표했습니다. 처음에 나는 이것들도 생산
해야하는지

7
주문이 중요합니까?
Mr. Xcoder

9
FWIW 주문과 관련이 없다고 생각하면 더 재미있는 골프를 만들 수있을 것입니다 ...
Jonathan Allan

답변:



7

자바 스크립트 (ES6), 48 바이트

대시로 구분 된 정수 목록을 문자열로 출력합니다.

f=(n,k=n*n)=>--k?f(n,k)+(k%~-n&&k%-~n?'':~k):'1'

형식화 및 의견

f = (n, k = n * n) => // given n and starting with k = n²
  --k ?               // decrement k; if it does not equal zero:
    f(n, k) + (       //   return the result of a recursive call followed by:
      k % ~-n &&      //     if both k % (n - 1) and
      k % -~n ?       //             k % (n + 1) are non-zero:
        ''            //       an empty string
      :               //     else:
        ~k            //       -(k + 1) (instantly coerced to a string)
    )                 //   end of iteration
  :                   // else:
    '1'               //   return '1' and stop recursion

테스트 사례


기호를 구분 기호로 사용하는 것이 좋습니다. bitwsie &를 사용하여 바이트를 저장할 수 있습니까?
Shaggy

@Shaggy 아니요, 작동하지 않습니다. 예를 들어 : 4%34%5공통의 1 비트가 없지만, 모두가 비 제로이다.
Arnauld

예, 방금 테스트하여 n=5작동하지 않는 것으로 나타났습니다.
Shaggy

k%~-n&&k%-~n작동해야합니다. 분리기와 좋은 트릭!
Titus

@Titus 골프에 관해서는 정말로 중요하지 않지만 ... 그래, 조금 더 읽기 쉽습니다 . :-) (업데이트)
Arnauld

7

R , 38 35 34 38 바이트

which함수 의 존재를 기억했을 때 3 바이트가 절약되었습니다 ..., @Rift 덕분에 1 바이트가 절약되었습니다.

d=diag(n<-scan());which(d|d[n:1,])

ec=T전체 프로그램으로 호출 될 때 인수에 +4 바이트source()

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

설명:

n<-scan()            # take input
d=diag(n);           # create an identity matrix (ones on diagonal, zeros elsewhere)
d|d[n:1,]            # coerce d to logical and combine (OR) with a flipped version
which([d|d[n:1,]])   # Find indices for T values in the logical expression above

1
-1 바이트d=diag(n<-scan());which(d|d[n:1,])
Rift

이것을 전체 프로그램 ( source) 으로 실행하면 아무 것도 인쇄되지 않습니다. 전화해야합니다 cat. 메타에 대한이 게시물을 참조하십시오 .
JAD

@JarkoDubbeldam 페어 충분! 나는 항상 그것이 TIO에 유효한 결과를 제공한다는 사실에 기초하여 일했지만 실제로는 "전체 프로그램"의 요구 사항을 고려하지 않았습니다.
user2390246

돌아가서이 문제를 해결하기 위해 이전의 모든 답변을 편집 할 계획은 아닙니다!
user2390246

R의 콘솔 환경과 코드 스 니펫이 그것을 사용하는 주요 방법이기 때문에 약간 모호합니다. 내가 연결 한 메타 스레드에 대한 통찰력을 공유하십시오. 그다지 많은 입력을받지 못했습니다.
JAD


5

옥타브 , 41 37 바이트

이것은 MATLAB에서도 작동합니다. 몰래 옥타브 특정 기능 없음 :)

@(x)unique([x:x-1:x^2-1;1:x+1:x*x+1])

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

설명:

정사각 행렬을 만들고 두 개의 대각선을 찾는 대신 대각선을 직접 계산하는 것이 좋습니다. 이것은 17 바이트 더 짧았습니다! =)

@(x)                                   % Anonymous function that takes 'x' as input
    unique(...                   ...)  % unique gives the unique elements, sorted
           [x:x-1:x^2-1                % The anti-diagonal (is that the correct word?)
                       ;               % New row
                        1:x+1:x*x+1])  % The regular diagonal

이것이없는 모습입니다 unique:

ans =    
    6   11   16   21   26   31
    1    8   15   22   29   36

예, 아마도 대각선 순서를 뒤집어 인간 친화적으로 만들었을 것입니다.


5

MATL , 6 바이트

XytP+f

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

설명

내 Octave 답변과 동일한 접근 방식입니다.

3예를 들어 입력 을 고려하십시오 .

Xy   % Implicit input. Identity matrix of that size
     % STACK: [1 0 0;
               0 1 0;
               0 0 1]
t    % Duplicate
     % STACK: [1 0 0
               0 1 0
               0 0 1],
              [1 0 0
               0 1 0
               0 0 1]
P    % Flip vertically
     % STACK: [1 0 0
               0 1 0
               0 0 1],
              [0 0 1
               0 1 0
               1 0 0]
+    % Add
     % STACK: [1 0 1
               0 2 0
               1 0 1]
f    % Linear indices of nonzero entries. Implicit display  
     % STACK:[1; 3; 5; 7; 9]

선형 인덱싱은 기반 1 기반입니다. 자세한 내용은 여기서 length-12 스 니펫을 참조 하십시오 .


"전치"란 무엇을 의미합니까?
Outgolfer Erik

@EriktheOutgolfer 죄송합니다. t전치가 아닌 중복입니다. 또한, 나는 예제를 추가했습니다
Luis Mendo

놀랄 만한! 이것을 달성하려면 두 개의 루프가 필요합니다.
mr5

@LuisMendo 나는 아이덴티티 매트릭스를 바꾸는 것이 의미가 없기 때문에 그렇게 생각했습니다 ... 흠, 알고리즘으로 바이트를 절약 할 수있었습니다.
Outgolfer Erik


4

옥타브, 68 54 바이트

14 바이트를 절약 한 @Stewie Griffin에게 감사합니다!

@(x)unique([diag(m=reshape(1:x^2,x,x)),diag(flip(m))])

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

MATLAB, 68 바이트

x=input('');m=reshape([1:x*x],x,x);unique([diag(m) diag(flipud(m))])

설명:

@(x)                               % Anonymous function
m=reshape([1:x*x],x,x);            % Create a vector from 1 to x^2 and
                                   % reshape it into an x*x matrix.
diag(m)                            % Find the values on the diagonal.
diag(flip(m))                      % Flip the matrix upside down and
                                   % find the values on the diagonal.
unique([])                         % Place the values from both diagonals
                                   % into a vector and remove duplicates.

@LuisMendo 감사합니다. Jimi가 가장 좋아합니다.
Steadybox

4

수학, 42 바이트

Union@Flatten@Table[{i,#+1-i}+i#-#,{i,#}]&

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

@KellyLowder가 골프를 쳤다 ..

수학, 37 바이트

##&@@@Table[{i-#,1-i}+i#,{i,#}]⋃{}&

그리고 @alephalpha는 테이블을 버렸습니다!

Mathematica, 34 바이트

Union@@Range[{1,#},#^2,{#+1,#-1}]&

##&@@@Table[{i-#,1-i}+i#,{i,#}]⋃{}&5 바이트 짧음
Kelly Lowder

Union@@Range[{1,#},#^2,{#+1,#-1}]&
alephalpha




2

C # (. NET 코어) , 97 83 바이트

f=>{var s="[";for(int i=0;i<n*n-1;)s+=i%-~n<1|i++%~-n<1?i+",":"";return s+n*n+"]";}

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

여기에서의 변화는 찾을 숫자 사이의 변화에 ​​기초합니다. 0에서 시작하는 2 개 교대는 n-1하고 n+1, 그래서 만약 n=5에 대한 번호 n-10,4,8,12,16,20와 대한이 n+1될 것이다 0,6,12,18,24. 이것들을 결합하고 (0 인덱싱 대신) 1 인덱싱을 제공합니다 1,5,7,9,13,17,19,21,25. 의 오프셋n 비트 부정 (비트 보수 연산)하여 실현 ~-n==n-1-~n==n+1.

구 버전

f=>{var s="[";for(int i=0;i<n*n-1;i++)s+=(i/n!=i%n&&n-1-i/n!=i%n?"":i+1+",");return s+$"{n*n}]";}

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

이 방법은 숫자가 대각선에 있는지 확인하기 위해 열 및 행 인덱스를 사용합니다. i/n행 인덱스를 i%n제공하고 열 인덱스를 제공합니다.

숫자 형 배열 만 반환

숫자 배열 만 구성하는 것이 바이트 비용을 계산하는 것으로 간주되면 Dennis.Verweij의 제안에 따라 다음을 수행 할 수 있습니다 ( using System.Linq;추가 18 바이트 추가).

C # (. NET 코어) , 66 + 18 = 84 바이트

x=>Enumerable.Range(1,x*x).Where(v=>~-v%~-x<1|~-v%-~x<1).ToArray()

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


extra를 제거하여 코드를 줄일 수 있습니다 &. 추가 사항 &은 첫 번째 입력이 잘못된 경우에만 비교를 깨뜨릴 수 있습니다. MSDN
Dennis.Verweij

실제로 Linq를 사용하여 92 바이트를 가질 수 있습니다 . 온라인에서 사용해보십시오!
Dennis.Verweij

@ Dennis.Verweij Neat, TIO에서 머리글이나 바닥 글로 얼마나 많이 이동할 수 있는지 확실하지 않았습니다. 나는 내 주위에 놀러 갈거야.
Ayb4btu

linq (System.Linq; 사용)에 대한 참조를 위해 18 바이트를 포함시켜야한다는 것을 기억해야합니다.
Dennis.Verweij

그래. 그러나 그것은 필요하지 using System;않습니까? (나는 그것을 포장 가정namespace System.Linq 유효하지 않다고 합니까?)
Ayb4btu

2

자바 스크립트, 73 63 바이트

구 버전

n=>[...Array(y=n*n).keys(),y].filter(x=>(--x/n|0)==x%n||(x/n|0)==n-x%n-1)

@Shaggy 덕분에 10 바이트 절약

n=>[...Array(n*n)].map((_,y)=>y+1).filter(x=>!(--x%-~n&&x%~-n))

처음으로 골프! 내가 너무 심하게 망쳐지지 않기를 바라고있다.


PPCG에 오신 것을 환영합니다 :) 내가 작업 한 것과 비슷한 솔루션입니다 (내 인덱스 만 0입니다). filter함수 에서 다음을 사용하고 다음과 !(--x%(n+1)&&x%(n-1))같이 배열을 생성하여 바이트를 절약 할 수 있습니다 .[...Array(n*n+1).keys()]
Shaggy

@Shaggy 감사합니다! 직장에서 집에 도착하자마자 귀하의 제안으로 답변을 개선하도록 노력하겠습니다!
Marco Lepore

천만에요. 그건 그렇고 : "" [1...n*n]범위를 만드는 것보다 약간 짧습니다.Array(n*n).fill().map((x,i)=>i+1) "- [...Array(n*n)].map((_,y)=>y+1)나중에 참조 할 수있는 짧은 방법입니다.
Shaggy

그것으로 조금 n=>[...Array(n*n+1).keys()].filter(x=>!(--x%-~n&&x%~-n))
Shaggy

@Shaggy 마지막 버전을 시도했지만 f (1) 및 f (2)에 대해 추가 0을 출력하지만 [1 ... n * n] 범위에서 작동하지만 이전 의견. 아니면 어쨌든 엉망입니까?
Marco Lepore




1

Japt , 16 바이트

이보다 더 나은 것으로 보이지는 않지만 가능하다고 확신합니다. 1 인덱싱을 사용해야하는 불필요한 요구 사항으로 2 바이트를 희생해야했습니다.

²õ f@´XvUÉ ªXvUÄ

그것을 테스트



0

PHP, 56 54 + 1 바이트

-R플래그의 경우 +1 바이트

for(;$z**.5<$n=$argn;$z++)$z%-~$n&&$z%~-$n||print~+$z;

앞에 대시가 붙은 숫자를 인쇄합니다. 파이프로 실행 -nR하거나 온라인으로 사용해보십시오 .

**운영자를 위해서는 PHP 5.6 이상이 필요합니다 .
이전 PHP에는 1 바이트를 추가하십시오 : Replace ;$z**.5<$n=$argnwith $z=$argn;$z<$n*$n.


0

루비, 45 바이트

->n{(n*n).times{|i|i%-~n>0&&i%~-n>0||p(i+1)}}

내부적으로 0 인덱스로 작동합니다. 만약 검사 i모듈 n+1또는 n-1인쇄 그렇다면, 0이다 i+1.

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