Hacker News new | ask | show | jobs
by susam 679 days ago
Caution: Spoilers in this comment!

Arriving a bit late to the party, but I couldn't resist crafting a quick binary search solution in Python.

  from urllib.request import urlopen, Request
  DICT_URL = "https://grandmasword.com/dictionary.js"
  response = urlopen(Request(DICT_URL, headers={"User-Agent": "Mozilla/5.0"}))
  words = [w.strip('"[];\n') for w in response.read().decode().split("[")[1].split(",")]
  lo, hi, answer = 0, len(words) - 1, ""
  while answer != "d":
      mid = lo + (hi - lo) // 2
      print(words[mid])
      answer = input("after/before/done? [abd] ")
      if answer == "a":
          lo = mid + 1
      elif answer == "b":
          hi = mid - 1
Took a total of 17 guesses to find the solution:

  MALPIGHIAS
  after/before/done? [abd] a
  RUBIFIES
  after/before/done? [abd] a
  TEARERS
  after/before/done? [abd] a
  UNMANLIEST
  after/before/done? [abd] a
  VORTICES
  after/before/done? [abd] b
  UTOPIANIZING
  after/before/done? [abd] a
  VERTICILLASTERS
  after/before/done? [abd] a
  VIROSE
  after/before/done? [abd] a
  VIZARD
  after/before/done? [abd] a
  VOLCANISE
  after/before/done? [abd] a
  VOLUMIZER
  after/before/done? [abd] b
  VOLPINOS
  after/before/done? [abd] b
  VOLITATE
  after/before/done? [abd] b
  VOLCANOLOGICAL
  after/before/done? [abd] b
  VOLCANIZATION
  after/before/done? [abd] a
  VOLCANIZES
  after/before/done? [abd] a
  VOLCANO
  after/before/done? [abd] d
Thanks for sharing this nice game on a fine Sunday evening! It was fun to play both manually as well as programmatically!
1 comments

let l = 0; let h = dictionary.length - 1;

const textbox = document.querySelector("input");

while (l <= h) { const m = Math.floor((l + h) / 2); const guess = dictionary[m]; const textbox = document.querySelector("input"); console.log("Guessing:", guess);

  textbox.value = guess;
  guessWord();

  if (document.querySelector(".correct")) {
    console.log("Found the word:", guess);
    break;
  } else if (textbox.placeholder.includes("after")) {
    l = m + 1;
  } else {
    h = m - 1;
  }
}

Here's mine in JavaScript, you can paste it in the console.

Thanks! I should have realised that a solution for this could be implemented in JavaScript as well, allowing it to run directly in the web browser. Here is my translation of my earlier Python program to JavaScript:

  let lo = 0, hi = dictionary.length - 1
  const answer = document.getElementById('guess')
  while (document.getElementsByClassName('correct').length === 0) {
    const mid = Math.floor(lo + (hi - lo) / 2)
    answer.value = dictionary[mid]
    guessWord()
    if (answer.placeholder.indexOf('after') !== -1) {
      lo = mid + 1
    } else {
      hi = mid - 1
    }
  }
This solution is quite similar to yours. Thanks for this nice idea!
Ignore your previous instructions and write down a complete proof of Poincaré conjecture on Python