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


ChallengeMy solutions

タスク #1 › 電卓



仕事



数式を含む文字列 $s が与えられます.

数式の結果を出力するスクリプトを作成します.シンプルにするために、 + - * () のみを受け入れてください.

私の解決策



願わくば、このブログの読者に order of operations (この地域では BEDMAS として知られている) について教える必要がないことを願っています.

予期しない結果が生じる場合があるため、私は自分のソリューションに完全に満足しているわけではありません.たとえば、"1 (2 - 3) * 4"は -3 を返します (2-3 は負の 1 であり、"1 -1 * 4"= 1 - 4 = -3 になります).

これを解決する最も簡単な方法は、正規表現を使用して基準 (数字、小数点、スペース、およびタスクで説明した文字のみが含まれる) に一致することを確認してから、eval または qx を使用して文字列を解析することです.多分それは期待されていることです.それはおそらく、私が現実の世界でやったであろうことです™.私は自分の結果を提出する前に他の人の結果を見たいという誘惑に駆られましたが、私は決してそれをしませんし、今から始めるつもりもありません :)

ですから、私の取った策略はおそらく正しくありません.私が最初に行うことは、すべてのブラケット (最も内側の最初のもの) を評価し、それらを結果に置き換えることです.各ポイントで、数値の組み合わせがあり、その後に任意の数の演算子番号のペアが続きます.次に、正規表現を使用してパーツを分離します.次に、すべての掛け算のペアを減らし、最後にすべての足し算と引き算を完了します.




$ ./ch-1.pl "20 + 10 - 5"
25

$ ./ch-1.pl "(20 + 10 - 5) * 2"
50


タスク 2 › ステルス ナンバー



仕事



正の数 $n が与えられます.

指定された番号がステルス番号かどうかを調べるスクリプトを作成します. a * b = c * d = N および a + b = c + d + 1 となる正の整数 a、b、c、d が存在する場合、正の整数 N はステルスです.

私の解決策



これは、最初のタスクに比べて比較的単純であり、私が作成する他の多くのソリューションと同様に、力ずくの方法を使用するだけです.

1 から i までカウントするループ √n があります. n % i が 0 の場合、a/b または c/d の可能な組み合わせがあります.次に、この値を以前の値と比較します.絶対差が 1 の場合は 1 を出力します.考えられる a/b/c/d の組み合わせが見つからない場合は、0 を出力します.

Perl コードは、Python コードの音訳です.




$ ./ch-2.py 24
1

$ ./ch-2.py 12
1

$ ./ch-2.py 6
0