この質問は、この答えに触発されています。偶然にも、私は子供の頃エチオピア乗法を使用していましたが、最近までその方法の名前を知りませんでした。
エチオピアの乗算は、加算、倍増、および半分だけを使用して整数を乗算する方法です。
方法:
- 乗算する2つの数値を取得し、2つの列の上部に書き留めます。
- 左側の列では、値1を書き込むまで、最後の数値を繰り返し半分にし、残りをすべて破棄し、同じ列の最後の結果の下に結果を書き込みます。
- 右側の列で、最後の数字を繰り返し2倍にして、以下の結果を書きます。左側の列に1が表示されているのと同じ行に結果を追加すると停止します。
- 作成されたテーブルを調べて、左側の列の値が偶数である行を破棄します。残っている右側の列の値を合計して、元の2つの数値を乗算した結果を生成します。
例:17 x 34
17 34
最初の列を半分にする:
17 34
8
4
2
1
2列目を2倍にするには:
17 34
8 68
4 136
2 272
1 544
最初のセルが偶数の取り消し線は、これらの数値を角括弧で囲んで右側に配置します。
17 34
8 [68]
4 [136]
2 [272]
1 544
右側の列の残りの数値を合計します。
17 34
8 [68]
4 [136]
2 [272]
1 544
=====
578
17に34を掛けると、エチオピアの方法では578です。
タスク:
1〜1000の2つの数字を受け取り、同じレイアウトとアルゴリズムを実行するゴルフコード。以下の製品を表示します。
入力方法:ただし、選択する...
入力例:
19 427
結果の出力:
19 427
9 854
4 [1708]
2 [3416]
1 6832
======
8113
数字の配置に注意してください。これはレイアウトで最も重要です。また、等号で配置される二重線は、全体の回答よりも2文字長く、中央揃えにする必要があることに注意してください。
テスト中
これをどのようにテストしますか?2つの数字を使用してプログラムの実行を提供する。これらの番号は、ユーザーID番号から抽出できます(これは、トップウィンドウのアバターにカーソルを合わせると取得できます)。あなたの番号を取り、最後の3桁を取ります。これは番号Bになり、前に残っているものはすべて番号Aになります。その後、A倍Bをテストします。
テスト例:
ユーザーID番号は8555なので、番号は8と555です。したがって、出力は次のようになります。
8 [555]
4 [1110]
2 [2220]
1 4440
======
4440
制限事項:
アルゴリズムで言及されているように、「倍加」の使用を節約するためのネイティブの乗算演算子は許可されていません。つまり、*などの演算子を使用している場合、2で乗算する場合にのみ使用できます。
これに準拠していないエントリは考慮されず、ユーザーは所有物でいっぱいの段ボール箱で施設からエスコートされます。各エントリには、コードと、ユーザーID番号に基づくテストが含まれます。
これはコードゴルフです。最短バイト数は、仲間の賞、栄光、賞賛を受けます...(そして、おそらくランボルギーニ...私は「たぶん」と言いました!)
*
またはなどx
)の使用を制限できますが、乗算が使用されているかどうかを検出することはできません。その部分を除いて、挑戦は興味深いです。