Этот Code Golf был вдохновлен недавней статьей Daily WTF, « Вы не можете справиться с истиной»! , который показывает сравнение строк, записанное в виде:
String yes = "YES";
if ((delay.hashCode()) == yes.hashCode())
Представьте себе проблему, которую это вызвало бы для команды Стива, если бы String.hashCode
метод Java был реализован таким образом "YES".hashCode() == "NO".hashCode()
. Итак, проблема, которую я предлагаю здесь:
Напишите как можно меньше символов хеш-функции (я ее назову
h
) со строковым параметром и целочисленным возвращаемым значением, таким, чтоh("YES")
равноh("NO")
.
Конечно, это было бы тривиально сделать с функцией like def h(s): return 0
, которая создает хеш-коллизию для каждой строки. Чтобы сделать этот вызов более интересным, вы должны соблюдать следующее дополнительное правило:
Из других 18 277 возможных строк , состоящих из трех или менее заглавных букв (ASCII
^[A-Z]{0,3}$
), не должна быть ни одного хэша столкновения.
Пояснение (на это указывает Heiko Oberdiek): входная строка может содержать символы, отличные от A-Z
, и ваш код должен иметь возможность хешировать произвольные строки. (Тем не менее, вы можете предположить, что ввод является символьной строкой, а не нулевым указателем или объектом какого-либо другого типа данных.) Однако, не имеет значения, какое возвращаемое значение для строк, которые не совпадают ^[A-Z]{0,3}$
, если это целое число
Кроме того, чтобы скрыть намерение этой функции:
Ваш код не должен содержать буквы «Y», «E», «S», «N» или «O» (в верхнем или нижнем регистре) внутри символьных или строковых литералов.
Конечно, это ограничение не распространяется на ключевые слова языка, поэтому else
, return
и т.д. все в порядке.
YESNO
для проверки этого конкретного исключения.