TODO:提出が公開されたらここにURLを貼る
ヤマト運輸プログラミングコンテスト2019 A問題のACコードです。芸術点とかないですか? pic.twitter.com/qx4zrVtL2M
— こたつがめ (@kotatsugame_t) 2019年8月18日
上のような見た目のコードを書きました。この記事はそれのメイキングです。
1.Rubyコードを用意する
残念ながら今回はご用意することができませんでした……。
仕方がないので、Rubyからbashを呼び出してC++コードをコンパイルすることにしました。
2.RubyコードをAA化するために調整する
下のスライドの12ページ目に書いてあるような理由で、空白・バックスラッシュを除いたコードをeval(%w(
と)*"")
で挟むことでその間に自由に空白や改行を入れることができるようになります。
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
今回のコードでは先頭と末尾に十分な長さの連続したコードを書けるので、そこに付け加えたコードが壊れることはありませんでした。ここに空白や改行が入ると、その場所によってはうまく動きません。
空白とバックスラッシュを除くため、それぞれ#{32.chr}
、#{92.chr*2}
に置き換えています。
ここで、出来上がったコードの文字数をカウントします。1208文字でした。
3.ロゴマークの縦横比を調整する
個人利用、と念じながらロゴマークの画像を拾ってきます。ペイントツールで縦横比をいじりながらAA化して(4番参照)、AtCoderのコードテストに貼り付けて、見え方を確認します。これを怠ると下のツイートのようになります(1敗)。
ぼくのうんちも完成してからAtCoderに投げたらゴンの髪の毛みたいになってたので提出後の見栄え気にするなら確認した方がよさそうです pic.twitter.com/VFD8ydy56I
— 💩 (@Cinnamon_VR) 2019年8月12日
4.白黒のAAにする
まず一般の文字を使用したAAを作成するツールにぶん投げて下地を作ります。
こうなります:
次に、白っぽい文字を空白に、黒っぽい文字をシャープに置換します。末尾に生まれる空白は削除しておきます。
tr -c 'MNHg7#F@\n"' ' '|sed 's/[^ ]/#/g;s/ *$//'
ここで、シャープの文字数をカウントします。シャープの部分に用意したRubyコードを1文字ずつ埋め込んでいくので、上でカウントした1208文字とぴったり一致する必要があります(本当はコードを無意味に伸ばすことで調整は効きます)。
手直しするときに数十文字増えるので、それを見越していい感じの文字数になるようにツールで作るAAのサイズを調整します。載せた画像はそれぞれ調整した後のものです。
最後に手作業で整形します。できるだけ左右対称になるようにしました。1208文字ぴったりにすることもできました。
5.RubyコードをAA化する
プログラムを書いて楽をします。
s=%q(Rubyコード).chars gets(p).chars{|c|$>.<<c==?# ? s.shift : c}
6.提出
完成!