hash0 3 months ago

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.

escanor 3 months ago

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

  • escanor 3 months ago

    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)
  • emrtnn 3 months ago

    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);

    };

mike_hock 3 months ago

You should make one where you can play against the branch predictors of various processors.

  • rllj 3 months ago

    I was just about to comment the same! Sadly, branch predictors are incredibly well guarded secrets, mostly.

user- 3 months ago

I am briefly in the top ten after completely misunderstanding the rules nicee

  • thih9 3 months ago

    The ultimate unpredictability.

    • freakynit 3 months ago

      "To confuse your enemy, you must first confuse yourself"

        - Some reddit guy
IdiotSavage 3 months ago

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.

  • AlexanderZ 3 months ago

    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).

krussikas 3 months ago

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.

brtkwr 3 months ago

Would be fairer if the frog occasionally got to throw a punch or two...

  • pjio 3 months ago

    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.

  • AlexanderZ 3 months ago

    On my todo list: when the frog wins, it runs towards you and knocks you out, haha

subarctic 3 months ago

Curious how a couple people got >100 hits on 100 punches

  • AlexanderZ 3 months ago

    some people went on to explore the code limits, hehe. it's been fixed

momoraul 3 months ago

46 and that was my ceiling. frogs smarter than me.

  • AlexanderZ 3 months ago

    plot twist: there is no frog, it's all your internal biases (what you do after success/failure)

andai 3 months ago

Woah, neat. Is this like, a Markov chain?

  • AlexanderZ 3 months ago

    a variation of Aaronson Oracle

digitalWestie 3 months ago

Just wanted to give the little guy a hug

jmpavlec 3 months ago

Looks like the leaderboard was hacked unfortunately. Fun little concept.

  • AlexanderZ 3 months ago

    Fixed it. The fun part is there is no real protection against bots/AI and the code works as expected - they EASILY score 100. It's the humans that are too predictable.

jv22222 3 months ago

How many pixels wide is the hit zone?

ramon156 3 months ago

Leaderboard has been overtaken :(

  • AlexanderZ 3 months ago

    Fixed it. Elon Musk had too much time on his hands

vyrotek 3 months ago

Bam! 50 on the first try. Fun.

  • AlexanderZ 3 months ago

    nice! try playing it the first thing every morning, it really wakes up your brain

ozyschmozy 3 months ago

Why does a silly little online game need my email to send a one-time login code? What a strange experience

  • AlexanderZ 3 months ago

    because it doesn't? practice mode requires no login. if you want to play a ranked match then you'll need an account, how else could it work?

    • ozyschmozy 3 months ago

      Practice mode also has a popup telling you what to do which seems to negate the point of the game?

      • AlexanderZ 3 months ago

        it's the coach mode telling you which biases you have so you can fix them in a ranked match

    • applfanboysbgon 3 months ago

      > how else could it work?

      Username+password. There is zero reason to require e-mail for account creation.

      • AlexanderZ 3 months ago

        well, it's a personal preference thing then. I'd rather enter my email quickly and click a link than generate and store a new password for each website in a password manager

uberex 3 months ago

Free?!. Is there a "call us" SSO enabled plan?