Сума в п'ять кубів


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^₃ᵐ.+?∧

Спробуйте в Інтернеті!

Пояснення

Ми в основному описуємо проблему, з додатковим обмеженням, що ми хочемо, щоб список вихідних даних не збільшувався з точки зору величин: це змушує Брахілога правильно відслідковувати всі можливі комбінації 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₅≥₁.√₃ᵐ∧

Спробуйте в Інтернеті!

По-перше, ~+примушує, що результат ( .) повинен дорівнювати вводу. l₅знову обмежує вихід, диктуючи, що він повинен мати довжину 5. ≥₁заявляє, що список повинен бути у зменшенному порядку (я вважаю, що це необхідно для припинення вступу програми у нескінченний цикл)

Ми явно уніфікуємо цей список із .вихідною змінною, оскільки наш наступний предикат "змінить" значення всередині списку. Потім беремо корінь куба кожного значення зі списку √₃ᵐ. Оскільки Брахілог за своєю суттю базується на цілі числа, це диктує, що всі числа у списку є кубовими числами.

Нарешті, ми використовуємо, тому що .в кінці кожного рядка є неявне додавання. Оскільки ми не хочемо .уніфікувати список корінь куба, ми об’єднали його раніше і використовуємо, щоб зупинити його об'єднання в кінці.


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]
Rod

1
@Rod For не -(n-n**3)можна використовувати (n**3-n)?
Ніл

@Neil так, можна.
Пруд

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 .

Таке ж пояснення внизу, але використовуючи базове рівняння замість похідного, яке я використовував раніше (завдяки відповіді Python 3 @LeakyNun за неявну підказку):

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 байт

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

Використовує шість функцій:

а

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"}}

c

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

f

function e
function c

"Займає введення" з імені табло на табло n, створює її /scoreboard objectives add n dummyта встановлює за допомогою /scoreboard players set x n 5. Потім зателефонуйте за допомогою функції/function a

Використовує формулу з цієї відповіді math.se





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)та[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 символів, оскільки він знаходиться в unicode, чи не він використовує 43 байти, як вказано в tio?
rafa11111

1
@ rafa11111 Ні і ні: APL дивно працює в TIO. Присвоєння в полі "Код" насправді є лише ярликом для використання функції в полі "Введення"; абсолютно не потрібно, щоб фактичний код працював. Крім того, ми рахуємо кожен символ як один байт, оскільки для Dyalog APL ми використовуємо SBCS @ Adám. Я можу додати посилання на мета-пост, пояснюючи його пізніше, але я зараз на мобільному телефоні.
Дж. Салле

О Я бачу. Я про них не знав. Дякуємо за пояснення!
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.

Журнал змін:

  • К - Фікс байт , використовуючи notзамість neg/ dec.

  • -2 байт, що не xorІнги , 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





Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.