#include "puzutl.h"
// 0 : ピ
// 1 : ョ
// 2 : ン
#define S 100
byte word[S];
cstring c2s[] = { "ピ", "ョ", "ン"}; // 出力用
YesNo samestr( int level, int i, int j) // word[i]からj文字分同じ文字列が出現したか調べる
{
for( int k=0; k< j; k++) {
if( i+j+k > level) return NO; // 単語の長さを越えて比較しようとしている
if( word[i+k] != word[i+j+k]) return NO;
}
return YES;
}
YesNo check( int level)
{
if( word[0] != 0) return NO; // 最初の文字は「ピ」に限る
for( int i=1; i<= level; i++) {
if( word[i] == 1 && word[i-1] != 0) return NO; // ョはピの直後のみ
}
for( i=0; i< level; i++) {
//for( int j=1; j<= (level-i+1)/2; j++) {
for( int j=1; j<= level-i; j++) {
if( samestr( level, i, j)) return NO; // 同じ文字列を繰り返したらNG
}
}
return YES;
}
void find( int level)
{
{
static int maxLevel = 0;
if( level > maxLevel) {
ps( "%3d : ", level);
for( int i=0; i< level; i++) {
ps( "%s", c2s[word[i]]);
}
ps( "\n");
maxLevel = level;
}
}
for( int ch=0; ch<= 2; ch++) { // 3種類の文字を試す
word[level] = ch;
if( check( level)) { // 文字列に問題なし
find( level+1);
}
}
}
int main( int argc, cstring argv[])
{
find( 0);
return 0;
}