Цей 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для перевірки цього конкретного винятку.