Berapa banyak kubus yang bisa dibangun

20

tugas

Tugas Anda adalah membangun struktur dengan n kubus. Volume kubus mengikuti urutan berikut (bawah -> atas)

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

memasukkan

Total volume struktur ( V ).

keluaran

nilai ( ), yaitu: Jumlah total kubus.n

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

catatan

  • Input akan selalu berupa bilangan bulat.
  • Kadang-kadang tidak mungkin untuk mengikuti urutan, yaitu: tidak mewakili nilai spesifik untuk n . Dalam acara tersebut, kembalikan -1, atau nilai palsu yang Anda pilih (meskipun diperlukan konsistensi).Vn
  • Ini adalah sehingga jawaban terpendek dalam byte untuk setiap bahasa menang.
  • Tidak ada jawaban yang ditandai diterima karena alasan yang disebutkan di atas.

permintaan

  • Ini adalah tantangan pertama saya di situs ini jadi bersabarlah, dan maafkan (dan ceritakan tentang) kesalahan yang saya buat.
  • Mohon berikan tautan agar kode Anda dapat diuji.
  • Jika Anda bisa, silakan tulis penjelasan tentang cara kerja kode Anda, sehingga orang lain dapat memahami dan menghargai karya Anda.

contoh

input  : 4183059834009
output : 2022

input  : 2391239120391902
output : -1

input  : 40539911473216
output : 3568

Terima kasih kepada @Arnauld untuk tautannya:

Bukankah itu bagus?

Tautan ke orignial: Tautan

Pengguna any3nymous
sumber
2
Ini adalah tantangan pertama yang ditulis dengan baik. Namun, saya sangat menyarankan untuk menambahkan beberapa test case.
Arnauld
1
@Arnauld, ok kerjakan sekarang juga dan terima kasih :)
Pengguna Any3nymous
OEIS A000537
JayCe
Bisakah Anda jelaskan bagaimana input 4183059834009memberikan output 2022?
DimChtz
2
@ SuperJedi224 AFAIK aturan defaultnya adalah "rentang apa pun yang dimiliki tipe bilangan bulat alami bahasa Anda", tentu saja tanpa menggunakan rentang kecil untuk celah - setidaknya itulah yang saya asumsikan dalam jawaban saya: o
Felix Palmen

Jawaban:

19

JavaScript (ES7), 31 byte

Formula langsung. Kembali 0jika tidak ada solusi.

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

Cobalah online!

Bagaimana?

Jumlah dari n pertama kubus diberikan oleh:Snn

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

(Ini A000537 . Formula ini dapat dengan mudah dibuktikan dengan induksi. Berikut ini adalah representasi grafis .)S5

Secara timbal balik, jika adalah jumlah dari kubus x pertama , persamaan berikut mengakui solusi bilangan bulat positif:vx

(x2+x2)2=v

Karena positif, ini mengarah ke:(x2+x)/2

x2+x2v=0

Solusi positif siapa diberikan oleh:

Δ=1+8vx=1+Δ2

Jika adalah bilangan bulat, dijamin aneh, karenaΔitu sendiri ganjil. Oleh karena itu, solusinya dapat dinyatakan sebagai:r=ΔΔ

x=r2

Berkomentar

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)

Versi rekursif, 36 35 byte

Kembali NaNjika tidak ada solusi.

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

Cobalah online!

Berkomentar

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
Arnauld
sumber
Hai, saya membuat tautan jawaban (untuk pertanyaan saya sendiri) , karena Anda pertama kali menerbitkan saya ingin bertanya apakah boleh menerbitkan dua kali dalam bahasa yang sama?
Pengguna Any3nymous
@ Pengguna Any3nymous Memposting beberapa jawaban dalam bahasa yang sama dengan baik-baik saja. Menjawab tantangannya sendiri tidak boleh dilakukan sebelum beberapa hari, tapi saya rasa sekarang sudah OK.
Arnauld
Oh, dalam hal ini thnx untuk memberi tahu saya :)
Pengguna Any3nymous
7

05AB1E , 6 byte

ÝÝOnIk

Cobalah online!

Port of Jonathan's Jelly menjawab. Ambil jumlah kumulatif [0 ... n] , persegi masing-masing dan menemukan indeks V .


05AB1E , 7 byte

ÝÝ3mOIk

Cobalah online!

Bagaimana itu bekerja

ÝÝ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-byte alternatif: ÝÝÅΔ3mOQ.

Tuan Xcoder
sumber
Saya tidak tahu mengapa keduanya 3mOdan nObekerja ... Mungkin juga menyebutkan -1 adalah nilai palsu.
Magic Gurita Guci
5

Jelly ,  5  4 byte

RIJi

Tautan monadik, menghasilkan 0jika tidak memungkinkan.

Cobalah online! terlalu tidak efisien untuk kasus uji! (O (V) spasi: p)

Berikut adalah versi 8-byte yang melakukan cube-root dari V terlebih dahulu untuk membuatnya O (V ^ (1/3)) sebagai gantinya. Menggunakan versi 8-byte di sini adalah test-suite

Bagaimana?

i=1i=ni3=(i=1i=ni)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)
Jonathan Allan
sumber
Apakah ini valid? karena tidak dapat menangani input yang ditunjukkan dalam kasus uji? (Saya tidak punya ide)
Pengguna Any3nymous
1
Itu valid, hanya rentang yang memberikan kesalahan memori untuk kasus uji tersebut. Coba nilai yang lebih kecil seperti36
Tn. Xcoder
1
@ FiveCrayFish973 ya, itu cukup normal untuk mengorbankan kegunaan / efisiensi / dll untuk byte-count dalam kode-golf (kecuali spesifikasi memberlakukan beberapa batasan). Lihat versi 9-byte untuk versi yang berfungsi untuk kasus uji Anda.
Jonathan Allan
@ Jonathan Allan keren, saya tidak tahu apa yang disarankan oleh aturan komunitas ini. Jika itu valid, itu valid. Cheers
Pengguna Any3nymous
Terlalu buruk IJiberperilaku seperti ²⁼( , dengan kata lain).
Erik the Outgolfer
4

Elixir , 53 byte

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

Cobalah online!

Port of Jonathan's Jelly menjawab.


Elixir , 74 byte

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

Cobalah online!

Jelas kurang optimal. Tapi saya hanya pemula Elixir! :) Pengembalian niluntuk nilai "tidak valid" dari V.

Tuan Xcoder
sumber
3

Japt, 7 byte

o³å+ bU

Cobalah


Penjelasan

            :Implicit input of integer U
o           :Range [0,U)
 ³          :Cube each
  å+        :Cumulatively reduce by addition
     bU     :0-based index of U

Alternatif

Çõ³xÃbU

Cobalah

Shaggy
sumber
3

Cubix , 27 byte (atau volume 27?)

Sepertinya tempat yang tepat untuk bahasa ini.

[email protected]<s)s;;q\.>s-.?/

Cobalah online!

Ini membungkus ke kubus 3x3x3 sebagai berikut

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

Lihat saja

Ini penting kekuatan kasar dengan mengambil kubus meningkat dari input. Jika hasilnya nol, nhasilkan sebaliknya jika ada hasil negatif, cetak 0 dan keluar.

MickyT
sumber
2

Perl 6 , 30 29 26 byte

-4 byte terima kasih kepada Jo King

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

Cobalah online!

Solusi brute force untuk n <10000. Menggunakan persamaan dari jawaban Jonathan Allan. 37 36 byte solusi untuk n yang lebih besar ( -1 byte berkat Jo King ):

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

Cobalah online!

Kembali Falsejika tidak ada solusi.

Penjelasan

               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
nwellnhof
sumber
Untuk kekuatan kasar, Anda bisa melakukannya 0..$_untuk menjadi valid untuk semua angka, bahkan jika itu akan habis pada yang lebih besar. Untuk bermain golf normal, Anda dapat menghapus yang .pertama dan mengubah yang kedua dari 0>=*menjadi1>*
Jo King
26 byte
Jo King
2

JavaScript (Node.js) , 28 byte

a=>a**.5%1?0:(2*a**.5)**.5|0

Cobalah online!

Saya tahu itu pertanyaan saya sendiri dan semuanya, tapi saya punya jawaban yang lebih baik (untuk bahasa ini) kemudian hadir, jadi saya memposting. Semoga tidak apa-apa

Pengguna any3nymous
sumber
1

Matlab, 27 byte

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

Mengembalikan njika ada atau matriks kosong jika tidak.

Bagaimana itu bekerja

            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

Cobalah secara Online!

Catatan Gagal untuk besar vkarena keterbatasan memori.

DimChtz
sumber
1

Python 3 , 60 byte

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

Cobalah online!

-6 terima kasih kepada Tn . Xcoder .

Jika kita bisa melempar kesalahan kalau-kalau tidak ada n untuk tertentu V, kita bisa mendapatkan ini hingga 51 byte:

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

Cobalah online!

Erik the Outgolfer
sumber
1

dc , 19 byte

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

Input dan output berasal dari stack, mengembalikan 0 jika tidak ada solusi.

Cobalah online!

Penjelasan

Jika ada solusi n, inputnya adalah ((n^2+n)^2)/4. Jadi kami akan menghitung solusi percobaan sebagai n=sqrt(sqrt(4*input)), menggunakan dc default 0 desimal tempat presisi untuk akar kuadrat, kemudian membandingkan (n^2+n)^2untuk 4*inputuntuk melihat apakah itu sebenarnya solusi.

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

Garis kedua dari belakang bergantung pada fakta yang tidak jelas bahwa untuk dc, 0^x=0untuk semua bukan nol x(bahkan negatif x!) Tetapi 0^0=1.

Sophia Lechner
sumber
1

Python 3 , 53 48 byte

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

Cobalah online!

-3 byte dari Jo King

Kembali -1 tanpa jawaban.

Hanya bekerja hingga n=997batas rekursi default.

Berulang kali mengambil kubus yang lebih besar dan lebih besar dari volume sampai tiba di nol (sukses, mengembalikan jumlah kubus dihapus), atau angka negatif (tidak ada jawaban).

Penjelasan:

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
pizzapants184
sumber
and/oratau daftar biasanya lebih pendek dari if/else. 50 byte
Jo King
@JoKing, terima kasih! Saya mendapat dua byte lagi juga.
pizzapants184
not V=> V==0atauV>-1
Jo King
0

gvm (commit 2612106 ) bytecode, 70 59 byte

(-11 byte dengan mengalikan dalam satu lingkaran alih-alih menulis kode untuk mengalikan dua kali)

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

Tes berjalan:

> 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

Tidak benar-benar skor rendah, hanya menggunakan pertanyaan yang bagus ini untuk pengujian di gvmsini;) Komit lebih tua dari pertanyaan tentu saja. Catatan ini adalah mesin virtual 8bit, jadi menggunakan beberapa kode hanya menangani rentang nomor yang tidak ditandai0-255 , kasus uji yang diberikan dalam pertanyaan tidak akan berfungsi.

Dirakit secara manual dari ini:

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

sunting : Saya baru saja memperbaiki bug di gvm; tanpa perbaikan ini,gvm cobalah membaca program biner dalam mode teks , yang mungkin rusak (kode di atas tidak mengandung 0xdbyte sehingga tidak akan rusak di windows tanpa perbaikan ini).

Felix Palmen
sumber
0

K (oK) , 21 byte

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

Cobalah online!

Pelabuhan JS Arnauld menjawab .

Bagaimana:

{(,_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.

fungsi akan mengembalikan (_r%2)iff 1!r == 0, kalau tidak mengembalikan null ( 0N). Itu karena elemen tunggal dalam daftar memiliki indeks 0, dan mencoba mengindeks daftar itu dengan angka apa pun selain 0 akan menghasilkan nol.

J. Sallé
sumber