Скільки кубів можна побудувати


20

завдання

Ваше завдання - побудувати структуру з кубів. Об'єм кубів дотримуйтесь наступної послідовності (знизу -> вгорі)н

n3,(n1)3,(n2)3,...,13

вхід

Загальний об'єм споруди ( ).V

вихід

значення ( ), тобто: Загальна кількість кубів.n

V=n3+(n1)3+....+13

примітки

  • Вхід завжди буде цілим числом.
  • Іноді неможливо прослідкувати послідовність, тобто: не представляє конкретного значення для . У такому випадку поверніть -1, або хибне значення вашого вибору (хоча консистенція потрібна).нVn
  • Це тому найкоротша відповідь у байтах за кожну мову виграє.
  • Жодна відповідь не буде позначена прийнятою з вищезгаданої причини.

запити

  • Це мій перший виклик на сайті, тож потерпіть мене і пробачте (і розкажіть мені про) будь-які помилки, які я допустив.
  • Будь ласка, надайте посилання, щоб ваш код можна було протестувати.
  • Якщо можете, будь ласка, напишіть пояснення щодо того, як працює ваш код, щоб інші могли зрозуміти та оцінити вашу роботу.

приклади

input  : 4183059834009
output : 2022

input  : 2391239120391902
output : -1

input  : 40539911473216
output : 3568

Дякуємо @Arnauld за посилання на це:

Хіба це не приємно.

Посилання на оригінал: Посилання


2
Це добре написаний перший виклик. Однак я б радимо додати кілька тестових випадків.
Арнольд

1
@Arnauld, добре працюю над цим прямо зараз і дякую :)
Any3nymous користувач


Чи можете ви пояснити, як вхід 4183059834009дає вихід 2022?
DimChtz

2
@ SuperJedi224 AFAIK за замовчуванням - це "будь-який діапазон природного цілого типу вашої мови", звичайно, без використання невеликого діапазону для лазівки - принаймні, це я припускав у своїй відповіді: o
Фелікс Палмен

Відповіді:


19

JavaScript (ES7), 31 байт

Пряма формула. Повертається, 0якщо немає рішення.

v=>(r=(1+8*v**.5)**.5)%1?0:r>>1

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

Як?

Сума перших n кубів задається:Snn

Sn=(n(n+1)2)2=(n2+n2)2

(Це A000537 . Цю формулу легко довести індукцією. Ось приємне графічне зображення )S5

Взаємно, якщо - сума перших х кубів, наступне рівняння допускає позитивне ціле рішення:vх

(х2+х2)2=v

Оскільки є позитивним, це призводить до:(х2+х)/2

х2+х-2v=0

Чиє позитивне рішення дає:

Δ=1+8vх=-1+Δ2

Якщо - ціле число, воно гарантовано є непарним, оскількиΔсам по собі непарний. Тому рішення можна виразити так:r=ΔΔ

х=r2

Прокоментував

v =>                    // v = input
  ( r =                 //
    (1 + 8 * v ** .5)   // delta = 1 + 8.sqrt(v)
    ** .5               // r = sqrt(delta)
  ) % 1 ?               // if r is not an integer:
    0                   //   return 0
  :                     // else:
    r >> 1              //   return floor(r / 2)

Рекурсивна версія, 36 35 байт

Повертається, NaNякщо немає рішення.

f=(v,k=1)=>v>0?1+f(v-k**3,k+1):0/!v

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

Прокоментував

f = (v,                   // v = input
        k = 1) =>         // k = current value to cube
  v > 0 ?                 // if v is still positive:
    1 +                   //   add 1 to the final result
    f(                    //   do a recursive call with:
      v - k ** 3,         //     the current cube subtracted from v
      k + 1               //     the next value to cube
    )                     //   end of recursive call
  :                       // else:
    0 / !v                //   add either 0/1 = 0 if v is zero, or 0/0 = NaN if v is
                          //   non-zero (i.e. negative); NaN will propagate all the
                          //   way to the final output

Привіт, я створив відповідь (на мій власний питання) посилання , так як ви опублікували перший я хотів запитати , чи нормально це двічі опублікувати в одній мові?
Any3nymous користувач

@ Any3nymoususer Опублікувати кілька відповідей однією мовою - це чудово. Відповідати на власний виклик слід не за пару днів, але, мабуть, це все нормально.
Арнольд

О, у цьому випадку thnx за те, що мені сказали :)
Any3nymous користувач

7

05AB1E , 6 байт

ÝÝOnIk

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

Відповідь порту Джонатана. Візьміть накопичену суму з [0 ... п] , квадрат кожного і знайти індекс V .


05AB1E , 7 байт

ÝÝ3mOIk

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

Як це працює

ÝÝ3mOIk – Full program.
ÝÝ      – Yield [[0], [0, 1], [0, 1, 2], ... [0, 1, 2, ... V]].
  3mO   – Raise to the 3rd power.
     Ik – And find the index of the input therein. Outputs -1 if not found.

8-байтовое альтернатива: ÝÝÅΔ3mOQ.


Я поняття не маю, чому і те, 3mOі nOробота ... Напевно, також згадка -1 - це хибна цінність.
Чарівний восьминіг Урна


5

Желе ,  5  4 байти

RIJi

Монадійне посилання дає вихід, 0якщо це неможливо.

Спробуйте в Інтернеті! занадто неефективний для тестових випадків! (O (V) простір: p)

Ось 8-байтова версія, яка виконує куб-корінь V спочатку, щоб зробити його O (V ^ (1/3)). Використовуючи цю 8-байтну версію, тут є тестовий набір

Як?

i=1i=нi3=(i=1i=нi)2
RIJi - Link: integer, V
R    - range of v -> [1,2,3,...,V]
 Ä   - cumulative sums -> [1,3,6,...,(1+2+3+...+V)]
  ²  - square -> [1,9,36,...,(1+2+3++...+V)²] ( =[1³,1³+2³,1³+2³+3³,...,(1³+2³+3³+...+V³)] )
   i - first 1-based index of v? (0 if not found)

Чи дійсно це? оскільки він не може обробляти дані, показані в тестових випадках? (У мене немає поняття)
Any3nymous користувач

1
Це дійсно, саме діапазон дає помилку пам'яті для цих тестових випадків. Спробуйте менші значення на кшталт36
містер Xcoder

1
@ FiveCrayFish973 так, цілком нормально пожертвувати зручністю / ефективністю / тощо для підрахунку байтів у коді-гольфу (якщо специфіка не виконує деякі обмеження). Дивіться 9-байтну версію, яка працює для ваших тестових випадків.
Джонатан Аллан

@JonathanAllan круто, я не знав, що пропонують правила цієї спільноти. Якщо він дійсний, він дійсний. Привітання
Any3nymous користувача

Дуже погано IJiповодиться на кшталт ²⁼( іншими словами).
Ерік Аутгольфер

4

Еліксир , 53 байти

&Enum.find_index 0..&1,fn n->&1*4==n*n*(n+1)*(n+1)end

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

Відповідь порту Джонатана.


Еліксир , 74 байти

fn v->Enum.find_index 0..v,&v==Enum.sum Enum.map(0..&1,fn u->u*u*u end)end

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

Безумовно, неоптимальний. Але я просто новачок Elixir! :) Повертає nilдля "недійсних" значень V.



3

Cubix , 27 байт (або обсяг 27?)

Схоже, це місце для цієї мови.

I@.1OW30pWpP<s)s;;q\.>s-.?/

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

Це загортається на куб 3x3x3 наступним чином

      I @ .
      1 O W
      3 0 p
W p P < s ) s ; ; q \ .
> s - . ? / . . . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

Дивіться, як це працює

Це необхідне грубі сили, відбираючи куби від входу. Якщо це призводить до нуля, виведіть nінакше, якщо є негативний результат, надрукуйте 0 та вийдіть.


2

Perl 6 , 30 29 26 байт

-4 байти завдяки Джо Кінгу

{first :k,.sqrt,[\+] ^1e4}

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

Розв’язання грубої сили для n <10000. Використовує рівняння з відповіді Джонатана Аллана. 37 36 байт рішення для більшого n ( -1 байт завдяки Джо Кінгу ):

{!.[*-1]&&$_-2}o{{$_,*-$++³...1>*}}

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

Повертається, Falseякщо немає рішення.

Пояснення

               o  # Combination of two anonymous Blocks
                {                 }  # 1st Block
                 {               }   # Reset anonymous state variable $
                  $_,*-$++³...1>*    # Sequence n,n,n-1³,n-1³-2³,... while positive
{             }  # 2nd Block
 !.[*-1]&&       # Return False if last element is non-zero
          $_-2   # Return length of sequence minus two otherwise

Що стосується грубої сили, ви могли б 0..$_бути дійсними для всіх номерів, навіть якщо це буде вичерпано на більших. Для звичайного гольфу ви можете зняти .перший і змінити другий 0>=*на1>*
Jo King




1

Матлаб, 27 байт

@(v)find(cumsum(1:v).^2==v)

Повертає, nякщо існує, або порожню матрицю, якщо ні.

Як це працює

            1:v            % Creates a 1xV matrix with values [1..V]
     cumsum(   )           % Cumulative sum
                .^2        % Power of 2 for each matrix element
                   ==v     % Returns a 1xV matrix with ones where equal to V
find(                 )    % Returns a base-1 index of the first non-zero element

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

Примітка. Неможливий для великих vчерез обмеження пам'яті.


1

Python 3 , 60 байт

lambda V:[*[(n*-~n/2)**2for n in range(V+1)],V].index(V)%-~V

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

-6 дякую містеру Xcoder .

Якщо ми можемо нанести помилку на випадок, якщо її немає н для конкретного V, ми можемо звести це до 51 байта:

lambda V:[(n*-~n/2)**2for n in range(V+1)].index(V)

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



1

постійного струму , 19 байт

4*dvvdddk*+d*-0r^K*

Введення та вихід із стека, повертає 0, якщо немає рішення.

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

Пояснення

Якщо є рішення n, вхід є ((n^2+n)^2)/4. Таким чином , ми розрахуємо пробне рішення , як n=sqrt(sqrt(4*input)), використовуючи DC за замовчуванням 0 десяткового місця точності для квадратних коренів, а потім порівняти (n^2+n)^2з , 4*inputщоб побачити , якщо це на самому справі рішення.

4*dvv         Calculate a trial solution n (making a copy of 4*input for later use)
dddk          Store the trial solution in the precision and make a couple copies of it
*+d*          Calculate (n^2+n)^2
-             Subtract from our saved copy of 4*input - now we have 0 iff n is a solution
0r^           Raise 0 to that power - we now have 1 if n is a solution, 0 if not
K*            Multiply by our saved trial solution

Передостання лінія покладається на неочевидний факт, що до постійного струму, 0^x=0для всіх ненульових x(навіть негативних x!), Але 0^0=1.


1

Python 3 , 53 48 байт

f=lambda V,n=1:V>0and f(V-n**3,n+1)or(not V)*n-1

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

-3 байти від Джо Кінга

Повертається -1без відповіді.

Працює лише n=997з типовими межами рекурсії.

Неодноразово приймає все більші та більші кубики від обсягу, поки він не досягне нуля (успіх, кількість повернених кубів вилучено) або від’ємне число (відповіді немає).

Пояснення:

f=lambda V,n=1: # f is a recursive lambda taking the volume and the cube size (defaulting to 1)

               V>0and               # if the volume is positive
                      f(V-n**3,n+1) # then we are not to the right cube size yet, try again with n+1, removing the volume of the nth cube

                                   or # if V is not positive
                                     (not V)*n-1
                         # case V == 0:
                         # (not V)*n == n; return n-1, the number of cubes
                         # case V < 0:
                         # (not V)*n == 0; return -1, no answer

and/orабо списки зазвичай коротші, ніж if/else. 50 байт
Джо Кінг

@JoKing Дякую! У мене також ще два байти.
pizzapants184

not V=> V==0абоV>-1
Джо Кінг

0

gvm (фіксувати 2612106 ) байт-кодів, 70 59 байт

(-11 байт шляхом множення в циклі замість написання коду для множення двічі)

Hexdump:

> hexdump -C cubes.bin
00000000  e1 0a 00 10 00 1a 03 d3  8a 00 f6 2a fe 25 c8 d3  |...........*.%..|
00000010  20 02 2a 04 0a 01 1a 02  00 00 20 08 4a 01 fc 03  | .*....... .J...|
00000020  d1 6a 02 52 02 cb f8 f4  82 04 f4 e8 d1 6a 03 0a  |.j.R.........j..|
00000030  03 fc d5 a8 ff c0 1a 00  a2 00 c0                 |...........|
0000003b

Випробування:

> echo 0 | ./gvm cubes.bin
0
> echo 1 | ./gvm cubes.bin
1
> echo 2 | ./gvm cubes.bin
-1
> echo 8 | ./gvm cubes.bin
-1
> echo 9 | ./gvm cubes.bin
2
> echo 224 | ./gvm cubes.bin
-1
> echo 225 | ./gvm cubes.bin
5

Насправді низький бал, просто використовуючи це приємне запитання для тестування gvmтут;) Комісія старіша за питання, звичайно. Зауважте, що це 8-бітова віртуальна машина, тому використовуючи деякий код обробки лише природного безпідписаного діапазону чисел 0-255, тестові випадки, наведені у питанні, не працюватимуть.

Зібрано вручну з цього:

0100  e1         rud                     ; read unsigned decimal
0101  0a 00      sta     $00             ; store to $00 (target sum to reach)
0103  10 00      ldx     #$00            ; start searching with n = #0
0105  1a 03      stx     $03             ; store to $03 (current cube sum)
0107  d3         txa                     ; X to A
                   loop:
0108  8a 00      cmp     $00             ; compare with target sum
010a  f6 2a      beq     result          ; equal -> print result
010c  fe 25      bcs     error           ; larger -> no solution, print -1
010e  c8         inx                     ; increment n
010f  d3         txa                     ; as first factor for power
0110  20 02      ldy     #$02            ; multiply #02 times for ...
0112  2a 04      sty     $04             ; ... power (count in $04)
                   ploop:
0114  0a 01      sta     $01             ; store first factor to $01 ...
0116  1a 02      stx     $02             ; ... and second to $02 for multiplying
0118  00 00      lda     #$00            ; init product to #0
011a  20 08      ldy     #$08            ; loop over 8 bits
                   mloop1:
011c  4a 01      lsr     $01             ; shift right first factor
011e  fc 03      bcc     noadd1          ; shifted bit 0 -> skip adding
0120  d1         clc                     ; 
0121  6a 02      adc     $02             ; add second factor to product
                   noadd1:
0123  52 02      asl     $02             ; shift left second factor
0125  cb         dey                     ; next bit
0126  f8 f4      bpl     mloop1          ; more bits -> repeat
0128  82 04      dec     $04             ; dec "multiply counter" for power
012a  f4 e8      bne     ploop           ; not 0 yet -> multiply again
012c  d1         clc
012d  6a 03      adc     $03             ; add power to ...
012f  0a 03      sta     $03             ; ... current cube sum
0131  fc d5      bcc     loop            ; repeat unless adding overflowed
                   error:
0133  a8 ff      wsd     #$ff            ; write signed #$ff (-1)
0135  c0         hlt                     ; 
                   result:
0136  1a 00      stx     $00             ; store current n to $00
0138  a2 00      wud     $00             ; write $00 as unsigned decimal
013a  c0         hlt

правити : Я просто виправлена помилка в gvm; без цього виправлення gvmспробував прочитати бінарні програми в текстовому режимі , які можуть зламатися (код вище не містить жодних 0xdбайтів, тому не вийде з ладу на Windows без цього виправлення).


0

K (oK) , 21 байт

{(,_r%2)@1!r:%1+8*%x}

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

Порт Відповідь JS Арнальда .

Як:

{(,_r%2)@1!r:%1+8*%x} # Main function, argument x
             %1+8*%x  # sqrt(1+(8*(sqrt(x)))
           r:         # Assign to r
         1!           # r modulo 1
        @             # index the list:
 (,_r%2)              # enlist (,) the floor (_) of r modulo 2.

функція поверне (_r%2)iff 1!r == 0, інакше поверне null ( 0N). Це пов’язано з тим, що єдиний елемент у списку, що має індекс 0, і намагається проіндексувати цей список будь-яким числом, окрім 0, поверне нуль.

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