import board
import keypad
import digitalio as dio
from time import sleep
btn0_pin = board.GP15
btn1_pin = board.GP14
led0_pin = board.GP16
led1_pin = board.GP17
led0 = dio.DigitalInOut(led0_pin)
led0.direction = dio.Direction.OUTPUT
led1 = dio.DigitalInOut(led1_pin)
led1.direction = dio.Direction.OUTPUT
keys = keypad.Keys((btn0_pin, btn1_pin), value_when_pressed=False, pull=True)
print("Aaronson's Oracle")
model = {}
input_stream = ""
success = ""
def update_model(fivegram, letter):
if fivegram not in model:
model[fivegram] = {"0": 0, "1": 0}
model[fivegram][letter] += 1
def predict_next_letter(fivegram):
if fivegram not in model:
return "0"
m = model[fivegram]
if m["0"] > m["1"]:
return "0"
return "1"
while True:
event = keys.events.get()
if event and event.pressed:
# print(event.key_number)
letter = str(event.key_number)
fivegram = input_stream[-5:]
prediction = predict_next_letter(fivegram)
if prediction == "0":
led0.value = 1
led1.value = 0
if prediction == "1":
led0.value = 0
led1.value = 1
print(f"predicted: {prediction}, observed: {letter}")
update_model(fivegram, letter)
input_stream += letter
if prediction == letter:
success += "1"
else:
success += "0"
curr_success = success[-20:]
success_ratio = curr_success.count("1") / 20
print(f"Success ratio: {success_ratio}")