얼마나 많은 큐브를 만들 수 있습니까


20

태스크

당신의 임무는 큐브 로 구조를 만드는 것 입니다. 큐브의 양은 다음 순서를 따릅니다 (아래 -> 위).

,(1),(2),...,1

입력

구조의 총 부피 ( ).V

산출

( )의 값 , 즉 총 큐브 수입니다.

V=+(1)+....+1

노트

  • 입력은 항상 정수입니다.
  • 때때로 시퀀스를 따라갈 수 없습니다. 즉 : 는 대한 특정 값을 나타내지 않습니다 . 이 경우 -1을 반환하거나 선택한 값이 틀립니다 (일관성 필요).NV
  • 이것은 이므로 각 언어 당 승리에 대한 바이트 단위의 최단 답변입니다.
  • 위에 언급 된 이유로 답변이 수락 된 것으로 표시되지 않습니다.

요청

  • 이것은 사이트의 첫 번째 도전이므로 나와 함께 견뎌내고 내가 저지른 실수를 용서하십시오.
  • 코드를 테스트 할 수 있도록 링크를 제공하십시오.
  • 가능하면 코드 작동 방식에 대한 설명을 친절하게 작성하여 다른 사람들이 귀하의 작업을 이해하고 감사하게 할 수 있습니다.

input  : 4183059834009
output : 2022

input  : 2391239120391902
output : -1

input  : 40539911473216
output : 3568

이 링크에 대한 @Arnauld 덕분에 :

그렇게 좋지 않습니까?

orignial로 연결 : 링크


2
이것은 훌륭하게 쓰여진 첫 번째 도전입니다. 그러나 몇 가지 테스트 사례를 추가하는 것이 좋습니다.
Arnauld

1
@Arnauld, 괜찮아요. 고마워요 :)
Any3nymous 사용자


입력 4183059834009이 어떻게 출력을 제공 하는지 설명해 주 2022시겠습니까?
DimChtz

2
오 : 적어도 그게 내가 내 대답에 가정 무엇 - SuperJedi224 AFAIK @ 기본 규칙은 허점에 대한 작은 범위를 사용하지 않고 물론, "어떤 언어의 자연 정수 유형이 다양합니다"입니다
펠릭스 Palmen을

답변:


19

자바 스크립트 (ES7), 31 바이트

직접적인 공식. 0솔루션이없는 경우 반환 합니다.

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

온라인으로 사용해보십시오!

방법?

첫 번째 큐브 의 합 은 다음과 같습니다. , N에스

에스=((+1)2)2=(2+2)2

(이것은 A000537 입니다.이 공식은 귀납법으로 쉽게 증명할 수 있습니다 . 여기 에 의 멋진 그래픽 표현이 .)에스5

역수로, 가 첫 큐브 의 합 이면 다음 방정식은 양의 정수 솔루션을 허용합니다.xV엑스

(엑스2+엑스2)2=V

때문에 양극이고,이 리드에 :(엑스2+엑스)/2

엑스2+엑스2V=0

다음과 같은 방법으로 긍정적 인 해결책을 제시합니다.

Δ=1+8V엑스=1+Δ2

경우 의 정수이기 때문에, 이상한 일이 보장되는 자체가 이상하다. 따라서 솔루션은 다음과 같이 표현 될 수 있습니다. Δ아르 자형=ΔΔ

엑스=아르 자형2

댓글

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 같은 언어로 여러 답변을 게시하는 것은 완벽합니다. 며칠 전에 자체 도전에 응답해서는 안되지만 이제는 괜찮습니다.
Arnauld

오, 그 경우에 말해 : thnx :)
Any3nymous 사용자

7

05AB1E , 6 바이트

ÝÝOnIk

온라인으로 사용해보십시오!

조나단 항의 젤리 답변. 누적 합 [0 ... n] 을 취하고 각각 제곱 한 다음 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.


나는 아무 생각 왜 모두가없는 3mOnO아마 또한 언급 ... 작업을 -1 falsy 값입니다.
Magic Octopus Urn


5

젤리 ,  5  4 바이트

RIJi

모나드 링크는 0가능하지 않은 경우 생성 합니다.

온라인으로 사용해보십시오! 테스트 케이스에는 너무 비효율적입니다! (O (V) 공간 : p)

다음 은 8의 큐브 루트를 먼저 수행하여 대신 O (V ^ (1/3))로 만드는 8 바이트 버전입니다. 이 8 바이트 버전을 사용하는 것은 테스트 스위트입니다.

방법?

나는=1나는=나는=(나는=1나는=나는)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 사용자 13

1
유효합니다. 테스트 케이스에 메모리 오류를주는 범위 일뿐입니다. 같은 작은 값을 시도36
씨 Xcoder

1
@ FiveCrayFish973 예, 사양에서 일부 제한이 적용되지 않는 한 코드 골프에서 바이트 수에 대한 사용성 / 효율성 등을 희생하는 것이 일반적입니다. 테스트 사례에 적합한 9 바이트 버전을 참조하십시오.
Jonathan Allan

@JonathanAllan 쿨, 나는이 커뮤니티의 규칙이 제안하는 것을 알지 못했습니다. 유효하면 유효합니다. 건배
Any3nymous 사용자

너무 IJi나쁘면 ²⁼( 즉,) 처럼 동작 합니다.
Outgolfer Erik



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 - . ? / . . . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

달려 봐

입력에서 큐브를 늘리면 무차별 대입이 필요합니다. 결과가 0이면 n결과가 음수이면 0을 인쇄하고 종료하십시오.


2

펄 6 , 30 29 26 바이트

Jo King 덕분에 -4 바이트

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

온라인으로 사용해보십시오!

n <10000에 대한 무차별 해법. Jonathan Allan의 답변의 방정식을 사용합니다. (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

Matlab, 27 바이트

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

n존재 하는 경우 if 또는 비어있는 행렬을 반환합니다 .

작동 원리

            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

dc , 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=00이 아닌 x(음수 x!)이지만 dc에 대한 명백한 사실에 의존합니다 0^0=1.


1

파이썬 3 , 53 48 바이트

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

온라인으로 사용해보십시오!

Jo King 에서 -3 바이트

-1대답이 없으면 반환 합니다.

n=997기본 재귀 제한에 대해서만 작동합니다 .

볼륨이 0에 도달 할 때까지 (성공, 큐브 리턴 수 제거) 음수 (응답 없음)가 될 때까지 볼륨에서 더 큰 큐브를 반복적으로 가져옵니다.

설명:

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 바이트
Jo King

@JoKing 감사합니다! 나는 또한 2 바이트를 더 껐다.
pizzapants184184 년

not V=> V==0또는V>-1
Jo King

0

gvm (커밋 2612106 ) 바이트 코드, 70 59 바이트

(두 번 곱하기위한 코드를 작성하는 대신 루프를 곱하여 11 바이트)

16 진 덤프 :

> 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}

온라인으로 사용해보십시오!

Arnauld의 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이 아닌 다른 숫자로 해당 목록을 인덱싱하려고하면 null을 반환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.