이 코드 골프는 최근 일일 WTF 기사 인 You ca n't handle the true! 에서 영감을 얻었습니다 . 다음과 같이 작성된 문자열 비교 기능이 있습니다.
String yes = "YES";
if ((delay.hashCode()) == yes.hashCode())
Java의 String.hashCode
메소드가 방금 구현 된 방식으로 스티브의 팀에게 야기 된 문제를 상상해보십시오 "YES".hashCode() == "NO".hashCode()
. 그래서 여기서 제안하는 과제는 다음과 같습니다.
h
문자열 매개 변수와 정수 반환 값을 사용하여 가능한 한 적은 수의 문자로 해시 함수h("YES")
를 작성h("NO")
합니다.
물론 이것은 모든 문자열에 def h(s): return 0
해시 충돌을 일으키는 같은 함수와 관련이 있습니다. 이 도전을 더 재미있게하려면 다음 추가 규칙을 따라야합니다.
의 다른 세 이하의 대문자 ASCII 문자 (구성된 18 277 가능한 문자열
^[A-Z]{0,3}$
)이 없어야합니다 더 해시 충돌.
설명 (Heiko Oberdiek에서 지적) : 입력 문자열에 이외의 문자가 포함될 수 있으며 A-Z
코드에서 임의의 문자열을 해시 할 수 있어야합니다 . (당신은, 그러나, 입력이 있다고 가정 할 수 있습니다 문자열이 아닌 널 포인터 또는 다른 데이터 형식의 목적은.) 그러나,이 반환 값이 일치하지 않는 문자열이 무엇인지는 중요하지 않습니다 ^[A-Z]{0,3}$
만큼, 정수입니다.
또한이 기능의 의도를 혼란스럽게하려면 :
코드는 문자 또는 문자열 리터럴 내에 'Y', 'E', 'S', 'N'또는 'O'(대문자 또는 소문자)를 포함해서는 안됩니다.
물론,이 제한은 언어 키워드에 적용되지 않으므로 else
, return
등 정상입니다.
YESNO
이 특정 예외를 확인하기 위해 숫자 ASCII 값을 계속 사용할 수는 없습니다 .