見出し画像

3. 青い空、白い雲。 (Twitterのあんたがたに挑戦しました2020mini)

前回までのあらすじ

Twitterのあんたがたに挑戦しました2019
Twitterのあんたがたに挑戦しませんでした2020GW
2020GW運営のあんたがたに挑戦しました


Twitterのあんたがたに挑戦します2020mini

エンドロール スタッフや、活躍した参加者が書かれています。
解説集 全問題の解説が書かれています。
振り返り配信 全問題についてGMが語ったりしています。


記事目次

1. Twitterのあんたがたに挑戦します2020mini
2. 旅に、出ませんか?
3. 青い空、白い雲。


3. 青い空、白い雲。

予告通り、これも4匁の話です。


あれはいつ誰が言い出したんだろう。

難解プログラミング言語の1つ、
Whitespaceを使った匁を作ろう、と。


私は、作ろうと思ってはいませんでした。

でも私は全問デバッグ担当
実際に匁が完成したら、
Whitespaceを解読して動作を確認しなきゃいけない。
と、気づいちゃったんです。
それが10月11日の話。

ということで、
Whitespaceを勉強しよう!!(拍手)


そもそもWhitespaceとは。

使う文字は、半角スペース、タブ、改行、の3種類。
他の文字はどれだけあっても無視されます。
つまり見えない部分だけが実行されるんです。

こんなの考える人、頭おかしいですよね。


さて、いろんなサイトを見てみる。

たぶんBrainf*ckみたいな言語なんだよね?
……と思っていたら全然違うらしい。

ふーん……。


とりあえず自分のPC内で実行したい。

でも公式サイトにはアクセスできないし……。

使えそうなインタプリタがない……?


頑張って探しました。


見つけました。

元カレが作ってました

は?神じゃん。


早速Facebookで連絡。
(Twitterはブロックされてるので)

インタプリタの使い方を教えてもらいます。

そして自分でも、
S T L の3文字で書いたコードを
半角スペース、タブ、改行に変換するコードを書いて。

よし、環境構築完了!


じゃあ試しにコードを書いてみましょう。

ただ文字コードを入力して出力するだけじゃなくて、
ちょっと計算とか交換とかの遊びも入れながら。

私の記念すべき初めてのWhitespaceコード、
Hello World!!です。

画像1

そう、このideoneっていうサイト。
コードの共有用に使っていたんですが、
なんかコードが2色の棒みたいに表示されるんですよ。

これはどう見てもグラフ……。

画像2

いや何のグラフやねん。

さっきも書いたように、
半角スペース・タブ・改行以外の文字は全て無視されます。
(全角スペースも)
ということで、こんなに文字を書いたまま実行できちゃいます。


このグラフっぽい見た目は生かしたいですね……。


あれ……

いつから作問者の立場になっちゃったんだろう……。

まあ、いっか……。


さて、前回の記事に書いたように。
私は人口密度が日本一低い村
檜枝岐村に行くことを決めました。

ということは……?
市町村の人口密度のグラフを使って、
最低」を導出すれば、
檜枝岐村にたどり着けるのでは……?

と思いついてしまったので実装に取り掛かります。


せっかくグラフにするので、
見栄えもよくしたいところ。

上から広義短調減少な感じにしたいなあ。

普通に書いていたらそうはならないので、
余計な計算を入れたりしてみます。

T S S T       // sub        // スタックトップから2つの値を取り出し、その差をスタックにpush

// 文字を出力していくループ
L S S S S T L // label SSTL // LSS -> ラベル"SST"を定義
T S S S       // add        // スタックトップから2つの値を取り出し、その和をスタックにpush
T L S S       // prtc       // スタックトップの値を取り出し、文字として出力
T S S T       // sub        // スタックトップから2つの値を取り出し、その差をスタックにpush
L T S S S T L // jmpz SSTL  // LTS -> スタックトップの値が0ならばラベル"SST"に飛ぶ
L L L         // end        // プログラム終了 

タブは「行の長さを4の倍数にする」効果があることを利用して、
これで最後に長さ8の行を5つ作りました。

ループ内ではスタックの上から4つの値が使われて、
・1つめと2つめの和を文字として出力
・3つめと4つめの差が0ならループ先頭に戻る
という動きをしています。

ただし最初の1回だけ、
上から2つの値の差を「1つめ」として使っています。
(下から5行目の長さ調整のため)


あとはひたすら数値を入れていくだけです。
Whitespaceの数値は任意の桁数で入れられるし、
しかも和や差の計算をすることになっているので、
ここの長さの調整はどうにでもなりそうです。

ところで私のPCでスクショできる上限は34行っぽい。
ideoneのスクショをそのまま出題するとしたら、
(プログラムを終了させるための最下部の空行4つも考えて)
出力できる文字数は6文字まで。

"Lowest"がちょうど使える。いけそうです。

S S T                       T T T T T T T T T T T T T T T T T T T T T T T T L // push - 16777215 // SS -> 値をスタックにpush、次はSなら+でTなら-、以下はSが0T1とする2進法、Lで終わり
S S T                       T T T T T T T T T T T T T T T T T T T T T T S S L // push - 16777212 // ここの上2つの値が違うので最後にループから抜けて終了する
S S S     S S S S S S S S S T T T T T T T T T T T T T T T T T S T S S S S S L // push + 16777120
S S T                       T T T T T T T T T T T T T T T T S S T S T T S S L // push - 16777004 // + 16777120 - 16777004 = 116 -> "t"

S S S                               S T T T T T T T T T T T T T T T T T S S L // push +   524284
S S S                                 T T T T T T T T T T T T T T T T T S S L // push +   524284
S S T S S S S S S S S S S S S S S S S S S S S T T T T T T T T S S S T T S S L // push -    32652
S S S                                         T T T T T T T T T T T T T T T L // push +    32767 // - 32652 + 32767 = 115 -> "s"

S S T                                   S S S S T T T T T T T T T T T S S S L // push -    16376
S S T                                           T T T T T T T T T T T S S S L // push -    16376
S S S                                             T T T T T T T T T T T S S L // push +     8188
S S T                                             T T T T T T S S T S T T T L // push -     8087 // + 8188 - 8087 = 101 -> "e"

S S S                                                 S T T T T T T T T S S L // push +     1020
S S S                                                   T T T T T T T T S S L // push +     1020
S S S                                                   T T T T T T T S S S L // push +     1016
S S T                                           S S S S T T T S S S S S S T L // push -      897 // + 1016 - 897 = 119 -> "w"

S S S                                                         S T T T T T S L // push +       62
S S S                                                           T T T T T S L // push +       62
S S S                                                           S T T S T T L // push +       27
S S S                                                       S T S T S T S S L // push +       84 // + 27 + 84 = 111 -> "o"

S S S                                             S S S S S S S S S S S S S L // push +        0
S S S                                               S S S S S S S S S S S S L // push +        0
S S S                                                             S T T S S L // push +       12
S S S                                                       T S S S S S S S L // push +      128
S S S                                                         T S S S S S S L // push +       64 // + 12 + 128 - 64 = 76 -> "L"

こうして出来上がったグラフに町村名を入れていきます。
(市はなんとなく除外しました)

スクリーンショット 2020-10-29 22.41.55

終了するための空行には現地ヒントを入れて。

これで完成です!!


さて全問デバッグ班が作問しちゃった問題、
当然他にデバッグ担当を雇わないといけません。

これのデバッグのポイントとして、
印刷されたものからそれぞれの棒の長さが読み取れるのか、
というのがありました。

ここはfffさんが頑張ってくれました。

PowerPointで画像を拡大して目盛りを作って合わせたり、
印刷したものを定規で測ってくれたりと。

えっ私じゃないデバッグ担当めっちゃちゃんと仕事するじゃん。

そんなデバッグも経て、
無事に出題を迎えることができました。


あんたがたも印刷されたネプリの写真から、
「4匁@グラフ」シートを作ってくれました。

画像4

ちゃんと読めてるじゃん。えらい。

でも。
よく見ると1か所だけ違うんです……。

上から3つめ、岩美町。
左端から赤い棒が13マス伸びてますが、
これは正しくは12……。

でもここは1個スペースが増えても、
数値の上の位の0が1個増えただけで、
実はちゃんと同じように動くんです。

ちなみに逆に11になってたら、
表示される文字が変わっちゃってたんですよね……。

結果的に葦(ヨシ)!!


ということで、4匁の作問記でした。

あんたがた的には難しかったのかそうでもないのか。
勇者待ちが長かったことしかもう覚えてない……。

いや、日本国内で勇者待ち12時間ってなかなかですよ。
釜山以上ホーチミン未満ってところですね。


いやー、Whitespace楽しかったなあ。
また何かに使いたいですね……。(何に??)


さて。

3つ書くと言った記事の3つ目が終わりました。

これでatgt2020miniに関する記事は最後になります。

気づいたらもう終わって1か月経ってる……。
更新遅れちゃって申し訳ないですね……。


別件ですが。

Twitterのあんたがたに Advent Calendar 2020
という企画が始まっています。

12月1日から25日まで、
毎日1人ずつが、
「あんたがた」について語ってくれます。

実はちょうど昨日すべての枠が埋まってしまったんですが。


私は最後の25日に何か書きます。

まだ何も決まっていません。

考えなきゃ……。


ということで。
また25日の記事でお会いしましょう。

では。


いいなと思ったら応援しよう!