Most in need of transparency

もっとも透明性が必要

受賞者:Don Yang

引用元:https://www.ioccc.org/2019/yang/prog.c

審査員・作者による説明:https://www.ioccc.org/2019/yang/hint.html

動作

テキストをスクランブル・アンスクランブルする。

$ cat sample_input.txt


  アイ         オォ
  あい       オ汚雄                しい      シシシシシ
  アィ     おぉ    おお        (*゚ー゚)      シシシシシシシ        cCCCCCCc
 あぃ     オお        オォ     しぃ         シシ      シシシ     cCCCCc   CC
 IIII    oお          Oオ    しー          シシ                cCCC
 藍愛    おO           ォ   しい           シシ                CCC
 哀合    OoO          oOO   詩             シシ               CCc
 iiii    おぉ        ォオ   強い            シシ       シシシ   CCCc
あぁ      おおo   ぉオオ     しい             シシシシシシ     CCCCc    cCc
ぁあ        おぉおぉお        しぃしぃしっ      シシシシ          CCCCccCCC
                                 (*゚ー゚)


$ gcc -o prog prog.c

$ ./prog sample_input.txt


  アイ         オォ
  あい       オ汚雄                しい      シシシシシ
  アィ     おぉ    おお        (*゚ー゚)      シシシシシシシ        cCCCCCCc
 あぃ     オお        オォ     しぃ         シシ      シシシ     cCCCCc   CC
 IIII    oお          Oオ    しー          シシ                cCCC
 藍愛    おO           ォ   しい           シシ                CCC
 哀合    OoO          oOO   詩             シシ               CCc
 iiii    おぉ        ォオ   強い            シシ       シシシ   CCCc
あぁ      おおo   ぉオオ     しい             シシシシシシ     CCCCc    cCc
ぁあ        おぉおぉお        しぃしぃしっ      シシシシ          CCCCccCCC
                                 (*゚ー゚)

見た目には何も変わらないが、ファイル上では順番がバラバラになっており、さらにエスケープシーケンスが含まれていて本来の位置にカーソル移動してから各文字を含むようになっている。

prog.cはRubyスクリプトとして解釈すると、出力をゆっくり通すcatとして動くので、これを通すとわかりやすい。 文字がランダムな順序で現れるのを確認できる。

$ ./prog sample_input.txt | ruby prog.c


  アイ         オ
               汚
             ぉ      お             ゚         シシシ  シ           C
 あ                    ォ                            シ  シ     c    c   C
    I                                                           C
   愛                  ォ     い             シ                 C
 哀      O            o     詩             シ
 i       お                 強                         シ    CC
                             し               シシ              C       c c
            お  おぉ            ぃしぃ  っ                       CC    C
                                 ( ゚ー )

スクランブルされた出力を./progに与え直すことで、元のテキストに戻る。

$ ./prog sample_input.txt | ./prog


  アイ         オォ
  あい       オ汚雄                しい      シシシシシ
  アィ     おぉ    おお        (*゚ー゚)      シシシシシシシ        cCCCCCCc
 あぃ     オお        オォ     しぃ         シシ      シシシ     cCCCCc   CC
 IIII    oお          Oオ    しー          シシ                cCCC
 藍愛    おO           ォ   しい           シシ                CCC
 哀合    OoO          oOO   詩             シシ               CCc
 iiii    おぉ        ォオ   強い            シシ       シシシ   CCCc
あぁ      おおo   ぉオオ     しい             シシシシシシ     CCCCc    cCc
ぁあ        おぉおぉお        しぃしぃしっ      シシシシ          CCCCccCCC
                                 (*゚ー゚)

見た目にはわからないが、上記の出力にはエスケープシーケンスが混ざっていない。


出力を別のファイルに分割して出させることもできる。 次は、1.txtと2.txtと3.txtに分割して出力させる例。

$ ./prog sample_input.txt 1.txt 2.txt 3.txt

$ cat 1.txt


  アイ         オ
               汚
             ぉ      お             ゚         シシシ  シ           C
 あ                    ォ                            シ  シ     c    c   C
    I                                                           C
   愛                  ォ     い             シ                 C
 哀合    O            o     詩             シ
 i       お                 強                         シシ   CC
                             しい             シシ              C       c c
            お  おぉ            ぃしぃ  っ                       CC    C
                                 ( ゚ー )

全部まとめてcatすると元通りに見える。

$ cat 1.txt 2.txt 3.txt


  アイ         オォ
  あい       オ汚雄                しい      シシシシシ
  アィ     おぉ    おお        (*゚ー゚)      シシシシシシシ        cCCCCCCc
 あぃ     オお        オォ     しぃ         シシ      シシシ     cCCCCc   CC
 IIII    oお          Oオ    しー          シシ                cCCC
 藍愛    おO           ォ   しい           シシ                CCC
 哀合    OoO          oOO   詩             シシ               CCc
 iiii    おぉ        ォオ   強い            シシ       シシシ   CCCc
あぁ      おおo   ぉオオ     しい             シシシシシシ     CCCCc    cCc
ぁあ        おぉおぉお        しぃしぃしっ      シシシシ          CCCCccCCC
                                 (*゚ー゚)

解説

Visual cryptographyを念頭に置いて作られた作品。 それぞれ単体では二次元のランダムな点列に見えるけれど、重ねると意味のあるメッセージが浮き上がるというもの。

苦労したポイントは、上記の例のとおり、UTF-8のサポートがあるところ。 日本人なら知っている通り、いわゆる全角文字は半角文字の2つ分の幅があるので、何かと面倒。 このプログラムは全角・半角の区別を理解して、CJKインプットでも正しく動作する。 ただし右から左に書く文字には対応していない(アンスクランブルはできるはずとのこと)。

サイズ制限が厳しく、絵にすることができなかったが、制限がなければviolet.cのようにするはずだったとのこと。 この形状はヴァイオレット・エヴァーガーデンのキャラクター、ヴァイオレット。