답변:
½Ḥ
내 Mathematica 답변 포트 (제곱근을 취한 다음 두 배). 이것은 부동 소수점 숫자로 정확하게 표현 될 수있는 입력으로 제한됩니다. 이것이 문제라면, 3 바이트 솔루션 ƽḤ은 임의의 제곱 (Dennis가 먼저 게시했지만 삭제)에서 작동합니다.
{([[]](({})))}{}([]<>)
난 아주 이 답변의 자랑. 내 최고의 두뇌 게임 중 하나 인 IMO.
다른 많은 사용자들이 지적했듯이 대답은 단순히 sqrt (n) * 2 입니다. 그러나 뇌-플래 크에서 제곱근을 계산하는 것은 매우 사소한 일입니다. 입력이 항상 정사각형이라는 것을 알고 있으므로 최적화 할 수 있습니다. 그래서 우리는 빼는 루프를 작성합니다
1, 3, 5, 7, 9...
입력에서 몇 번이나 실행되는지 추적하십시오. 그것이 0에 도달하면, 답은 단순히 우리가 빼는 마지막 숫자입니다.
원래 카운터를 다른 스택에 밀어 넣었습니다. 그러나 스택 높이를 늘려 주 스택 자체를 카운터로 사용할 수 있습니다.
#While TOS (top of stack, e.g. input) != 0:
{
#Push:
(
#The negative of the height of the stack (since we're subtracting)
[[]]
#Plus the TOS pushed twice. This is like incrementing a counter by two
(({}))
)
#Endwhile
}
#Pop one value off the main stack (or in other words, decrement our stack-counter)
{}
#And push the height of the stack onto the alternate stack
([]<>)
python-y pseudocode에서 이것은 기본적으로 다음 알고리즘입니다.
l = [input]
while l[-1] != 0: #While the back of the list is nonzero
old_len = len(l)
l.append(l[-1])
l.append(l[-1] - old_len)
l.pop()
print(len(l))
2Sqrt@#&
온라인으로 사용해보십시오! (수학 사용)
차이 N 2 과 (N + 1) (2)는 항상 2N + 1 하지만 우리는 그냥 양쪽 끝 제외하고 그들 사이의 값을 원하는 2N을 .
2#^.5&정밀 요구 사항 에 따라 잠재적으로 단축 될 수 있습니다 .
?2*vp
이전에는 질문을 잘못 읽었습니다. 이 버전은 완벽한 제곱이 아닌 양의 정수 입력에 작동합니다.
?dv1+d*1-r-p
나는 "입력이 제곱이 될 것"이라는 경고를 놓쳤다. 그러나 이것은 음이 아닌 모든 정수에서 작동 할 것이다. Martin Ender는 이미 2 바이트 솔루션을 제공했다 .
½‘Ḟ²’_
카운트를 반환하는 모나드 링크.
DJMcMayhem의 놀라운 답변에 약간 외치 십시오.
{({}()[({}()())])}{}
이 코드는 제곱에서 홀수 단위로 카운트 다운하여 작동합니다. 모든 제곱은 연속 홀수의 합이므로 n 1/2 단계 에서 0에 도달 합니다. 여기서의 요령은 실제로 짝수로 단계를 추적 하고 정적 ()을 사용 하여 적절한 홀수로 오프셋합니다. 답은 2n 1/2 이므로이 짝수는 우리의 답이 될 것입니다. 따라서 0에 도달하면 0을 제거하고 답은 스택에 있습니다.
@(n)2*n^.5
Martin의 훨씬 나은 접근 방식을 사용하여 15 바이트를 절약했습니다. 범위는 2*sqrt(n)요소 로 구성됩니다 . 함수는 정확히 다음 2을 수행합니다. 입력의 근을 곱 합니다.
½‘R²Ṫ_‘
설명:
½‘R²Ṫ_ Input: 40
½ Square root 6.32455532...
‘ Increment 7.32455532...
R Range [1, 2, 3, 4, 5, 6, 7]
² Square [1, 4, 9, 16, 25, 36, 49]
Ṫ Tail 49
_‘ Subtract input+1 8
+?
_
S
+1
^2
-1
-G
O
어떻게 작동하는지 알고 싶습니까? 글쎄, 두려워하지 마라! 나는 당신을 교육하기 위해 여기 있습니다!
+? Add the input to x (the accumulator)
_ Store the input in the input list
S Square root
+1 Add 1
^2 Square
-1 Subtract 1
-G Subtract the input
O Output as number
나는 이것이 크게 줄어들 수 있다고 확신하지만 (편집 : Luis 덕분에) 순진한 해결책은 다음과 같습니다.
X^QUG-q
X^ % Take the square root of the input (an integer)
QU % Square the next integer to find the next square
G- % Subtract the input to find the difference
q % Decrement solution by 1 to count only "in between" values.
2/*<ER
o@i
다시, 2 sqrt (n)을 계산합니다 . 레이아웃은 표준 솔루션보다 2 바이트를 절약합니다.
/o
\i@/2RE2*
IP의 리디렉션을 제외한 코드 분석 :
2 Push 2 for later.
i Read all input.
i Try reading more input, pushes "".
2 Push 2.
R Negate to get -2.
E Implicitly discard the empty string and convert the input to an integer.
Then take the square root of the input. E is usually exponentiation, but
negative exponents are fairly useless in a language that only understands
integers, so negative exponents are interpreted as roots instead.
* Multiply the square root by 2.
o Output the result.
@ Terminate the program.
.+
$*
(^1?|11\1)+
$1
온라인으로 사용해보십시오! 설명 : @MartinEnder의 삼각 숫자 솔버를 기반으로 숫자의 제곱근을 취하여 작동합니다. 정사각형 번호를 일치시킨 후 $1정사각형 번호와 이전 정사각형 번호의 차이는 단항입니다. 우리는 다음 차이점을 원하지만 독점적입니다. 이를 달성하기 위해의 null 문자열 수를 계산합니다 $1.
n->2*Math.sqrt(n)
참고 :이 필요 import java.util.function.*;얻을 IntFunction<T>자바 (8) 또는 Java 9,하지만 java.util.function패키지가 JShell에서 기본적으로 가져옵니다.