Пятничные клеточные автоматы. 10 удивительных правил с нотацией Хенселя
Сопоставлять конкретное расположение с паттернами удобнее всего по хеш-таблицам целых чисел, составленных по бинарному представлению расположения клеток.
# 0 1 2
# 3 • 4
# 5 6 7
hensel_str = { # живые клетки в исходных паттернах
'': {'0': '', '8': '01234567'},
'c': {'1': '0', '2': '02', '3': '025', '4': '0257', '5': '13467', '6': '134567', '7': '1234567'},
'e': {'1': '1', '2': '13', '3': '134', '4': '1346', '5': '02567', '6': '024567', '7': '0234567'},
'k': {'2': '04', '3': '046', '4': '0236', '5': '12357', '6': '123567'},
'a': {'2': '01', '3': '013', '4': '0124', '5': '24567', '6': '234567'},
'i': {'2': '16', '3': '012', '4': '0234', '5': '34567', '6': '023457'},
'n': {'2': '07', '3': '024', '4': '0125', '5': '13567', '6': '123456'},
'y': {'3': '026', '4': '0245', '5': '13457'},
'q': {'3': '017', '4': '0137', '5': '23456'},
'j': {'3': '014', '4': '0146', '5': '23567'},
'r': {'3': '016', '4': '0134', '5': '23457'},
't': {'4': '0126'},
'w': {'4': '0147'},
'z': {'4': '0167'},
}
hensel_int = { # результирующие int'ы с поворотами и отражениями паттернов
'': {'0': {0}, '8': {255}},
'c': {
'1': {1, 4, 32, 128},
'2': {5, 33, 132, 160},
'3': {37, 133, 161, 164},
'4': {165},
'5': {91, 94, 122, 218},
'6': {95, 123, 222, 250},
'7': {127, 223, 251, 254},
},
'e': {
'1': {2, 8, 16, 64},
'2': {10, 18, 72, 80},
'3': {26, 74, 82, 88},
'4': {90},
'5': {167, 173, 181, 229},
'6': {175, 183, 237, 245},
'7': {191, 239, 247, 253},
},
'k': {
'2': {12, 17, 34, 48, 65, 68, 130, 136},
'3': {50, 76, 81, 138},
'4': {51, 77, 85, 113, 142, 170, 178, 204},
'5': {117, 174, 179, 205},
'6': {119, 125, 187, 190, 207, 221, 238, 243},
},
'a': {
'2': {3, 6, 9, 20, 40, 96, 144, 192},
'3': {11, 22, 104, 208},
'4': {15, 23, 43, 105, 150, 212, 232, 240},
'5': {47, 151, 233, 244},
'6': {63, 111, 159, 215, 235, 246, 249, 252},
},
'i': {
'2': {24, 66},
'3': {7, 41, 148, 224},
'4': {29, 99, 184, 198},
'5': {31, 107, 214, 248},
'6': {189, 231},
},
'n': {
'2': {36, 129},
'3': {13, 21, 35, 97, 134, 168, 176, 196},
'4': {39, 45, 135, 149, 169, 180, 225, 228},
'5': {59, 79, 87, 121, 158, 220, 234, 242},
'6': {126, 219},
},
'y': {
'3': {49, 69, 140, 162},
'4': {53, 101, 141, 163, 166, 172, 177, 197},
'5': {93, 115, 186, 206},
},
'q': {
'3': {38, 44, 52, 100, 131, 137, 145, 193},
'4': {54, 108, 139, 209},
'5': {62, 110, 118, 124, 155, 203, 211, 217},
},
'j': {
'3': {14, 19, 42, 73, 84, 112, 146, 200},
'4': {58, 78, 83, 89, 92, 114, 154, 202},
'5': {55, 109, 143, 171, 182, 213, 236, 241},
},
'r': {
'3': {25, 28, 56, 67, 70, 98, 152, 194},
'4': {27, 30, 75, 86, 106, 120, 210, 216},
'5': {61, 103, 157, 185, 188, 199, 227, 230},
},
't': {'4': {57, 71, 156, 226}},
'w': {'4': {46, 116, 147, 201}},
'z': {'4': {60, 102, 153, 195}},
}
При обработке конкретного правила мы заполняем хеш-таблицы birth
и survival
соответствующими значениями из hensel_int
, в которые уже просто смотрим вхождения.