กอล์ฟรหัสนี้ได้แรงบันดาลใจจากบทความ WTF รายวันล่าสุดที่คุณไม่สามารถจัดการได้จริง! ซึ่งมีการเปรียบเทียบสตริงที่เขียนเป็น:
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
ซึ่งจะทำให้การปะทะกันแฮสำหรับทุกสตริง เพื่อให้การท้าทายนี้น่าสนใจยิ่งขึ้นคุณต้องปฏิบัติตามกฎเพิ่มเติมต่อไปนี้:
ในบรรดาสตริงอื่น ๆ ที่เป็นไปได้ 18 277 อันประกอบด้วยตัวอักษร ASCII ตัวพิมพ์ใหญ่สามตัวหรือน้อยกว่า
^[A-Z]{0,3}$
นั้นจะต้องไม่มีการชนกันของแฮช
การชี้แจง (ชี้ให้เห็นโดย Heiko Oberdiek): สตริงอินพุตอาจมีอักขระอื่นที่ไม่ใช่A-Z
และรหัสของคุณจะต้องสามารถแฮชสตริงโดยพลการ (อย่างไรก็ตามคุณอาจสมมติว่าอินพุตเป็นสตริงอักขระแทนที่จะเป็นตัวชี้โมฆะหรือวัตถุของชนิดข้อมูลอื่น) อย่างไรก็ตามมันไม่สำคัญว่าค่าส่งคืนจะเป็นสตริงที่ไม่ตรงกัน^[A-Z]{0,3}$
ตราบใดที่ มันเป็นจำนวนเต็ม
นอกจากนี้เพื่อทำให้งงงวยความตั้งใจของฟังก์ชั่นนี้:
รหัสของคุณจะต้องไม่มีตัวอักษร 'Y', 'E', 'S', 'N' หรือ 'O' ใด ๆ (ทั้งตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก) ภายในตัวอักษรหรือสตริงตัวอักษร
แน่นอนข้อ จำกัด นี้ใช้ไม่ได้กับคำหลักภาษาดังนั้นelse
, return
ฯลฯ จะมีการปรับ
YESNO
เพื่อตรวจสอบข้อยกเว้นเฉพาะนี้ได้