Join the discussion

Write your take first — we'll ask for email only when you're ready to publish.

  • Hacker News
  • Woah, neat. Is this like, a Markov chain?
  • a variation of Aaronson Oracle
  • 46 and that was my ceiling. frogs smarter than me.
  • plot twist: there is no frog, it's all your internal biases (what you do after success/failure)
  • Curious how a couple people got >100 hits on 100 punches
  • some people went on to explore the code limits, hehe. it's been fixed
  • By the way, there is an ios app: https://apps.apple.com/app/id6755528165
  • Would be fairer if the frog occasionally got to throw a punch or two...
  • On my todo list: when the frog wins, it runs towards you and knocks you out, haha
  • In the first round I struggled to notice if I missed. The frog punching back would be a good indicator. And I wouldn't feel so guilty for punching a pacifist frog.
    by pjio
  • That was fun, got up to 79 :)
  • practice mode? the record for ranked matches is 64
  • I once coded a rock-paper-scissors game that you can play against a tree based matcher/learner, with symmetry between the options accounted for. Pretty similar idea-wise. To be honest, it was pretty hard to get a better than random score.
  • If you want to see what a random distribution looks like:

      jot -r 100 0 1 | rs -t 10
    
    I noticed my "fake randomness" is lacking long sequences of the same key. I feel like I'm "predictable" when I press the same key 5 times in a row, yet that happens a lot in a truly random distribution.
  • With Brain Frog I went even further - it doesn't actually check L/R. Instead, it checks what you do after a landed/blocked punch (some people tend to switch after a block, others insist on hitting the same side until they land a hit).
  • I am briefly in the top ten after completely misunderstanding the rules nicee
  • what's your score?
  • The ultimate unpredictability.
  • You should make one where you can play against the branch predictors of various processors.
  • I was just about to comment the same! Sadly, branch predictors are incredibly well guarded secrets, mostly.
    by rllj
  • pure random player:

      (async function(punch, delay) {
        async function sleep(ms) {
          return new Promise((resolve, _) => {
            setTimeout(resolve, ms)
          })
        }
        
        for (let i = 0; i < 100; i++) {
          punch(['L', 'R'][(Math.random() * 2) | 0])
          await sleep(delay)
        }
      })(punch, 150)
      
    "cheating" player:

      (async function(oracle, punch, delay) {
        async function sleep(ms) {
          return new Promise((resolve, _) => {
            setTimeout(resolve, ms)
          })
        }
        
        for (let i = 0; i < 100; i++) {
          punch((i + 1) < oracle.minForPrediction ? ['L', 'R'][(Math.random() * 2) | 0] : oracle.predictNextPunch() === 'L' ? 'R' : 'L')
          
          await sleep(delay)
        }
      })(oracle, punch, 150)
    
    
    is it possible to do any better? i haven't fully read frog/oracle code
  • it is:

      (async function(oracle, punch, delay) {
        async function sleep(ms) {
          return new Promise((resolve, _) => {
            setTimeout(resolve, ms)
          })
        }
        
        for (let i = 0; i < 100; i++) {
          const state = oracle._state
          const block = oracle.predictNextPunch()
          oracle._state = state
          
          punch(block === 'L' ? 'R' : 'L')
          
          await sleep(delay)
        }
      })(oracle, punch, 150)
  • Less fancy hack here, intercept the prediction function on every punch and force the frog to take the opposite side. const realPunch = punch;

    punch = function(myMove) {

      oracle.predictNextPunch = function() {
        return myMove === 'L' ? 'R' : 'L'; 
      };
      
      realPunch(myMove);
    };
  • I got 50 hits in 100 tries. That being said, I did not particularly like hitting that poor frog :'( Yes, I am the kind of player who would never choose the rude option when talking to an NPC.