ブログ

特になし

Palindrome 11【Markov Algorithm Online】

https://mao.snuke.org/tasks/15
解法のネタバレがあります!






























yyes1:yyes0yyes0
yyes01:1yyes0
yyes00:0yyes0
yyes0yno:yno
0yyes0yyes0:yno
1yyes0yyes0:
1yyes0:yno
0yyes0:
yyes0:
yyesy::
:yyes


よく分からないコードになりました。
13 手解から変形させると分かりやすいです。

13 手解
t0:#
t1:##
#1:1#
#0:0#
#f:f
0##:f
1##:
1#:f
0#:
#:
tf::no
t::yes
:t

13 手解です。まず先頭に t を作って、先頭の文字が 0 なら #、1 なら ## に符号化して末尾に送ります(符号化は一進数でやるとコスパがいいです)。
末尾に着いたら先頭と末尾が合っていれば両者を消して、合わなければ f に化けます。
最終的に f があれば no で、なければ yes という感じのコードです。

t、f の代わりにいい感じに yes、no っぽい文字列を使うことで、停止規則を 1 つにできます(自由な文字列を含む規則は、文字列をいい感じにごにょるとまとめられることがあります)。

12 手解
yyes0:#
yyes1:##
#1:1#
#0:0#
#yno:yno
0##:yno
1##:
1#:yno
0#:
#:
yyesy::
:yyes

# にまだ自由度があって、12 手解の一番上の規則を見ると # を yyes0 にすればこの規則が除けることが分かります(自由な文字列を含む規則は、文字列をいい感じにごにょると削除できることがあります)。
実際に # を yyes0 で置き換えると冒頭の 11 手解になります。

まとめ

最短手数の公式: なんかいい感じのやつ - (自由な文字列の種類数)