Rubyちゃんこんにちわ

子育てエンジニアが綴る

RubyHirobaの難問をQuineで解く

これが解けないと、オレのRubyHirobaが終わらない。という訳で終わらせる。

難問とは?

それがこれ ラーメンバーガー 挑戦者求む!【Ruby】ラーメンバーガー食べたい!│CodeIQ

“ラーメンバーガー食べたい!”と出力するコードを書いてください

一見簡単そうに見えるが、実は奥が深い。

まず日本語をどうにかする必要がある。フォントがインストールされていない環境を想定しなければならない。

次に「出力するコードを書いてください」というところだが、これは一体誰が書くのか?恐らくマシンが書く必要がある。そうQuineでという暗黙条件だ。

これらを組み合わせると、本来の出題意図は「ラーメンバーガー食べたい!と表示されるQuineを書く」ということになる。かなりハードな問題だ。

ちなみに自分は何も考えずに、普通のコードで提出してラーメンバーガーを頂いてしまったが、後でこれらの問題の真意に気づいてRubyHirobaを終えていないことに愕然とした。

Quineとは

そもそもQuineが分からない。Wikipediaによると

自身のソースコードと完全に同じ文字列を出力するプログラムである。

とのこと。なるほど、理解不能だがやってみる価値はありそうだ。

いつも思うのだが、いつも複雑さと戦っている僕らは、なぜ複雑さを求めてしまうのか。

解いてみた

まずフォントを作るところから。ドット絵とか久しぶり。

1
2
3
4
5
6
7
8
9
10
11
12
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1100000000000011111111111111111111111111111111111111111111111111
1111111111111111111111111111111111110011111100111100111111111100
0000000000000000111111111111111111110000110000111111001111111100
1111111111111100110000000000001111111100000011111111111111111100
1111111111111100111111111111111111111100000011111111111111110000
1111111111111100111111111111111111110000110000111111111111000011
1111111111000000111111111111111111000011111100111100001100001111
1111000000001111111111111111111100001111111111111111000000111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111

続いてネット上のいろいろな解説などをもとにQuineを書いてみた。

実行ごとに結果が少しだけ異なるようにしていて、ヒネリは全くないが3回実行するとまた元のコードに戻るようになっている。

以下のようにコマンドすると、それぞれで出力が変わることが分かる。

1
2
3
$ cat ramen.rb | ruby
$ cat ramen.rb | ruby | ruby
$ cat ramen.rb | ruby | ruby | ruby

ということで何とか解けた。ありがとうRubyHiroba。

まとめ

  • CodeIQさん問題ありがとうございます。ラーメンバーガーごちそうさまでした。
  • Quine意外とハマる、数独的な楽しさ。フルスタックエンジニアの逆張りでQuineだけを極めるのもありではないだろうか、いやありえない。
  • いつも複雑さと戦っている僕らは、なぜ複雑さを求めてしまうのか。まだ答えは見つかっていない。。。

参考

いろいろと参考にさせていただきました。これらの資料、記事によってなんとか作れました。ありがとうございます。

終わりに

アスキーアートな簡易Quineを出力するクラスを手元で作ってみた。これでサラッとAA Quineいける!と思ったけど、そもそも01にマッピングしたAAがそこら辺に転がってはいなかった。

この記事とは別にRubyHirobaでLTしてきた話はこちら