Meydan okuma
Origami (katlama kağıdı) yaratıcı bir sanat şeklidir. Bildiğim kadarıyla, Origami ustası kare kağıdı tercih ediyor. En baştan başlayalım - dikdörtgen bir kağıdı kare bir kağıda dönüştürün.
Böylece kağıt karelere bölünür. Mevcut şekliyle daha kısa bir kenarı paylaşan en büyük kareyi adım adım kaldırıyoruz (aşağıdaki resme bakın). Ve bir adımdan sonra kalan kısım daha küçük veya eşitse 0.001 * (area of the original paper)
, kağıt daha fazla bölünemez. Sonunda hiçbir şeyin kalmaması mümkündür.
Göreviniz, işlem sırasında kaç kare yapıldığını hesaplamaktır. Son adımda kağıdın bölünememesine neden olan kare çıktıya sayılır.
Örnek ( 1.350
genişlik / yükseklik kağıdı ), çıktı 10'dur:
Giriş ve çıkış
Girdi: dikdörtgen kağıt için en / boy oranı, bir ila ondalık (veya nokta olmadan bir tam sayı) 1.002
için 1.999
asgari bir adım 0.001
. Oranı tanımlayan diğer makul formatları da kullanabilirsiniz. Sadece cevabında bahset.
Çıktı: kare sayısı, bir tamsayı.
Örnek G / Ç
Bir eşleme biçimi sayfanın düzenli kalması için kullanılırken, kodunuzun bir liste girişini desteklemesi veya bir eşleme işlevi olması gerekmez.
1.002 => 251
1.003 => 223
1.004 => 189
1.005 => 161
1.006 => 140
1.007 => 124
1.008 => 111
1.009 => 100
@LuisMendo sayesinde, cevapların grafiği burada.
Uyarılar
- Bu bir kod golfü yani kısa kod kazanıyor
- Standart boşluklara dikkat edin
- Girdi ve çıktı ile nasıl başa çıkılacağına karar verme özgürlüğünüz ancak standart kısıtlamalara uymaları gerekir.
Bu arada...
- Meydan okuma hakkında net olmayan bir şeyiniz varsa yorum yapın
- Şahsen golf dili kullanıyorsanız cevabınızın bir açıklama içerdiğini öneririm
- @GregMartin sayesinde, meydan okuma için iyi bir matematik açıklaması için cevabını okuyun.
Örnek Kod
İşte C ++ kodunun ungolfed sürümü:
#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;
}
Örnek kodla ilgili tüm hesaplamalar, kapsanan 6 ondalık basamak doğruluğuna ihtiyaç duyar float
.