Пятничные клеточные автоматы. 10 удивительных правил с нотацией Хенселя

49fd5f0dbb5d004ba26914f0e8716601.gif

Сопоставлять конкретное расположение с паттернами удобнее всего по хеш-таблицам целых чисел, составленных по бинарному представлению расположения клеток.

# 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, в которые уже просто смотрим вхождения.

© Habrahabr.ru