Questo Code Golf è stato ispirato dal recente articolo del Daily WTF You Can't Handle the True! , che presenta un confronto di stringhe scritto come:
String yes = "YES";
if ((delay.hashCode()) == yes.hashCode())
Immagina il problema che avrebbe causato al team di Steve se il String.hashCode
metodo Java fosse stato implementato in quel modo "YES".hashCode() == "NO".hashCode()
. Quindi, la sfida che propongo qui è:
Scrivi, nel minor numero di caratteri possibile, una funzione hash (la chiamerò
h
) con un parametro stringa e un valore di ritorno intero, tale cheh("YES")
sia uguale ah("NO")
.
Naturalmente, questo sarebbe banale a che fare con una funzione simile def h(s): return 0
, che provoca una collisione hash per ogni stringa. Per rendere questa sfida più interessante, devi rispettare la seguente regola aggiuntiva:
Degli altri 18 277 possibili stringhe composte da tre o meno lettere maiuscole ASCII (
^[A-Z]{0,3}$
), ci deve essere nessun collisioni hash.
Chiarimento (sottolineato da Heiko Oberdiek): la stringa di input può contenere caratteri diversi da A-Z
e il codice deve essere in grado di eseguire l'hashing di stringhe arbitrarie. (Tuttavia, è possibile supporre che l'input sia una stringa di caratteri anziché un puntatore null o un oggetto di qualche altro tipo di dati.) Tuttavia, non importa quale sia il valore restituito per le stringhe che non corrispondono ^[A-Z]{0,3}$
, purché è un numero intero.
Inoltre, per offuscare l'intento di questa funzione:
Il codice non deve includere nessuna delle lettere "Y", "E", "S", "N" o "O" (maiuscole o minuscole) all'interno dei caratteri letterali o di stringa.
Naturalmente, questa restrizione non si applica alle parole chiave del linguaggio, così else
, return
ecc vanno bene.
YESNO
per verificare questa specifica eccezione.