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


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.