숫자 나선 문제


24

숫자 나선은 왼쪽 위 사각형에 숫자 1이있는 무한 그리드입니다. 다음은 나선의 처음 5 개 레이어입니다.

여기에 이미지 설명을 입력하십시오

당신의 임무는 행 y와 열 x의 숫자를 찾는 것입니다.


예:

Input: 2 3
Out  : 8
Input: 1 1
Out  : 1
Input: 4 2
Out  : 15

노트 :

  1. 모든 프로그래밍 언어가 허용됩니다.
  2. 이것은 도전이므로 가장 짧은 코드가 승리합니다.
  3. 행운을 빌어 요!

출처 : https://cses.fi/problemset/task/1071


@WW 무슨 뜻입니까?
Agile_Eagle 오전

1
입력이 1 인덱싱 된 것처럼 보입니다 (좌표는 1,1에서 시작하지만) (테스트 사례에서 직관해야하지만) 0 인덱싱 (좌표는 0에서 시작합니다)을 사용할 수 있습니까?
밀 마법사

4
이것에 대한 추론은 무엇입니까?
밀 마법사

7
특히 프로그램이 CSES에 게시 된 경우 OP가 이것을 정당화 할 필요가없는 경우 좌표가 (1, 1)에서 시작하는 것이 좋습니다. 여기의 골퍼들이 다소 임의의 자유에 익숙해 져 있다고 생각합니다.
Lynn

2
@Lynn 나는 두 번째
Agile_Eagle 12

답변:


19

C (gcc),  44  43 바이트

f(x,y,z){z=x>y?x:y;z=z*z-~(z%2?y-x:x-y)-z;}

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

나선에는 몇 가지 "무기"가 있습니다.

12345
22345
33345
44445
55555

위치 는 arm (변수에 할당 됨 ). 그런 다음, 팔 에서 가장 큰 숫자 는 이며, 이는 팔의 왼쪽 아래 위치와 오른쪽 위 위치 사이에서 번갈아 나타납니다. 에서 를 빼면 arm 따라 이동 하는 시퀀스를 므로 다음을 기반으로 적절한 부호를 선택합니다 의 패리티는 0부터 시작하는 시퀀스를 얻기 위해 로 조정하고 에서이 값을 뺍니다 .(x,y)max(x,y)znn2xyn+1,n+2,,1,0,1,,n1,n2nnn1n2

바이트를 저장해 준 Mr. Xcoder 에게 감사합니다 .


f(x,y,z){z=x>y?x:y;z=z*z-~(z%2?x-y:y-x)-z;}1 바이트를 저장합니다.
Mr. Xcoder

@ Mr.Xcoder 깔끔한 트릭, 감사합니다!
손잡이


3
@RobertS. 예, 그것이 제가 정의한 기능이 ( TIO 의 코드 섹션에서)하는 것입니다. 예를 들어, f(1, 1)값을 반환합니다 1. 풋터 섹션을 루핑 X = 1 (5) 및 y = 1 내지 5를 통해, 그러한 모든 값에 대한 함수를 호출하고, 기능 문제에 나타낸 모든 입력에 대해 올바른 것을 증명하기 위해, 격자의 출력을 출력한다.
Doorknob

1
@Agile_Eagle이 함수는 숫자를 반환합니다 (나선을 출력 할 수 없습니다-루프조차 없습니다!).
Doorknob

7

파이썬,  54   50  49 바이트

def f(a,b):M=max(a,b);return(a-b)*(-1)**M+M*M-M+1

@ChasBrown 덕분에 -4 바이트

@Shaggy 덕분에 -1 바이트

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

처음으로 골프! 나는 이것이 최적이 아니라는 것을 알고 있습니다.

본질적으로 @Doorknob C 코드와 동일한 원칙으로 실행됩니다.


2
PPCG에 오신 것을 환영합니다! 이 경우 def f(a,b):접근 방식을 사용하여 4 바이트를 절약 할 수 있습니다 ( 여기 참조) .
Chas Brown

@ChasBrown 매우 흥미로운, 감사합니다!
Don Thousand

@Shaggy 감사합니다! 나는 몇 가지 도전 과제를 게시했지만 골프를 치기에는 충분하지 않았습니다
Don Thousand

그렇다면 골프에 오신 것을 환영합니다! :) 나는 파이썬 사람이 아니지만 M**2로 대체 될 수 있다고 확신 M*M합니다.
Shaggy

@Shaggy 감사합니다! 지금 바로 고칠 것입니다
Don Thousand

7

MATL , 15 바이트

X>ttq*QwoEqGd*+

온라인으로 사용해보십시오!
매트릭스로 수집 및 인쇄

방법?

편집 : @Doorknob의 답변과 동일한 기술로 방금 도착했습니다.

나선의 대각선 요소의 차이는 산술 시퀀스 입니다. 이것의 항의 합 은 (일반적인 AP 공식에 의해). 이 합계는 1 씩 증가하여 위치 대각선 요소를 제공합니다 .0,2,4,6,8,nn(n1)(n,n)

주어지면 이 두 가지의 최대 값을 찾게되는데,이 점은이 점이 속한 나선의 "계층"입니다. 그런 다음 해당 레이어의 대각선 값을 로 찾습니다 . 짝수 레이어의 경우 홀수 레이어 의 값 은 입니다.(x,y)v=n(n1)+1(x,y)v+xyvx+y

X>        % Get the maximum of the input coordinates, say n
ttq*      % Duplicate that and multiply by n-1
Q         % Add 1 to that. This is the diagonal value v at layer n
wo        % Bring the original n on top and check if it's odd (1 or 0)
Eq        % Change 1 or 0 to 1 or -1
Gd        % Push input (x, y) again, get y - x
*         % Multiply by 1 or -1
          % For odd layers, no change. For even layers, y-x becomes x-y
+         % Add that to the diagonal value v
          % Implicit output

대체 21 바이트 솔루션 :

Pdt|Gs+ttqq*4/QJb^b*+

온라인으로 사용해보십시오!
행렬로 수집 및 인쇄
위의 내용을 통해 원하는 기능이

f=m(m1)+1+(1)m(xy)

여기서 입니다.m=max(x,y)

일부 기본 계산은 최대 두 숫자에 대한 하나의 표현식이

m=max(x,y)=x+y+abs(xy)2

다른에 하나를 연결해, 우리는 발견 을위한 하나의 대체 양식을 것입니다 :f

f=(xy)ik+14((k2)k)+1

여기서 입니다.k=abs(xy)+x+y

솔루션이 구현하는 기능입니다.


5

Japt , 16 바이트

몇 가지 맥주에 대한 Doorknob 솔루션에서 채택되었습니다.

wV
nU²ÒNr"n-"gUv

시도 해봐


설명

                  :Implicit input of integers U=x and V=y
wV                :Maximum of U & V
\n                :Reassign to U
 U²               :U squared
   Ò              :-~
      "n-"        :Literal string
           Uv     :Is U divisible by 2? Return 0 or 1
          g       :Get the character in the string at that index
    Nr            :Reduce the array of inputs by that, where n is inverse subtraction (XnY = Y-X)
n                 :Subtract U from the result of the above

3

Pyth, 20 바이트

A~Qh.MZQh-+*-GH^_1Q*

테스트 스위트

Rushabh Mehta 의 답변을 거의 문자 그대로 번역했습니다 .

설명:
A~Qh.MZQh-+*-GH^_1Q*    | Full code
A~Qh.MZQh-+*-GH^_1Q*QQQ | Code with implicit variables filled
                        | Assign Q as the evaluated input (implicit)
A                       | Assign [G,H] as
 ~Q                     |  Q, then assign Q as
   h.MZQ                |   Q's maximal value.
                        | Print (implicit)
        h-+*-GH^_1Q*QQQ |  (G-H)*(-1)^Q+Q*Q-Q+1




2

05AB1E , 12 11 바이트

ZÐ<*>ŠGR}¥+

@Emigna가로 변경 Èi되어 -1 바이트 G.

@sundar 의 MATL 답변 포트 , 그래서 그를 투표 해야합니다!

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

설명:

Z              # Get the maximum of the (implicit) input-coordinate
               #  i.e. [4,5] → 5
 Ð             # Triplicate this maximum
  <            # Decrease it by 1
               #  i.e. 5 - 1 → 4
   *           # Multiply it
               #  i.e. 5 * 4 → 20
    >          # Increase it by 1
               #  i.e. 20 + 1 → 21
     Š         # Triple swap the top threes values on the stack (a,b,c to c,a,b)
               #  i.e. [4,5], 5, 21 → 21, [4,5], 5
      G }      # Loop n amount of times
       R       #  Reverse the input-coordinate each iteration
               #   i.e. 5 and [4,5] → [5,4]→[4,5]→[5,4]→[4,5] → [5,4]
         ¥     # Calculate the delta of the coordinate
               #  [5,4] → [1]
          +    # And add it to the earlier calculate value (output the result implicitly)
               #  21 + [1] → [22]

1
Èi될 수 있습니다 G.
Emigna

@Emigna 아 똑똑해, 고마워! : D
Kevin Cruijssen




0

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

f=(r,c,x)=>r<c?f(c,r,1):r%2-!x?r*r-c+1:--r*r+c

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