ウィークリーチャレンジ140


ChallengeMy Solutions

先週の課題を行った後、基本的に Perl コードをコピーしてから Python に変換していることに気付きました. Python が私にとって最も困難な課題であるため、今後の課題については別の方法で行う可能性が高いと判断しました.

タスク 1 › バイナリの追加



仕事



2 つの 10 進コード化された 2 進数 $a$b が与えられます.

指定された 2 進数の加算をシミュレートするスクリプトを作成します.スクリプトは $a + $b のようなものをシミュレートする必要があります. (オペレーターのオーバーロード)

私の解決策



したがって、このタスクでは、10 進数である value を保持する BinaryDecimal というクラスがあります.この値に 1 と 0 のみが含まれていることを確認します.

次に、2 つの BinaryDecimal 値を加算する加算演算子をオーバーロードする __add__ メソッドを使用します. Pythonは整数と文字列を区別するので、ショートカットはありません:)

チーム PWC のメンバーに、小学校でどのように足し算を教えられたかを説明する必要はないと思います.各数値の最後の桁 (モジュラス演算子を使用) と carry の値を取得し、それらを合計します.結果が 2 または 3 の場合、carry を 1 に設定します.結果が 1 または 3 の場合、適切な値を result 変数に追加します.次に、両方の数値を 10 で割り、両方の数値とキャリー値がなくなるまで続けます.

このタスクでは、Perl コードは Python コードの音訳です.余分な my 、ドル記号、セミコロン、および括弧のすべてが、私に Python を高く評価させます.唯一の大きな変更点は、 overload モジュールを使用して演算子をオーバーロードし、 package の代わりに class を使用することです.




$ ./ch-1.py 11 1
100

$ ./ch-1.py 101 1
110

$ ./ch-1.py 100 11
111


タスク #2 › 九九



仕事



3 つの正の整数、 $i$j 、および $k が与えられます.
$k$i のソートされた乗算表の $j 番目の要素を出力するスクリプトを作成します.

私のソリューション



これらの課題を実行するとき、通常、最適なソリューションを達成するためにどのくらいの作業を行うかを決定するポイントがあります.これはそのようなタスクの 1 つです.これに取り組むには 2 つの方法があるため、言語ごとに異なる道をたどりました.

Python コードでは、力ずくですべての積を計算し、配列を並べ替えて、適切な数値を表示します.これは機能し、うまく機能します.

ただし、非常に大きな数を使用し始めると、そのような大きな配列を格納することで RAM を簡単に使い果たす可能性があります.私の Perl コードでは、配列の最大サイズが 2 * $k である、よりスマートなソリューションを使用します.

ロジックは次のとおりです.

1) 変数 $i を使用して、1 から $m まで繰り返します.
2) 検索する必要がある製品の最大数を計算する
  • 配列サイズがすでに $k 項目である場合、最後の値を $m で割った結果が最大値になります.
  • それ以外の場合は、$k$j の最小値を計算します
    3) これらの数値に $m を掛けた積を配列にプッシュします.
    4) 配列をソートしてトリムします.

  • これははるかに効率的であり、非常に大きな数を簡単に計算できることを意味します.例を考えるとやり過ぎかもしれませんが、とにかくやってみるのは楽しいです.




    $ ./ch-2.py 2 3 4
    3
    
    $ ./ch-2.py 3 3 6
    4
    
    $ ./ch-2.pl 2 3 4
    3
    
    $ ./ch-2.pl 3 3 6
    4