『3番目のダンジョン』私の解答
テンプレ
この問題(に限らずダンジョンシリーズ)の面白いところは、定められた文字数制限と使用禁止文字列を満たす JavaScript のコードを提出すれば正解となってバッジが付与されるのですが、実際には場外(Twitter とか CodeIQ MAGAZINE とか)で出題者様主導で解答コードの短さが競われているのです! いわゆるコードゴルフです。このことは問題文には一切書かれていなくて、バッジほしさに適当に解答を送ると、知らずにコードゴルフに引きずり込まれるという、恐ろしい罠が仕掛けられているのです!
はじめに
今回の問題は、相異なる5個の数値 a, b, c, d, e が与えられたときに、3番目の大きさのものを求める、というものでした。具体的な問題は、解説記事をご覧ください。
解説記事(CodeIQ MAGAZINE)
https://codeiq.jp/magazine/2014/08/14753/
今回もいつものように、途中経過を見ながら縮めていこうと思って、とりあえず様子見でコードを提出したのですが、いつもと違って途中経過の発表がほとんどありませんでした。いぶかしく思っているうちに、帯状疱疹を患って入院してしまい、入院中に締め切りとなってしまいました。しかし、蓋を開けてみると、とりあえず提出したコードがそのまま最短コードになっていました。途中経過の発表がほとんど無かったのは、そもそも動きがほとんど無かったからのようですね。
LV2の私のコード
(a<b)-(a>c)^(a>d)-(a<e)?arguments.callee(b,c,d,e,a):a
53文字です。コードゴルフでは忌み嫌われる優先順位の括弧が、なんと4組も使われています。しかし +
と /
が使用禁止なので、まあ仕方ないところです。
(a<b)-(a>c)^(a>d)-(a<e)
の部分がやや解りにくいですが、 ^ の両辺を表にすると次のようになります。
条件 | (a<b)-(a>c) の値 |
---|---|
a < b,c | 1 |
b < a < c | 0 |
c < a < b | |
b,c < a | -1 |
条件 | (a>d)-(a<e) の値 |
---|---|
d,e < a | 1 |
d < a < e | 0 |
e < a < d | |
a < d,e | -1 |
この表から、 a の大きさが3番目のときに限り (a<b)-(a>c)^(a>d)-(a<e)
が 0 になることがわかります。
LV2の私の面白コード
上記のような経緯のため提出はしませんでしたが、私の考えた面白いコードです。
f=Math.min,-f(-f(a,b,c),-f(a,b,d),-f(a,b,e),-f(a,c,d),-f(a,c,e),-f(a,d,e),-f(b,c,d),-f(b,c,e),-f(b,d,e),-f(c,d,e))
114文字です。 -f()
だけで答えを求めています。