🧠

ずんだのポップル錯視問題 Brainf**k版

2024/11/30に公開

はじめに

※本記事は、2019/5/6にQiitaに投稿した記事を移行したものです
てぃーびーさんずんだのポップル錯視問題をBrainf**kで実装しました。

問題

詳細は上記リンクからご参照ください。概要としては次の通りです。

  • 特定の単語を標準入力から入力する。( コード中にハードコーディングしてもよい )
  • その単語の(正順に4回出力→改行)×2セット→改行→(逆順に4回出力→改行)×2セットを2セット行う
  • 2セットの間には改行出力を1回行う

実装

以下のような実装になります。( 283文字 )
※なお、実行環境としてはideoneのbffを想定しています

ポイントとしては以下の通り

  • UTF-8マルチバイト文字を想定し、複数バイトで1文字の場合はまとめて扱えるようにした
    • UTF-8の2文字目以降は、0x80-0xbfの範囲になることから、バイトの数値を32で割り、商が4,5の場合複数バイトの継続と判断するようにした
    • なお、改行文字はこの判断の延長で「商が0の場合」とした。( なので改行以外の特殊文字を読み込んでも単語の終わりと判断する )
    • 文字の区切りは0とし、正順・逆順どちらの場合も、同一文字は塊として正順に出力するようにした

詳細は、コード中のコメントをご覧ください。

zunda-popple.bf
** 改行文字とループカウンタをセット **
++++++++++>++
** 終端(マイナス1)をセットし、単語入力ループ **
>>>->>>+[
 ,+[
  ** 1増えた状態でdivmod 32 **
  [>[->>>]<[>->+>++++[-<<++++++++>>]]<<<<+>-]
  >>-[
   ** 余りのクリア等行いUTF8の2文字目以降(divmod 32での商が4か5)かの判断 **
   <[-]<<->>>-[-[-[-[-[[-]<->]]<+>]]]
   ** UTF8の2文字目以降の場合は文字の記憶位置をずらし塊にする **
   <[-<<[-<+>]>]
  >+>>] ** 入力ループ継続フラグセット **
  ** 改行(実際はdivmod 32での商が0)の場合は文字クリア **
  <[[-]<<[-]>]
 ]
<]
** 終端をセットし、メインループ開始 **
-<+[-<+]-<<<[-#
 ** 正順に4回単語出力×2行 **
 >++[-
  >++++[->>>+[-[.>]>+]-<+[-<+]-<]
 <<<.>>]
 ** 逆順に4回単語出力×2行(改行が先) **
 ++[-
  <<.>>>>>+[->+]-
  >++++[-<<<+[-[<]>[.>]<[<]<+]->+[->+]->]
  <<+[-<+]-
 <<]
 ** 次のループもあるなら改行2回、さもなくば改行1回
 <[<..<]<[.<<]
>>>]

実行例

ideoneの以下のページで確認できます。

https://ideone.com/Nf7jeI

参考

  • AzicoreさんのオンラインBFインタプリタ
    https://azisava.sakura.ne.jp/js/bf/
    ※動作環境をbffと合わせるには、オプションで、「バッファの型」を4バイト符号付き整数、「標準入力の終端」を-1に設定してください
  • Brainf**kの記事一覧の各講座記事

Discussion