สามารถสร้างลูกบาศก์ได้กี่ก้อน


20

งาน

งานของคุณคือการสร้างโครงสร้างที่มีลูกบาศก์ ปริมาณของลูกบาศก์ทำตามลำดับต่อไปนี้ (ล่าง->ด้านบน)n

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

อินพุต

ปริมาตรรวมของโครงสร้าง ( )V

เอาท์พุต

มูลค่าของ ( ) คือ: จำนวนรวมของลูกบาศก์n

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

บันทึก

  • ข้อมูลที่ป้อนจะเป็นจำนวนเต็มเสมอ
  • บางครั้งก็เป็นไปไม่ได้ที่จะทำตามลำดับเช่น:ไม่ได้แสดงค่าที่เฉพาะเจาะจงสำหรับnในเหตุการณ์นั้นให้คืน -1 หรือค่าเท็จของการเลือกของคุณ (จำเป็นต้องมีความสอดคล้อง)nVn
  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์สำหรับแต่ละภาษาที่ชนะ
  • จะไม่มีการทำเครื่องหมายตอบรับด้วยเหตุผลดังกล่าวข้างต้น

การร้องขอ

  • นี่เป็นความท้าทายครั้งแรกของฉันบนเว็บไซต์ดังนั้นโปรดอดทนกับฉันและให้อภัย (และบอกฉันเกี่ยวกับ) ความผิดพลาดใด ๆ ที่ฉันทำ
  • โปรดระบุลิงก์เพื่อให้โค้ดของคุณสามารถทดสอบได้
  • หากคุณทำได้โปรดเขียนคำอธิบายเกี่ยวกับวิธีการทำงานของรหัสของคุณเพื่อให้ผู้อื่นสามารถเข้าใจและชื่นชมงานของคุณ

ตัวอย่าง

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 กฎเริ่มต้นคือ "ช่วงใดก็ตามที่จำนวนเต็มตามธรรมชาติของภาษาของคุณมี" แน่นอนโดยไม่ต้องใช้ช่วงเล็ก ๆ สำหรับช่องโหว่ - อย่างน้อยนั่นคือสิ่งที่ฉันคิดในคำตอบของฉัน: o
Felix Palmen

คำตอบ:


19

JavaScript (ES7), 31 ไบต์

สูตรโดยตรง ส่งคืน0ถ้าไม่มีวิธีแก้ไข

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

ลองออนไลน์!

อย่างไร?

ผลรวมของของnก้อนแรกถูกกำหนดโดย:Snn

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

(นี่คือA000537สูตรนี้สามารถพิสูจน์ได้อย่างง่ายดายโดยการเหนี่ยวนำนี่คือการแสดงกราฟิกที่ดีของ )S5

ซึ่งกันและกันถ้าคือผลรวมของxลูกบาศก์แรกสมการต่อไปนี้ยอมรับวิธีแก้ปัญหาจำนวนเต็มบวก:โวลต์x

(x2+x2)2=โวลต์

เนื่องจากเป็นค่าบวกสิ่งนี้นำไปสู่:(x2+x)/2

x2+x-2โวลต์=0

วิธีแก้ปัญหาเชิงบวกที่ได้รับจาก:

Δ=1+8โวลต์x=-1+Δ2

ถ้าเป็นจำนวนเต็มจึงรับประกันได้ว่าจะเป็นเลขคี่เพราะΔเป็นเลขคี่ ดังนั้นวิธีแก้ปัญหาสามารถแสดงเป็น:R=ΔΔ

x=R2

แสดงความคิดเห็น

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

สวัสดีฉันสร้างลิงก์คำตอบ (สำหรับคำถามของฉันเอง) เนื่องจากคุณเผยแพร่ก่อนฉันต้องการถามว่าการเผยแพร่สองครั้งในภาษาเดียวกันเป็นเรื่องปกติหรือไม่?
ผู้ใช้ 3 คนใด ๆ ใน

@ Any3nymoususer การโพสต์คำตอบหลาย ๆ คำในภาษาเดียวกันนั้นใช้ได้อย่างสมบูรณ์แบบ การตอบคำถามท้าทายของตัวเองไม่ควรทำก่อนสองสามวัน แต่ฉันเดาว่ามันใช้ได้แล้ว
Arnauld

โอ้ในกรณีนี้ขอบคุณที่บอกฉัน :)
ผู้ใช้ 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ไบต์:


ฉันไม่รู้ว่าทำไมทั้งสอง3mOและnOทำงาน ... อาจกล่าวถึง -1 เป็นค่าที่ผิดพลาด
Magic Octopus Urn

6

R , 42 40 ไบต์

-2 ไบต์ขอบคุณ Giuseppe

function(v,n=((1+8*v^.5)^.5-1)/2)n*!n%%1

ลองออนไลน์!

ท่าเรือArnauld เป็นคำตอบ ส่งกลับค่า 0 ถ้าไม่มีวิธีแก้ไข


เยี่ยมมาก @Giuseppe!
duckmayr


@Giuseppe เสร็จสิ้นแล้ว!
duckmayr

5

เยลลี่ ,  5  4 ไบต์

RIJi

ลิงก์แบบ monadic ให้ผลลัพธ์0หากไม่สามารถทำได้

ลองออนไลน์! วิธีที่ไม่มีประสิทธิภาพมากเกินไปสำหรับกรณีทดสอบ! (O (V) พื้นที่: p)

นี่คือเวอร์ชัน 8 ไบต์ที่ทำคิวบ์รูทของ V ก่อนเพื่อให้เป็น O (V ^ (1/3)) แทน การใช้เวอร์ชัน 8 ไบต์ที่นี่เป็นชุดทดสอบ

อย่างไร?

Σผม=1ผม=nผม3=(Σผม=1ผม=nผม)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

1
ถูกต้องมันเป็นเพียงช่วงที่ให้ข้อผิดพลาดของหน่วยความจำสำหรับกรณีทดสอบเหล่านั้น ลองใช้ค่าที่น้อยกว่าเช่น36
Mr. Xcoder

1
@ FiveCrayFish973 ใช่มันค่อนข้างปกติที่จะเสียสละความสามารถในการใช้งาน / ประสิทธิภาพ / ฯลฯ สำหรับ byte-count ใน code-golf (เว้นแต่ spec จะบังคับใช้ข้อ จำกัด บางอย่าง) ดูรุ่น 9 ไบต์สำหรับรุ่นที่เหมาะกับเคสทดสอบของคุณ
Jonathan Allan

@ โจนาธานเยี่ยมมากฉันไม่ทราบว่ากฎของชุมชนนี้แนะนำอะไร ถ้ามันถูกต้องก็ถูกต้อง ไชโย
ผู้ใช้ Any3nymous

IJiพฤติกรรมแย่เกินไปเช่น²⁼( ในคำอื่น ๆ )
Erik the Outgolfer

4

Elixir , 53 ไบต์

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

ลองออนไลน์!

คำตอบของเยลลี่พอร์ตของโจนาธาน


Elixir , 74 ไบต์

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

ลองออนไลน์!

ย่อยที่ดีที่สุดแน่นอน แต่ฉันเป็นแค่น้องใหม่ของ Elixir! :) ผลตอบแทนnilสำหรับ "ไม่ถูกต้อง" Vค่านิยมของ



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

ดูมันทำงาน

มันเป็นสัตว์เดรัจฉานที่สำคัญโดยการเพิ่มลูกบาศก์ให้ห่างจากอินพุต หากผลลัพธ์เป็นศูนย์ให้เอาต์พุตเป็นnอย่างอื่นหากมีผลลัพธ์เป็นลบให้พิมพ์ 0 และออก


2

Perl 6 , 30 29 26 ไบต์

-4 ไบต์ขอบคุณ Jo King

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

ลองออนไลน์!

วิธีแก้ปัญหาที่โหดเหี้ยมสำหรับ n <10,000 ใช้สมการจากคำตอบของ Jonathan Allan 37 36 bytes solution สำหรับ n ที่ใหญ่กว่า ( -1 byte ขอบคุณ Jo King ):

{!.[*-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>*
โจคิงเมื่อ


2

JavaScript (Node.js)ขนาด 28 ไบต์

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

ลองออนไลน์!

ฉันรู้ว่ามันเป็นคำถามของฉันเองและทั้งหมด แต่ฉันมีคำตอบที่ดีกว่า (สำหรับ lang นี้) จากนั้นจึงปรากฏดังนั้นฉันโพสต์ หวังว่ามันจะโอเค



1

Matlab ขนาด 27 ไบต์

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

ส่งคืนnถ้ามีอยู่หรือเมทริกซ์ว่างเปล่าถ้าไม่

มันทำงานอย่างไร

            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))ใช้โดยใช้ความแม่นยำทศนิยม 0 ตำแหน่งเริ่มต้นของ dc สำหรับรากที่สองแล้วเปรียบเทียบ(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=0สำหรับทุกภัณฑ์x(แม้ในเชิงลบx!) 0^0=1แต่


1

Python 3 , 53 48 ไบต์

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

ลองออนไลน์!

-3 bytes จากJo King

ส่งคืนโดย-1ไม่มีคำตอบ

ทำงานได้ถึงn=997ขีด จำกัด การเรียกซ้ำเริ่มต้นเท่านั้น

เอาก้อนที่ใหญ่กว่าและใหญ่กว่าซ้ำจากปริมาตรจนกระทั่งมันมาถึงศูนย์ (สำเร็จ, ส่งคืนจำนวนของลูกบาศก์ที่นำออก) หรือจำนวนลบ (ไม่มีคำตอบ)

คำอธิบาย:

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 bytes
Jo King

@ โจกิ้งขอบคุณ! ฉันได้เพิ่มอีกสองไบต์
pizzapants184

not V=> V==0หรือV>-1
Jo King

0

gvm (กระทำ2612106 ) ไบต์รหัส70 59 ไบต์

(-11 ไบต์โดยการคูณในลูปแทนที่จะเขียนโค้ดสำหรับการคูณสองครั้ง)

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

ทดสอบการทำงาน:

> 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 เป็นคำตอบ

วิธี:

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