Gaya gravitasi adalah gaya yang menarik dua benda dengan massa. Dalam tantangan ini objek kita akan menjadi Bilangan dan massa mereka akan menjadi nilainya. Untuk melakukannya, kita tidak peduli tentang kekuatan gaya tetapi arahnya.
Bayangkan serangkaian angka ini
[1 6 9 4 6 9 7 6 4 4 9 8 7]
Masing-masing dari mereka menciptakan kekuatan antara dirinya dan angka-angka yang berdekatan. Dalam beberapa kondisi, ini akan menyebabkan nomor lain tertarik (dipindahkan) ke suatu nomor. Ketika jumlahnya lebih besar dari yang berdekatan, itu menariknya. Mari kita lihat contoh kita sebelumnya:
[1 → 6 → 9 ← 4 6 → 9 ← 7 ← 6 ← 4 4 → 9 ← 8 ← 7]
Jumlahnya 1
tidak cukup besar untuk bergerak 6
, tetapi jumlahnya 6
, dll ... Pada dasarnya, nomor dipindahkan ke nomor terdekat terbesar (juga lebih besar dari angka itu sendiri). Jika kedua angka yang berdekatan sama maka tidak tertarik. Ini juga terjadi ketika jumlah dan berdekatannya sama.
Ini hanya untuk menunjukkan daya tarik, tetapi apa yang terjadi setelahnya? Jumlah yang bertabrakan karena tarik-menarik dirangkum:
[20 32 28]
Jadi pada dasarnya tantangannya adalah, Mengingat satu set angka, output hasil dari set angka yang menarik.
Contoh 1
Input => [10 15 20 10 20 10 10]
[10 → 15 → 20 10 20 ← 10 10]
Output => [45 10 30 10]
Contoh 2
Input => [9 9 9 9 8 1 8]
[9 9 9 9 ← 8 1 8]
Output => [9 9 9 17 1 8]
Contoh 3
Input => [1 6 9 4 6 9 7 6 4 4 9 8 7]
[1 → 6 → 9 ← 4 6 → 9 ← 7 ← 6 ← 4 4 → 9 ← 8 ← 7]
Output => [20 32 28]
Contoh 4
Input => [1 2 3 2 1]
[1 → 2 → 3 ← 2 ← 1]
Output => [9]
Contoh 5
Input => [1]
Output => [1]
Contoh 6
Input => [1 1]
Output => [1 1]
Contoh 7
Input => [2 1 4]
Output => [2 5]
Catatan
- Ketertarikan hanya terjadi sekali
- Angka tidak tertarik ke Angka yang tidak berdekatan
- Himpunan angka hanya akan berisi bilangan bulat positif
[1 3 5 4 2]
= 15?G*M*m / r^2
sama untuk kedua benda. Yang lebih ringan bergerak lebih dari yang lebih berat karena momentum, bukan karena kurangnya daya tarik. Mungkin mengatakan "1 tidak cukup besar untuk bergerak 6".Jawaban:
JavaScript (ES6),
106 104100 byteDisimpan 2 byte berkat @Shaggy
Cobalah online!
Berkomentar
Kami pertama-tama memperbarui array input asli0
a[]
dengan mengulanginya pada salinannya. Selama langkah ini, semua nilai 'tertarik' oleh yang lain diatur ke .Karena array diuraikan dari kiri ke kanan, kita bisa menambahkan ke setiap kali nilai tertarik oleh tetangga kanannya.Sebuahsaya Sebuahi + 1
Contoh: diubah menjadi dan kemudian .4 → 5 → 6 [ 0 , 9 , 6 ] [ 0 , 0 , 15 ]
Tetapi ketika beberapa nilai berturut-turut tertarik oleh tetangga kiri mereka, kita perlu menambahkan ke penarik pertama dari urutan ini (dengan ) daripada hanya .ai ak k<i ai−1
sumber
[1,3,5,3,1,2,1]
dan keluaran[14,2]
, tetapi sebenarnya berfungsi dengan benar dan keluaran[13,3]
.Stax ,
27252318 byteJalankan dan debug itu
Output dipisahkan oleh baris baru.
Program ini beroperasi pada pasangan yang berdekatan dalam array, dan menentukan apakah harus ada pemisahan di antara mereka menggunakan prosedur ini.
Pertimbangkan beberapa input sewenang-wenang
[... w x y z ...]
. Berikut adalah cara menentukan apakah harus ada pemisahan antarax
dany
.x == y
ya.x > y
, maka iffz >= x
.y > x
, maka iffw >= y
.Penjumlahan dibiarkan sebagai latihan.
sumber
Retina 0.8.2 , 64 byte
Cobalah online! Tautan termasuk test suite. Penjelasan:
Konversikan ke unary.
Hapus pemisah antara nomor yang ditarik.
(?<=(1+))
mengatur\1
ke nomor sebelum pemisah. Setelah pemisah, maka ada dua kasus:Dalam kasus ini ada ketertarikan antara dua angka dan menghapus pemisah menyebabkan angka bertabrakan, menambahkannya bersama-sama.
Konversikan ke desimal.
sumber
Jelly , 23 byte
Cobalah online!
Tautan monadik yang menggunakan daftar bilangan bulat sebagai argumennya dan mengembalikan daftar bilangan bulat.
Penjelasan
Beberapa inspirasi diambil dari jawaban Stax @ recursive .
sumber
C (gcc) , 111 byte
Cobalah online!
Mengambil array bilangan nol yang diakhiri.
Penjelasan
sumber
Python 2 , 162 byte
Cobalah online!
sumber
J , 45 byte
Cobalah online!
Terinspirasi oleh jawaban Stax asli rekursif
sumber
R ,
222196173 byteIni adalah solusi dengan bantuan dari Robin Ryder
Cobalah online!
Satu set komentar pendek
sumber
sign(e)
bukannya(e>0)-(e<0)
{}
di dalam for loop tidak perlu karena hanya ada satu instruksi di loop.y
.m
adalah booleanPython,
114112 byteIni menggunakan fakta bahwa arah panah sebenarnya tidak penting, dan bahwa keberadaan panah antara [i] dan [i + 1] dapat ditentukan dengan melihat kisaran empat elemen a [i- 1: i + 3].
Sunting: Terima kasih kepada Jo King untuk klarifikasi aturan
sumber
Perl 5 ,
156147 byteCobalah online!
sumber
K (ngn / k) , 46 byte
Cobalah online!
0,x,0
mengelilingi argumen dengan 0s3'
kembar tiga item berturut-turut{
}'
untuk setiap lakukanx 2 0
dapatkan yang terakhir dan pertama dari triplet saat ini -x[2]
danx[0]
. mereka adalah tetanggax[1]
, tempat si kembar tiga berpusatx<\:
bandingkan dengan menggunakan kurang dari masing-masing triplet saat ini+/
jumlah. hasilnya adalah pasangan yang sesuai denganx[2]
danx[0]
2=
periksa apakah tetangga lebih besar dari 2 elemen lainnyax
, kembalikan sepasang boolean 0-atau-1-/
kurangi mereka. hasil -1 berartix[1]
tertarik ke kiri, 1 ke kanan, dan 0 berarti tetap di tempatnya(!#x)+
tambahkan 0 ke item pertama, 1 ke item kedua, dll. ini menghitung indeks ke arah mana item tertarik{x x}/
indeks dengan sendirinya sampai konvergensi. hasilnya adalah indeks efektif di mana setiap item akhirnya tertarikx@.=
kelompokx
(argumen asli) oleh mereka. hasilnya adalah daftar daftar+/'
jumlah masing-masingsumber
Clojure ,
299252 byteCobalah online!
Penjelasan:
sumber
APL (Dyalog Classic) ,
5251 byteCobalah online!
terjemahan jawaban k saya
sumber
05AB1E , 21 byte
Cobalah online!
sumber