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.hashCodeMethode 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, returnetc. sind in Ordnung.
YESNO, um nach dieser bestimmten Ausnahme zu suchen.