Цей Code Golf був натхненний нещодавньою статтею Daily WTF You Can't Handle True! , який містить порівняння рядків, написане як:
String yes = "YES";
if ((delay.hashCode()) == yes.hashCode())
Уявіть собі проблеми, які могли б заподіяти команді Стіва, якби String.hashCode
метод Java просто був реалізований таким чином "YES".hashCode() == "NO".hashCode()
. Отже, завдання, яке я пропоную тут:
Напишіть якомога менше символів хеш-функцію (я її зателефоную
h
) зі строковим параметром та цілим цільовим значенням повернення, таким, щоh("YES")
дорівнюєh("NO")
.
Звичайно, це було б тривіально з функцією на зразок def h(s): return 0
, яка робить хеш-зіткнення для кожної рядки. Щоб зробити цей виклик цікавішим, ви повинні дотримуватися наступного додаткового правила:
З інших 18 277 можливих рядків , що складаються з трьох або менш великих літер (ASCII
^[A-Z]{0,3}$
), не повинна бути ні одного хеша зіткнення.
Уточнення (вказував Хайко Обердіек): рядок введення може містити інші символи, крім того A-Z
, і ваш код повинен мати можливість хеш-довільних рядків. (Ви можете, однак, припустити, що вхід є символьним рядком, а не нульовим вказівником або об'єктом якогось іншого типу даних.) Однак, не має значення, яке значення повертається для рядків, які не відповідають ^[A-Z]{0,3}$
, до тих пір, це ціле число.
Крім того, для придушення наміру цієї функції:
Ваш код не повинен містити жодної з букв "Y", "E", "S", "N" або "O" (у верхньому або нижньому регістрі) в букве символів або рядків.
Звичайно, це обмеження не поширюється на ключові слова мови, тому else
, return
і т.д. все в порядку.
YESNO
для перевірки цього конкретного винятку.