読者です 読者をやめる 読者になる 読者になる

『3番目のダンジョン』私の解答

CodeIQ

テンプレ

この問題(に限らずダンジョンシリーズ)の面白いところは、定められた文字数制限と使用禁止文字列を満たす 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() だけで答えを求めています。