Apakah saya seorang taksi sekunder?


13

Latar Belakang

Nomor Ramanujan, 1729, disebut sebagai nomor taksi karena kisah Hardy yang menaiki taksi untuk mengunjungi Ramanujan di rumah sakit dengan nomor ini, yang tampaknya hambar baginya.

Sejak itu dikenal sebagai yang paling terkenal dari kelas bilangan bulat yang dikenal sebagai "bilangan taksi" yang dapat diekspresikan sebagai jumlah dari dua kekuatan n (dari bilangan bulat positif) dalam dua (atau kadang-kadang 'k') cara yang berbeda.

1729 adalah bilangan alami terkecil yang dapat diekspresikan sebagai jumlah 2 kubus dengan 2 cara berbeda, menjadikannya nomor taksi "3,2" pertama ("n, k" adalah umum).

Tantangan

Diberi nomor, tentukan apakah nomor itu adalah "3,2" 'nomor taksi sekunder' - artinya nomor tersebut memenuhi batasan yang sama dengan 1729 (2 jumlah kubus unik), tetapi tidak harus menjadi bilangan bulat terkecil dari "3 , Kelas 2 "(tentu saja tahun 1729).

Contoh kasus:

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

Serta 20683, 32832, 39312 ...

Mencetak gol

Ini adalah , jadi jawaban tersingkat di setiap bahasa menang.

Kode Matlab kasar untuk menemukan kasus lain dengan kekerasan:

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

Selamat datang di PPCG! Saya mengedit pertanyaan Anda sedikit agar lebih jelas. Apakah Anda bersedia menambahkan beberapa test case?
musicman523

Yap, saya berjuang karena saya sedang bekerja dan tidak memiliki Matlab, tetapi berhasil membuat Octave online untuk bekerja dan menemukan 4104 = 16 ^ 3 + 4 ^ 3 = 15 ^ 3 + 9 ^ 3
DrQuarius


1
Apakah harus ada dua cara untuk menulis nomor, atau setidaknya dua?
John Dvorak

2
seseorang harus menulis jawaban di Taxi bigzaphod.github.io/Taxi
SaggingRufus

Jawaban:


4

05AB1E , 9 byte

Kode (sangat lambat)

L3mãOQO3›


Kode (lebih cepat), 12 byte

tL3mDδ+˜QO3›

Menggunakan penyandian 05AB1E . Cobalah online!

Penjelasan

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
Tentunya Anda bisa menyimpan byte dengan menghapus root kuadrat. Ini adalah kode-golf, bukan kode tercepat.
berhamburan

@Christian Saya telah menambahkan versi kode yang lambat.
Adnan

6

Jelly , 9 byte

Penghargaan untuk Erik the Outgolfer.

Œċ*3S€ċ>1

Cobalah online!

Ini terlalu lambat sehingga tidak akan berfungsi untuk 1729online.

Jauh lebih cepat, 12 byte

Penghargaan untuk Dennis.

R*3fRŒċS€ċ>1

Cobalah online!


Saya baru saja menguji ini dengan "4104" dan itu berlalu. :) Belum menemukan yang lebih dari ini, tapi itu cepat kilat!
DrQuarius

Ðf⁸bisa menjadi fR. Yang kedua bisa dihapus.
Dennis

Second kedua memang bisa dihapus, tetapi swap fR menyebabkan kegagalan.
DrQuarius

Ngomong-ngomong, ini adalah kode-golf sehingga kami tidak peduli dengan kecepatan;) tetapi Anda masih dapat memasukkan versi cepat di tautan TIO.
Kritixi Lithos

1
Anda tidak perlu peduli dengan kecepatan, lakukan saja Œċ*3S€ċ>1.
Erik the Outgolfer

5

Mathematica, 35 byte

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

Fungsi murni mengambil bilangan bulat positif dan mengembalikan Trueatau False.

#^3+#2^3&~Array~{#,#}mentabulasikan semua jumlah kubus dua bilangan bulat antara 1 dan input. (Ini akan jauh lebih cepat dengan ikatan masuk akal pada bilangan bulat yang akan dipotong dadu, seperti akar kubus dari input; tetapi itu akan membutuhkan byte yang berharga. Karena, kode membutuhkan sekitar 30 detik pada input 13832dan skala setidaknya secara kuadratik dalam input.) Count[...,#,2]menghitung berapa kali input muncul dalam daftar ini di level-sarang 2; jika angka ini lebih besar dari 2, maka inputnya adalah angka semi-taksi (lebih dari 2, daripada lebih besar dari 1, karena a ^ 3 + b ^ 3 dan b ^ 3 + a ^ 3 dihitung secara terpisah).


3

Mathematica, 38 37 byte

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

-1 byte terima kasih kepada @GregMartin

Seperti biasa, ada Mathematica yang dibangun untuk semuanya.


1
Dengan asumsi bahwa OP tidak apa-apa dengan lebih dari 2 representasi, maka saya yakin Tr[1^...]berfungsi sebagai pengganti Length@.
Greg Martin

2

JavaScript (ES7), 63 byte

Fungsi rekursif yang relatif cepat yang akhirnya mengembalikan boolean.

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

Demo


2

Mathematica, 48 byte

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

memasukkan

[4104]

keluaran

Benar


Perhatikan bahwa #!=1729&&tidak perlu lagi sekarang karena spesifikasi telah diklarifikasi.
Greg Martin

Bisakah Anda menggunakan Solvebukan Reduce?
Ian Miller

tentu saja ... 1 byte adalah 1 byte!
J42161217

Dapat menyimpan satu byte lagi dengan Length@Solve[x^3+y^3-#==0<x<y,{x,y},Integers]>1&yang menggantikan &&dengan -dan sedikit menata ulang.
Ian Miller


1

MATL ( 16 15 byte) ( 13 12 idealnya)

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

Cobalah online!

Penjelasan:

Berdasarkan solusi Jelly dari 'Leaky Nun', baru saja dikonversi ke MATL, mungkin berlebihan di beberapa bagian dan dapat ditingkatkan:

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

Catatan: output falsy termasuk 0 dan -1, sedangkan output yang sebenarnya adalah 1. Terima kasih kepada Luis Mendo karena telah menyimpan byte tambahan di sini menggantikan "s1>" dengan "sq".

Idealnya ( 13 12 byte):

:3^2XN!sG=sq

... sudah cukup, tetapi untuk jumlah yang lebih besar ini macet di halaman tio.run.


Asli: MATL (19 byte) ================= XH.34 ^: 3 ^ 2XN! SH = s1>
DrQuarius

1
Jika ada output yang benar valid, Anda dapat menggantinya 1>dengan q. Juga, Anda memiliki Hbukan Gdalam penjelasannya. Fakta bahwa program macet untuk jumlah besar biasanya tidak relevan untuk penilaian. Jika berhasil, cukup waktu dan memori yang dapat diterima, kecuali tantangannya menentukan sebaliknya
Luis Mendo

1
Terima kasih Luis! Saya baru untuk output "benar", tetapi ini berfungsi dengan baik sekarang. Diedit untuk diubah. Juga, terima kasih telah membuat esolang yang menyenangkan dan mudah digunakan!
DrQuarius

0

Ruby , 52 byte

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

Cobalah online!

Karena versi ini menciptakan array berukuran n 2 besar, gagal pada semua testcas benar lebih tinggi dari 1729, di sini adalah versi yang dimodifikasi yang memiliki ukuran array yang lebih kecil sekitar n 2/3 , yang berhasil memeriksa setidaknya hingga 31392.

Cobalah online! (diubah)


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.