Macr055でNクイーン

前回の4クイーンを元に一般化して「マクロを生成するマクロ」によるNクイーン問題( http://parametron.blogspot.jp/2015/04/christopher-stracheygpm.html )。

エスケープが妖しいことになってて、もしかしたら無駄な展開とか起きてるかもしれませんが、一応ちゃんと動いて、正しい結果は出ています。

リスト中では N = 8 を定義してエイトクイーンになっていますが、macr055 は awk で実装しているうえに効率とか考えていないので流石に遅く、手元の環境で実行し(他の作業もしていましたので安定したものではないですが)time で確認したところ3時間ちょっとかかりました。

{m55_define|1+|`{1|2|3|4|5|6|7|8|9|10|
  {m55_define|1|$$$1}}'}{m55_dnl}
{m55_define|1-|`{-1|0|1|2|3|4|5|6|7|8|
  {m55_define|-1|$$$1}}'}{m55_dnl}
{m55_define|-|`{$2|
  {m55_define|$2|`{-|{1-|$1}|{1-|$2}}'}
  {m55_define|0|$1}}'}{m55_dnl}
{m55_define|lt|`{$1|
  {m55_define|$1|`{p|$1|$2|
    {m55_define|p|`{lt|{1-|$1}|$2}'}}'}
  {m55_define|-1|t}
  {m55_define|$2|f}}'}{m55_dnl}
{m55_define|or|`{$1|
  {m55_define|$1|t}
  {m55_define|f|$2}}'}{m55_dnl}
{m55_define|?|`{{lt|$1|$2}|
  {m55_define|t|`{{-|$2|$1}|
    {m55_define|{-|$2|$1}|f}
    {m55_define|$3|t}}'}
  {m55_define|f|`{{-|$1|$2}|
    {m55_define|{-|$1|$2}|f}
    {m55_define|$3|t}}'}}'}{m55_dnl}
{m55_define|gen1|`{$1|
  {m55_define|$1|``|$$$$$1'{gen1|{1+|$1}|$2}'}
  {m55_define|{1+|{1+|$2}}}}'}{m55_dnl}
{m55_define|gen2|`{$1|
  {m55_define|$1|````|$$$$$1'''{gen2|{1+|$1}|$2}'}
  {m55_define|{1+|{1+|{1+|$2}}}}}'}{m55_dnl}
{m55_define|gen3|`{$2|
  {m55_define|$2|```{or|{?|$$$$$1|$$$$1|0}|{or|{?|$$$$$1|$$$$1|$2}|''{gen3|{1+|$1}|{1-|$2}}'```}}'''}
  {m55_define|1|```{or|{?|$$$$$1|$$$$1|0}|{?|$$$$$1|$$$$1|1}}'''}}'}{m55_dnl}
{m55_define|gen4|`{$1|
  {m55_define|$1|````|$$$$$1'''{gen4|{1+|$1}|$2}'}
  {m55_define|{1+|{1+|$2}}|````|$$$$1|$$$$$1''''}}'}{m55_dnl}
{m55_define|gen_q|`{$1|
  {m55_define|$1|`{m55_define|q$1|`{qq$1|0'{gen1|1|$1}`}'}{m55_dnl}
{m55_define|qq$1|`{$$$$1|
  {m55_define|$$$$1|`{''{gen3|2|$1}``|
    {m55_define|f|`{q{1+|$1}'''{gen4|2|$1}```}{qq$1|{1+|$$$$1}'''{gen2|2|$1}```}'}
    {m55_define|t|`{qq$1|{1+|$$$$1}'''{gen2|2|$1}```}'}}'}
  {m55_define|$$$$'{1+|{1+|$1}}`|}}'}{gen_q|{1-|$1}}{m55_dnl}'}
  {m55_define|0}}'}{m55_dnl}
{m55_dnl}
{m55_define|N|8}{m55_dnl}
{m55_dnl}
{m55_define|gen5|`{m55_define|q$1|{gen6|1|$1}}'}{m55_dnl}
{m55_define|gen6|`{$1|
  {m55_define|$1|``$$$$$1 '{gen6|{1+|$1}|$2}'}
  {m55_define|$2|``$$$$$1
''}}'}{m55_dnl}
{gen5|{N}}{m55_dnl}
{gen_q|{1-|{N}}}{m55_dnl}
{m55_define|q0|`{qq0|0|$1}'}{m55_dnl}
{m55_define|qq0|`{$1|
  {m55_define|$1|`{q1|$1|$2}{qq0|{1+|$1}|$2}'}
  {m55_define|$2|}}'}{m55_dnl}
{q0|{N}}{m55_dnl}