Meskipun tantangan terkait telah diajukan, yang satu ini berbeda untuk menjamin pertanyaannya sendiri.
Tantangan
Diberikan bilangan bulat positif, kembalikan urutan terpanjang dari bilangan bulat ganjil positif berurutan yang jumlahnya adalah bilangan bulat yang diberikan. Jika tidak ada urutan seperti itu, Anda dapat melaporkan kesalahan dengan cara apa pun yang masuk akal untuk bahasa Anda, termasuk mengembalikan nilai palsu atau melemparkan pengecualian.
Uji Kasus
1 -> [1] 2 -> [] 3 -> [3] 4 -> [1, 3] 5 -> [5] 6 -> [] 9 -> [1, 3, 5] (perhatikan bahwa [9] bukan jawaban yang valid) 15 -> [3, 5, 7] 104 -> [23, 25, 27, 29] (perhatikan bahwa [51, 53] bukan jawaban yang valid)
Mencetak gol
Ini adalah kode-golf , jadi jawaban tersingkat di setiap bahasa menang.
Jawaban:
Haskell,
6765636258 byteDisimpan 4 byte berkat Julian Wolf
Cobalah online!
Aku memeriksa apakah nomor tersebut dapat dinyatakan sebagai dia perbedaan dari dua kotak:
m^2-n^2
. Saya kemudian dapat membangun daftar nomor ganjil berturut-turut:[2n+1,2n+3...2m-1]
. Perhatikan bahwa karena minimumn
dipilih, daftar terpanjang akan ditampilkansumber
x
untuk keduanyan
danm
Python 2 ,
6662 byteKeluar dengan RuntimeError (kedalaman rekursi maksimum terlampaui) jika tidak ada solusi.
Cobalah online!
sumber
Jelly ,
1110 byte-1 byte terima kasih kepada Dennis (gunakan pengembangan rentang implisit
Ẇ
- gantiRm2Ẇ
denganẆḤ’
)Tautan monadik yang mengembalikan daftar puncak jika mungkin, atau
0
jika tidak.Cobalah online!
Bagaimana?
sumber
ẆḤ’
menghemat satu byte.JavaScript (ES7),
87868581 byteMengembalikan daftar bilangan bulat yang dipisah koma, atau
0
jika tidak ada solusi.Bagaimana?
Kami melihat pertama untuk sempurna persegi terkecil s sehingga x = n + s persegi lain sempurna.
Jika s ada, n adalah selisih x - s dari 2 kuadrat sempurna, yang dapat ditulis sebagai selisih 2 urutan bilangan ganjil berturut-turut. Kami kemudian membangun daftar yang dihasilkan.
Contoh:
Untuk n = 104 :
Kami menemukan s = 11² = 121 yang memenuhi x = n + s = 225 = 15²
Kemudian:
15² = 1 + 3 + 5 + 7 + 9 + 11 + 13 + 15 + 17 + 19 + 21 + 23 + 25 + 27
11² = 1 + 3 + 5 + 7 + 9 + 11 + 13 + 15 + 17 + 19 + 21
104 = 15² - 11² = 23 + 25 + 27 + 29
Tampilkan cuplikan kode
sumber
n^2
itu selalu sama dengan jumlahn
angka ganjil pertama ? Huh, menarik05AB1E ,
98 byte-1 byte terima kasih kepada Emigna
Penjelasan:
Pada input yang tidak valid, tidak menghasilkan apa-apa.
Cobalah online!
sumber
ʒOQ}
bukannyaDO¹QÏ
menyimpan byte.Haskell ,
6160 byteTerima kasih kepada @maple_shaft untuk mencukur 1 byte
Cobalah online!
Menggunakan fakta bahwa proses terpanjang akan selalu menjadi proses yang dimulai dengan angka terendah.
Saya ingin melakukan sesuatu dengan aritmatika sebagai pengganti kekerasan
k
, tetapifromInteger
tampaknya membunuhnya.sumber
[1,3..n]
ke[1,3..]
r?n=[r,r+2..n]
. Cobalah online!Python , 67 byte
Cobalah online!
Saya menyalin jawaban saya dari tantangan jumlah berturut-turut sebelumnya dan mengubah
+1
ke+2
. Siapa yang tahu bahwa kode golf bisa sangat modular?Strategi aneh langsung: mencari interval
R
dengan jumlah yang diinginkan.R
.Karena ujung bawah interval hanya meningkat, interval yang lebih lama ditemukan sebelum yang lebih pendek. Jika tidak ada interval yang mungkin dapat ditemukan, akhiri dengan IndexError.
sumber
JavaScript (ES6),
6564 byteMengembalikan array jika ada solusi, atau 0 tanpa solusi.
Ini adalah solusi yang sangat tidak efisien namun golf untuk masalah ini.
Ini mencari solusi pertama menggunakan
a-i
dani=1
, bahkan jika itu tidak berhasil menumpuk stack rekursif. Jika solusi itu tidak dimulai dengani+2
, maka kami secara rekursif mencari solusi pertama menggunakana
dani+2
.Tidak disatukan
Kasus uji:
Tampilkan cuplikan kode
Untuk gagasan tentang betapa tidak efisiennya ini, solusi untuk
f(104)
meminta 69.535 panggilan rekursif. Tumpukan tidak pernah lebih dari 51 level, jadi tidak ada masalah dengan stack overflow.Solusi untuk
f(200)
membutuhkan 8,6 juta panggilan rekursif, dengan kedalaman 99 level. (Solusinya adalah[11,13,15,17,19,21,23,25,27,29]
.)Berikut ini adalah representasi visual dari program yang sedang berjalan:
Tampilkan cuplikan kode
sumber
Python 2.7,
10910897 byte11 byte ke bawah, Terima kasih kepada Erik the Outgolfer.
Ini golf kode pertamaku!
Bagaimana itu bekerja
Saya menggunakan identitas yang terkenal itu
1 + 3 + 5 + ... + (2n - 1) = n²
Ambil kasusnya
15
Secara umum, jika ada x istilah mulai dari
2n + 1
, sukaItu sama dengan
2nx + x²
Jika
N
bilangan bulat input, masalahnya berkurang hingga menemukan maksimumx
sehinggaIni adalah persamaan kuadratik dengan solusi
Urutan terpanjang adalah urutan yang terbesar
x
. Program iteratesn
dari0
keN
dan ketika menemukan itux
adalah bilangan bulat, itu membuat daftar(2n + 1) + (2n + 3) + (2n + 5) ... (2n + (2x-1))
dan mengembalikannya.sumber
Python 3,
19081 BytesTerima kasih kepada @ovs dan @ musicman523
sumber
print
tanda kurung hilangl.append(i)
dengan hanya menggunakanl+[i]
dalam panggilan rekursif. Anda dapat menghapusl.pop(0)
dengan menggunakanl[1:]
dalam panggilan rekursif. Anda dapat menghapus panggilan kec
bagian paling bawah dengan menggunakan argumen kata kunci. Anda dapat menghapus>0
pada baris 2. Akhirnya, Anda dapat mengubahif
danelse
pernyataan Anda menjadi ekspresi, menggunakan formulir ternary, yang membuat Anda turun ke 92 byte sebagai ekspresi lambda. Cobalah online!i
hingga total 81 byte .sum(l)>q else
untukq<sum(l)else
menyimpan 1 byte.QBIC , 47 byte
Ini mencoba menghitung semua angka ganjil dari satu sampai jumlahnya
n
. Jika berhasiln
, setel ulang loop, naikkan 1 ke 3 dan coba lagi. Berhenti, cetak 0, jika pada awal perulangan nomor kita> n
.Penjelasan
sumber
R , 90 byte
Cobalah online!
Menggunakan fungsi rekursif yang menguji jumlah kumulatif urutan y: x yang dikonversi ke urutan bilangan ganjil. y bertambah pada setiap rekursi hingga melebihi x. Urutan pertama yang menjumlahkan target akan dikembalikan.
sumber
Python 2 , 89 byte
Fungsi tanpa nama mengambil bilangan bulat positif
n
,, dan mengembalikan hasilnya jika ada dan menaikkan yangIndexError
sebaliknya.Cobalah online!
Membuat daftar semua angka ganjil yang relevan dengan
r(1,n+1,2)
iturange(start=1, stop=n+1, step=2)
; membuat semua sub-irisan yang relevan (ditambah beberapa yang kosong) dengan mengirisnya darii
inklusif menjadij
eksklusif dengan[i:j]
dii
dalam [0, n) menggunakanr(n)
danj
dalam [0, n] menggunakanr(n+1)
(yang kosong ketikai>=j
atau dii
luar batas); filter untuk mereka dengan jumlah yang benar denganif sum(v)==n
; mengembalikan irisan pertama (dan karenanya terpanjang) menggunakan[0]
.sumber
Python 2 ,
9190 byte-1 byte terima kasih kepada @CMcAvoy
Cobalah online!
sumber
Pyth, 11 byte
Coba di sini.
sumber
PHP , 73 byte
tidak ada solusi yang merupakan infinite loop
Cobalah online!
PHP , 83 byte
tidak mencetak apapun tanpa solusi
setiap input mod 4 == 2 tidak memiliki solusi
Cobalah online!
sumber
Python 2 ,
122121119115 byte-1 byte terima kasih kepada musicman523. -4 byte berkat Langkah Hen. ha ha
Cobalah online!
sumber
range
, Coba online!Python 3 , 93 byte
Cobalah online!
Satu-satunya hal khusus yang saya lakukan adalah mencatat bahwa
(s+e)*(2+e-s)==4*n
itu setara dengansum(range(s,e+1,2))==n
, dan meskipun ukurannya sama ketikar=range
, yang pertama dapat ditempatkan lebih dekat denganif
pernyataan.sumber
Python 3 , 185 byte
Cobalah online!
Adapun cara kerjanya, saya mencoba mencari solusi yang sedikit lebih elegan daripada pencarian brute force sederhana. Saya mengatur ulang rumus untuk jumlah urutan aritmatika dan menerapkan rumus kuadratik untuk mendapatkan ekspresi
(1-a+((a-1)**2+4*s)**(.5))/2
, yang muncul dalam kode. Apa ekspresi menghitung, diberikan jumlah yang diinginkans
dan istilah pertama untuk urutan aritmatikaa
, panjang urutan. Panjang ini disimpan dalam kamus sebagai nilai untuk istilah pertama sebagai kunci.Selanjutnya, semua nilai non-integer dihapus dari kamus, karena itu mewakili urutan yang tidak valid. Dari sana, nilai terbesar diidentifikasi dengan
max(d.keys(), key=(lambda k: d[k]))
dan urutan bilangan ganjil pada posisi itu dan pada panjang itu dibuat denganlist(range(int(m),int(m+2*d[m]),2))
.Saya mencari bantuan untuk bermain golf jika Anda melihat sesuatu. Saya lebih tertarik melihat seberapa baik yang bisa saya lakukan dengan algoritma non-sepele; jawaban saya hampir dua kali lipat dari solusi Python terbaik.
sumber
Mathematica, 56 byte
Function
dengan argumen pertama#
.Table[n,{n,1,#,2}]
menghitung daftar angka ganjil positif kurang dari atau sama dengan#
.Subsequences
mengembalikan semua urutan daftar yang dipesan dengan menambah panjang. Kami kemudian mengambil pasanganCases
yang cocokx_/;Tr@x==#
, yaitu urutanx
sedemikian sehingga jumlah merekaTr@x
sama dengan input#
. Kami kemudian mengambilLast
urutan seperti itu.sumber
JavaScript (ES6), 72 byte
Mengembalikan string angka ganjil yang dipisah-ruang atau melempar pada input yang tidak valid. Versi 84 byte yang mengembalikan array (kosong saat yang sesuai):
Penjelasan: Secara longgar didasarkan pada solusi awk @ Cabbie407 untuk Sums of Consecutive Integers kecuali saya dapat menyimpan beberapa byte dengan menggunakan rekursi.
sumber
PHP, 78 byte
infinite loop jika tidak ada solusi. masukkan
?$b>$argn+2?$n=[]:1:0
setelahnya$s-$argn
untuk mencetak array kosong saja.Jalankan dengan
-nR
atau coba online .sumber
C # (.NET Core) , 129 byte
Menghasilkan angka dalam string, dibatasi ruang (karakter lain apa pun hanya perlu mengubah
" "
). Input tanpa solusi mengembalikan string kosong (meskipun jika berjalan selamanya tanpa kesalahan adalah cara yang valid untuk menunjukkan tidak ada solusi, maka 17 byte dapat disimpan dengan menghapusif(b==e)return"";
).Algoritma adalah:
sumber
(i)=>
sebagaii=>
C ++, 157 -> 147 Bytes
-10 Bytes berkat DJMcMayhem
akan mengembalikan 0 jika tidak ada jawaban, 1 sebaliknya
baris terakhir yang dicetak adalah jawabannya
ungolfed:
ini adalah kode golf pertama saya ^^
sumber
int v=0;
alih - alihint v;....v=0;
dan jika Anda membuat output Newline Anda dibatasi, Anda dapat melakukanstd::cout<<k<<"\n";
dan kemudian menghapus Newline kedua sekaligusKotlin, 152 byte
Cobalah online (Tunggu 4-5 detik, kompiler lambat)
Tidak disatukan
sumber
Excel VBA, 139 Bytes
Sub
rutin yang mengambil inputn
dari integer tipe yang diharapkan dan melaporkan urutan terpanjang dari angka ganjil berturut-turut ke sel[A1]
sumber