ฉันเป็นรถแท็กซี่รองหรือไม่


13

พื้นหลัง

หมายเลข Ramanujan ปี 1729 เรียกว่าหมายเลขแท็กซี่ - แท็กซี่เนื่องจากเรื่องราว (อาจเป็นหลักฐาน) ของ Hardy ขึ้นรถแท็กซี่เพื่อเยี่ยมชม Ramanujan ในโรงพยาบาลที่มีหมายเลขนี้ซึ่งดูเหมือนจะไม่สุภาพกับเขา

มันเป็นที่รู้จักกันในชื่อที่โด่งดังที่สุดในชั้นเรียนของจำนวนเต็มที่เรียกว่า "หมายเลขรถแท็กซี่" ซึ่งแสดงให้เห็นว่าเป็นผลรวมของพลังสอง nth (ของจำนวนเต็มบวก) ในสองวิธี (หรือบางครั้ง 'k')

ค.ศ. 1729 เป็นจำนวนธรรมชาติที่เล็กที่สุดที่สามารถบอกได้ว่าเป็นผลรวมของ 2 ลูกบาศก์ใน 2 วิธีที่แตกต่างกันทำให้เป็นหมายเลขรถแท็กซี่ "3,2" ตัวแรก ("n, k" โดยทั่วไป)

ท้าทาย

ให้ตัวเลขตัดสินใจว่ามันเป็น "3,2" 'หมายเลขรถแท็กซี่รอง' - หมายถึงมันตอบสนองข้อ จำกัด เช่นเดียวกับ 1729 (2 ผลรวมของก้อนที่ไม่ซ้ำกัน) แต่ไม่จำเป็นต้องเป็นจำนวนเต็มที่น้อยที่สุดของ "3 ชั้น 2 "(แน่นอนว่าเป็นปี 1729)

ตัวอย่างกรณี:

1729 = 10 ^ 3 + 9 ^ 3 = 12 ^ 3 + 1 ^ 3

4104 = 15 ^ 3 + 9 ^ 3 = 16 ^ 3 + 2 ^ 3

13832 = 2 ^ 3 + 24 ^ 3 = 18 ^ 3 + 20 ^ 3

เช่นเดียวกับ 20683, 32832, 39312 ...

เกณฑ์การให้คะแนน

นี่คือดังนั้นคำตอบที่สั้นที่สุดในแต่ละภาษาจะเป็นผู้ชนะ

รหัส Matlab หยาบเพื่อค้นหากรณีอื่น ๆ โดยใช้กำลังดุร้าย:

for k = 1729:20000
    C = sum(round(mod(real((k-[1:ceil(k^(1/3))].^3).^(1/3)),1)*10000)/10000==1);
    if C > 1
        D = (mod(C,2)==0)*C/2 + (mod(C,2)==1)*((C+1)/2);
        disp([num2str(k),' has ',num2str(D),' solns'])
    end
end

ยินดีต้อนรับสู่ PPCG! ฉันแก้ไขคำถามของคุณเล็กน้อยเพื่อให้ชัดเจนขึ้น คุณยินดีที่จะเพิ่มกรณีทดสอบหรือไม่?
musicman523

ใช่ฉันกำลังดิ้นรนเพราะฉันอยู่ที่ทำงานและไม่มี Matlab แต่สามารถจัดการให้คู่แปดคนออนไลน์ทำงานและพบ 4104 = 16 ^ 3 + 4 ^ 3 = 15 ^ 3 + 9 ^ 3
DrQuarius


1
จำเป็นต้องมีสองวิธีในการเขียนตัวเลขหรืออย่างน้อยสองวิธีใช่หรือไม่
John Dvorak

2
ใครบางคนควรเขียนคำตอบใน Taxi bigzaphod.github.io/Taxi
SaggingRufus

คำตอบ:


4

05AB1E , 9 ไบต์

รหัส (ช้ามาก)

L3mãOQO3›


รหัส (เร็วมาก), 12 ไบต์

tL3mDδ+˜QO3›

ใช้การเข้ารหัส05AB1E ลองออนไลน์!

คำอธิบาย

t                # Square root (not necessary but added for speed)
 L               # Create a list [1 .. sqrt(input)]
  3m             # Raise to the power of 3
    D            # Duplicate
     δ+          # 2 dimensional addition
       ˜         # Deep-flatten the entire list
        Q        # Check which are equal to the input
         O       # Sum up to get the number of equalities
          3›     # Checks whether there are 4 or more equalities. In order for a number
                   to be a secondary taxicab number, there are at least two distinct
                   ways to get to that number and 4 ways when you also take reversed
                   arguments in account.

2
แน่นอนคุณสามารถบันทึกไบต์โดยการลบสแควร์รูท นี่คือรหัส - กอล์ฟไม่ใช่รหัสที่เร็วที่สุด
กระจาย

@ คริสเตียนฉันได้เพิ่มรหัสรุ่นที่ช้า
Adnan

6

เยลลี่ขนาด 9 ไบต์

มอบเครดิตให้แก่ Erik the Outgolfer

Œċ*3S€ċ>1

ลองออนไลน์!

ช้าเกินไปที่จะไม่สามารถใช้งาน1729ออนไลน์ได้

เร็วกว่ามาก 12 ไบต์

ให้เครดิตกับเดนนิส

R*3fRŒċS€ċ>1

ลองออนไลน์!


ฉันเพิ่งทดสอบมันด้วย "4104" และมันผ่านไปแล้ว :) ยังไม่พบอะไรมากไปกว่านี้ แต่มันเร็วมาก!
DrQuarius

Ðf⁸fRจะกลายเป็น สามารถลบอันที่สองได้
Dennis

สามารถลบ second อันที่สองได้อย่างแน่นอน แต่การสลับ fR นำไปสู่ความล้มเหลว
DrQuarius

อย่างไรก็ตามนี่คือcode-golfดังนั้นเราไม่สนใจความเร็ว;) แต่คุณยังสามารถรวมเวอร์ชันที่รวดเร็วในลิงค์ TIO
user41805

1
Œċ*3S€ċ>1คุณไม่จำเป็นต้องดูแลเกี่ยวกับความเร็วเพียงแค่ทำ
Erik the Outgolfer

5

Mathematica, 35 ไบต์

Count[#^3+#2^3&~Array~{#,#},#,2]>2&

ฟังก์ชั่นการถ่ายบริสุทธิ์เป็นจำนวนเต็มบวกและกลับมาหรือTrueFalse

#^3+#2^3&~Array~{#,#}tabulates ผลรวมของลูกบาศก์ทั้งหมดของจำนวนเต็มสองจำนวนระหว่าง 1 ถึงอินพุต (สิ่งนี้จะเร็วกว่ามากเมื่อมีความรู้สึกที่ถูกผูกไว้กับจำนวนเต็มที่จะถูกลูกบาศก์เช่นคิวบ์รูทของอินพุต แต่จะต้องใช้ค่าไบต์ที่มีค่าตามที่เป็นอยู่รหัสจะใช้เวลาประมาณ 30 วินาทีในอินพุต13832และปรับขนาดอย่างน้อย ในอินพุต) Count[...,#,2]นับจำนวนอินพุตที่ปรากฏในรายการนี้ที่ระดับซ้อน 2 หากตัวเลขนี้มากกว่าจำนวน2ที่ป้อนเป็นตัวเลขกึ่งแท็กซี่ (มากกว่า 2 มากกว่ามากกว่า 1 เนื่องจากมีการนับจำนวน ^ 3 + b ^ 3 และ b ^ 3 + a ^ 3 แยกต่างหาก)


3

Mathematica, 38 37 ไบต์

Tr[1^PowersRepresentations[#,2,3]]>1&

-1 ไบต์ขอบคุณ @GregMartin

เช่นเคยมี Mathematica สร้างขึ้นเพื่อทุกสิ่ง


1
สมมติว่า OP จะ ok ที่มีมากขึ้นกว่าที่ 2 การแสดงแล้วผมเชื่อว่าการทำงานในสถานที่ของTr[1^...] Length@
Greg Martin

2

JavaScript (ES7), 63 ไบต์

ฟังก์ชั่นวนซ้ำอย่างรวดเร็วซึ่งในที่สุดก็ส่งกลับบูลีน

f=(n,k,r=0,x=n-k**3)=>x<0?r>3:f(n,-~k,r+=(x**(1/3)+.5|0)**3==x)

การสาธิต


2

Mathematica, 48 ไบต์

Length@Solve[x^3+y^3-#==0<x<y,{x,y},Integers]>1&

อินพุต

[4104]

เอาท์พุต

จริง


โปรดทราบว่า#!=1729&&ไม่จำเป็นอีกต่อไปตอนนี้ข้อมูลจำเพาะได้รับการชี้แจงแล้ว
Greg Martin

คุณสามารถใช้Solveมากกว่าReduce?
เอียนมิลเลอร์

แน่นอน ... 1 ไบต์คือ 1 ไบต์!
J42161217

สามารถบันทึกได้อีกหนึ่งไบต์Length@Solve[x^3+y^3-#==0<x<y,{x,y},Integers]>1&ซึ่งแทนที่&&ด้วย-และการจัดเรียงใหม่เล็กน้อย
เอียนมิลเลอร์


1

MATL ( 16 15 ไบต์) ( 13 12 นึกคิด)

.4^:3^2XN!sG=sq

ลองออนไลน์!

คำอธิบาย:

จากวิธีการแก้ปัญหาของเจลลี่ 'Leaky แม่ชี' เพิ่งเปลี่ยนเป็น MATL ซึ่งอาจซ้ำซ้อนในบางส่วนและสามารถปรับปรุงได้:

.4^  % rough cube root of input, as maximum potential integer N.
:3^   % create array of all cubes from 1^3 up to N^3.
2XN   % do nchoosek on cube array, creating all possible pairs (k=2) to add.
!s    % transpose array and add all pairs to find sums.
G=    % find all pairs that equal the original input.
sq   % if there is more than one solution, then pass the test.

หมายเหตุ: ผลลัพธ์ที่ผิดพลาดรวมถึง 0 และ -1 ในขณะที่เอาท์พุทความจริงคือ 1 ขอบคุณ Luis Mendo สำหรับการบันทึกไบต์พิเศษที่นี่แทนที่ "s1>" ด้วย "sq"

เป็นการดี ( 13 12 ไบต์):

:3^2XN!sG=sq

... ก็เพียงพอแล้ว แต่สำหรับจำนวนที่มากกว่านี้จะขัดข้องในหน้าของ tio.run


Original: MATL (19 bytes) =============== XH.34 ^: 3 ^ 2XN! sH = s1>
DrQuarius

1
ถ้าผลลัพธ์ truthy ใด ๆ ที่เป็นที่ถูกต้องคุณสามารถแทนที่โดย1> qนอกจากนี้คุณมีHแทนที่จะGอธิบาย ความจริงที่ว่าโปรแกรมขัดข้องสำหรับคนจำนวนมากมักจะไม่เกี่ยวข้องกับการให้คะแนน หากได้รับเวลาและหน่วยความจำที่เพียงพอเป็นที่ยอมรับเว้นแต่ความท้าทายจะระบุไว้เป็นอย่างอื่น
Luis Mendo

1
ขอบคุณหลุยส์! ฉันใหม่กับผลลัพธ์ "ความจริง" แต่ตอนนี้ใช้ได้เป็นอย่างดี แก้ไขเพื่อแก้ไข ขอบคุณสำหรับการสร้าง esolang ที่สนุกและใช้งานง่าย!
DrQuarius

0

Ruby , 52 ไบต์

->n{r=*1..n;r.product(r).count{|i,j|i**3+j**3==n}>1}

ลองออนไลน์!

เนื่องจากรุ่นนี้สร้างอาร์เรย์ขนาดใหญ่ขนาด n 2จึงล้มเหลวในการทดสอบจริงทั้งหมดที่สูงกว่า1729นี่คือรุ่นที่แก้ไขซึ่งมีขนาดอาร์เรย์ที่เล็กกว่าประมาณ n 2/3ซึ่งตรวจสอบอย่างน้อย 31392 สำเร็จ

ลองออนไลน์! (แก้ไข)


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.