この課題におけるあなたの仕事は、このような「マッチスティック方程式」を分析することです...
...そして、一致を再配置することで有効な方程式に変換できるかどうかを調べます。もしそうなら、あなたはそうするための動きの最小数と結果の方程式を出力することになっています。
入力
入力は、STDINから読み取ることができる文字列で、関数の引数として取得するか、ファイルに保存することもできます。これは、マッチスティック配置を表す方程式であり、次のEBNFを使用して説明できます。
input = term, "=", term ;
term = number | (term, ("+" | "-"), term) ;
number = "0" | (numeralExceptZero , {numeral}) ;
numeralExceptZero = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
numeral = "0" | numeralExceptZero ;
有効な入力の例はになります3+6-201=0+0+8
。
仕事
各マッチスティックに番号が割り当てられている次の図を検討してください。
次のように、各入力シンボルを対応するマッチスティックの位置にマッピングします。
0 ↦ 1,2,3,4,5,6
1 ↦ 4,5
2 ↦ 2,3,5,6,8
3 ↦ 3,4,5,6,8
4 ↦ 1,4,5,8
5 ↦ 1,3,4,6,8
6 ↦ 1,2,3,4,6,8
7 ↦ 4,5,6
8 ↦ 1,2,3,4,5,6,8
9 ↦ 1,3,4,5,6,8
- ↦ 8
+ ↦ 8,10
= ↦ 7,9
各入力式は、マッチスティック配列に変換できます。たとえば、方程式「45 + 6 = 92」は次のようになります
未使用のマッチ棒はグレー表示されます。あなたの仕事は、方程式を有効にするために再配置する必要があるマッチスティックの最小数を見つけることです。
出力
考えられる3つのケースを区別します。
- 入力が無効な場合(つまり、上記のEBNFを満たさない場合)、必要なものを出力します。
- そうでなければ、マッチスティックを再配置して方程式を有効なものに変える方法がある場合、再配置の最小数と対応する方程式の両方を出力する必要があります。入力と同様に、出力された方程式も指定されたEBNFを満たさなければなりません。上記の例では、正しい出力は
1
and46+6=52
です。結果の方程式に複数の可能性がある場合、それらのいずれかを出力します。 - それ以外の場合(したがって、入力は有効であるが、方程式を真にする方法がない場合)、出力する必要があります
-1
。
詳細
- 一致を削除または追加することはできません。つまり、入力が
n
マッチスティックで構築されている場合、出力も正確にn
マッチスティックで構成されている必要があります。 - 「空の」マッチスティックブロックは、式の最後と最初でのみ許可され、中央では許可されません。だから、例えば、ターニング
7-1=6
に7 =6-1
簡単に除去することにより、-1
左側からわずか3マッチ棒の再編成と右側にそれを追加することが許可されていません。 私は実際のプラスのために、この挑戦の興味深い部分として位置をマッチ棒の数字からのマッピングが表示されないので、20バイトのどちらかが、
- マッピング
(number/operation ↦ matchstick positions)
が合理的な方法で保存されているファイルにアクセスする、または - プログラミング言語が
Map
データ型をサポートしている場合、(number/operation ↦ matchstick positions)
-mappingで事前に初期化されたマップにアクセスできると仮定します。たとえば、このマップは次のようになります。{(0,{1,2,3,4,5,6}),(1,{4,5}),(2,{2,3,5,6,8}),(3,{3,4,5,6,8}), ..., (-,{8}),(+,{8,10}),(=,{7,9})}
- マッピング
例
入力: 1+1=3
↦ 出力: 1
および1+1=2
入力: 15+6=21
↦ 出力: 0
および15+6=21
入力: 1=7
↦ 出力: -1
入力: 950-250=750
↦ 出力: 2
および990-240=750
入力: 1-2=9
↦ 出力: 1
および1+2=3
入力: 20 + 3=04
↦ 出力:何でも
勝者
これはcode-golfなので、最短の正解(バイト単位)が勝ちます。最初の正解が投稿されてから1週間後に勝者が選ばれます。
=
(2マッチスティック)と-
(1マッチスティック)の位置を切り替えて、すべての数字をそのままにしておくことができるため、3を返すはずです。ただし、2を左に移動する必要がある場合は、必要な移動もカウントする必要があります。
1+1+2=3-6+10
か?出力に関する同じ質問。
0: 1, 2, 3, 4, 5, 6
一貫性のために追加してください