Tulis fungsi yang mengambil daftar bilangan bulat positif dan mengembalikan daftar bilangan bulat yang mendekati persentase total untuk bilangan bulat yang sesuai di posisi yang sama.
Semua bilangan bulat dalam daftar kembali harus benar-benar menambahkan hingga 100. Anda dapat mengasumsikan jumlah bilangan bulat yang dilewatkan lebih besar dari 0. Bagaimana Anda ingin membulatkan atau memotong desimal terserah Anda selama setiap bilangan bulat tunggal yang dihasilkan dikembalikan sebagai persentase dimatikan oleh tidak lebih dari 1 di kedua arah.
p([1,0,2]) -> [33,0,67] or [34,0,66]
p([1000,1000]) -> [50,50]
p([1,1,2,4]) -> [12,12,25,51] or [13,12,25,50] or [12,13,25,50] or [12,12,26,50]
p([0,0,0,5,0]) -> [0,0,0,100,0]
Ini adalah kode-golf , jadi kode terpendek dalam byte menang!
code-golf
array-manipulation
DaveAlger
sumber
sumber
p([2,2,2,2,2,3])
. Ini memiliki banyak kemungkinan jawaban hukum, tetapi tidak semua2
dapat dipetakan dengan nilai yang sama. Ini menghilangkan banyak algoritma yang terlalu sederhana yang bekerja pada semua kasus pengujian sebelumnya karena pembulatan tidak terlalu buruk.p([1000,1000]) -> [49,51]
?Jawaban:
Dyalog APL,
211916 byteDi atas adalah setara kereta
Cobalah online.
Bagaimana itu bekerja
sumber
TI-BASIC,
262316 byteUntuk kalkulator TI-83 + / 84 + series.
Terima kasih kepada @Dennis untuk algoritme yang indah! Kami mengambil jumlah kumulatif daftar setelah mengonversi ke persen, lalu naik, menempelkan 0 ke depan, dan mengambil perbedaan.
ᴇ2
lebih pendek satu byte dari100
.Pada hitungan byte yang sama adalah:
Fakta menyenangkan:
%
adalah token dua byte yang mengalikan angka dengan 0,01 — tetapi tidak ada cara untuk memasukkannya ke dalam kalkulator! Anda perlu mengedit sumber di luar atau menggunakan program perakitan.Kode lama:
Baris pertama menghitung semua persen lantai, lalu baris kedua menambahkan 1 ke
N
elemen pertama , di manaN
persentase tersisa.cumSum(
singkatan dari "jumlah kumulatif".Contoh dengan
{1,1,2,4}
:Kami tidak akan memilikinya
N>dim([list]
, karena tidak ada persentase yang berkurang lebih dari 1 di lantai.sumber
int(
,sum(
,Ans
, dll) menempati hanya satu byte.%
simbol? Saya akan berpikir itu bisa ditemukan di katalog simbol ... Juga, saya harus mengeluarkan TI-84 + Perak. Saya belum menggunakannya dalam beberapa saat. Block Dude luar biasa.CJam,
252322 byteTerima kasih kepada @ Sp3000 untuk 25 → 24.
Cobalah online.
Bagaimana itu bekerja
sumber
Mathematica, 41 byte
sumber
N
elemen pertama , di manaN
persentase yang tersisa.J (8,04 beta) , 59 byte (30 dicuri byte)
30 byte literal J-port jawaban Dennis's APL :
59 byte jawaban, yang terbaik yang bisa saya lakukan sendiri:
(Berdasarkan sisanya harus pergi ke nilai tertinggi, masing-masing tidak lebih dari +1, dibagi beberapa nilai dalam kasus sisa> 1 atau dasi untuk nilai tertinggi).
misalnya
Penjelasan
f=.3 : 0
- 'f' adalah variabel, yang merupakan jenis kata kerja (3), didefinisikan di bawah (: 0):p=.
variabel 'p', dibangun dari:y
adalah daftar angka1 0 2
+/y
adalah '+' diletakkan di antara setiap nilai '/', jumlah daftar3
y % (+/y)
adalah nilai y asli dibagi dengan jumlah:0.333333 0 0.666667
100 * (y%+/y)
adalah 100x nilai-nilai itu:33.33.. 0 0.66...
untuk mendapatkan persentase.<. (100*y%+/y)
adalah operator lantai diterapkan ke persentase:33 0 66
r=.
variabel 'r', dibangun dari:+/p
adalah jumlah dari persentase lantai:99
100 - (+/p)
adalah 100 - jumlah, atau sisa poin persentase yang diperlukan untuk membuat persentase jumlah menjadi 100.r $ 1
adalah daftar 1s, asalkan jumlah item yang perlu kita tambahkan:1 [1 1 ..]
#p
adalah panjang daftar persentase(#p - r)
adalah jumlah item yang tidak akan bertambah(#p-r) $ 0
adalah daftar 0s selama yang dihitung:0 0 [0 ..]
((r$1) , (#p-r)$0)
adalah daftar 1s diikuti oleh daftar 0s:1 0 0
\: p
adalah daftar indeks yang harus diambilp
untuk meletakkannya dalam urutan menurun./: (\:p)
adalah daftar indeks yang harus diambil\:p
untuk menempatkannya dalam urutan menaik((r$1),(#p-r)$0)/:\:p
adalah mengambil unsur-unsur dari 1 1 .. 0 0 .. daftar masker dan menyortir jadi ada 1s dalam posisi persentase terbesar, satu untuk setiap nomor kita perlu peningkatan, dan 0s untuk nomor lain:0 0 1
.p + ((r$1),(#p-r)$0)/:\:p
adalah persentase + topeng, untuk membuat daftar hasil yang berjumlah 100%, yang merupakan nilai pengembalian fungsi.misalnya
dan
)
akhir definisi.Saya tidak terlalu berpengalaman dengan J; Saya tidak akan terlalu terkejut jika ada "mengubah daftar menjadi persentase dari total" operasi yang dibangun, dan cara yang lebih bersih untuk "meningkatkan n nilai terbesar" juga. (Ini 11 byte kurang dari upaya pertama saya).
sumber
list[0:100-n] + list[:-100-n]
pendekatan - dan saya belum memikirkan cara lain untuk mendekatinya.JavaScript (ES6), 81 byte
Kondisi "harus sama dengan 100" (bukan pembulatan dan penjumlahan) hampir dua kali lipat kode saya (44-81). Triknya adalah menambahkan pot untuk nilai desimal yang, setelah mencapai 1, mengambil 1 dari dirinya sendiri dan menambahkannya ke angka saat ini. Masalahnya adalah floating point, yang berarti sekitar [1,1,1] menyisakan 0,9999999999999858. Jadi saya mengubah cek menjadi lebih dari 0,999, dan memutuskan untuk menyebutnya cukup tepat.
sumber
Haskell,
4227 byteCukup banyak metode sepele di Haskell, dengan beberapa ruang dihapus untuk bermain golf.
Konsol (tanda kurung dimasukkan agar konsisten dengan contoh):
Sunting: melatih puting saya, membuat beberapa penggantian yang jelas.
Asli:
sumber
Jelly , 7 byte
-2 Terima kasih kepada Dennis, mengingatkan saya untuk menggunakan fitur baru lain (
Ä
) dan menggunakan:
bukan apa yang awalnya saya miliki.Cobalah online!
Jelly , 11 byte
Cobalah online!
Dilakukan bersama caird coinheringaahing dan user202729 dalam obrolan .
Bagaimana itu bekerja
sumber
Haskell,
635655 bytesumber
Perl, 42 byte
Berdasarkan algoritma Dennis
Termasuk +1 untuk
-p
Jalankan dengan daftar angka pada STDIN, mis
percent.pl
:sumber
Oktaf, 40 byte
sumber
Python 2, 89 byte
sumber
Brain-Flak , 150 byte
Cobalah online!
Mulai dari akhir dan bekerja mundur, kode ini memastikan pada setiap langkah bahwa jumlah nomor output sejauh ini sama dengan persentase total yang ditemui, dibulatkan ke bawah.
sumber
JavaScript (ES6) 60
63 95Diadaptasi dan disederhanakan dari jawaban saya (salah) untuk tantangan lain. Terima kasih
kepada @ l4m2 untuk mengetahui bahwa ini juga salah
Memperbaiki penghematan 1 byte (dan 2 byte lebih sedikit, tidak termasuk nama
F=
)Tes menjalankan cuplikan di bawah ini di peramban apa pun yang mendukung EcmaScript 6
sumber
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,980]
any single resulting integer returned as a percentage is off by no more than 1 in either direction.
Karat, 85 byte
Ini menggunakan vektor bukan array karena sejauh yang saya tahu tidak ada cara untuk menerima array dengan panjang yang berbeda.
sumber
JavaScript, 48 byte
sumber
Jq 1,5 , 46 byte
Diperluas
Cobalah online!
sumber
PHP, 82 byte
mengambil input dari argumen baris perintah, mencetak persentase yang dibatasi oleh garis bawah.
Jalankan dengan
-nr
atau coba online .sumber
15_15_15_15_15_25
ketika diberi input[2,2,2,2,3]
, yang tidak benar karena3/13 ~= 23.1%