Toshusai blog

知識の保管庫

新婚三択アルゴリズムを1行で実装する

はじめに

ご飯にする?お風呂にする?それとも私?という言葉を聞いたことがあるだろうか。この仕事等から帰ってきた旦那さんを出迎えた奥様が提示する三択は一般的には新婚三択と呼ばれているようだ。*1,*2 起源は全員集合の志村けんのコントとするものもあったが、筆者の2分ほどの調査では正しい起源を確認することはできなかった。*3 特に理由はないがプログラミング言語のレベルにモデル化することにした。

実装

ご飯お風呂以外の選択肢を選んだ場合の動作は未定義であることが多いが、今回のケースではご飯お風呂以外をとする。

 const f = (action) => ご飯 == action ? 🍚 : お風呂 == action ? 🛁 : 🤷<200d>♀️

次に、ご飯お風呂以外の選択を例外として処理したい場合を考える(ここでは夫からの呼びであるため、選択肢としての呼び名をと定義する)。

 const f = (action) => ご飯 == action ? 🍚 : お風呂 == action ? 🛁 : action === 君 ? 🤷<200d>♀️ : (()=>{throw `ActionError: Unexpected action '${action}'`})();
 f(ご飯);
 // 🍚
 f(お風呂);
 // 🛁
 f(君);
 // 🤷<200d>♀️
 f(ゲーム);
 // Uncaught ActionError: Unexpected action 'ゲーム'

注意すべき点は、3項演算子中で例外を投げるには、例外を投げる即時関数を呼び出さないといけない(以下のコードを参照)。*4

 false ? 'ok' : throw 'omg'; 
 // Uncaught SyntaxError: Unexpected token 'throw'
 false ? 'ok' : (()=>{throw 'omg'})(); 
 // Uncaught omg

見てわかるように、このケースではやや冗長なコードになる。

おわりに

今回はJavaScriptを用いて実装したが、PythonやGo言語のように3項演算子を持たない言語では1行で書くことは不可能である。また、世の中には3項演算子の良し悪しについての議論が存在する。*5本記事はジョーク記事なのでそういった議論は一切受け付けない。

余談ではあるが、新婚三択を言われたいかどうかというアンケートによると53.9%の男性がいいえと答えたそうだ。*6

マイナビウーマン調べ(2015年8月にWebアンケート。有効回答数102件。22歳~39歳の社会人男性)

筆者はそんなことを考えたことはないが、どうかと聞かれたら、ちょっと言われてみたい。

参考

*1

新婚三択 (しんこんさんたく)とは【ピクシブ百科事典】 https://dic.pixiv.net/a/新婚三択

*2

新婚三択とは (シンコンサンタクとは) [単語記事] - ニコニコ大百科 https://dic.nicovideo.jp/a/新婚三択

*3

ご飯にする?お風呂にする? - それとも私?って具体的にどういうことですか?? - Yahoo!知恵袋 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14137012839

*4

JavaScript error handling: can I throw an error inside a ternary operator? - Stack Overflow https://stackoverflow.com/questions/9370606/javascript-error-handling-can-i-throw-an-error-inside-a-ternary-operator

*5

三項演算子?:は悪である。 - Qiita

https://qiita.com/raccy/items/0b25b2f106e2a813828b#:~:text=条件演算子(conditional%20operator,項演算子である。

*6

「ごはんにする? お風呂にする? それとも私にする?」って、男性は言われてみたいもの? https://woman.mynavi.jp/article/150901-125/