숫자 나선은 왼쪽 위 사각형에 숫자 1이있는 무한 그리드입니다. 다음은 나선의 처음 5 개 레이어입니다.
당신의 임무는 행 y와 열 x의 숫자를 찾는 것입니다.
예:
Input: 2 3
Out : 8
Input: 1 1
Out : 1
Input: 4 2
Out : 15
노트 :
- 모든 프로그래밍 언어가 허용됩니다.
- 이것은 코드 골프 도전이므로 가장 짧은 코드가 승리합니다.
- 행운을 빌어 요!
숫자 나선은 왼쪽 위 사각형에 숫자 1이있는 무한 그리드입니다. 다음은 나선의 처음 5 개 레이어입니다.
당신의 임무는 행 y와 열 x의 숫자를 찾는 것입니다.
예:
Input: 2 3
Out : 8
Input: 1 1
Out : 1
Input: 4 2
Out : 15
노트 :
답변:
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부터 시작하는 시퀀스를 얻기 위해 로 조정하고 에서이 값을 뺍니다 .z
바이트를 저장해 준 Mr. Xcoder 에게 감사합니다 .
f(x,y,z){z=x>y?x:y;z=z*z-~(z%2?x-y:y-x)-z;}1 바이트를 저장합니다.
f(1, 1)값을 반환합니다 1. 풋터 섹션을 루핑 X = 1 (5) 및 y = 1 내지 5를 통해, 그러한 모든 값에 대한 함수를 호출하고, 기능 문제에 나타낸 모든 입력에 대해 올바른 것을 증명하기 위해, 격자의 출력을 출력한다.
def f(a,b):M=max(a,b);return(a-b)*(-1)**M+M*M-M+1
@ChasBrown 덕분에 -4 바이트
@Shaggy 덕분에 -1 바이트
처음으로 골프! 나는 이것이 최적이 아니라는 것을 알고 있습니다.
본질적으로 @Doorknob C 코드와 동일한 원칙으로 실행됩니다.
def f(a,b):접근 방식을 사용하여 4 바이트를 절약 할 수 있습니다 ( 여기 참조) .
M**2로 대체 될 수 있다고 확신 M*M합니다.
X>ttq*QwoEqGd*+
편집 : @Doorknob의 답변과 동일한 기술로 방금 도착했습니다.
나선의 대각선 요소의 차이는 산술 시퀀스 입니다. 이것의 항의 합 은 (일반적인 AP 공식에 의해). 이 합계는 1 씩 증가하여 위치 대각선 요소를 제공합니다 .
주어지면 이 두 가지의 최대 값을 찾게되는데,이 점은이 점이 속한 나선의 "계층"입니다. 그런 다음 해당 레이어의 대각선 값을 로 찾습니다 . 짝수 레이어의 경우 홀수 레이어 의 값 은 입니다.
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*+
온라인으로 사용해보십시오!
행렬로 수집 및 인쇄
위의 내용을 통해 원하는 기능이
여기서 입니다.
일부 기본 계산은 최대 두 숫자에 대한 하나의 표현식이
다른에 하나를 연결해, 우리는 발견 을위한 하나의 대체 양식을 것입니다 :
여기서 입니다.
솔루션이 구현하는 기능입니다.
몇 가지 맥주에 대한 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
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
((({}<>))<>[(({}))]<{({}[()])<>}>)<>{}((){({}[()])({})<><([{}])><>}{}<>{}<>)
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]
Èi될 수 있습니다 G.
uses math;var x,y,z:word;begin read(x,y);z:=max(x,y);write(z*z-z+1+(1and z*2-1)*(y-x))end.
Doorknob 포트 의 답변 이지만 sundar의 답변 은 공간을 제거하기 위해 z mod 2*2-1어떤 아이디어를 변형 시켰는지 알려 주었습니다 1and z*2-1.