63
6
This Code Golf was inspired by the recent Daily WTF article You Can't Handle the True!, which features a string comparison written as:
String yes = "YES";
if ((delay.hashCode()) == yes.hashCode())
Imagine the trouble it would have caused for Steve's team if Java's String.hashCode method just happened to be implemented in a way that "YES".hashCode() == "NO".hashCode(). So, the challenge I propose here is:
Write, in as few characters as possible, a hash function (I'll call it
h) with a string parameter and integer return value, such thath("YES")is equal toh("NO").
Of course, this would be trivial to do with a function like def h(s): return 0, which makes a hash collision for every string. To make this challenge more interesting, you must abide by the following additional rule:
Of the other 18 277 possible strings consisting of three or fewer uppercase ASCII letters (
^[A-Z]{0,3}$), there must be no hash collisions.
Clarification (pointed out by Heiko Oberdiek): The input string may contain characters other than A-Z, and your code must be able to hash arbitrary strings. (You may, however, assume that the input is a character string rather than a null pointer or an object of some other data type.) However, it does not matter what the return value is for strings that do not match ^[A-Z]{0,3}$, as long as it's an integer.
Furthermore, to obfuscate the intent of this function:
Your code must not include any of the letters 'Y', 'E', 'S', 'N', or 'O' (in either upper- or lowercase) within character or string literals.
Of course, this restriction doesn't apply to language keywords, so else, return, etc. are fine.
4It kind of doesn't help that we can still use the numeric ASCII values of
YESNOto check for this specific exception. – Joe Z. – 2014-04-25T02:22:48.3231
Reading the article one can't not remember the "for reasons" comic: http://threewordphrase.com/pardonme.gif
– Antonio Ragagnin – 2014-04-26T10:46:05.890