Wie viele Würfel können gebaut werden?

20

Aufgabe

Ihre Aufgabe ist es, eine Struktur mit Würfeln zu bauen . Das Volumen der Würfel folgt der folgenden Reihenfolge (unten -> oben)n

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

Eingang

Das Gesamtvolumen der Struktur ( ).V

Ausgabe

Wert von ( ), dh: Die Gesamtzahl der Würfel.n

V=n3+(n-1)3+....+13

Anmerkungen

  • Die Eingabe wird immer eine Ganzzahl sein.
  • Manchmal ist es nicht möglich, die Reihenfolge einzuhalten, dh: steht nicht für einen bestimmten Wert für . In diesem Fall geben Sie -1 oder einen falschen Wert Ihrer Wahl zurück (es ist jedoch Konsistenz erforderlich).nVn
  • Dies ist so dass die kürzeste Antwort in Bytes für jede Sprache gewinnt.
  • Aus dem oben genannten Grund wird keine Antwort als angenommen markiert.

Anfragen

  • Dies ist meine erste Herausforderung auf der Website. Nehmen Sie sie mit und verzeihen Sie mir alle Fehler, die ich gemacht habe.
  • Bitte geben Sie einen Link an, damit Ihr Code getestet werden kann.
  • Wenn Sie können, schreiben Sie bitte eine Erklärung, wie Ihr Code funktioniert, damit andere Ihre Arbeit verstehen und wertschätzen können.

Beispiele

input  : 4183059834009
output : 2022

input  : 2391239120391902
output : -1

input  : 40539911473216
output : 3568

Vielen Dank an @Arnauld für den Link dazu:

Ist das nicht schön?

Link zum Original: Link

Beliebiger Benutzer
quelle
2
Dies ist eine schön geschriebene erste Herausforderung. Ich würde jedoch dringend empfehlen, einige Testfälle hinzuzufügen.
Arnauld
1
@ Arnauld, ok arbeiten gerade daran und danke :)
Any3nymous Benutzer
OEIS A000537
JayCe
Können Sie bitte erklären, wie Input 4183059834009Output ergibt 2022?
DimChtz
2
@ SuperJedi224 AFAIK Die Standardregel lautet "Welchen Bereich auch immer der natürliche Integer-Typ Ihrer Sprache hat", natürlich ohne einen kleinen Bereich für eine Lücke zu verwenden - zumindest habe ich das in meiner Antwort angenommen: o
Felix Palmen

Antworten:

19

JavaScript (ES7), 31 Byte

Eine direkte Formel. Gibt zurück, 0wenn es keine Lösung gibt.

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

Probieren Sie es online!

Wie?

Snn

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

S5

vx

(x2+x2)2=v

(x2+x)/2

x2+x2v=0

Wessen positive Lösung ist gegeben durch:

Δ=1+8vx=-1+Δ2

r=ΔΔ

x=r2

Kommentiert

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)

Rekursive Version, 36 35 Bytes

Gibt zurück, NaNwenn es keine Lösung gibt.

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

Probieren Sie es online!

Kommentiert

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
quelle
Hallo, habe ich eine Antwort (auf meine eigene Frage) Link , da Sie zuerst veröffentlicht ich gesucht zu fragen , ist es ok zweimal in derselben Sprache zu veröffentlichen?
Any3nymous Benutzer
@ Any3nymoususer Das Posten mehrerer Antworten in derselben Sprache ist völlig in Ordnung. Die Beantwortung der eigenen Herausforderung sollte nicht vor ein paar Tagen erfolgen, aber ich denke, das ist jetzt OK.
Arnauld
Oh, in diesem Fall danke, dass du es mir erzählt hast :)
Any3nymous user
7

05AB1E , 6 Bytes

ÝÝOnIk

Probieren Sie es online!

Port of Jonathans Gelee Antwort. Nehmen Sie die kumulative Summe von [0 ... n] , quadratisch jeder und finden Sie den Index von V .


05AB1E , 7 Bytes

ÝÝ3mOIk

Probieren Sie es online!

Wie es funktioniert

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

Mr. Xcoder
quelle
Ich habe keine Ahnung warum beides funktioniert 3mOund nO... Erwähne wahrscheinlich auch -1 ist der falsche Wert.
Magic Octopus Urn
5

Gelee ,  5  4 Bytes

RIJi

Eine monadische Verbindung ergibt sich, 0wenn nicht möglich.

Probieren Sie es online! viel zu ineffizient für die Testfälle! (O (V) Raum: p)

Hier ist eine 8-Byte-Version, die zuerst eine Kubikwurzel von V ausführt, um es stattdessen zu O (V ^ (1/3)) zu machen. In dieser 8-Byte-Version handelt es sich um eine Testsuite

Wie?

ich=1ich=nich3=(ich=1ich=nich)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
quelle
Ist das gültig? da es keine eingaben verarbeiten kann, die in testfällen angezeigt werden? (Ich habe keine Ahnung)
Any3nymous Benutzer
1
Es ist gültig, es ist nur der Bereich, der einen Speicherfehler für diese Testfälle ergibt. Versuchen Sie kleinere Werte wie36
Mr. Xcoder
1
@ FiveCrayFish973 ja, es ist ganz normal, die Benutzerfreundlichkeit / Effizienz / usw. für die Byte-Anzahl in Code-Golf zu opfern (es sei denn, die Spezifikation erzwingt einige Grenzen). In der 9-Byte-Version finden Sie eine, die für Ihre Testfälle geeignet ist.
Jonathan Allan
@ JonathanAllan cool, ich wusste nicht, was die Regeln dieser Community vorschlagen. Wenn es gültig ist, ist es gültig. Prost
Any3nymous Benutzer
Schade, IJibenimmt sich wie ²⁼( mit anderen Worten).
Erik der Outgolfer
4

Elixier , 53 Bytes

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

Probieren Sie es online!

Port of Jonathans Gelee Antwort.


Elixier , 74 Bytes

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

Probieren Sie es online!

Auf jeden Fall suboptimal. Aber ich bin nur ein Elixier-Neuling! :) Gibt nilfür "ungültige" Werte von zurück V.

Mr. Xcoder
quelle
3

Japt, 7 Bytes

o³å+ bU

Versuch es


Erläuterung

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

Alternative

Çõ³xÃbU

Versuch es

Zottelig
quelle
3

Cubix , 27 Bytes (oder Volume 27?)

Scheint der richtige Ort für diese Sprache zu sein.

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

Probieren Sie es online!

Dies wird wie folgt auf einen 3x3x3-Würfel gewickelt

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

Schau es dir an

Es ist eine wesentliche rohe Kraft, indem es dem Eingang immer mehr Würfel wegnimmt. Wenn es zu Null kommt, wird es ausgegeben, nandernfalls, wenn es ein negatives Ergebnis gibt, wird 0 gedruckt und der Vorgang beendet.

MickyT
quelle
2

Perl 6 , 30 29 26 Bytes

-4 Bytes dank Jo King

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

Probieren Sie es online!

Brute-Force-Lösung für n <10000. Verwendet die Gleichung aus Jonathan Allans Antwort. 37 36 Byte Lösung für größeres n ( -1 Byte dank Jo King ):

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

Probieren Sie es online!

Gibt zurück, Falsewenn es keine Lösung gibt.

Erläuterung

               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
quelle
Für die Brute Force könnten Sie tun 0..$_, um für alle Zahlen gültig zu sein, auch wenn es bei größeren Zahlen zu einer Zeitüberschreitung kommt. Für den normalen Golf, können Sie das Entfernen .von der ersten und der zweiten Wechsel von 0>=*zu1>*
Jo König
26 Bytes
Jo King
2

JavaScript (Node.js) , 28 Byte

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

Probieren Sie es online!

Ich weiß, es ist meine eigene Frage und alles, aber ich hatte eine bessere Antwort (für diese Sprache) als vorhanden, also habe ich gepostet. Hoffe es ist ok

Beliebiger Benutzer
quelle
1

Matlab, 27 Bytes

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

Gibt das nIf-Vorhandensein oder eine leere Matrix zurück, wenn nicht.

Wie es funktioniert

            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

Probieren Sie es online!

Hinweis: Es schlägt vaufgrund von Speicherbeschränkungen für große fehl .

DimChtz
quelle
1

Gleichstrom , 19 Bytes

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

Die Eingabe und Ausgabe erfolgt vom Stapel und gibt 0 zurück, wenn keine Lösung vorliegt.

Probieren Sie es online!

Erläuterung

Wenn es eine Lösung gibt, ist die Eingabe ((n^2+n)^2)/4. Aus diesem Grund berechnen wir eine Probelösung n=sqrt(sqrt(4*input))mit der Standardgenauigkeit von 0 Dezimalstellen für Quadratwurzeln von dc und vergleichen (n^2+n)^2sie dann mit , 4*inputum festzustellen, ob es sich tatsächlich um eine Lösung handelt.

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

Die vorletzte Zeile beruht auf der nicht offensichtlichen Tatsache, dass zu dc, 0^x=0 für alle ungleich Null x(auch negativ x!) Aber 0^0=1.

Sophia Lechner
quelle
1

Python 3 , 53 48 Bytes

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

Probieren Sie es online!

-3 Bytes von Jo King

Kehrt -1ohne Antwort zurück.

Funktioniert nur bis zu n=997 mit den Standard-Rekursionsgrenzen.

Nimmt wiederholt größere und größere Würfel vom Volume, bis sie null (Erfolg, Anzahl entfernter Würfel zurückgeben) oder eine negative Zahl (keine Antwort) ergeben.

Erläuterung:

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
quelle
and/oroder Listen sind in der Regel kürzer als if/else. 50 Bytes
Jo King
@JoKing Danke! Ich habe auch noch zwei Bytes frei.
Pizzapants184
not V=> V==0oderV>-1
Jo King
0

gvm (Commit 2612106 ) Bytecode, 70 59 Bytes

(-11 Bytes durch Multiplikation in einer Schleife, anstatt den Code für die doppelte Multiplikation zu schreiben)

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

Testläufe:

> 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

Keine wirklich niedrige Punktzahl, nur diese nette Frage zum Testen verwenden gvm;) Das Commit ist natürlich älter als die Frage. Beachten Sie, dass dies eine virtuelle 8-Bit-Maschine ist. Wenn Sie also einen Code verwenden, der nur den natürlichen vorzeichenlosen Zahlenbereich behandelt 0-255, funktionieren die in der Frage angegebenen Testfälle nicht.

Manuell zusammengestellt daraus:

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 : Ich habe einen Fehler behoben in gvm; Ohne dieses Update wurde gvmversucht, Binärprogramme im Textmodus zu lesen , die möglicherweise 0xdfehlerhaft sind.

Felix Palmen
quelle
0

K (oK) , 21 Bytes

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

Probieren Sie es online!

Port of Arnauld's JS Antwort .

Wie:

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

Die Funktion gibt (_r%2)iff zurück 1!r == 0, andernfalls null ( 0N). Dies liegt daran, dass das einzelne Element in der Liste den Index 0 hat. Wenn Sie versuchen, diese Liste mit einer anderen Zahl als 0 zu indizieren, wird null zurückgegeben.

J. Sallé
quelle