(false時の処理)という形式で記述することが出来ます。このコードを読むと:が目に付きますが、先頭から順番に読むほうがわかりやすいと思います。先頭の!は否定演算子以外にないので次の????!を考えます。?!とパースできることがわかります。一応:をシンボルのリテラルと推測することも出来ますが、:!のように記述することは出来ても:!?!のようには記述できず文法エラーが発生します。?ただでさえわかりにくいコードをわざと誤解を招く見た目にしています。コミッターを始めとしてRubyに詳しい人ほど0や1と回答していました。少なくとも#sizeメソッドが実行できるならIntegerが返るはずで、マイナーですがInteger#[]というメソッドが存在しており必ず0か1を返すことを知っているからだと思います。このクイズを思いついたのはRubyKaigi2019の1日めに偶然お会いしたtompngさん(Rubyの超難読コンテスト、TRICKの入賞者)とお話していた時に「記号が連続するっていえば、%記法の囲い文字に%を指定することが可能なんですよ」と教えて頂いたのがきっかけです。"hoge")ということです。囲み文字が?や!などの記号でも良いことは知っていましたがまさか%自体でも可能だとは知らなかったので、せっかくなのでこれを利用して難読コードを書きました。この知識からわかるのは、Rubyでは%%%と書いて""を生成できるということです、楽しい!多くの人はこのコードをRangeオブジェクトだと考えたようですが、それは罠です。[0].sizeの部分で配列か何かを扱っているように見せていますがわざとです、この部分にはなんの意味もありません。ちなみに、そもそもRangeに#[]メソッドはありません。実際には[0].size[0]は独立した式になっています。単なるInteger:0を要素とした配列でsizeメソッドを呼び、その結果であるintegerについて#[]メソッドを利用しています。integer#[]は引数番目のビットが立っているかどうかを0か1で返します。最後に必要となる知識はString#%メソッドです。これはsprintfの言い換えで引数を元に書式付きフォーマットを返します。"3.0000"つまり、このコードはこんな風にパースされます。""%メソッドを使っていますが、レシーバのStringが引数を使っていないので引数は虚空に消えます。内側の%メソッドについても同様です。故にこのコードで実際に意味があるのは最初の三文字、%%%だけです。実は公開直後のこの解説記事ではDay2-1の問題をRubyKaigiで掲示していた問題とは異なるコードで記載してしまいました。@gomachan46さんにTwitterでご指摘頂いて初めて気がついたのですが(ありがとうございます!)、当初この問題を前半の%が一個少ない%%%%%..%%[0].size[0]として掲載してしまったのです。こんなことになったのかというと、記事を書く際に掲載資料がローカルになかったので自分の記憶を元に問題を復元してirbで結果を確認したのです。不幸にもこのコードは%が一個くらいなくなっても全く同じように動く上に、%がいっぱいあったので気が付きませんでした。あまりにも面白かったのでどうして%を一個くらい福岡国際会議場に忘れてきても動くのかについて解説しておきます。?この%が一個少ないバージョンでは%..は空文字として評価されます。この部分において.は%記法の囲み文字として扱われます。その次に存在する%[0]はシンプルな%記法です。"0"と評価されます。%..はともかくここで本来あるべきだった[0]の代わりに"0"が来てしまったのですが、ご安心下さい、Stringにも#sizeメソッドがあるので全く問題ありません。ちなみに文字列の長さを返します。2-1と全く同様に%メソッドによって使われることなく捨てられます。?二日目に難易度を上げすぎたことを反省して簡単にしたのがこれです。実際にはそれほど簡単ではなかったようでした。その理由がそもそもputsメソッドの返し値が何かを知っている人が少なかったことです。予想外にみなさんはputsメソッドが何を返すか興味がないようですね?putsメソッドは標準出力する内容に関わらず必ずnilを返します。この挙動は表示内容を返し値とするpメソッドとは異なるため注意です。いや、一点だけ補足が必要ですね。Rubyではメソッドで定義していないブロック引数を渡してもエラーも実行もされません。逆にブロック引数を定義しているメソッドにブロックを渡さなくてもそれだけではエラーにはなりません。true」(unak氏)でも使われたRubyの奇妙な仕様ですね。}は無視され影響を与えません。?パースするだけですね。2-1の説明と1-1の説明を組み合わせれば先頭の%%%が""になってString#%で後半が捨てられるので答えが""になるはずだとピンと来るでしょう、不正解です。これはRubyが%%%%%%%という奇妙な文字列を""%""と評価してくれる嬉しい挙動を使っています。この部分は""となります。優先順位の問題でこの評価結果は後半にある三項演算子の条件式として機能します。irb.quit直後に何が発生しますか?この問題を誰かが完全に解けるとは思っていませんでした、irbのコミッターでもない限り。コミッターの方が2名ほどクリアしていきましたが意外にも他の問題で引っかかってしまうことがあったり得意不得意を感じますね。これは3-2や1-1、2-1のようなパース問題ではなく純粋な知識問題です。irb上で実行されるという前提と返し値ではなく「直後に何が発生するか」を聞いている点に注意してください。回答で多かったのが「ZeroDivisionErrorが発生する」という答え。確かに一般に数値を0で割ればエラーになるということは知られています。それがInteger(整数)であればです。Number)オブジェクトが得られます。falseとなります。故に三項演算子は後者のirb.quitが評価されます。irb.quitはirbもquitメソッドも見たことがある人はまずいないでしょう。irbを起動するとそこはトップレベルですがirb関連のメソッドがいくつか追加されています。irbを抜けたい時に呼び出すquitメソッドなどです。irbメソッドもその一つであり、新規にIRB::Irbオブジェクトを生成しその中に入ります。IRB::Irbオブジェクト自体はquitメソッドを持ちません。故にirb.quitは不正な呼び出しであり、NoMethodErrorが発生します。このエラーが発生するのはirbメソッドの実行が終わり、ユーザが新たに開いたコンソールを抜けた後なので、この問題で聞かれている「直後に何が発生しますか?」の答えは「irbが起動する」です。クイズが解けた方も解けなかった方もお気軽にお問い合わせください。弊社で普段書かれているRubyのコードはとても治安が良いため、記事のような難読コードに業務で遭遇することはありません。難読コードでマージリクエストを出されてもLGTMしかねますのでご了承下さい。Sponsorとして参加しました!(ブース・セッ...エンジニアリンググループの山口です。まとめ!エンジニアリンググループの松原@ma2geです。月別アーカイブ注目記事はてなブログをはじめよう!m3techさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。