Latar Belakang
Di Prancis, dan mungkin di seluruh Uni Eropa, setiap makanan yang tersedia untuk dijual harus mencantumkan bahan-bahan yang menyusunnya pada kemasannya, dalam urutan persentase penurunan berat . Namun, persentase pastinya tidak harus ditunjukkan, kecuali bahan tersebut disorot oleh teks atau gambar di sampulnya.
Sebagai contoh, saus tomat kemangi saya, hanya menunjukkan beberapa tomat merah besar dan daun kemangi yang indah pada kemasannya, memiliki indikasi sebagai berikut:
Bahan: Tomat 80%, bawang merah, basil 1,4%, garam laut, bawang putih tumbuk, gula tebu mentah, minyak zaitun extra virgin, lada hitam.
Kedengarannya gurih, tapi ... berapa banyak bawang yang akan saya makan , tepatnya?
Tantangan
Diberikan daftar persentase berat dalam urutan menurun, akhirnya tidak lengkap, menampilkan daftar lengkap persentase berat minimum dan maksimal yang mungkin dapat ditemukan dalam resep.
- Anda dapat menulis fungsi, atau program lengkap.
- The masukan bisa dalam bentuk yang wajar (array angka atau daftar string, misalnya). Nilai pecahan harus didukung setidaknya ke satu tempat desimal. Persentase berat badan yang hilang dapat diwakili dengan cara yang konsisten dan tidak ambigu (
0
,'?'
ataunull
, misalnya). Anda dapat mengasumsikan bahwa input akan selalu dikaitkan dengan resep yang valid ([70]
dan[∅, ∅, 50]
tidak valid, misalnya). - The Output dapat dalam bentuk yang wajar (satu array untuk kedua persentase berat minimal dan maksimal, atau satu daftar doublet, misalnya). Persentase minimal dan maksimal dapat dalam urutan apa saja (
[min, max]
dan[max, min]
keduanya dapat diterima). Persentase berat yang tepat tidak perlu diproses secara berbeda dari persentase lainnya dan dapat direpresentasikan dengan nilai minimal dan maksimal yang sama.
Aturan standar untuk kode-golf berlaku: saat Anda mengetik kode Anda, hidangan pasta saya menjadi dingin, sehingga pengiriman terpendek menang.
Contohnya
Karena masalah ini lebih sulit daripada yang terlihat pada pandangan pertama, berikut adalah resolusi langkah demi langkah dari beberapa kasus.
[40, ∅, ∅]
Mari kita sebut masing x
- masing dan y
dua persentase yang hilang.
- Karena muncul setelah bahan pertama pada 40%,
x
tidak bisa lebih tinggi dari 40% itu sendiri.[40, [?, 40], [?, ?]]
- Jumlah dari dua persentase yang hilang selalu 60%. Akibatnya:
- Jika
x
mengambil nilai maksimalnya , makay
mengambil nilai minimalnya , yang karenanya 60% - 40% = 20%.[40, [?, 40], [20, ?]]
- Jika
x
mengambil nilai minimalnya , makay
ambil nilai maksimalnya . Tapix
tidak boleh lebih rendah dari ituy
, jadi dalam hal ini,x
=y
= 60% / 2 = 30%.[40, [30, 40], [20, 30]]
- Jika
[70, ∅, ∅, 5, ∅]
Mari kita sebut masing-masing x
, y
dan z
tiga persentase yang hilang.
- Persentase minimal dan maksimal untuk
z
harus antara 0% dan 5%. Mari kita asumsikanz
= 0% sejenak. Jumlah dari dua persentase yang hilang selalu 25%. Akibatnya:[70, [?, ?], [?, ?], 5, [0, 5]]
- Jika
y
mengambil nilai minimalnya , 5%, kemudianx
mengambil nilai maksimalnya , yang karenanya 25% - 5% = 20%.[70, [?, 20], [5, ?], 5, [0, 5]]
- Jika
y
mengambil nilai maksimalnya , makax
mengambil nilai minimalnya . Tetapix
tidak boleh lebih rendah dari ituy
, jadi dalam hal ini,x
=y
= 25% / 2 = 12,5%.[70, [12.5, 20], [5, 12.5], 5, [0, 5]]
- Jika
- Mari kita verifikasi bahwa semuanya baik-baik saja jika kita asumsikan sekarang
z
= 5%. Jumlah dari dua persentase yang hilang selalu 20%. Akibatnya:- Jika
y
mengambil nilai minimalnya , 5%, kemudianx
mengambil nilai maksimalnya , yaitu 20% - 5% = 15%. Kasing ini sudah termasuk dalam rentang yang dihitung sebelumnya. - Jika
y
mengambil nilai maksimalnya , makax
mengambil nilai minimalnya . Tetapix
tidak boleh lebih rendah dari ituy
, jadi dalam hal ini,x
=y
= 20% / 2 = 10%. Kasing ini sudah termasuk dalam rentang yang dihitung sebelumnya untuky
, tetapi tidak untukx
.[70, [10, 20], [5, 12.5], 5, [0, 5]]
- Jika
Uji kasus
Input: [∅]
Output: [100]
Input: [70, 30]
Output: [70, 30]
Input: [70, ∅, ∅]
Output: [70, [15, 30], [0, 15]]
Input: [40, ∅, ∅]
Output: [40, [30, 40], [20, 30]]
Input: [∅, ∅, 10]
Output: [[45, 80], [10, 45], 10]
Input: [70, ∅, ∅, ∅]
Output: [70, [10, 30], [0, 15], [0, 10]]
Input: [70, ∅, ∅, 5, ∅]
Output: [70, [10, 20], [5, 12.5], 5, [0, 5]]
Input: [30, ∅, ∅, ∅, 10, ∅, ∅, 5, ∅, ∅]
Output: [30, [10, 25], [10, 17.5], [10, 15], 10, [5, 10], [5, 10], 5, [0, 5], [0, 5]]
[40, ∅, ∅]
dan[70, ∅, ∅, 5, ∅]
untuk membuat hal-hal sedikit lebih jelas. Suatu tantangan harus jelas tanpa melihat pada test case, yang bukan merupakan case saat ini. Jika saya memahaminya dengan benar[40, ∅, ∅]
: 60 lebih banyak diperlukan untuk 100%, dibagi dua∅
. Yang pertama∅
harus 30 atau lebih tinggi (kalau tidak yang kedua∅
akan di atasnya, yang seharusnya tidak mungkin ketika mereka dalam urutan). Selain itu, tidak bisa di atas40
, jadi yang pertama∅
menjadi[30,40]
, dan yang kedua menjadi[(100-40-40=)20, (100-40-30=)30]
.[min,max]
/[max,min]
atau campuran diizinkan?[min,max]
dan[max,min]
merupakan batas yang dapat diterima, tetapi karena tidak dapat menghasilkan hasil yang ambigu, saya akan mengatakan tidak apa-apa.[70, 12, 11, 5, 2]
tidak berhasil untuk contoh kedua Anda? Jika berhasil, minimum untukx
menjadi kurang dari12.5
.Jawaban:
JavaScript (ES6), 252 byte
Mengharapkan
0
persentase yang hilang. Menghasilkan sepasang nilai minimum dan maksimum untuk semua entri.Cobalah online!
Bagaimana?
Inisialisasi
Kami pertama-tama mengganti setiap nilai dalam larik input a [] dengan rentang sebesar mungkin.
Contoh:
Fungsi utama
Fungsi utama adalah h () . Tampaknya entri pertama yang tampaknya tidak konsisten ketika kami mencoba memperkecil atau memaksimalkannya. Jika ditemukan, pembaruan ke nilai yang setidaknya dapat diterima untuk sementara, mengingat rentang lainnya.
Dibutuhkan sebagai input baik M = Math.max / I = 0 atau M = Math.min / I = 1 dan mendefinisikan J sebagai I XOR 1 .
Karena h () ditulis untuk mendukung pass minimalisasi dan maksimalisasi, kode ini agak sulit dikomentari. Itu sebabnya kami akan fokus hanya pada pemaksimalan pass, yang kami miliki M = Math.max , I = 0 dan J = 1 . Dengan parameter ini, kode tersebut berbunyi sebagai berikut:
Rekursi
Fungsi rekursif g () terus memanggil h () sampai tidak ada jalur meminimalkan atau memaksimalkan yang mengarah ke koreksi baru, dan akhirnya mengembalikan hasil akhir.
sumber
[38,0,10,0,0,0,0,0,0,0]
.