Este Code Golf se inspiró en el reciente artículo del Daily WTF ¡ No puedes manejar lo verdadero! , que presenta una comparación de cadenas escrita como:
String yes = "YES";
if ((delay.hashCode()) == yes.hashCode())
Imagine el problema que le habría causado al equipo de Steve si el String.hashCode
método de Java se implementara de una manera tal "YES".hashCode() == "NO".hashCode()
. Entonces, el desafío que propongo aquí es:
Escriba, en la menor cantidad de caracteres posible, una función hash (la llamaré
h
) con un parámetro de cadena y un valor de retorno entero, tal queh("YES")
sea igual ah("NO")
.
Por supuesto, esto sería trivial con una función como def h(s): return 0
, que genera una colisión hash para cada cadena. Para hacer este desafío más interesante, debe cumplir con la siguiente regla adicional:
De los otros 18 277 cuerdas posibles que constan de tres o menos letras mayúsculas (ASCII
^[A-Z]{0,3}$
), tiene que haber no hay colisiones hash.
Aclaración (señalado por Heiko Oberdiek): la cadena de entrada puede contener caracteres que no sean A-Z
, y su código debe ser capaz de codificar cadenas arbitrarias. (Sin embargo, puede suponer que la entrada es una cadena de caracteres en lugar de un puntero nulo o un objeto de algún otro tipo de datos). Sin embargo, no importa cuál sea el valor de retorno para las cadenas que no coinciden ^[A-Z]{0,3}$
, siempre que Es un número entero.
Además, para ofuscar la intención de esta función:
Su código no debe incluir ninguna de las letras 'Y', 'E', 'S', 'N' u 'O' (en mayúsculas o minúsculas) dentro de caracteres o literales de cadena.
Por supuesto, esta restricción no se aplica a las palabras reservadas, por lo que else
, return
, etc están muy bien.
YESNO
para verificar esta excepción específica.