チャレンジ
折り紙(折り紙)は芸術の創造的な形式です。私の知る限り、折り紙の達人は正方形の紙を好みます。最初から始めましょう-長方形の紙を正方形の紙に変換します。
したがって、紙は正方形に分割されます。現在の形状と1つの短いエッジを共有する最大の正方形を段階的に削除します(下の図を参照)。また、1ステップ後の残りの部分がより小さいか等しい場合0.001 * (area of the original paper)
、用紙はそれ以上分割できません。最後に何も残っていない可能性があります。
あなたのタスクは、プロセス中に作成される正方形の数を計算することです。用紙を分割できない最後のステップの正方形は、出力にカウントされます。
例(1.350
幅/高さの用紙)、出力は10です:
入出力
入力:長方形の紙の幅/高さの比、1桁の小数(またはドットのない整数)から1.002
まで1.999
、最小ステップ0.001
。また、比率を説明する他の合理的な形式を使用することもできます。答えにそれを記載してください。
出力:平方カウント、1つの整数。
I / Oの例
コードはリスト入力をサポートしたり、マッピング関数である必要はありませんが、ページを整理するためにマッピング形式が使用されます。
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のおかげで、ここに回答のグラフがあります。
備考
- これはコードゴルフなので、最短のコードが勝ちます
- 標準的な抜け穴に注意する
- 入力と出力の処理方法を決めるのはあなたの自由ですが、標準の制限に従う必要があります。
ところで...
- 課題について不明な点がある場合はコメントしてください
- 個人的には、ゴルフの言語を使用している場合は、答えに説明を含めることをお勧めします
- @GregMartinのおかげで、このチャレンジの数学的な説明については彼の答えを読んでください。
サンプルコード
以下は、C ++コードの未使用バージョンです。
#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;
}
サンプルコードに関連するすべての計算には、6桁の10進数の精度が必要float
です。