2015-07-10

Regex Golf をやってみた 13 〜Triples〜

Regex Golf 13回目(12回目はこちら

前回に続き、正規表現によるパズルゲーム? Regex Golf 10問目 "Triples" に挑戦です。3の倍数を検索です。


前回色々考えましたが、なんか出来そうにないのでもう一度最初からやり直すことにしました。

以下、ネタバレ

前回、数字を3つのグループ
  • A:余り0のグループ(0, 3, 6, 9)
  • B:余り1のグループ(1, 4, 7)
  • C:余り2のグループ(2, 5, 8)
に分けてみました。今回もその部分は使います。
その先を順を追って考えてみます。

余りの値による判断を行う点も前回考えたのと同じで、次のように考えます。


行頭から行末まで 1 文字ずつ足し 3 で割った余りを遷移していくことで 3 の倍数か判断する方針です。


まずはこの部分。


まずは「A(0, 3, 6, 9)は何回現れてもよい」ですが
^[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 件のコメント: