이것은 최근 도전의 버전입니다. 이 숫자는 정수 -2입니까? 문제의 흥미로운 특성을 강조하고 도전을 더욱 어렵게하기 위해 고안된 다른 기준을 사용합니다. 여기 에 몇 가지 고려 사항이 있습니다 .
Toby가 관련 질문에서 훌륭하게 언급 한 도전은 다음과 같습니다.
정수가 2의 정확한 거듭 제곱인지 여부를 결정하는 영리한 방법이 있습니다. 더 이상 흥미로운 문제는 아니므로 주어진 정수가 -2 의 정확한 거듭 제곱인지 여부를 결정하십시오 . 예를 들면 다음과 같습니다.
-2 => yes: (-2)¹ -1 => no 0 => no 1 => yes: (-2)⁰ 2 => no 3 => no 4 => yes: (-2)²
규칙 :
- 정수는 부호있는 64 비트이며 2의 보수입니다. 이것은 작업 할 수 있는 유일한 데이터 유형입니다.
- 다음 작업 만 사용할 수 있습니다. 이들 각각은 하나의 작업으로 계산됩니다.
n << k
,n >> k
: 좌 / 우측 시프트n
에 의해k
비트. 부호 비트가 오른쪽으로 확장됩니다.n >>> k
: 오른쪽으로 이동하지만 부호 비트를 확장하지 않습니다. 0이 이동합니다.a & b
,a | b
,a ^ b
: 비트 단위 AND, OR, XOR.a + b
,a - b
,a * b
:, 빼기, 곱하기 추가합니다.~b
: 비트 단위 반전.-b
: 2의 보수 부정.a / b
,a % b
: 나누기 (정수 몫, 0을 향해 반올림) 및 모듈로.- 음수의 모듈은 규칙을 사용하여 C99에 지정을 :
(a/b) * b + a%b
동일하여야한다a
. 그래서5 % -3
입니다2
, 그리고-5 % 3
있다-2
: 5 / 3
is1
,5 % 3
is2
, 1 * 3 + 2 = 5-5 / 3
-는 *-1
,--5 % 3
는-2
* 1 + 3 + -2 = -5입니다.5 / -3
이고-1
,5 % -3
이며2
, -1 * -3 + 2 = 5.-5 / -3
is1
,-5 % -3
is-2
, 1 * -3 + -2 = -5.- 파이썬의
//
바닥 나누기 연산자는 여기에서 나누기의 "0을 향한 반올림"속성을%
만족하지 않으며 , 파이썬 연산자는 요구 사항도 충족하지 않습니다.
- 음수의 모듈은 규칙을 사용하여 C99에 지정을 :
- 배정은 작업으로 계산되지 않습니다. C에서와 마찬가지로, 할당은 할당 한 후 왼쪽의 가치 평가 :
a = (b = a + 5)
세트b
로a + 5
, 다음 세트a
에b
하나 개의 작업으로, 그리고 수를. - 복합 할당은
a += b
수단 으로 사용될a = a + b
수 있으며 하나의 연산으로 계산됩니다.
- 정수 상수를 사용할 수 있지만 아무것도 계산하지 않습니다.
- 작업 순서를 지정하는 괄호는 허용됩니다.
- 함수를 선언 할 수 있습니다. 함수 선언은 64 개 비트 정수는 것을 당신 만 참고 편리 어떤 스타일에있을 수 있습니다 만 유효한 데이터 유형입니다. 함수 선언은 연산으로 계산되지 않지만 함수 호출 은 하나로 계산됩니다. 또한, 명확하게하기 위해 : 함수는 여러
return
문장을 포함 할 수 있으며return
어느 시점에서나 허용됩니다.return
자체는 조작으로 간주하지 않습니다. - 무료로 변수를 선언 할 수 있습니다.
- 당신은 사용할 수 있습니다
while
루프,하지만 당신은 사용할 수 없습니다if
나for
. 에 사용되는 연산자while
조건에 점수에 포함됩니다.while
루프는 조건 이 0이 아닌 값으로 평가되는 한 실행됩니다 (이 개념을 가진 언어의 "거짓"0은 올바른 결과가 아닙니다). 조기 복귀가 허용되어 있기 때문에, 당신은 사용할 수 있습니다break
뿐만 아니라, - 오버 플로우 / 언더 플로우가 허용되며 값 클램핑이 수행되지 않습니다. 작업이 실제로 올바르게 발생한 것처럼 처리 된 다음 64 비트로 잘립니다.
득점 / 승리 기준 :
입력이 -2의 거듭 제곱이면 0이 아닌 값을 생성하고 그렇지 않으면 0을 생성해야합니다.
이것은 atomic-code-golf 입니다. 점수는 런타임에 실행되는 총 작업 수가 아니라 코드에 존재하는 총 작업 수 (위에 정의 된대로) 입니다. 다음 코드 :
function example (a, b) {
return a + ~b;
}
function ispowerofnegtwo (input) {
y = example(input, 9);
y = example(y, 42);
y = example(y, 98);
return y;
}
함수에 2 개, 함수 호출에 3 개의 5 가지 작업이 있습니다.
결과를 어떻게 표현하든, 언어에서 편리한 것을 사용하고, 결과를 변수에 저장하거나, 함수에서 반환하거나, 무엇이든 반환하십시오.
승자는 명백히 정확하고 (필요한 경우 우연한 또는 공식적인 증거를 제공하는) 게시물이며 위에 설명 된대로 가장 낮은 점수를받습니다.
보너스 매우 어려운 모드 도전!
파티에서 사람들에게 깊은 인상을 줄 수있는 능력을 제외하고는 전혀 아무것도 얻지 못할 경우 while
루프 를 사용하지 않고 답변을 제출하십시오 ! 이것들이 충분히 제출된다면 나는 우승 그룹을 두 가지 범주 (루프 유무에 관계없이)로 나누는 것을 고려할 수도 있습니다.
참고 : 32 비트 정수만 지원하는 언어로 솔루션을 제공하려는 경우 설명에서 64 비트 정수에 대해 여전히 올바르다는 것을 충분히 정당화 할 수 있습니다.
또한 : 특정 언어 별 기능은 규칙을 회피하지는 않지만 위의 규칙에 따라 언어가 동작하도록 강요해야하는 경우 무료로 허용 될 수 있습니다 . 예를 들어, (고려 된), 나는 조건이 전체적으로 적용될 때 루프 에서 0이 아닌 0을 비교 하는 것을 허용 할 것이다 while
. 이러한 유형의 것을 활용하려는 명확한 시도는 허용되지 않습니다 . 예를 들어 "truthy"0 또는 "undefined"값의 개념은 위의 규칙 세트에 없으므로 신뢰할 수 없습니다.
m ^= s
그것이 옳다고 가정하면 , 그것을 더 향상시키기 위해 대체를하는 것이 완전히 괜찮을 것이라고 생각합니다.
while
및 break
하지만 if
? if (x) { ... }
와 같습니다 while (x) { ... break; }
.
break
초기 수익은 유감스러운 부분 임) 긴 이야기이며 미래의 도전에 대한 규칙에서 배운 교훈입니다. 항상 "보너스"버전이 있습니다! :)
if
그리고 for
허용되지 않습니까? int x=condition; while (x) { ... x=0; }
무료이며 더 많은 코드입니다. c-style도 마찬가지 for
입니다.