Tantangan
Origami (kertas lipat) adalah bentuk seni kreatif. Sejauh yang saya tahu, penguasa Origami lebih suka kertas persegi. Mari kita mulai dari awal - mengkonversi kertas persegi panjang menjadi persegi.
Jadi kertas itu dibagi menjadi kotak. Kami menghapus persegi terbesar yang berbagi satu tepi lebih pendek dengan bentuk saat ini, langkah demi langkah (lihat gambar di bawah). Dan jika bagian yang tersisa setelah satu langkah kurang atau sama dengan 0.001 * (area of the original paper)
, kertas tidak dapat dibagi lebih jauh. Mungkin akhirnya tidak ada yang tersisa.
Tugas Anda adalah menghitung berapa banyak kotak yang dibuat selama proses. Kuadrat pada langkah terakhir yang membuat kertas tidak dapat dibagi dihitung ke dalam output.
Contoh (kertas 1.350
lebar / tinggi), outputnya 10:
Masukan dan keluaran
Input: rasio / tinggi lebar untuk kertas persegi panjang, satu desimal (atau integer tanpa dot) dari 1.002
ke 1.999
dengan langkah minimal 0.001
. Anda juga dapat menggunakan format wajar lainnya yang menjelaskan rasio. Sebut saja dalam jawaban Anda.
Output: jumlah kuadrat, satu bilangan bulat.
Contoh I / O
Format pemetaan digunakan untuk menjaga halaman tetap rapi, sementara kode Anda tidak perlu mendukung input daftar atau menjadi fungsi pemetaan.
1.002 => 251
1.003 => 223
1.004 => 189
1.005 => 161
1.006 => 140
1.007 => 124
1.008 => 111
1.009 => 100
Berkat @LuisMendo, berikut adalah grafik jawaban.
Catatan
- Ini adalah kode-golf sehingga kode terpendek menang
- Perhatikan celah standar
- Adalah kebebasan Anda untuk memutuskan bagaimana menangani input dan output tetapi mereka harus mengikuti batasan standar.
Ngomong-ngomong...
- Beri komentar jika Anda memiliki sesuatu yang tidak jelas tentang tantangannya
- Secara pribadi saya menyarankan jawaban Anda berisi penjelasan jika Anda menggunakan bahasa golf
- Terima kasih kepada @GregMartin, bacalah jawabannya untuk penjelasan matematika yang bagus untuk tantangannya.
Kode Contoh
Berikut ini adalah kode C ++ versi ungolfed:
#include <iostream>
#include <utility>
int f (double m)
{
double n = 1, k = 0.001;
int cnt = 0;
k *= m; // the target minimum size
while(m*n >= k)
{
m -= n; // extract a square
if(n > m)
std::swap(n, m); // keep m > n
++ cnt;
}
return cnt;
}
int main()
{
double p;
std::cin >> p;
std::cout << f(p);
return 0;
}
Semua perhitungan yang terkait dalam kode contoh membutuhkan akurasi 6 angka desimal, yang tercakup dalam float
.