5つのキューブの合計


33

整数が与えられた場合、合計がその整数である5つの完全なキューブを出力します。キューブは、正、負、またはゼロになる可能性があることに注意してください。例えば、

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

したがって、入力について-10は出力できます[-64, -64, 64, 27, 27]が、他の解決策も可能です。キューブ化する数値ではなく、キューブを出力する必要があることに注意してください。

解決策は常に存在します -あなたは自分でこれを戸惑うことを楽しむかもしれません。さらに、4つのキューブで十分であると推測されます。


2つの質問:結果を出力できますか、それとも最小のものだけを出力できますか?以下のために-10別の可能な解決策かもしれない-1000+4574296+4410944-4492125-4492125例えば。そして、それは出力が許可される--か、+-代わりに+/ -それぞれ(すなわち3 = 27+-27+-125--64--64代わりに3 = 27-27-135+64+64)?
ケビンCruijssen

@KevinCruijssenどんな結果でも結構です。のような出力を意味する場合、式の出力--5に関する通常の規則に従って、私はノーと言います
xnor

@KevinCruijssen +数字だけで符号付きの式を出力する必要はありません。
xnor

-10 = -64 - 64 + 64 + 27 + 27または-10 = -343 + 0 -8 +125 +216
Angs

3
興味深い注:3は十分ではありません(一部の数値は表現できない)が、表現可能性が不明な数値(33など)もあります。
エソランジングフルーツ

回答:


16

Brachylog、18バイト

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

オンラインでお試しください!

説明

私たちは基本的に問題を説明しますが、出力リストが大きさに関して増加しないようにするという追加の制約を使用します:これにより、Brachylogは、最後の値を無限にバックトラックするのではなく、5つの値のすべての可能な組み合わせを適切にバックトラックしますリストの要素。

∧                ∧    (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バイトを保存してくれたFatalizeに感謝します

~+l₅≥₁.√₃ᵐ∧

オンラインでお試しください!

最初に~+、出力(.)を入力に合計する必要があることを強制します。l₅再び出力を制限し、長さが5でなければならないことを指定します。≥₁リストが降順でなければならないことを宣言します(無限ループに入るプログラムを停止するために必要だと思います)

.次の述語はリスト内の値を「変更」するため、このリストを出力変数で明示的に統合します。次に、リスト内の各値のキューブルートを取得し√₃ᵐます。Brachylogは本質的に整数ベースであるため、これはリスト内のすべての数値がキューブ番号であることを示しています。

最後に、各行の末尾に暗黙的な行が.追加されているため、使用します。.キューブルートのリストと統合することは望ましくないため、以前に統合し、最後に統合を停止するために使用しました。



9

Python 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バイトを節約できます。 オンラインでお試しください!
ジェフフリーマン

なぜ繰り返しキュービングするのが面倒ですか?すなわちcodegolf.stackexchange.com/a/161235/17360
qwr

7

Java 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から上にループします。すべての反復で、次の2つの方程式をチェックします。

  • kn == n 3 +(k + 1)3 +(k-1)3 -k 3 -k 3
  • kn == n 3-(k + 1)3-(k-1)3 + k 3 + k 3

どうして?

以来NN 3 = N *(1-N)*(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)
オリビエグレゴワール

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

オンラインでお試しください!

古い括弧を削除するのを忘れていたため、ジュゼッペのおかげで6バイト節約できました。rafa11111のおかげで、記号を変更して別のバイトを節約しました。

リンクされたmath.se投稿の式を使用します。

  1. 以降のn -のn ^ 3 = N(1-N)(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

Minecraft関数(18w11a、1.13スナップショット)、813バイト

perfect cubes in minecraft

6つの機能を使用します。

a

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

b

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

c

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

d

scoreboard players operation x c = x k

e

scoreboard players operation x b = x c

f

function e
function c

というスコアボード目標から「入力を取得」し、nで作成して/scoreboard objectives add n dummyからを使用して設定し/scoreboard players set x n 5ます。次に、を使用して関数を呼び出します/function a

このmath.se回答の式を使用します




2

Haskell43 42バイト

p n|k<-div(n^3-n)6=map(^3)[n,-k-1,1-k,k,k]

Haskellに翻訳された人気のある回答です。バイトを保存してくれた@ rafa11111に感謝します!

オンラインでお試しください!


2
あなたは、サインインを変更し、バイト1を保存することができますk...割り当て
rafa11111

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

Pythonの3、65の 61 60バイト

lambda N:[n**3for k in[(N**3-N)//6]for n in[N,-k-1,1-k,k,k]]

編集:いくつかの不要なスペースを削除しました。

編集:rafa11111のスマートな並べ替えのおかげ。

これに触発され

オンラインでお試しください!


(N**3-N)and を使用して1バイトを保存できます[N,1-k,-1-k,k,k]
rafa11111

1
@ rafa11111スマート再配列。ありがとう。
国陽


1

APL(Dyalog Unicode)30 26バイト

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

オンラインでお試しください!

LeakyNunの答えの APL翻訳。

暗黙のうちに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)tioには課題があるので、ここでの答えは単なる断片ではありませんか?2)30文字を使用しましたが、Unicodeであるため、tioで指摘されているように、43バイトを使用していませんか?
rafa11111

1
@ rafa11111いいえ、いいえ:APLはTIOで奇妙に動作します。「コード」フィールドの割り当ては、実際には「入力」フィールドの機能を使用するためのショートカットです。実際のコードが機能することは完全に不要です。また、Dyalog APLでは@AdámのSBCSを使用するため、各文字を1バイトとしてカウントします。後で説明するメタ投稿にリンクを追加できますが、今はモバイルです。
J.サール

ああなるほど。私はこれらについて知りませんでした。説明してくれてありがとう!
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

Objdump:

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.