このコードゴルフは、最近のDaily WTFの記事「You Ca n't Can the True!」に触発されました!、次のように記述された文字列比較を備えています。
String yes = "YES";
if ((delay.hashCode()) == yes.hashCode())
JavaのString.hashCode
メソッドがたまたまJavaのメソッドが次のように実装された場合、Steveのチームに生じたトラブルを想像してください"YES".hashCode() == "NO".hashCode()
。したがって、ここで提案する課題は次のとおりです。
(私はそれを呼び出すよ、できるだけ少ない文字数で、ハッシュ関数を書く
h
ように、文字列パラメータと整数戻り値で)h("YES")
に等しいですh("NO")
。
もちろん、これはdef h(s): return 0
、すべての文字列に対してハッシュ衝突を発生させるのような関数で行うのは簡単です。この課題をさらに面白くするには、次の追加規則を順守する必要があります。
3つ以下の大文字のASCII文字()で構成される他の 18 277の可能な文字列のうち、ハッシュの衝突が発生して
^[A-Z]{0,3}$
はなりません。
明確化(Heiko Oberdiekが指摘):入力文字列には以外の文字が含まれている場合がA-Z
あり、コードは任意の文字列をハッシュできる必要があります。(ただし、入力がいることを仮定してもよいです文字列ではなくNULLポインタまたは他のいくつかのデータ型のオブジェクト。)しかし、戻り値が一致しない文字列を何のためにあるのかは重要ではありません^[A-Z]{0,3}$
限り、整数です。
さらに、この関数の意図をわかりにくくするには:
コードには、文字または文字列リテラル内に文字「Y」、「E」、「S」、「N」、または「O」(大文字または小文字)を含めないでください。
もちろん、この制限は、言語のキーワードには適用されませんのでelse
、return
など細かいです。
YESNO
この特定の例外をチェックするためにASCIIの数値を使用できることは、何の役にも立ちません。