Diberikan daftar bilangan bulat positif, temukan jumlah segitiga yang dapat kita bentuk sedemikian rupa sehingga panjang sisi mereka diwakili oleh tiga entri berbeda dari daftar input.
(Inspirasi berasal dari CR .)
Detail
- Segitiga dapat dibentuk jika semua permutasi dari panjang tiga sisi memenuhi ketimpangan segitiga ketat(Ini berarti , dan harus dimiliki semua.)
- Tiga panjang sisi harus muncul pada posisi yang berbeda dalam daftar, tetapi tidak harus berbeda secara berpasangan.
- Urutan tiga angka dalam daftar input tidak masalah. Jika kita mempertimbangkan daftar
a
dan tiga angkaa[i], a[j], a[k]
(di manai,j,k
berpasangan berbeda), maka(a[i],a[j],a[k]), (a[i],a[k],a[j]), (a[j], a[i], a[k])
dll. Semua dianggap sebagai segitiga yang sama . - Daftar input dapat dianggap mengandung setidaknya 3 entri.
- Anda dapat mengasumsikan bahwa daftar input diurutkan dalam urutan menaik.
Contohnya
Program uji kecil dapat ditemukan di sini di Coba online!
Input, Output:
[1,2,3] 0
[1,1,1] 1
[1,1,1,1] 4
[1,2,3,4] 1
[3,4,5,7] 3
[1,42,69,666,1000000] 0
[12,23,34,45,56,67,78,89] 34
[1,2,3,4,5,6,7,8,9,10] 50
Untuk inputnya [1,2,3,...,n-1,n]
adalah A002623 .
Untuk input [1,1,...,1]
(panjang n
) ini adalah A000292 .
Untuk input n
angka Fibonacci pertama ( A000045 ) ini adalah A000004 .
[1,1,1,1]
memungkinkan 4 segitiga "berbeda", semua[1,1,1]
, dipilih menggunakan tiga dari 1 itu? Tapi, ini bukan 24 karena tiga 1 dipilih tanpa urutan, yaitu subset dari tiga indeks daripada daftar yang dipesan?Jawaban:
R ,
62524034 byteCobalah online!
Solusi Octave Pelabuhan Luis Mendo
Karena
a<=b<=c
, kondisi segitiga sama dengana+b-c>0
. Secaraa+b-c
ringkas ditangkap oleh produk matriks[1,1,-1] * X
, di manaX
adalah 3-kombinasi dari array input.Ada banyak saran untuk perbaikan yang dilakukan oleh 3 orang yang berbeda di komentar:
Robert S. untuk memberi saran
scan
.Robin Ryder untuk menyarankan perbaikan pada ketimpangan segitiga dan yang aneh ini yang membutuhkan input dalam urutan menurun (yang hanya menunjukkan betapa pentingnya format input yang fleksibel).
dan akhirnya Nick Kennedy untuk yang berikut:
R , 40 byte
Cobalah online!
sumber
x[3]<x[1]+x[2]
setara dengan2*x[3]<sum(x)
: 51 byte[
alias itu licin, benar-benar membersihkan pendekatan.Stax ,
87 byteBerkat rekursif untuk -1!
Jalankan dan debug di staxlang.xyz!
Dibongkar (8 byte) dan penjelasan:
Itu trik yang rapi. Jika Anda memiliki urutan instruksi yang akan selalu menghasilkan 0 atau 1 dan Anda perlu menghitung item dari array yang menghasilkan hasil yang benar pada akhir program Anda,
F..+
lebih pendek satu byte dari{..f%
.Mengasumsikan daftar awal diurutkan naik. Tanpa asumsi ini, tempelkan
o
di awal untuk 8 byte.sumber
r3SFE+<+
paket ke 7. Ini menggunakan loop foreach untuk menambahkan hasil filter. Penambahan adalah salah satu operasi yang no-op ketika hanya elemen tunggal yang hadir.Haskell , 49 byte
Cobalah online!
Secara rekursif menghasilkan semua urutan
l
(terbalik), dan memeriksa yang panjang-3 yang membentuk segitiga.50 byte
Cobalah online!
Gagasan yang sama, menghasilkan hasil dengan
mapM
, dengan memetakan setiap nilail
baik untuk dirinya sendiri (termasuk) atau0
(mengecualikan).50 byte
Cobalah online!
Mencoba setiap titik partisi untuk mengambil elemen tengah
b
.51 byte
Cobalah online!
Fungsi
q=scanr(:)[]
menghasilkan daftar sufiks. Banyak masalah timbul karena harus mempertimbangkan memasukkan elemen yang sama beberapa kali.52 byte
Cobalah online!
Fungsi helper
q=scanr(:)[]
menghasilkan daftar sufiks.57 byte
Cobalah online!
sumber
Brachylog , 11 byte
Cobalah online!
Saya mungkin lupa memanfaatkan input yang diurutkan dalam solusi lama saya:
Brachylog ,
181715 byteCobalah online!
sumber
Perl 6 , 35 byte
Cobalah online!
Penjelasan
Ini adalah kode Apapun, yaitu notasi ringkas untuk fungsi lambda (yang hanya berfungsi dalam kasus yang sangat sederhana). Masing
*
- masing adalah penampung untuk satu argumen. Jadi kita ambil daftar panjang (yang muncul di bagian pertama*
), buat semua kombinasi dari 3 elemen (mereka selalu keluar dalam urutan yang sama seperti dalam daftar asli, sehingga itu berarti kombinasi diurutkan juga), ratakan daftar, dan kemudian ambil daftar 3-oleh-3, dan filter (grep
) hanya triplet yang memuaskan*+*>*
, yaitu jumlah dari dua argumen pertama lebih besar dari yang ketiga. Itu memberi semua kembar tiga, dan kami akhirnya menghitungnya dengan memaksa konteks numerik dengan a+
.(Tentu saja kita perlu mengujinya hanya untuk kasus "jumlah dua lebih kecil> yang terbesar". Jika ini berlaku, yang lain berlaku sepele, jika tidak, triplet tidak menunjukkan panjang segitiga yang benar dan kami tidak perlu melihat lebih jauh.)
sumber
Retina , 55 byte
Cobalah online! Tautan termasuk kasus uji, tetapi dengan nilai dalam kasus ke 5 dikurangi untuk memungkinkannya selesai hari ini. Mengasumsikan input diurutkan. Penjelasan: Regex tidak terlalu suka mencocokkan lebih dari satu hal. Regex normal akan dapat menemukan semua nilai yang bisa menjadi kaki terpendek dari segitiga. Pilihan Retina
v
tidak membantu di sini, kecuali untuk menghindari pencarian. Namunw
opsi Retina sedikit lebih membantu, karena akan dapat menemukan kaki terpendek dan terpanjang pada saat yang sama. Itu tidak cukup untuk tantangan ini, karena mungkin ada beberapa kaki tengah.Konversikan input ke unary.
Untuk setiap nomor input ...
... buat garis yang array aslinya dipotong untuk memulai pada angka itu.
$'
biasanya berarti string setelah pertandingan, tetapi<
memodifikasinya berarti string setelah pemisah sebelumnya, menghindari membuang 2 byte$&
. Oleh karena itu setiap baris mewakili semua solusi potensial menggunakan nomor itu sebagai kaki terpendek.Untuk masing-masing garis tersebut, temukan semua kemungkinan kaki tengah dan terpanjang, tetapi pastikan bahwa perbedaannya kurang dari kaki pertama. Keluarkan a
_
untuk setiap kombinasi kaki yang cocok.Hitung jumlah total segitiga yang ditemukan.
sumber
Python 3 , 73 byte
Cobalah online!
sumber
Python 2 , 72 byte
Cobalah online!
73 byte
Cobalah online!
sumber
05AB1E ,
12109 bytePertama kali saya menggunakan 05AB1E! Terima kasih kepada [Grimy] untuk -1!
Cobalah online! atau test suite
Port langsung dari jawaban Stax saya. Dapatkan semua kombinasi dari tiga entri dan hitung yang mungkin membentuk segitiga. Bagian penghitungan itulah yang benar-benar membuat saya. Saya menghabiskan banyak byte di sana. Terikat menjadi kesalahan pemula di sana.
sumber
ì
(membalikkan masing-masing) sebelum filter daripadaŠ
(tiga swap) di dalam filter. Atau, Anda juga bisa menggunakanε...}O
bukanʒ...}g
, tetapi jumlah byte tetap sama. PS: Hitungan byte Anda sebesar 10 dan TIO sudah benar, tetapi jawaban Anda yang sebenarnya masih memiliki eksplisity
yang tidak perlu yang dapat dihapus. :) Tapi jawaban pertama yang bagus, jadi +1 dari saya.3.ÆʒRÆd_}g
, bytecount yang sama.3.Æʒ`α›}g
9.JavaScript (ES6), 63 byte
Cobalah online!
sumber
Oktaf / MATLAB, 33 byte
Cobalah online!
sumber
Zsh , 66 byte
Cobalah online!
Relatif mudah, mengambil keuntungan dari input yang diurutkan, dan kenaikan di
for
header (kenaikan terjadi sekali per loop orangtua ).sumber
Excel VBA,
171164152 byte-26 byte berkat TaylorScott
Input ada dalam rentang
A:A
lembar aktif. Output ke jendela langsung.Karena ini terlihat pada setiap kombinasi setiap sel dalam kolom yang tingginya 2 20 sel (yang hampir 260 kombinasi), kode ini ... tidak cepat. Anda bisa membuatnya lebih cepat tetapi dengan mengorbankan byte.
sumber
()
dalam sub pernyataan, spasi diDebug.? r
dan dapat jatuhNext:Next:Next
keNext k,j,i
. selain dari itu - baik masih melakukan 2 ** 60 kombinasi tetapi berfungsir=r-(a+b>c)*(b+c>a)*(c+a>b)
Arang , 17 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Mengasumsikan input diurutkan. Penjelasan:
sumber
Japt
-x
, 9 byteCobalah
Cobalah
sumber
Bahasa Wolfram (Mathematica) ,
3735 byteCobalah online!
sumber
Ruby , 41 byte
Cobalah online!
sumber
Pyth , 14 byte
Cobalah online!
Alternatif (juga 14 byte):
sumber
Perl 5 (
-p
),5552 bytemenggunakan regex backtracking, -3 bytes berkat @Cows quack menggunakan
^
alih-alih(?!)
gagal dan mundur.atau
TIO
sumber
(?!)
menjadi^
?Jelly , 9 byte
Cobalah online!
Tautan monadik dengan mengambil daftar bilangan bulat yang disortir sebagai argumennya dan mengembalikan jumlah segitiga.
Penjelasan
Alternatif 9s:
sumber
J , 40 byte
Cobalah online!
sumber
Bash , 123 byte
Cobalah online!
Yang menyenangkan.
sumber
SNOBOL4 (CSNOBOL4) , 181 byte
Cobalah online!
0
0
sumber
C (dentang) , 83 byte
Cobalah online!
Disimpan 1 berkat @ceilingcat
sumber