Сумма пяти кубов


33

Получив целое число, выведите пять совершенных кубов, сумма которых равна этому целому числу. Обратите внимание, что кубы могут быть положительными, отрицательными или нулевыми. Например,

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

поэтому для ввода -10вы можете вывести [-64, -64, 64, 27, 27], хотя возможны и другие решения. Обратите внимание, что вы должны выводить кубы, а не кубы.

Решение всегда существует - вам может понравиться загадывать это для себя. Далее предполагается, что четырех кубиков достаточно.


Два вопроса: можем ли мы вывести какой-либо результат или только самый маленький? Для -10другого возможного решения может быть, -1000+4574296+4410944-4492125-4492125например. И разрешено ли выводить --или +-вместо +/ -соответственно (т.е. 3 = 27+-27+-125--64--64вместо 3 = 27-27-135+64+64)?
Кевин Круйссен,

@KevinCruijssen Любой результат в порядке. Если вы имеете в виду вывод, как --5, я бы сказал, нет, в соответствии с обычными правилами вывода выражения .
xnor

@KevinCruijssen Вам не нужно выводить выражение со +знаками, только цифры.
xnor

-10 = -64 - 64 + 64 + 27 + 27или-10 = -343 + 0 -8 +125 +216
Анг

3
Интересное примечание: 3 недостаточно (некоторые числа непредставимы), но есть некоторые числа, представимость которых неизвестна (например, 33).
Esolanging Fruit

Ответы:


16

Брахилог , 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

Нахождение разных решений

Добавив a , можно использовать этот предикат, чтобы найти все решения с растущими величинами: например, вот первые 10 решений для42


14

Брахилог , 11 байт

Спасибо Fatalize за сохранение одного байта

~+l₅≥₁.√₃ᵐ∧

Попробуйте онлайн!

Во-первых, необходимо ~+, чтобы output ( .) суммировался с входом. l₅снова ограничивает вывод, диктуя, что он должен иметь длину 5. ≥₁объявляет, что список должен быть в порядке убывания (я считаю, что это необходимо для остановки программы, входящей в бесконечный цикл)

Мы явно унифицируем этот список с .выходной переменной, потому что наш следующий предикат «изменит» значения внутри списка. Затем мы берем кубический корень каждого значения в списке с помощью √₃ᵐ. Поскольку Brachylog по своей сути основан на целых числах, это диктует, что все числа в списке являются числами куба.

Наконец, мы используем, потому что есть неявное .добавление в конце каждой строки. Поскольку мы не хотим .объединяться со списком корней куба, мы объединили его ранее и используем, чтобы остановить его объединение в конце.


10

Python 2 , 58 57 54 байта

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

Попробуйте онлайн!


  • -2 байта, спасибо Роду
  • -1 байт, спасибо Нейлу

1
Вы можете сэкономить 2 байта, меняя сигналk=-(n-n**3)/6;[v**3for v in~k,1-k,n,k,k]
Род

1
@Rod для -(n-n**3)вы не можете использовать (n**3-n)?
Нил

@ Нейл, да, ты можешь.
Род

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и переписав уравнение. Попробуйте онлайн!
Джефф Фриман

Зачем беспокоиться о повторных кубов? т.е. 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}

-6 байт благодаря @ OlivierGrégoire .

То же самое объяснение внизу, но с использованием базового уравнения вместо производного, которое я использовал ранее (благодаря ответу @LeakyNun 's 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

Зачем?

Поскольку n - n 3 = n * (1-n) * (1 + n) и затем 6 | (nn 3 ) , его можно записать как n - n 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}(или 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 байтов

идеальные кубики в майнкрафт

Использует шесть функций:

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

б

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

с

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

d

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

Использует формулу из этого ответа math.se




2

Haskell , 43 42 байта

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

Просто популярный ответ, переведенный на Haskell. Спасибо @ rafa11111 за сохранение байта!

Попробуйте онлайн!


2
Вы можете сохранить один байт, изменив знак в 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

C (gcc) , 85 81 75 байтов

Сохранено 4 байта, а затем 6 байтов благодаря переупорядочению назначений @ terracecat

r[5];f(n){r[1]=(n=(n-(*r=n*n*n))/6+1)*n*n--;r[3]=r[4]=-n*n*n;r[2]=--n*n*n;}

Попробуйте онлайн!



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)и[N,1-k,-1-k,k,k]
rafa11111

1
@ rafa11111 умный переупорядочивание. Спасибо.
Гоян Цинь


1

APL (Dyalog Unicode) , 30 26 байт

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

Попробуйте онлайн!

APL перевод ответа LeakyNun .

Спасибо Адаму за 4 байта за молчание.

Как?

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 символов, так как он в юникоде, разве он не использует 43 байта, как указано в tio?
rafa11111

1
@ rafa11111 Нет и нет: APL странно работает в TIO. Назначение в поле «Код» на самом деле является просто ярлыком для использования функции в поле «Ввод»; это совершенно не нужно для реального кода для работы. Кроме того, мы считаем каждый символ одним байтом, потому что для Dyalog APL мы используем SBCS @ Adám. Я могу добавить ссылку на мета-пост, объясняя это позже, но сейчас я на мобильном.
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 labelэто 5 байтов , я сохраняю адрес метки и использую 2 байта call reg. Кроме того, так как я помещаю значения в свою функцию, я использую jmpвместо ret. Вполне возможно, что, будучи умным с циклом и стеком, можно полностью избежать вызовов.

Я не делал никаких причудливых трюков с кубиками, вроде использования (k+1)^3 = k^3 + 3k^2 + 3k + 1.

Changelog:

  • Исправьте количество байтов, используя notвместо neg/ dec.

  • -2 байта, не xorIN, edxпоскольку это, вероятно, 0 из imul.

.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




0

PowerShell Core , 52 байта

$o,(1-($k=($o*$o-1)*$o/6)),(-$k-1),$k,$k|%{$_*$_*$_}

Попробуйте онлайн!

Использует уравнение o=o^3 + (1-k)^3 + (-k-1)^3 + k^3 + k^3, где k=o^3 - o; это незначительный рефакторинг популярногоl=o-o^3k=-l).

Как примечание стороны, выражение l=o-o^3похоже на кошку с больным ухом.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.