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のようにするはずだったとのこと。
この形状はヴァイオレット・エヴァーガーデンのキャラクター、ヴァイオレット。