Ile kostek można zbudować

20

zadanie

Twoim zadaniem jest zbudowanie struktury z kostek. Objętość kostek jest zgodna z następującą sekwencją (dół -> góra)n

n3),(n-1)3),(n-2))3),...,13)

Wejście

Całkowita objętość struktury ( ).V.

wynik

wartość ( ), tj .: Całkowita liczba kostek.n

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

notatki

  • Dane wejściowe zawsze będą liczbą całkowitą.
  • Czasami nie jest możliwe przestrzeganie sekwencji, tzn .: nie reprezentuje określonej wartości dla . W takim przypadku zwróć -1 lub dowolną wartość falsy (wymagana jest jednak spójność).nV.n
  • To jest więc wygrywa najkrótsza odpowiedź w bajtach dla każdego języka.
  • Żadna odpowiedź nie zostanie oznaczona jako zaakceptowana z wyżej wymienionego powodu.

upraszanie

  • To jest moje pierwsze wyzwanie na stronie, więc bądźcie ze mną i wybaczcie (i powiedzcie mi) wszelkie błędy, które popełniłem.
  • Podaj link, aby przetestować kod.
  • Jeśli możesz, uprzejmie napisz wyjaśnienie, jak działa Twój kod, aby inni mogli zrozumieć i docenić twoją pracę.

przykłady

input  : 4183059834009
output : 2022

input  : 2391239120391902
output : -1

input  : 40539911473216
output : 3568

Dzięki @Arnauld za link do tego:

Czy to nie miłe?

Link do oryginału: Link

Any3nymous użytkownik
źródło
2
To ładnie napisane pierwsze wyzwanie. Jednak zdecydowanie zalecam dodanie kilku przypadków testowych.
Arnauld
1
@Arnauld, ok, pracuję nad tym teraz i dzięki :)
Any3nymous użytkownik
OEIS A000537
JayCe
Czy możesz wyjaśnić, w jaki sposób wkład 4183059834009daje wynik 2022?
DimChtz
2
@ SuperJedi224 AFAIK domyślną regułą jest „jakikolwiek zakres ma naturalna liczba całkowita twojego języka”, oczywiście bez użycia małego zakresu dla luki - przynajmniej tak założyłem w mojej odpowiedzi: o
Felix Palmen

Odpowiedzi:

19

JavaScript (ES7), 31 bajtów

Formuła bezpośrednia. Zwraca, 0jeśli nie ma rozwiązania.

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

Wypróbuj online!

W jaki sposób?

Suma pierwszych n kostek jest dana przez:S.nn

S.n=(n(n+1)2))2)=(n2)+n2))2)

(To jest A000537 . Ta formuła może być łatwo udowodniona przez indukcję. Oto ładne graficzne przedstawienie ).S.5

Odwrotnie, jeśli jest sumą pierwszych x sześcianów, poniższe równanie dopuszcza dodatnie, całkowite rozwiązanie:vx

(x2)+x2))2)=v

Ponieważ jest dodatnia, prowadzi to do:(x2+x)/2

x2+x2v=0

Którego pozytywne rozwiązanie daje:

Δ=1+8vx=1+Δ2

Jeśli jest liczbą całkowitą, na pewno jest nieparzysta, ponieważΔjest nieparzyste. Dlatego rozwiązanie można wyrazić jako:r=ΔΔ

x=r2

Skomentował

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)

Wersja rekurencyjna, 36 35 bajtów

Zwraca, NaNjeśli nie ma rozwiązania.

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

Wypróbuj online!

Skomentował

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
źródło
Cześć, Stworzyłem link do odpowiedzi (na moje własne pytanie) , odkąd opublikowałeś pierwszy chciałem zapytać, czy można publikować dwa razy w tym samym języku?
Any3nymous użytkownik
@ Any3nymoususer Publikowanie kilku odpowiedzi w tym samym języku jest całkowicie w porządku. Odpowiedź na własne wyzwanie nie powinna nastąpić wcześniej niż za kilka dni, ale myślę, że teraz jest OK.
Arnauld
Och, w takim razie dziękuję za poinformowanie mnie :)
Any3nymous użytkownik
7

05AB1E , 6 bajtów

ÝÝOnIk

Wypróbuj online!

Port galaretki Jonathana odpowiedź. Weź skumulowaną sumę [0 ... n] , kwadratowy każdego i znaleźć indeks V .


05AB1E , 7 bajtów

ÝÝ3mOIk

Wypróbuj online!

Jak to działa

ÝÝ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 bajtów alternatywnie: ÝÝÅΔ3mOQ.

Pan Xcoder
źródło
Nie mam pojęcia, dlaczego zarówno 3mOi nOpracy ... Prawdopodobnie również wspomnieć -1 jest wartością falsy.
Magic Octopus Urn
5

Galaretka ,  5  4 bajtów

RIJi

Łącze monadyczne daje, 0jeśli nie jest to możliwe.

Wypróbuj online! zbyt mało wydajne dla przypadków testowych! Spacja (O (V): p)

Oto 8-bajtowa wersja, która najpierw wykonuje pierwiastek kostki z V, aby zamiast tego była O (V ^ (1/3)). Używanie tej 8-bajtowej wersji tutaj jest zestawem testowym

W jaki sposób?

ja=1ja=nja3)=(ja=1ja=nja)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
źródło
Czy to jest ważne? ponieważ nie może obsłużyć danych wejściowych pokazanych w testach? (Nie mam pojęcia)
Any3nymous użytkownik
1
Jest poprawny, to tylko zakres, który daje błąd pamięci dla tych przypadków testowych. Wypróbuj mniejsze wartości, takie jak36
Mr. Xcoder
1
@ FiveCrayFish973 tak, całkiem normalne jest poświęcanie użyteczności / wydajności / itp. Dla liczenia bajtów w golfie kodowym (chyba że specyfikacja wymusza pewne ograniczenia). Zobacz 9-bajtową wersję, która działa dla twoich przypadków testowych.
Jonathan Allan
@JonathanAllan spoko, nie wiedziałem, co sugerują reguły tej społeczności. Jeśli jest ważny, jest ważny. Pozdrawiam
Any3nymous użytkownik
Szkoda IJizachowuje się jak ²⁼( innymi słowy).
Erik the Outgolfer
4

Eliksir , 53 bajty

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

Wypróbuj online!

Port galaretki Jonathana odpowiedź.


Eliksir , 74 bajty

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

Wypróbuj online!

Zdecydowanie nieoptymalne. Ale jestem tylko początkującym Eliksirem! :) Zwraca w nilprzypadku „nieprawidłowych” wartości V.

Pan Xcoder
źródło
3

Japt, 7 bajtów

o³å+ bU

Spróbuj


Wyjaśnienie

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

Alternatywny

Çõ³xÃbU

Spróbuj

Kudłaty
źródło
3

Cubix , 27 bajtów (lub tom 27?)

Wydaje się, że to właściwe miejsce dla tego języka.

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

Wypróbuj online!

To zawija się w kostkę 3x3x3 w następujący sposób

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

Zobacz, jak biegnie

To podstawowa brutalna siła, odciągając coraz większe kostki od wkładu. Jeśli wynikiem jest zero n, wypisz w przeciwnym razie, jeśli wynik jest ujemny, wydrukuj 0 i wyjdź.

MickyT
źródło
2

Perl 6 , 30 29 26 bajtów

-4 bajty dzięki Jo Kingowi

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

Wypróbuj online!

Rozwiązanie siły brutalnej dla n <10000. Korzysta z równania z odpowiedzi Jonathana Allana. 37 36 bajtów rozwiązanie dla większego n ( -1 bajt dzięki Jo King ):

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

Wypróbuj online!

Zwraca, Falsejeśli nie ma rozwiązania.

Wyjaśnienie

               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
źródło
Jeśli chodzi o brutalną siłę, możesz 0..$_być ważny dla wszystkich liczb, nawet jeśli upłynie limit czasu dla większych. Aby normalnie grać w golfa, możesz usunąć .z pierwszego i zmienić drugi z 0>=*na1>*
Jo King
26 bajtów
Jo King
2

JavaScript (Node.js) , 28 bajtów

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

Wypróbuj online!

Wiem, że to moje własne pytanie, ale mam lepszą odpowiedź (na ten język), więc jest obecny, więc napisałem. Mam nadzieję, że jest ok

Any3nymous użytkownik
źródło
1

Matlab, 27 bajtów

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

Zwraca nif istnieje lub pustą macierz, jeśli nie.

Jak to działa

            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

Wypróbuj online!

Uwaga: W przypadku dużych awarii kończy się niepowodzeniem v.

DimChtz
źródło
1

dc , 19 bajtów

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

Wejście i wyjście pochodzi ze stosu, zwraca 0, jeśli nie ma rozwiązania.

Wypróbuj online!

Wyjaśnienie

Jeśli istnieje rozwiązanie n, dane wejściowe to ((n^2+n)^2)/4. Więc będziemy obliczać rozwiązanie procesu, n=sqrt(sqrt(4*input))za pomocą domyślnie 0 miejsc dziesiętnych precyzję DC dla pierwiastków kwadratowych, a następnie porównać (n^2+n)^2do 4*input, aby zobaczyć, czy to rzeczywiście rozwiązanie.

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

Przedostatnia linia opiera się na nieoczywistym fakcie, że dla dc, 0^x=0dla wszystkich niezerowych x(nawet ujemnych x!), Ale 0^0=1.

Sophia Lechner
źródło
1

Python 3 , 53 48 bajtów

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

Wypróbuj online!

-3 bajty od Jo Kinga

Zwraca -1brak odpowiedzi.

Działa tylko n=997z domyślnymi limitami rekurencji.

Wielokrotnie pobiera coraz większe kostki z objętości, aż osiągnie zero (sukces, zwracana liczba usuniętych kostek) lub liczba ujemna (brak odpowiedzi).

Wyjaśnienie:

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
pizzapanty184
źródło
and/orlub listy są zwykle krótsze niż if/else. 50 bajtów
Jo King
@JoKing Thanks! Mam jeszcze dwa bajty więcej.
pizzapants184
not V=> V==0lubV>-1
Jo King
0

gvm (commit 2612106 ) bytecode, 70 59 bajtów

(-11 bajtów przez pomnożenie w pętli zamiast pisania kodu do dwukrotnego pomnożenia)

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

Przebiegi testowe:

> 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

Niezbyt niski wynik, wystarczy użyć tego miłego pytania do testowania gvmtutaj;) Zatwierdzenie jest starsze niż pytanie oczywiście. Zauważ, że jest to 8-bitowa maszyna wirtualna, więc używając kodu obsługującego tylko naturalny zakres liczb bez znaku 0-255, przypadki testowe podane w pytaniu nie będą działać.

Ręcznie zmontowany z tego:

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 : Właśnie naprawiono błąd w gvm; bez tej poprawki, gvmpróbował czytać programy binarne w trybie tekstowym , które mogą się zepsuć (powyższy kod nie zawiera żadnych 0xdbajtów, więc nie zepsuje się w systemie Windows bez tej poprawki).

Felix Palmen
źródło
0

K (oK) , 21 bajtów

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

Wypróbuj online!

Odpowiedź JS Port of Arnauld .

W jaki sposób:

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

funkcja zwróci (_r%2)iff 1!r == 0, w przeciwnym razie zwróci null ( 0N). Wynika to z faktu, że pojedynczy element na liście ma indeks 0, a próba indeksowania tej listy dowolną liczbą inną niż 0 zwróci null.

J. Sallé
źródło