Terinspirasi oleh /puzzling//q/626
Dalam petualangan Anda, Anda tiba di serangkaian 7 jembatan yang harus Anda lintasi. Di bawah setiap jembatan hidup troll. Untuk menyeberangi jembatan, Anda harus terlebih dahulu memberikan troll sejumlah kue sebagai persentase dari jumlah kue yang Anda bawa. Karena ini adalah troll yang baik, mereka akan memberikan sejumlah kue kepada Anda.
Pada awal setiap hari, raja troll lokal menetapkan pajak kue persen yang harus dibayar setiap pelancong, dan pengembalian kue troll - jumlah kue yang harus diberikan masing-masing troll kepada pelancong.
Tugas Anda adalah menghitung jumlah minimum kue yang diperlukan untuk melewati semua 7 jembatan troll untuk kondisi yang diberikan pada hari itu.
Menganggap:
- Dua parameter input: pajak kue persen (bilangan bulat dari 0 hingga 100), dan pengembalian dana kue troll.
- Tidak seorang pun, bahkan troll, menginginkan kue yang dimakan sebagian oleh troll lain. Jika Anda dibiarkan dengan sepotong kue, troll akan mendapatkannya.
- Jika troll menerima pajak kue, tetapi kemudian harus mengembalikan semua kue (dibiarkan dengan kue yang sama atau lebih sedikit dari sebelumnya), itu akan menjadi marah dan memakan Anda dan kue Anda.
- Setiap troll harus menyimpan setidaknya satu kue lengkap.
- Anda hanya dapat membawa maksimal 100 kue.
- Anda harus mengakhiri hari di mana Anda saat ini berada atau di sisi lain dari semua 7 jembatan.
Tantangan:
Tulis program lengkap untuk menampilkan jumlah kue minimum untuk bepergian hari ini atau nol jika hari ini tidak mungkin untuk bepergian dengan aman - Anda akan menunggu untuk melihat berapa angkanya besok.
Input harus diberikan sebagai stdin, argumen baris perintah atau input file.
Kode terpendek (jumlah byte) menang.
Contoh:
Pajak kue 25%, pengembalian 2 kue troll.
mulai dengan 19 kue
sebelum troll 1: (19 * 0,75) = 14,25
setelah troll 1: (14 + 2) = 16
sebelum troll 2: (16 * 0.75) = 12
setelah troll 2: (12 + 2) = 14
dll.
19 kue -> 16 -> 14 -> 12 -> 11 -> 10 -> 9 -> 8
18 kue -> 15 -> 13 -> 11 -> 10 -> 9 -> 8 -> 8 (aturan 3)
Untuk 18 kue, troll terakhir tidak akan bisa menyimpan kue. Oleh karena itu, jumlah minimum kue untuk 25% / 2 hari adalah 19.
input: 25 2
output: 19
Contoh 2:
Pajak kue 90%, pengembalian 1 kue troll
100 kue -> 11 -> 2 -> 1 (aturan 4)
Troll ketiga tidak bisa menyimpan kue apa pun. Oleh karena itu tidak mungkin untuk bepergian dengan 90% / 1 hari bahkan dimulai dengan jumlah kue maksimum.
input: 90 1
output: 0
Data
Gabungkan grafik input dan output dengan cepat. Saya terkejut ini bukan "halus" (seperti kurva lonceng atau serupa); ada beberapa pulau yang terlihat.
Data untuk mereka yang tertarik. Kolom dibagi menjadi interval 5%, baris adalah unit interval pengembalian uang 1 kue (excel memutar gambar). Anda dapat melihat tidak ada pengembalian dana yang lebih tinggi dari 28 kue.
27, 17, 13, 14, 15, 18, 20, 24, 53, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
47, 27, 20, 19, 19, 19, 24, 39, 48, 68, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0
67, 37, 28, 24, 23, 28, 27, 29, 50, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
87, 47, 33, 29, 27, 28, 31, 44, 37, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 57, 40, 34, 31, 29, 34, 34, 62, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 67, 48, 39, 35, 38, 37, 49, 57, 76, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 77, 53, 44, 39, 38, 47, 39, 59, 78, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 87, 60, 49, 43, 39, 40, 54, 46, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 97, 68, 54, 47, 48, 44, 44, 71, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 73, 59, 51, 48, 47, 59, 73, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 80, 64, 55, 49, 51, 49, 68, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 88, 69, 59, 58, 54, 64, 70, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 93, 74, 63, 58, 57, 54, 57, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 100, 79, 67, 59, 67, 69, 82, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 84, 71, 68, 60, 59, 77, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 89, 75, 68, 64, 74, 79, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 94, 79, 69, 67, 64, 66, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 99, 83, 78, 71, 79, 91, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 87, 78, 74, 69, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 91, 79, 77, 84, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 95, 88, 87, 74, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 99, 88, 80, 89, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 89, 84, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 98, 87, 94, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 98, 91, 84, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 99, 94, 99, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 97, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
25 2
11 kotak kue, Anda memberikan troll 2,75 kue dan kembali 2 sehingga troll itu tetap 0,75 (+. 25) dan Anda bertahan hidup. Dalam90 1
wadah 2 kue, Anda memberikan troll 1,8 dan mendapatkan kembali 1 sehingga troll tetap 0,8 (+. 2) tetapi Anda mati.Jawaban:
CJam,
46434139383633 byteInput melalui ARGV.
Ada penerjemah online, tetapi sayangnya tidak mendukung argumen baris perintah. Untuk pengujian, Anda dapat menirunya dari STDIN dengan versi ini:
Penjelasan versi berbasis ARGV:
Isi tumpukan secara otomatis dicetak di akhir program.
sumber
55 2
(0
bukan100
) dan56 5
(98
bukan94
). Ini karena100_0.55*-i
dan25_0.56*-i
menjadi korban ketidaktepatan floating point. Sejauh yang saya tahu, pasangan31 24, 31 25, 33 21, 33 22, 33 23, 35 10, 35 12, 35 15, 35 16, 35 27, 56 1, 57 4
memberikan hasil yang salah juga.CJam,
44 40 38 3735 byteAtau saat menggunakan argumen dan
{}#
trik baris perintah , 33 byte :Tidak menempatkan yang ini sebagai yang utama sebagai
{}#
pendekatan saya terinspirasi dari jawaban Martin.Contoh dijalankan:
Memasukkan:
Keluaran:
Lain:
Memasukkan:
Keluaran:
Bagaimana itu bekerja
Cobalah online di sini
sumber
]W=
triknya, tetapi sejauh ini, setiap cara saya mencoba menggunakannya saya berakhir dengan jumlah karakter yang sama.APL (39)
Penjelasan:
T R←⎕
: baca dua angka dari keyboard dan simpan diT
(pajak) danR
(kembali).Z←⍳M←100
: Menyimpan nomor100
diM
, dan semua nomor dari1
ke100
dalamZ
.{
...}⍣7¨
: untuk setiap elemenZ
, jalankan fungsi berikut 7 kali:R+⌊1-T÷M
: hitung berapa banyak kue yang harus dibayar,⍵(⊢×>)
: kalikan jumlahnya dengan 1 jika troll berakhir dengan lebih banyak kue daripada yang dia mulai, atau dengan 0 jika tidak.⊃Z/⍨
: untuk setiap elemen di dalamZ
, gandakan dengan jumlah yang diberikan fungsi tersebut. (Jadi semua angka yang fungsinya dikembalikan0
menghilang.) Kemudian pilih item pertama dari daftar itu. Jika daftar berakhir kosong, ini memberi0
.sumber
C, 83 byte
Jika berhasil, ini berfungsi untuk semua kemungkinan startcakes, tidak hanya dari 1 hingga 100.
EDIT: Berhasil. Golf:
Dengan batas 'maksimum 100 kue':
91 byte
sumber
CJam, 36 byte
sumber
C ++ - 202 karakter
Seperti biasa, C ++ saya melakukan yang terburuk:
sumber
APL, 36
Penjelasan
Perhatikan bahwa ada "ambang kue". Untuk tarif pajak
x
dan pengembalian uangy
, Anda akan membutuhkan lebih dari sekadary÷x
kue untuk melewati jembatan berikutnya.x y←⎕
mengambil input dan menetapkan untukx
(pajak) dany
(kembali)⍳x÷←100
bagix
100, dan kemudian menghasilkan array 1 hingga 100{y+⍵-⌈⍵×x}⍣6
panggil fungsi "pass bridge" 6 kali:⌈⍵×x
Jumlah kue yang Anda miliki, kali tarif pajak, jumlah (jumlah yang Anda bayarkan)⍵-
Kurangi dari jumlah kue yang Anda milikiy+
Tambahkan pengembalian danaKemudian Anda mendapatkan array 100 elemen yang menunjukkan jumlah kue yang tersisa setelah melewati 6 jembatan jika Anda mulai dengan 1 ~ 100 kue. Untuk melihat apakah Anda dapat menyeberangi jembatan terakhir, periksa apakah Anda berada di atas ambang batas
y÷x
. Atau:x×
gandakan array denganx
y<
memeriksa apakah lebih besar dariy
Akhirnya,
1⍳⍨
cari indeks kemunculan pertama1
(benar), kembali101
jika tidak ditemukan101|
mod 101sumber
C 128
Cukup mirip dengan solusi C lain tapi saya pikir itu tidak bisa dihindari. Trik utama adalah keluar dari loop dalam dengan nilai yang berbeda tergantung pada apakah itu selesai atau tidak. Ini memungkinkan saya untuk menggunakan?: Ketika saya tidak bisa jika saya menggunakan istirahat;
Tidak disatukan
sumber