« 「バイバイマンを数えよう」の高度じゃないコード | トップページ | 「平方コピペ数問題」の高度じゃないコード »

2016年3月 3日 (木)

「デスコロC #2」の高度じゃないコード

高度じゃないコードシリーズその6は「デスコロC #2」です。

aBcdEfGhijKlmnopQrStuvwxyzabCdefghijklmnOpqrstUvwxyzabcdefGhIjklmnOpqrStuvwxyzAbcdefghijKlmnopqrStuvWxyzabCdEfghijklmnopqrstuvWxyzabcdefghijklmnopqrStUvwxyzAbcdefghijKlmnopqrstuvWxYzabcdefghIjklmnOpQrstuvwxyzabCdefghijklmnopqrStUvwxyzabcdefGhijklmnopQrstuvWxyzabcdefghIjKlmnopQrstUvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijKlmnopqrStuvwxyzabCdEfghijklmnopqrstuvwxyzabcdefGhijklmnOpqrStuvwxYzabcdefghijKlmnopqrStuvWxyzabcdEfghijklmnOpqrstuvwxyzAbcdefghijklmnopqrstUvwxyzAbcdefghijKlmnopqrstuvWxYzabcdEfghijklmnOpqrstuvwxyzAbCdefghIjklmnopqrStUvwxyzabcdefghijklmnopQrstuvWxyzabcdefghIjKlmnopqrstuvwxyzAbcdefghijklmnOpqrstuvwxYzabcdefGhijklmnopQrstuvwxYzabcdefghijklmnopqrstuvWxyzabCdefGhijklmnOpqrstuvwxyzabcdefGhijklmnopQrstuvwxyzabCdEfghijklmnOpqrstUvWxyzabcdefghijklmnopqrstuvwxYzAbcdefghijklmnopqrStuvWxyzabCdefghijklmnopqrstuvWxyzAbcdefghIjklmnopqrStuvwxyzabcdEfghijKlmnopqrstuvwxyzabcdEfghIjklmnOpqrstuvwxyzabCdefghIjklmnopqrstUvwxyzabcdEfGhijklmnopqrstuvwxyzabcdefghIjKlmnopqrstUvwxyzabCdefghijklmnopqrstUvwxYzabcdEfghijklmnopQrstuvwxYzabcdefghijKlmnopqrstuvwxyzabcdefGhijklmnopqrstuvwxyzAbcdefghijKlmnopQrstuvwxyzabcdEfghijklmnopqrstUvwxyzabcdefGhijklmnopqrstuvwxyzAbcdefghijKlmnopqrstuvwxyzabCdEfghijklmnOpQrstuvWxyz

を標準出力してください。

「デスコロC #2」問題のトーナメント結果発表です!~優勝者は…!

アルファベット a~z の26文字が50回繰り返されていますが、所々大文字になっています。まずは、その大文字になる法則を見つけることが定石です。ところが、どうしても私には最後まで法則が見つけられませんでした。終了後公開された解説記事を読むと「素数かつ3なし番目を大文字化」だったらしいです。一応、素数は調べましたが、アホになる数字を除くことまでは残念ながら思いつきませんでした。道理で1箇所だけ間が119も飛んでいるわけだ。300番台の素数が全て除かれていたからってことね・・・。

でも、法則はわからなくても諦めません。テーブルを持たせて大文字に変えることにしました。大文字に挟まれた小文字の数でテーブルを作ります。それが、1~119まであったので、キャラクターコードの127からその数字を引いた文字を並べた文字列テーブルを作ることにしました。ちなみに、119は8になるので '\b' となり、そこだけ2文字になってしまいますが、1つだけなのでよしとします。ただし、テーブルは前から使うか後ろから使うかを変えることでコード短縮に繋がる可能性もあるので、とりあえず、両方の文字列を作りました。

正方向
~}~|z~vtzt~z|xvx|z~nj~zvt~vz~tp~tvzt~z|\bxv~dx|ztx|xvtlzvt~zvt~zv~jzt~prvxvxhz|xnvt~vz~d~n|zl|xvtzl|zrztv~d~vxn|ztxtjlvzrptlvn~v~z|
逆方向
|z~v~nvltprzvljtxtz|nxv~d~vtzrz|lztvx|lz|n~d~zv~tvnx|zhxvxvrp~tzj~vz~tvz~tvzltvx|xtz|xd~vx\b|z~tzvt~pt~zv~tvz~jn~z|xvx|z~tztv~z|~}~

そして、このテーブルを使ってRubyで作ったのが次の199バイトのコードです。テーブルの中身だけで131バイトあるので、まぁ、こんなもんでしょう。

法則がわからないことには、そんなに短くはならないのでRubyは諦めて、その時点でまだ人数0だったAssemblerで組んでみることにしました。実は、前回「バイバイマン」を初めてAssemblerで組んだのは、これを組むための練習だったのでした。もちろん、上記で作ったテーブル文字列は使います。ただ、もし法則がわかっていたとしたら、素数判定や数字に3が含まれるかどうかの判定をAssemblerで組むのはそこそこ面倒だし、コードもそれなりに長くなるので、逆に、Assemblerで組もうとは考えなかったと思います。

最初は、1文字1文字、長さ1の文字列として出力していましたが、バッファに溜めて行って最後に長さ1300の文字列として出力した方が短くなることがわかったので、そのように組んだのが、次の444バイトのコードです。提出した直後に、最後から2行めの「mov bx,0」を「dec bx」にすれば2バイト短くなることに気付きましたが、444バイトがゾロ目で切りがよかったので、442バイトは提出しませんでした。

|

« 「バイバイマンを数えよう」の高度じゃないコード | トップページ | 「平方コピペ数問題」の高度じゃないコード »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/99795/63294172

この記事へのトラックバック一覧です: 「デスコロC #2」の高度じゃないコード:

« 「バイバイマンを数えよう」の高度じゃないコード | トップページ | 「平方コピペ数問題」の高度じゃないコード »