パターン記述方法

[531]* のような正規表現風の書き方でサイトスワップの無限探索をします。半角の英数字の他に量指定子やワイルドカードなどが利用できます。探索の対象は、マルチやシンクロを含まない通常のサイトスワップ(いわゆるバニラサイトスワップ)です。

量指定子

*0 回以上の繰り返し
+1 回以上の繰り返し
?0 回または 1 回
{n}ちょうど n 回
{n,}n 回以上の繰り返し
{n,m}n 回以上 m 回以下の繰り返し

n, m とも 0 以上の整数です。記号間に空白は入れないでください(入れるとエラーになります)。

量指定子はその直前の要素に作用します。例えば 51+ と指定すると + の直前にある 1 に作用して 51, 511, 5111, 51111, ... という順に文字列を生成していきます。

ワイルドカードと文字クラス

#1桁の数字。[0-9] と同じ
$1桁の英字。[a-z] と同じ
.1桁の英数字。[0-9a-z] と同じ
[531]5, 3, 1 のいずれか1文字
[a-e]a ~ e のいずれか1文字
[^x]x 以外。[0-9a-wy-z] と同じ

[ ] で囲んだ文字クラスは、それ全体を1つの要素として扱います。例えば [51]+ と指定すると「5 または 1 の1回以上の繰り返し」になるため 5, 1, 55, 51, 15, 11, 555, ... という文字列を生成します。

[ ] の中に同じ文字を指定しても1つに集約されます。[abaa-b] は [ab] と同じです。大文字と小文字は区別されず、全て小文字として探索されます。また、[ ] の中ではワイルドカードなどの特殊記号は利用できません。

選択とグループ化

a|ba または b という文字列
(ab)ab という文字列

( ) で囲んだグループは、それ全体を1つの要素として扱います。例えば (51)+ と指定すると 51, 5151, 515151, 51515151, ... という順に文字列を生成します。

(ab|ba) のように選択とグループ化を組み合わせると「ab または ba」を1つの要素にできます。

( ) の中には他の要素を入れることができるため、無限探索の入れ子も可能です。(53*1)+ とすれば 51, 531, 5151, 53151, 51531, 5331, 515151, ... を生成します。

その他の文字

全角の英数字と記号は半角に、大文字は小文字に変換されます。ABC と指定しても出力されるのは abc です。

これまでに登場した特殊記号 * + ? { , } # $ . [ - ] | ( ) をそのままの文字として使用したいときは、その直前にバックスラッシュ \ を置いてエスケープします。\ そのものを使用したいときもその前に \ を置いて \\ とします。

例えば整数部1桁 + 小数部2桁の数字を表そうとして #.## と入力すると、「数字1桁 + 英数字1桁 + 数字2桁」の4桁になってしまいます。この場合は #\.## と指定してください。

キーボードあるいはフォントの問題で \ が ¥ と表示されることがあります。表示上は ¥ でも実際には \ であれば問題ありませんが、実際にも ¥ だと特殊記号がエスケープされません。そのときは全角の \ を使用してください(「バックスラッシュ」または「スラッシュ」と入力すれば漢字変換できると思います)。全角記号は半角に変換されるため \ として機能します。ちなみに全角の ¥ は半角の ¥ に変換されます。

英数字以外の文字はサイトスワップ判定やボール数の計算では使用されません。5.31 や <5,3,1> や 5/3=1 が生成されたとしても、いずれも単に 531 として計算されます。

言語仕様

参考までに、受理するパターンの仕様を HABA 形式 で記しておきます。

Selection ::= Sequence ('|' Sequence)* ;
Sequence ::= Factor+ ;
Factor ::= (Letter | Class | Group) Iteration? ;
Letter ::= Digit | NonDigit ;
Digit ::= "[0-9]" ;
NonDigit ::= "\\?." ;
Class ::= '#' | '$' | '.' | '[' '^'? (Letter ('-' Letter)?)+ ']' ;
Group ::= '(' Selection ')' ;
Iteration ::= '*' | '+' | '?' | '{' Integer (',' Integer?)? '}' ;
Integer ::= Digit+ ;