Menjaga tantangan ini singkat.
Anda diberi 4 angka: p1, p2, p3 dan p4.
Jumlah ajaib dari angka didefinisikan sebagai berikut:
magic_sum = |p1 - p2| + |p2 - p3| + |p3 - p4| + |p4 - p1|
Anda hanya diperbolehkan mengubah salah satu dari nilai integer di atas (p1, p2, p3 atau p4). Anda perlu mengubah nilai sedemikian rupa sehingga jumlah ajaib nilai mencapai nilai minimumnya.
Sebagai contoh:
p1, p2, p3, p4 = 17, -6, 15, 33. Nilai dari jumlah ajaib adalah 78 dalam kasus ini.
Anda dapat mengubah -6 di sini menjadi 16, dan nilai jumlah ajaib akan menjadi 36, yang merupakan nilai minimum yang dapat dicapai.
Ingatlah bahwa angka dapat berupa bilangan bulat positif atau negatif.
Ini adalah kode-golf, jadi paling tidak byte dalam kode menang. Brownie menunjuk untuk menggunakan Bahasa Praktis daripada bahasa Rekreasi. Semoga tanggal 4 bersamamu.
Untuk mengulangi:
Contoh 1
Input 1
17 -6 15 33
Keluaran 1
36
Penjelasan 1
-6 dapat diganti dengan 16 dan itu memberi kita jumlah magic minimum yang bisa dicapai.
Contoh 2
Input 2
10 10 10 10
Keluaran 2
0 or 2
keduanya bisa diterima
Penjelasan 2
Jumlah magic minimum yang dapat dicapai adalah 0 karena jumlah minimum dari 4 bilangan bulat positif adalah 0. Jika angka harus diubah, maka salah satu dari 10 dapat diubah menjadi 9 dan dengan demikian menghasilkan output 2.
Contoh 3
Input 3
1 2 3 4
Keluaran 3
4
Penjelasan 3
Input dengan sendirinya menghasilkan 6 sebagai jumlah ajaibnya. Mengubah 4 ke 1 dan jumlah magic minimum tercapai, yaitu 4.
sumber
+1
dari saya.Jawaban:
Jelly , 6 byte
Cobalah online!
Port jawaban Python saya .
sumber
Python 2 , 44 byte
Cobalah online!
Mengurutkan input seperti
a,b,c,d,
dalam urutan menaik, mengambil yang lebih kecil daric-a
dand-b
, dan menggandakannya. Mengapa ini bekerja?Pertama, perhatikan bahwa ketika kita mengubah elemen untuk memaksimalkan ke jumlah total siklus siklik, itu optimal (atau terikat untuk optimal) untuk mengubahnya menjadi sama dengan tetangga, seperti
17, -6, 15, 33 -> 17, 17, 15, 33
. Itu karena jarak total barunya ke tetangga siklik kiri dan kanannya setidaknya jarak antara tetangga-tetangga itu, jadi menjadikan ini sama adalah yang terbaik yang bisa kita lakukan.Sekarang, menghapus satu dari dua salinan nomor yang berdekatan memberikan jumlah siklus yang sama. Dalam contoh ini
17, 15, 33
, memberi jarak2 + 18 + 16
. Jadi alih-alih mengganti salah satu dari empat angka, itu sama saja dengan menghapusnya menyisakan tiga angka, dan menggunakan jumlah jarak siklik mereka.Perhatikan bahwa dengan 3 angka, jarak terbesar adalah jumlah dari dua angka yang lebih kecil. Ini karena jika kita mengurutkan angka untuk dimiliki
a ≤ b ≤ c
, maka|a - c| = |a - b| + |b - c|
. Dengan kata lain, kami melakukan perjalanan antara nomor terbesar dan terkecil dua kali, menggunakan nomor sedang sebagai pit stop satu kali. Jadi, jumlah dari ketiga jarak itu hanya dua kali jarak antara minimum dan maksimum, jadi(c-a)*2
.Jadi, pertanyaannya adalah nomor mana yang kita hapus untuk mendapatkan jarak terkecil antara minimum dan maksimum dari tiga angka yang tersisa. Jelas kami menghapus angka yang terkecil atau terbesar. Menyebut mereka
a, b, c, d
dalam urutan, menghapusa
daund - b
, dan menghapusd
daunc - a
, dan hasil akhirnya adalah dua kali lipat mana yang lebih kecil.sumber
p1
melaluip5
, dan masih hanya diperbolehkan mengubah satu nomor? Kasing empat angka sepertinya terlalu mudah (hanya setelah melihat jawaban Anda).R ,
6633 byteCobalah online!
Jauh lebih pendek dengan algoritme xnor (baca penjelasan mereka dan tingkatkan posnya!).
Versi lama:
R , 66 byte
Cobalah online!
Mengambil input sebagai vektor 4 bilangan bulat.
Ada 4 cara memilih nomor mana yang kita ubah; untuk masing-masing ini, kita hanya perlu menghitung jumlah dari 3 perbedaan absolut.
rbind
sumber
Jelly ,
1110 byteCobalah online!
Tautan monadik yang mengambil daftar jika bilangan bulat sebagai input. Harus bekerja untuk ukuran daftar yang berubah-ubah. Bekerja atas dasar bahwa jumlah minimum dapat diperoleh dengan menguji menghapus setiap nomor dari daftar, menghitung jumlah ajaib dan mengambil jumlah minimum.
sumber
Jelly , 8 byte
Tautan monadik yang menerima daftar bilangan bulat * yang menghasilkan bilangan bulat
* dapat berupa angka apa saja asalkan ada lebih dari 1; menggunakan formula sihir gaya yang sama menjumlahkan perbedaan tetangga membungkus.
Cobalah online!
Bagaimana?
sumber
Japt
-Q
, 11 byteMenggunakan algoritma xnor, yang menyelamatkan saya 4 byte.
Disimpan 5 byte berkat @Shaggy
Cobalah
sumber
ÃÃ
dengan baris baru.J ,
24201817 byteversi alternatif menggunakan algoritma xnor:
bagaimana
Dua kali
2 *
min dari[:<./
baris kedua dikurangi dari baris pertama[:-/
matriks 2x2 yang dibentuk dengan membentuk2 2$
input yang diurutkan ke bawah\:~
Cobalah online!
jawaban asli: J , 24 byte
Cobalah online!
Menggunakan ide Nick Kennedy.
1(...)\.]
menerapkan kata kerja dalam parens ke semua outfixes dari panjang 1 (outfix of length n adalah daftar dengan n elemen yang berdekatan dihapus, jadi ini menghasilkan setiap daftar yang mungkin dengan 1 elm dihapus)(1 #. 2 |@-/\ ] , {.)
ini menghitung jumlah ajaib dengan menambahkan elm pertama ke input] , {.
dan menerapkan perbedaan abs|@-/
ke infiks panjang 22 ...\
, dan menjumlahkan hasilnya1 #.
.[:<./
mengembalikan minsumber
05AB1E ,
117 bytePort of @xnor jawaban Jelly .
-4 byte terima kasih kepada @Emigna dan @Grimy .
Cobalah online.
Alternatif 7 byte yang hanya berfungsi di versi lawas 05AB1E (akan memerlukan
€
sebelum¥
versi baru):Cobalah online.
Penjelasan:
sumber
{2ôø¥W·
atau 8 dengan€
dalam penulisan ulang.{2ô`αW·
C ++ (gcc)
program lengkap: 138 byte
Cobalah online!
fungsi inti: 84 byte
Cobalah online!
Juga menggunakan algoritma xnor yang dijelaskan dalam postingan Python 2-nya.
sumber
Arang , 20 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Ternyata saya menggunakan ide @ NickKennedy. Penjelasan:
sumber
JavaScript (ES6), 51 byte
Menggunakan metode xnor yang jauh lebih pintar :
Cobalah online!
Jawaban asli, 96 byte
Mengambil input sebagai array dari 4 bilangan bulat.
Mungkinbukan pendekatan yang terpendek.Cobalah online!
sumber
Bahasa Wolfram (Mathematica) , 29 byte
Port algoritma @ xnor
Cobalah online!
sumber
Java 8 , 235 byte
Port jawaban dan algoritma Python @ xnor
Cobalah online!
Java 10 , tidak terbukti, 222 byte
Dengan Java 10, saya harus dapat mengganti sisi kiri deklarasi Pemindai dengan
var
, meskipun saya tidak dapat mengompilasinya secara online dan karenanya saya hanya dapat menambahkannya sebagai hal yang sepele. Maaf.sumber