Quanti cubi possono essere costruiti


20

compito

Il tuo compito è costruire una struttura con n cubi. Il volume dei cubi segue la seguente sequenza (in basso -> in alto)

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

ingresso

Il volume totale della struttura ( V ).

produzione

valore di ( n ), ovvero: il numero totale di cubi.

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

Appunti

  • L'input sarà sempre un numero intero.
  • A volte non è possibile seguire la sequenza, ovvero: non rappresenta un valore specifico per n . In tal caso, restituisci -1 o un valore errato di tua scelta (è tuttavia necessaria la coerenza).Vn
  • Questo è quindi la risposta più breve in byte per ogni lingua vince.
  • Nessuna risposta verrà contrassegnata come accettata per il motivo sopra indicato.

richieste

  • Questa è la mia prima sfida sul sito, quindi abbi pazienza e perdona (e raccontami) di tutti gli errori che ho commesso.
  • Si prega di fornire un collegamento in modo che il codice possa essere testato.
  • Se puoi, scrivi gentilmente una spiegazione su come funziona il tuo codice, in modo che altri possano capire e apprezzare il tuo lavoro.

esempi

input  : 4183059834009
output : 2022

input  : 2391239120391902
output : -1

input  : 40539911473216
output : 3568

Grazie a @Arnauld per il link a questo:

Non è carino.

Collegamento a originale: collegamento


2
Questa è una prima sfida ben scritta. Tuttavia, consiglio vivamente di aggiungere alcuni casi di test.
Arnauld,

1
@Arnauld, ok ci sto lavorando proprio adesso e grazie :)
Qualsiasi utente Any3nymous il


Potete per favore spiegare come input 4183059834009dà output 2022?
DimChtz,

2
@ SuperJedi224 AFAIK la regola predefinita è "qualunque sia l'intervallo del tipo intero naturale della tua lingua", ovviamente senza usare un piccolo intervallo per una scappatoia - almeno questo è quello che ho assunto nella mia risposta: o
Felix Palmen,

Risposte:


19

JavaScript (ES7), 31 byte

Una formula diretta Restituisce 0se non c'è soluzione.

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

Provalo online!

Come?

La somma dei primi n cubi è data da:Snn

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

(Questo è A000537 . Questa formula può essere facilmente dimostrata per induzione. Ecco una bella rappresentazione grafica di )S5

Alternativamente, se è la somma dei primi x cubi, la seguente equazione ammette una soluzione intera e positiva:vx

(x2+x2)2=v

Perché è positivo, ciò porta a:(x2+x)/2

x2+x2v=0

La cui soluzione positiva è data da:

Δ=1+8vx=1+Δ2

Se r=Δ è un numero intero, è garantito che sia dispari, poiché stesso è dispari. Pertanto, la soluzione può essere espressa come:Δ

x=r2

Commentate

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)

Versione ricorsiva, 36 35 byte

Restituisce NaNse non c'è soluzione.

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

Provalo online!

Commentate

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

Ciao, ho creato un link di risposta (alla mia domanda) , dal momento che hai pubblicato prima volevo chiedere, va bene pubblicare due volte nella stessa lingua?
Utente Any3nymous

@ Any3nymoususer Pubblicare diverse risposte nella stessa lingua va benissimo. Rispondere alla propria sfida non dovrebbe essere fatto prima di un paio di giorni, ma suppongo che ora sia OK.
Arnauld,

Oh, in quel caso grazie per
avermelo

7

05AB1E , 6 byte

ÝÝOnIk

Provalo online!

La risposta della gelatina di Port of Jonathan. Prendere la somma cumulativa di [0 ... n] , quadrati ciascuno e trovare l'indice di V .


05AB1E , 7 byte

ÝÝ3mOIk

Provalo online!

Come funziona

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


Non ho idea del perché entrambi 3mOe nOfunzionino ... Probabilmente anche menzionare -1 è il valore errato.
Magic Octopus Urn,


5

Gelatina ,  5  4 byte

RIJi

Un collegamento monadico, cede 0se non è possibile.

Provalo online!troppo inefficiente per i casi di test! (O (V) spazio: p)

Ecco una versione a 8 byte che esegue prima una radice cubica di V per renderla O (V ^ (1/3)). Utilizzando quella versione a 8 byte qui è una suite di test

Come?

Σio=1io=nio3=(Σio=1io=nio)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)

È valido? dal momento che non è in grado di gestire l'input mostrato nei casi di test? (Non ne ho idea)
Utente Any3nymous il

1
È valido, è solo l'intervallo che genera un errore di memoria per quei casi di test. Prova valori più piccoli come36
Mr. Xcoder,

1
@ FiveCrayFish973 sì, è del tutto normale sacrificare l'usabilità / efficienza / ecc. Per il conteggio dei byte nel code-golf (a meno che la specifica non imponga alcuni limiti). Vedere la versione a 9 byte per quella che funziona per i casi di test.
Jonathan Allan,

@JonathanAllan, non sapevo cosa suggerissero le regole di questa community. Se è valido, è valido. Saluti
Utente Any3nymous il

Peccato si IJicomporta come ²⁼( , in altre parole).
Erik the Outgolfer,

4

Elisir , 53 byte

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

Provalo online!

La risposta della gelatina di Port of Jonathan.


Elisir , 74 byte

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

Provalo online!

Decisamente non ottimale. Ma sono solo un principiante elisir! :) Restituisce nilper valori "non validi" di V.


3

Japt, 7 byte

o³å+ bU

Provalo


Spiegazione

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

Alternativa

Çõ³xÃbU

Provalo


3

Cubix , 27 byte (o volume 27?)

Sembra il posto giusto per questa lingua.

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

Provalo online!

Questo si avvolge su un cubo 3x3x3 come segue

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

Guarda correre

È essenziale forze brute allontanando i cubi crescenti dall'input. Se risulta zero, emettere naltrimenti in caso di risultati negativi, stampare 0 ed uscire.


2

Perl 6 , 30 29 26 byte

-4 byte grazie a Jo King

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

Provalo online!

Soluzione a forza bruta per n <10000. Utilizza l'equazione della risposta di Jonathan Allan. 37 36 byte soluzione per n maggiore ( -1 byte grazie a Jo King ):

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

Provalo online!

ritorna Falsese non c'è soluzione.

Spiegazione

               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

Per la forza bruta, potresti fare 0..$_in modo di essere valido per tutti i numeri, anche se scadrà su quelli più grandi. Per giocare a golf normale, puoi rimuovere il .primo e cambiare il secondo da 0>=*a1>*
Jo King




1

Matlab, 27 byte

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

Restituisce nif esiste o una matrice vuota in caso contrario.

Come funziona

            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

Provalo online!

Nota Non riesce per grandi vmotivi a causa di limiti di memoria.




1

dc , 19 byte

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

Input e output provengono dallo stack, restituisce 0 se nessuna soluzione.

Provalo online!

Spiegazione

Se esiste una soluzione n, l'input è ((n^2+n)^2)/4. Quindi dovremo calcoliamo una soluzione di prova come n=sqrt(sqrt(4*input)), utilizzando di default 0 dc decimale di precisione per le radici quadrate, quindi confrontare (n^2+n)^2per 4*inputvedere se è in realtà una soluzione.

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

La penultima linea si basa sul fatto non ovvio che a dc, 0^x=0per tutti diversi da zero x(anche negativo x!) Ma 0^0=1.


1

Python 3 , 53 48 byte

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

Provalo online!

-3 byte da Jo King

Restituisce -1per nessuna risposta.

Funziona solo n=997con i limiti di ricorsione predefiniti.

Prende ripetutamente cubi sempre più grandi dal volume fino a quando non arriva a zero (esito positivo, restituisce il numero di cubi rimossi) o un numero negativo (nessuna risposta).

Spiegazione:

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/oro gli elenchi sono generalmente più brevi di if/else. 50 byte
Jo King,

@JoKing Grazie! Ho anche rimosso altri due byte.
pizzapants184,

not V=> V==0oppureV>-1
Jo King,

0

gvm (commit 2612106 ) bytecode, 70 59 byte

(-11 byte moltiplicando in un ciclo invece di scrivere il codice per moltiplicare due volte)

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

Esecuzioni di test:

> 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

Non proprio un punteggio basso, sto solo usando questa bella domanda per i test gvmqui;) Il commit è più vecchio della domanda ovviamente. Nota che si tratta di una macchina virtuale a 8 bit, quindi utilizzando un codice che gestisce solo l'intervallo di numeri non firmati naturali 0-255, i casi di test indicati nella domanda non funzioneranno.

Assemblato manualmente da questo:

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

Edit : Ho appena risolto un bug in gvm; senza questa correzione, ho gvmprovato a leggere i programmi binari in modalità testo , che potrebbe rompersi (il codice sopra non contiene alcun 0xdbyte, quindi non si romperà su Windows senza questa correzione).


0

K (oK) , 21 byte

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

Provalo online!

La risposta JS di Port of Arnauld .

Come:

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

la funzione restituirà (_r%2)iff 1!r == 0, altrimenti restituisce null ( 0N). Ciò è dovuto al singolo elemento nell'elenco con indice 0 e il tentativo di indicizzare tale elenco con qualsiasi numero diverso da 0 restituirà null.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.