前回に続き、正規表現によるパズルゲーム? Regex Golf 10問目 "Triples" に挑戦です。3の倍数を検索です。
前回色々考えましたが、なんか出来そうにないのでもう一度最初からやり直すことにしました。
以下、ネタバレ
前回、数字を3つのグループ
- A:余り0のグループ(0, 3, 6, 9)
- B:余り1のグループ(1, 4, 7)
- C:余り2のグループ(2, 5, 8)
その先を順を追って考えてみます。
余りの値による判断を行う点も前回考えたのと同じで、次のように考えます。
まずはこの部分。
^[0369]*$でいけますね。
次にこの部分。
「B(1, 4, 7)と C(2, 5, 8)が 1 回ずつ交互に現れる」ですが、これは B と C の間に A が入ってもよいので、
^([0369]|[147][0369]*[258])*$となります。
さて、余り1の場合、A の代わりに B と C が 1 回ずつ交互に現れてもよいので
^([0369]|[147]([0369]|[147][0369]*[258])*[258])*$となります。
余り1の場合、B が 2 回現れると余り0に戻ります。
^([0369]|[147]([0369]|[147][0369]*[258])*([258]|[147][0369]*[147]))*$余り1から余り0に戻る C の代わりに B 2 回でも OK にしました。
さて、後は逆回りを追加すればいいはずです。
^([0369]|[147]([0369]|[147][0369]*[258])*([258]|[147][0369]*[147])|[258]([0369]|[258][0369]*[147])*([147]|[258][0369]*[258]))*$さて、結果はどうでしょうか?
できました!!
当初予定していた B と C の出現回数を使った検索とは違いますが、解決出来ました。
次回は当初予定していた方法でしつこく "Triples" をやるか、次の "Glob" に挑戦するか迷っています。
0 件のコメント:
コメントを投稿