implement keypad ABC

This commit is contained in:
2025-09-08 12:11:29 -05:00
parent 6c07d62cbe
commit aa2e949938
117 changed files with 509 additions and 8230 deletions

View File

@@ -1,45 +1,34 @@
import random
import pytest
from src.evilkode import Evilkode, Observation
from src.keypad import Keypad
from src.evilnkode import EvilNKode
from src.keypad.keypad import (
RandomShuffleKeypad,
)
from src.utils import observations
@pytest.fixture
def observations(number_of_keys, properties_per_key, passcode_len):
k = number_of_keys
p = properties_per_key
n = passcode_len
nkode = [random.randint(0, k*p-1) for _ in range(n)]
keypad = Keypad.new_keypad(k, p)
def obs_gen():
for _ in range(100): # finite number of yields
yield Observation(
keypad=keypad.keypad.copy(),
key_selection=keypad.key_entry(target_passcode=nkode)
)
keypad.split_shuffle()
return obs_gen()
def passcode(number_of_keys, properties_per_key, passcode_len):
return [random.randint(0, number_of_keys * properties_per_key - 1) for _ in range(passcode_len)]
@pytest.mark.parametrize(
"number_of_keys, properties_per_key, passcode_len",
[
(5, 3, 4), # Test case 1
(5, 4, 4), # Test case 1
(10, 5, 6), # Test case 2
(8, 4, 5), # Test case 3
(8, 4, 5), # Test case 3
]
)
def test_evilkode(number_of_keys, properties_per_key, passcode_len, observations):
evilkode = Evilkode(
observations=observations,
def test_evilkode(number_of_keys, properties_per_key, passcode_len, passcode):
keypad = RandomShuffleKeypad.new_keypad(number_of_keys, properties_per_key)
obs = observations(passcode, keypad)
evilkode = EvilNKode(
observations=obs,
number_of_keys=number_of_keys,
properties_per_key=properties_per_key,
passcode_len=passcode_len,
)
evilout = evilkode.run()
assert evilout.iterations_to_break > 1