하나의 큐브를 절단 할 수있는 큐브 수를 계산


9

조각이 남지 않고 더 작은 큐브로자를 수있는 큐브를 상상해보십시오.

큐브를 절단 할 수있는 큐브 수를 찾으십시오.

예를 들어, 큐브는 8, 27 (분명히 3의 정수 제곱)과 20 개 (19 개의 작은 큐브에 다른 크기의 8 배 크기, 이미지 참조) 로자를 수 있습니다.
도움이 필요 하시면 여기를 클릭하십시오 : http://mathworld.wolfram.com/CubeDissection.html

여기에 이미지 설명을 입력하십시오 프로그램은 입력 정수 n( 0 <= n <= 1 000) n로 가져와 큐브를 해당 큐브 수로자를 수 있도록 모든 숫자를 작거나 같게 인쇄해야합니다 . 큐브를 1 큐브로자를 수 있고 0 큐브로 할 수 없다고 가정하십시오.

64 비트보다 크지 않은 크기의 정수 데이터 유형 (배열, 객체 등) 만 사용할 수 있습니다. 가장 짧은 코드가 승리합니다.


이것은 잠재력이 있지만 더 명확하게 지정해야합니다. 큐브는 실제로 20 큐브로 절단 할 수 있습니다. 원본 1/3의 27 큐브로 잘라내는 대신 원본 1/3의 19 큐브와 8 배 더 큰 큐브로 잘라냅니다 (2/3면). . 원본) 그래, 난 사진이 도움이 될 것이라고 생각
레벨 강 세인트

그것은 내가 그린 꽤 거친 큐브입니다. 자유롭게 바꾸십시오. 첫눈에 이것은 사소한 것처럼 보이지만 125-216 (5 ^ 3-6 ^ 3) 정도의 흥미로운 범위가 있다고 생각합니다. 매우 많은 수의 경우 거의 모든 나눗셈이 가능합니다.
Level River St

임계 값 이후의 모든 숫자가 가능한지 살펴 보겠습니다.
Somnium

3
대답은 실제로 여기 있습니다 : mathworld.wolfram.com/CubeDissection.html
Level River St

1
우리가 지금 매우 사소한 솔루션을 가지고 있기 때문에, 당신은 코드 골프이 다시 변경하거나 일부 넣어 할 수 있습니다 정말 제출물에 하드 제한을.
마틴 엔더

답변:


1

골프 스크립트, 55 (또는 43 42)

{.:^}{.47>20{.^>^@- 7%|!|}:/~1/38/39/{}{;}if^(}while;]`

여기서 테스트 할 수 있습니다 (2 행의 숫자 변경). 수집 또는 문제 해결이 아닌 깨끗한 인쇄를 위해 배열 (마지막 두 문자) 만 사용합니다. 그대로두면 모든 결과가 연결됩니다.

방법 : 주어진 n에서 반복 : 현재 숫자가 47보다 크거나 1 + 7x, 20 + 7x, 38 + 7x 또는 39 + 7x 형식 인 경우 x = 음수가 아닌 정수이면 스택에 유지하십시오. 그렇지 않으면 떨어 뜨립니다.

짧은 답변 (43 바이트) :

{: / 6 +, {7 * / +} % |} : &;) : a, 48, ^ 1 & 20 & 38 & 39 & {a <},`

):a,48,^1{:/6+,{7*/+}%|}:&~20&38&39&{a<},`

방법 : 비슷하지만 몇 가지 이론이 있습니다. 이것은 배열을 사용하므로 기술적으로 받아 들일만한 대답이 아닙니다. 여기에서 테스트 할 수 있습니다 . Btw : 아무도 특정 순서로 있어야한다고 말한 적이 없습니다.)


1

Mathematica, 62 바이트 (또는 52)

하드 코딩 된 답변이며 흥미로운 것은 없습니다.

If[EvenQ@BitShiftRight[164015534735101,n],Print@n]~Do~{n,1000}

이것은 52 바이트 길이이지만 규칙을 위반합니다-큰 정수 (2의 거듭 제곱)와 목록 (범위)을 사용합니다.

Select[Range@1000,EvenQ@Floor[164015534735101/2^#]&]


0

C, 72

i;main(){for(scanf("%d",&i);i;i--)0x952BD7AF7EFC>>i&1||printf("%d ",i);}

또 다른 하드 코딩 된 답변. 이것은 아래로 계산됩니다 (숫자가 출력되는 순서에 대한 규칙에는 아무것도 없습니다.) 이론적으로는 효과가 있습니다. 상수는 큐브를자를 수없는 모든 숫자에 대해 1로 설정되고 숫자에 대해서는 0으로 설정됩니다. 이론적으로, 오른쪽으로 매우 큰 숫자만큼 이동하면 상수는 0이어야하므로 큰 숫자는 항상 인쇄해야합니다.

흥미로운 것은 실제로 이것이 작동하지 않는다는 것입니다. 위의 코드는 GCC에서 최대 65 개까지 컴파일 및 실행됩니다. 그러나이 숫자보다 높으면 컴파일러에 버그 (또는 "기능")가 있습니다. 로 해석 0x952BD7AF7EFC>>i됩니다 0x952BD7AF7EFC>>i%64. 따라서 66에서 71까지의 숫자 (64 + 2에서 64 + 7)를 건너 뜁니다.

Visual Studio에서 실행하려면 조금 더 상용구가 필요합니다 (암시 적 정수 및 #includes 와 같은 것을 피할 수는 없습니다 ). 프로그램이 시작되고 실행되면 최대 257까지 괜찮습니다. 263 (256 + 2-256 + 7) 따라서i%256.

나중에 고칠 수 있습니다 (귀찮게 할 수 있다면). Moral : 컴파일러 매뉴얼은 일반적으로 비트 시프트의 상한을 알려주지 않습니다. 그 이유가 있습니다!


이것은 내 대답과 정확히 같은 원칙을 사용합니다)
Somnium

실제로, 기본적으로 동일한 상수 (비트 0은 사용되지 않고 비트 1은 숫자 1을 나타냄)도 있습니다. CI에서는 상수를 16 진수로 지정하여 단일 바이트를 저장합니다. 나는 0비트 0을 가지고 있으며 , 1i = 0의 경우와 같이 변경할 수 있습니다 . 그러나 어쨌든 표시되지 않습니다.
Level River St

@steveverrill NUM>>i변경 방법을 설명해주세요 NUM>>i%64. 또한 64-bit숫자가 64 배 이상 오른쪽으로 이동 하면 숫자가 됩니다.zero
manav mn

@Manav는 실제로 0이되어야합니다. 내가 말했듯이, 컴파일러에는 버그가 있습니다. 비트 시프트를 수행하기 전에 컴파일러가 가장 왼쪽 비트를 자르기 때문에 또는 동등 NUM>>i하게됩니다 . GCC는 가장 오른쪽 6 비트 만 고려합니다. Visual Studio에는 동일한 버그가 있지만 가장 오른쪽 8 비트 만 고려하면 약간 더 좋습니다 . 호기심으로 직장에서 집으로 돌아올 때 Ideone을 시도 할 것입니다. NUM>>(i%64)NUM>>(i&63)iNUM>>(i%256)
Level River St

ideone은 GCC와 똑같이 동작합니다. ideone.com/EpKTpO
Level River St
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.