Ten kod golfowy został zainspirowany najnowszym artykułem Daily WTF, którego nie możesz poradzić sobie z prawdą! , który zawiera porównanie ciągów napisane jako:
String yes = "YES";
if ((delay.hashCode()) == yes.hashCode())
Wyobraź sobie kłopoty, jakie spowodowałoby to dla zespołu Steve'a, gdyby String.hashCode
metoda Java została zaimplementowana w taki sposób "YES".hashCode() == "NO".hashCode()
. Wyzwanie, które proponuję tutaj, to:
Napisz,
h
używając jak najmniej znaków, funkcję skrótu (nazywam ją ) z parametrem ciągu i wartością zwracaną liczby całkowitej, którah("YES")
jest równah("NO")
.
Oczywiście byłoby to trywialne w przypadku funkcji typu def h(s): return 0
, która powoduje kolizję skrótu dla każdego łańcucha. Aby uczynić to wyzwanie bardziej interesującym, musisz przestrzegać następującej dodatkowej zasady:
Spośród pozostałych 18 277 możliwych ciągów składających się z trzech lub mniej wielkich liter ASCII (
^[A-Z]{0,3}$
), musi istnieć żadne kolizje hash.
Wyjaśnienie (wskazane przez Heiko Oberdiek): Łańcuch wejściowy może zawierać znaki inne niż A-Z
, a Twój kod musi mieć możliwość mieszania dowolnych ciągów. (Można jednak założyć, że dane wejściowe to ciąg znaków, a nie wskaźnik zerowy lub obiekt innego typu danych.) Jednak nie ma znaczenia, jaka jest wartość zwracana dla ciągów, które nie pasują ^[A-Z]{0,3}$
, o ile to liczba całkowita.
Ponadto, aby zaciemnić cel tej funkcji:
Kod nie może zawierać żadnej litery „Y”, „E”, „S”, „N” lub „O” (wielkimi lub małymi literami) w literałach znaków lub ciągów.
Oczywiście, ograniczenie to nie ma zastosowania do słów kluczowych językowych, tak else
, return
itp są w porządku.
YESNO
celu sprawdzenia tego konkretnego wyjątku.