Este Code Golf foi inspirado no recente artigo do Daily WTF, You Can't Handle the True! , que apresenta uma comparação de cadeias escrita como:
String yes = "YES";
if ((delay.hashCode()) == yes.hashCode())
Imagine o problema que teria causado à equipe de Steve se o String.hashCode
método de Java fosse implementado de uma maneira assim "YES".hashCode() == "NO".hashCode()
. Então, o desafio que proponho aqui é:
Escreva, no menor número de caracteres possível, uma função hash (eu a chamarei
h
) com um parâmetro de string e um valor de retorno inteiro, de modo queh("YES")
seja igual ah("NO")
.
Obviamente, isso seria trivial para uma função como def h(s): return 0
, que faz uma colisão de hash para cada string. Para tornar esse desafio mais interessante, você deve respeitar a seguinte regra adicional:
Dos outros 18 277 cordas possíveis constituídos por três ou menos letras maiúsculas (ASCII
^[A-Z]{0,3}$
), deve haver nenhum colisões de hash.
Esclarecimento (apontado por Heiko Oberdiek): A sequência de entrada pode conter caracteres diferentes de A-Z
, e seu código deve ser capaz de hash seqüências arbitrárias. (No entanto, você pode supor que a entrada seja uma cadeia de caracteres em vez de um ponteiro nulo ou um objeto de outro tipo de dados.) No entanto, não importa qual é o valor de retorno para cadeias que não coincidem ^[A-Z]{0,3}$
, desde que é um número inteiro.
Além disso, ofuscar a intenção desta função:
Seu código não deve incluir nenhuma das letras 'Y', 'E', 'S', 'N' ou 'O' (em maiúsculas ou minúsculas) entre caracteres literais ou caracteres.
Claro, esta restrição não se aplica ao idioma palavras-chave, assim else
, return
, etc. são muito bem.
YESNO
para verificar esta exceção específica.