Dieser Code Golf wurde von dem kürzlich erschienenen WTF-Artikel " You Can't Handle the True!" Inspiriert. , der einen Zeichenfolgenvergleich enthält, der wie folgt geschrieben wurde:
String yes = "YES";
if ((delay.hashCode()) == yes.hashCode())
Stellen Sie sich die Schwierigkeiten vor, die es für Steves Team verursacht hätte, wenn Javas String.hashCode
Methode einfach so implementiert worden wäre "YES".hashCode() == "NO".hashCode()
. Die Herausforderung, die ich hier vorschlage, ist:
Schreiben Sie in möglichst wenigen Zeichen eine Hash-Funktion (ich nenne sie
h
) mit einem String-Parameter und einem ganzzahligen Rückgabewert, derh("YES")
gleich isth("NO")
.
Das wäre natürlich trivial, wenn es um eine Funktion geht def h(s): return 0
, die für jeden String eine Hash-Kollision erzeugt . Um diese Herausforderung interessanter zu gestalten, müssen Sie die folgenden zusätzlichen Regeln einhalten:
Von den anderen 18 277 möglichen Zeichenfolgen, die aus drei oder weniger ASCII-Großbuchstaben (
^[A-Z]{0,3}$
) bestehen, dürfen keine Hash-Kollisionen vorliegen .
Klarstellung (darauf hingewiesen von Heiko Oberdiek): Die Eingabezeichenfolge kann andere Zeichen als enthalten A-Z
, und Ihr Code muss in der Lage sein, beliebige Zeichenfolgen zu hashen. (Sie können davon ausgehen , jedoch, dass die Eingabe ist eine Zeichenkette , anstatt ein Null - Zeiger oder ein Objekt aus einem anderen Datentyp.) Allerdings ist es egal , was der Rückgabewert für Strings, die nicht übereinstimmen ^[A-Z]{0,3}$
, solange Es ist eine ganze Zahl.
Um die Absicht dieser Funktion zu verschleiern:
Ihr Code darf keine Buchstaben 'Y', 'E', 'S', 'N' oder 'O' (in Groß- oder Kleinbuchstaben) in Zeichen- oder Zeichenfolgenliteralen enthalten.
Natürlich ist diese Beschränkung auf Sprache Schlüsselwörter nicht gelten, so else
, return
etc. sind in Ordnung.
YESNO
, um nach dieser bestimmten Ausnahme zu suchen.