5 개 큐브 합


33

정수가 주어지면 그 합계가 그 정수인 5 개의 완벽한 큐브를 출력하십시오. 큐브는 양수, 음수 또는 0 일 수 있습니다. 예를 들어

-10 == -64 - 64 + 64 + 27 + 27

다른 솔루션도 가능하지만 입력의 경우 -10출력 할 수 [-64, -64, 64, 27, 27]있습니다. 큐브가되는 숫자가 아닌 큐브를 출력해야합니다.

해결책은 항상 존재합니다 . 자신을 위해 수수께끼를 풀 수 있습니다. 4 개의 큐브로 충분하다고 추측됩니다.


두 가지 질문 : 결과를 출력 할 수 있습니까 아니면 가장 작은 것만 출력 할 수 있습니까? 대한 -10또 다른 가능한 해결책이 될 수있다 -1000+4574296+4410944-4492125-4492125예를 들어. 그리고 그것은 출력 허용 --또는 +-대신에 +/ -(즉, 각각 3 = 27+-27+-125--64--64대신 3 = 27-27-135+64+64)?
Kevin Cruijssen

@KevinCruijssen 모든 결과는 괜찮습니다. 과 같은 출력을 의미 하는 경우 표현식 출력에 대한--5 일반적인 규칙에 따라 아니요라고 대답 합니다 .
xnor

@KevinCruijssen +부호가 있는 표현식을 숫자 로만 출력 할 필요는 없습니다 .
xnor

-10 = -64 - 64 + 64 + 27 + 27또는-10 = -343 + 0 -8 +125 +216
Angs

3
재미있는 메모 : 3만으로는 충분하지 않지만 (일부 숫자는 표현할 수 없음), 대표성이 알려지지 않은 숫자가 있습니다 (예 : 33).
Esolanging 과일 2

답변:


16

Brachylog , 18 바이트

∧5~lLȧᵐ≥₁∧L^₃ᵐ.+?∧

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

설명

우리는 기본적으로 출력 목록이 크기 측면에서 증가하지 않기를 원한다는 추가 제약 조건으로 문제를 설명합니다. 목록의 요소.

∧                ∧    (disable some implicit stuff)
 5~lL                 L is a list of length 5
    Lȧᵐ≥₁             L must be a non-increasing list in terms of magnitude
         ∧
          L^₃ᵐ.       The output is L with each element cubed
              .+?     The sum of the output is the input

다른 솔루션 찾기

를 추가하면 이 술어를 사용하여 증가하는 규모의 모든 솔루션을 찾을 수 있습니다. 예를 들어, 여기에 대한 첫 10 개의 솔루션이 있습니다.42


14

Brachylog , 11 바이트

1 바이트를 저장해 주셔서 감사합니다.

~+l₅≥₁.√₃ᵐ∧

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

먼저 ~+출력 ( .)이 입력과 합쳐 져야합니다. l₅다시 출력을 제한하여 길이가 5 ≥₁이어야 함을 나타냅니다.리스트가 감소하는 순서로 선언해야합니다 (프로그램이 무한 루프에 들어가는 것을 중지하는 데 필요하다고 생각합니다)

.다음 술어가 목록 내의 값을 "변경"하므로 출력 변수 인을 사용하여이 목록을 명시 적으로 통합 합니다. 그런 다음 목록에서 각 값의 큐브 근을로 사용 √₃ᵐ합니다. Brachylog는 본질적으로 정수를 기반으로하기 때문에 목록의 모든 숫자가 큐브 숫자임을 나타냅니다.

마지막으로, 우리 는 각 줄의 끝에 암시 적으로 .추가 되기 때문에 사용 합니다. 우리는 .큐브 루트 목록으로 통일 하기 를 원하지 않기 때문에 이전에 통일하여 통일을 멈추기 위해 사용 합니다.


10

파이썬 2 , 58 57 54 바이트

def f(n):k=(n**3-n)/6;return[v**3for v in~k,1-k,n,k,k]

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


  • Rod 덕분에 -2 바이트
  • Neil 덕분에 -1 바이트

1
신호를 교환하면서 2 바이트를 절약 할 수 있습니다k=-(n-n**3)/6;[v**3for v in~k,1-k,n,k,k]
Rod

1
@Rod For를 -(n-n**3)사용할 수 (n**3-n)없습니까?
Neil

@Neil 예, 가능합니다.
Rod

9

파이썬 3 , 65 바이트

def f(n):k=(n-n**3)//6;return[n**3,(k+1)**3,(k-1)**3,-k**3,-k**3]

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

내 말은, 명백한 공식은 여기에도 있습니다 (그는 존재의 배후에있는 구조를 추상화했지만)


k방정식 을 반전 시키고 다시 쓰면 정확히 1 바이트를 절약 할 수 있습니다 . 온라인으로 사용해보십시오!
Jeff Freeman

큐빙이 반복되는 이유는 무엇입니까? 즉 codegolf.stackexchange.com/a/161235/17360
qwr

7

자바 8, 178 87 73 71 65 바이트

n->new long[]{n*n*n,(n=(n-n*n*n)/6+1)*n*n--,--n*n*n,n=-++n*n*n,n}

@ OlivierGrégoire 덕분에 -6 바이트 .

하단에 동일한 설명이 있지만 이전에 사용한 파생 방정식 대신 기본 방정식을 사용합니다 ( 암시 적 팁에 대한 @LeakyNun 의 Python 3 답변 덕분에 ).

k = (n-n 3 ) / 6
n == n 3 + (k + 1) 3 + (k-1) 3 -k 3 -k 3

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


이전 178 바이트 답변 :

n->{for(long k=0,a,b,c,d;;){if(n==(a=n*n*n)+(b=(d=k+1)*d*d)+(c=(d=k-1)*d*d)-(d=k*k*k++)-d)return a+","+b+","+c+","+-d+","+-d;if(n==a-b-c+d+d)return-a+","+-b+","+-c+","+d+","+d;}}

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

설명:

k솔루션을 찾을 때까지 0에서 위쪽으로 반복 합니다. 모든 반복에서 다음 두 방정식을 점검합니다.

  • 양수 k: n == n 3 + (k + 1) 3 + (k-1) 3 -k 3 -k 3
  • 음수 k: n == n 3- (k + 1) 3- (k-1) 3 + k 3 + k 3

왜?

이후 NN 3 = N * (N-1) * (1 + n)의 다음 6 | NN ( 3 ) , 다음과 같이 작성 될 수 NN 3 = 6K .
6k = (k + 1) 3 + (k-1) 3 -k 3 -k 3 .
그러므로 N = N (3) + (K + 1) (3) + (K-1) 3 - K 3 - K 3 일부 K .
출처.


1
65 바이트 : n->new long[]{n*n*n,(n=(n-n*n*n)/6+1)*n*n--,--n*n*n,n=-++n*n*n,n}(또는 덜 정확한 결과를 위해 int를 사용하는 64)
Olivier Grégoire

6

젤리 , 13 바이트

‘c3µ;;C;~;³*3

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

공식을 독립적으로 계산하십시오. (X + 1) (3) + (X-1) 3 - × 2 X 3 == 6 × X.


 === Explanation ===
‘c3µ;;C;~;³*3   Main link. Input: (n).
‘               Increment.
 c3             Calculate (n+1)C3 = (n+1)×n×(n-1)÷6.
   µ            Start a new monadic link. Current value: (k=(n³-n)÷6)
    ;           Concatenate with itself.
     ;C         Concatenate with (1-k).
       ;~       Concatenate with bitwise negation of (k), that is (-1-k)
         ;³     Concatenate with the input (n).
           *3   Raise the list [k,k,1-k,-1-k,n] to third power.
                End of program, implicit print.

대안 13 바이트 : 온라인으로 사용해보십시오!


‘c3µ³;;;C;~*3(n ^ 3-n) / 6 = C (n + 1, 3) 이후 바이트를 저장해야 함
마일

5

옥타브 , 47 40 33 바이트

@(n)[k=(n^3-n)/6,k,-k-1,1-k,n].^3

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

오래된 괄호를 제거하는 것을 잊었 기 때문에 Giuseppe 덕분에 6 바이트를 절약했습니다. rafa11111 덕분에 부호를 변경하여 다른 바이트를 절약했습니다.

연결된 math.se 게시물 의 수식을 사용합니다 .

  1. 이후 N - N ^ 3 = N (N-1) (1 + n)의 다음 6 | (n-n ^ 3) 이고 n-n ^ 3 = 6k 라고 쓸 수 있습니다 .
  2. 6k = (k + 1) ^ 3 + (k-1) ^ 3-k ^ 3-k ^ 3 .

내가하려고하면 그것은 더 이상 나타납니다 해결 방정식 : (NN ^ 3) = (K + 1) ^ 3 + (K-1) ^ 3 - K ^ 3 - K ^ 3 에 관해서 K , 대신 단지 방정식을 사용하여.


3

마인 크래프트 함수 (18w11a, 1.13 스냅 샷), 813 바이트

perfect cubes in minecraft

6 가지 기능을 사용합니다.

에이

scoreboard objectives add k dummy
scoreboard objectives add b dummy
scoreboard objectives add c dummy
scoreboard players operation x k = x n
function d
function f
scoreboard players operation x k -= x b
scoreboard players set x b 6
scoreboard players operation x k /= x b
scoreboard players set x b 1
function d
scoreboard players operation x c += x b
function f
scoreboard players set x b 1
function d
scoreboard players operation x c -= x b
function f
function d
function e
scoreboard players operation x b -= x c
scoreboard players operation x b -= x c
function c
function b

tellraw @s {"score":{"name":"x","objective":"b"}}

기음

scoreboard players operation x b *= x c
scoreboard players operation x b *= x c
function b

scoreboard players operation x c = x k

이자형

scoreboard players operation x b = x c

에프

function e
function c

이라는 스코어 보드 목표에서 "입력을 가져와"로 n작성하고를 /scoreboard objectives add n dummy사용하여 설정하십시오 /scoreboard players set x n 5. 그런 다음 사용하여 함수를 호출하십시오./function a

이 수학 의 공식을 사용합니다.





2

껍질 , 12 바이트

ḟo=⁰Σπ5m^3İZ

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

가능한 5 개의 큐브 목록을 모두 시도하고 올바른 합계를 가진 첫 번째 큐브를 반환합니다.

설명

ḟo=⁰Σπ5m^3İZ
          İZ    List of all integers [0,1,-1,2,-2,3,-3...
       m^3      Cube of each integer [0,1,-1,8,-8,27,-27...
     π5         Cartesian power with exponent 5. This returns a list of all possible
                lists built by taking 5 elements from the input list. This infinite
                list is ordered in such a way that any arbitrary result occurs at a 
                finite index.
ḟo              Find and return the first element where...
    Σ             the sum of the five values
  =⁰              is equal to the input





1

APL (Dyalog Unicode) , 30 26 바이트

3*⍨⊢,∘(1 ¯1∘+,2⍴-)6÷⍨⊢-*∘3

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

의 APL 번역 LeakyNun의 답변 .

암묵적으로 진행하여 4 바이트의 Adám에게 감사드립니다.

방법?

3*⍨⊢,∘(1 ¯1∘+,2⍴-)6÷⍨⊢-*∘3  Tacit function
                   6÷⍨⊢-*∘3  (n-n^3)/6 (our k)
                 -)          Negate
               2            Repeat twice; (yields -k -k)
       (1 ¯1∘+,              Append to k+1, k-1
     ,∘                      Then append to
                            n
3*⍨                          And cube everything

내가 뭔가를 놓쳤다면 미안하지만 : 1) 티오에서 과제가 있기 때문에 여기에 당신의 대답이 스 니펫이 아닙니까? 2) 유니 코드로되어 있기 때문에 30자를 사용했지만 tio에서 지적한 것처럼 43 바이트를 사용하지 않습니까?
rafa11111

1
@ rafa11111 아니요 및 아니요 : APL이 TIO에서 이상하게 작동합니다. "코드"필드의 할당은 실제로 "입력"필드의 기능을 사용하는 바로 가기입니다. 실제 코드가 작동하는 것은 완전히 불필요합니다. 또한 Dyalog APL의 경우 @ Adám의 SBCS를 사용하기 때문에 각 문자를 1 바이트로 계산합니다. 나중에 메타 설명에 링크를 추가하여 나중에 설명 할 수 있지만 지금은 모바일에 있습니다.
J. Sallé

아, 알겠습니다 나는 이것에 대해 몰랐다. 설명해 주셔서 감사합니다!
rafa11111

1

껍질 , 20 바이트

m^3m‼:_:→:←;K¹÷6Ṡ-^3

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

이 게시물 의 수식을 사용합니다 .

설명

m^3m‼:_:→:←;K¹÷6Ṡ-^3  Implicit input
                Ṡ-    Subtract itself from it
                   ^3    raised to the third power
              ÷6       Divide by six
   m                   Map over the value with a list of functions:
           ;             Create a singleton list with
            K¹             the function of replace by the input
         :←              Append the function of decrement
       :→                Append the function of increment
    ‼:_                  Append the function of negate twice
m^3                    Cube the numbers of the list

1

x86, 41 39 바이트

ecx스택에 입력 및 출력 되는 수식의 대부분 간단한 구현 .

흥미로운 점은 큐빙 함수를 사용했지만 call label5 바이트 이므로 레이블의 주소를 저장하고 2 바이트를 사용한다는 것 call reg입니다. 또한 함수에서 값을 푸시하기 때문에 jmp대신을 사용합니다 ret. 루프가 똑똑하고 스택이 완전히 호출되는 것을 피할 수 있습니다.

나는을 사용하는 것과 같은 큐빙으로 멋진 트릭을하지 않았습니다 (k+1)^3 = k^3 + 3k^2 + 3k + 1.

변경 로그:

  • / not대신에 바이트 수를 수정하십시오 .negdec

  • -2 바이트 는 0부터 시작하므로 xoring 하지 않음으로써 .edximul

.section .text
.globl main

main:
        mov     $10, %ecx   # n = 10

start:
        lea     (cube),%edi # save function pointer
        call    *%edi       # output n^3

        sub     %ecx, %eax  # n^3 - n
                            # edx = 0 from cube
        push    $6
        pop     %ebx        # const 6        
        idiv    %ebx        # k = (n^3 - n)/6
        mov     %eax, %ecx  # save k

        call    *%edi       # output k^3
        push    %eax        # output k^3

        not     %ecx        # -k-1        
        call    *%edi       # output (-k-1)^3

        inc     %ecx        
        inc     %ecx        # -k+1
        call    *%edi       # output (-k+1)^3

        ret

cube:                       # eax = ecx^3
        pop     %esi 
        mov     %ecx, %eax
        imul    %ecx
        imul    %ecx

        push    %eax        # output cube
        jmp     *%esi       # ret

오보 펌프 :

00000005 <start>:
   5:   8d 3d 22 00 00 00       lea    0x22,%edi
   b:   ff d7                   call   *%edi
   d:   29 c8                   sub    %ecx,%eax
   f:   6a 06                   push   $0x6
  11:   5b                      pop    %ebx
  12:   f7 fb                   idiv   %ebx
  14:   89 c1                   mov    %eax,%ecx
  16:   ff d7                   call   *%edi
  18:   50                      push   %eax
  19:   f7 d1                   not    %ecx
  1b:   ff d7                   call   *%edi
  1d:   41                      inc    %ecx
  1e:   41                      inc    %ecx
  1f:   ff d7                   call   *%edi
  21:   c3                      ret    

00000022 <cube>:
  22:   5e                      pop    %esi
  23:   89 c8                   mov    %ecx,%eax
  25:   f7 e9                   imul   %ecx
  27:   f7 e9                   imul   %ecx
  29:   50                      push   %eax
  2a:   ff e6                   jmp    *%esi

마지막에 모든 큐빙을 수행하는 테스트 버전이 있습니다. 스택에서 값을 푸시하면 큐브 루프가 스택 값을 덮어 씁니다. 현재 42 40 바이트이지만 어딘가에 개선이 필요합니다.

.section .text
.globl main

main:
        mov     $10, %ecx       # n = 10

start:
        push    %ecx            # output n

        mov     %ecx, %eax
        imul    %ecx
        imul    %ecx
        sub     %ecx, %eax      # n^3 - n
                                # edx = 0 from imul

        push    $6
        pop     %ecx            # const 6        
        idiv    %ecx            # k = (n^3 - n)/6

        push    %eax            # output k
        push    %eax            # output k

        not     %eax            # -k-1        
        push    %eax            # output -k-1

        inc     %eax            
        inc     %eax            # -k+1
        push    %eax            # output -k+1

        dec     %ecx            # count = 5
        add     $20, %esp
cube:           
        mov     -4(%esp),%ebx   # load num from stack
        mov     %ebx, %eax
        imul    %ebx
        imul    %ebx            # cube 
        push    %eax            # output cube
        loop    cube            # --count; while (count)

        ret





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