입력과 다음 가장 높은 제곱 사이의 값 수


9

입력으로 양의 제곱수가 주어집니다. 입력과 다음 최고 제곱 사이의 값 수를 출력합니다.

입력 : 1

출력 : 2

이유 : 숫자 2와 3은 1에서 4 사이이며 다음으로 높은 정사각형입니다.

입력 : 4

출력 : 4

이유 : 숫자 5, 6, 7, 8은 4와 9 사이입니다.


1
어떤 범위의 입력 값을 지원해야합니까?
Martin Ender 2016 년

16
입력이 정사각형 일 필요가 없다면 이것이 더 흥미 로웠을 것이라고 생각합니다.
xnor

1
@ xnor Hindsight, 나는 확실히 동의합니다.
Shayne03

답변:


8

젤리 , 2 바이트

½Ḥ

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

내 Mathematica 답변 포트 (제곱근을 취한 다음 두 배). 이것은 부동 소수점 숫자로 정확하게 표현 될 수있는 입력으로 제한됩니다. 이것이 문제라면, 3 바이트 솔루션 ƽḤ은 임의의 제곱 (Dennis가 먼저 게시했지만 삭제)에서 작동합니다.


1
오, 나는 "입력이 사각형이 될 것이다"라는 전체를 놓쳤다.
Jonathan Allan

1
@JonathanAllan 나도. 이상한 사양 IMO.
디지털 외상

부동 소수점으로 정확하게 표현할 수없는 사각형이 있습니까?
산란

@Christian Sure, 부동 소수점 숫자는 크기가 고정되어 있기 때문에 한정 할 수있는 값은 유한합니다.
Martin Ender 2016 년

@MartinEnder이 경우 임의의 정밀 정수에 대한 Jelly의 지원과 사양의 상한이 없으면 모든 유효한 입력을 지원해야한다고 투표합니다.
산란

12

Brain-Flak , 38 , 22 바이트

{([[]](({})))}{}([]<>)

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

아주 이 답변의 자랑. 내 최고의 두뇌 게임 중 하나 인 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))

2
내 뇌는 말 그대로이 멋진 일에 의해 괴롭 혔습니다.
Magic Octopus Urn

9

수학, 8 바이트

2Sqrt@#&

온라인으로 사용해보십시오! (수학 사용)

차이 N 2(N + 1) (2)는 항상 2N + 1 하지만 우리는 그냥 양쪽 끝 제외하고 그들 사이의 값을 원하는 2N을 .

2#^.5&정밀 요구 사항 에 따라 잠재적으로 단축 될 수 있습니다 .


1
어때 2√ # &?
chyanog





2

Brain-Flak , 20 바이트

DJMcMayhem의 놀라운 답변에 약간 외치 십시오.

{({}()[({}()())])}{}

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

설명

이 코드는 제곱에서 홀수 단위로 카운트 다운하여 작동합니다. 모든 제곱은 연속 홀수의 합이므로 n 1/2 단계 에서 0에 도달 합니다. 여기서의 요령은 실제로 짝수로 단계를 추적 하고 정적 ()을 사용 하여 적절한 홀수로 오프셋합니다. 답은 2n 1/2 이므로이 짝수는 우리의 답이 될 것입니다. 따라서 0에 도달하면 0을 제거하고 답은 스택에 있습니다.




1

젤리 , 7 바이트

½‘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

Btw, 입력은 항상 정사각형입니다.
Martin Ender 2016 년

1
@JonathanAllan 고정
산란

@MartinEnder 나는 도전을 완전히 잘못 읽은 다음 ... 당신의 대답을 복사하지 않기 위해 (왜 그것이 효과가 있는지 분명하기 때문에) 나는 이것을 남겨 둘 것입니다.
산란




1

TI 기본, 3 바이트

2√(Ans

가장 간단한 접근법 ...



1

추가 ++ , 22 20 바이트

+?
_
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

나는 원래의 QBIC 답변에 대해 동일한 논리를 가지고 있었지만 더 짧은 방법이 있습니다.
steenbergh

1

MATL ( 8 7 바이트)

나는 이것이 크게 줄어들 수 있다고 확신하지만 (편집 : 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.

1
당신은 대체 할 수 2^U(이것은 버전 20.1.1에서 근무 심지어 우리의 오래된 표준에 의해 자격이 될 것이라고 대답 그래서 도전의 시점에서 가장 최근에했다)
루이스 Mendo

1
고마워 루이스! 나는 순진한 접근 방식이 MATL 마스터에 비해 1 문자 만 낭비한다는 것에 놀랐습니다. :)
DrQuarius



0

Alice , 10 바이트

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.


0

QBIC , 19 9 바이트

?sqr(:)*2

@MartinEnder의 접근 방식을 복사하여 무리를 저장했습니다.

불행히도 QBIC에 대한 TIO 링크가 없습니다.

설명

?          PRINT
 sqr( )    The square root of
     :     the input
        *2 doubled



0

망막 , 21 바이트

.+
$*
(^1?|11\1)+
$1

온라인으로 사용해보십시오! 설명 : @MartinEnder의 삼각 숫자 솔버를 기반으로 숫자의 제곱근을 취하여 작동합니다. 정사각형 번호를 일치시킨 후 $1정사각형 번호와 이전 정사각형 번호의 차이는 단항입니다. 우리는 다음 차이점을 원하지만 독점적입니다. 이를 달성하기 위해의 null 문자열 수를 계산합니다 $1.





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