#include #define NR 486 int data_vec[NR] = { 442,697,1464,700,636,1148,1340,318,311,1337,504,380,249,1566,1333,1594,126, 693,573,633,187,189,63,571,438,250,252,1242,543,377,1805,825,686,1678,476, 1388,373,909,1235,729,1652,467,742,1167,474,1611,1266,378,1734,1351,603,630, 748,1587,1622,1880,374,746,1381,473,965,1626,873,1505,1478,629,462,427,461, 1625,1865,1638,1671,359,869,627,95,1338,683,881,1986,980,207,1205,1396,1621, 1876,190,1607,948,726,1834,972,1386,1705,1579,1814,1702,725,1708,1563,1369, 123,730,235,246,1904,1925,238,1714,429,1209,819,1929,437,1716,756,783,1968, 876,918,1596,1686,621,1748,1992,745,1752,591,559,1614,1295,854,1582,1960, 1896,807,1131,1145,882,814,1740,797,1115,1675,1737,715,732,1331,237,1445, 1227,907,1127,663,1334,1644,1325,1677,1195,1641,119,219,811,874,822,1768, 1450,1799,221,411,821,1382,619,921,1458,1813,1559,350,215,931,1421,1197, 798,1260,1258,1944,1830,1829,1926,739,159,1761,858,1833,1085,365,347,2016, 1642,1481,1254,366,1427,1303,1806,1198,1953,754,1379,917,1699,851,1738,1635, 1415,1862,222,413,1419,1873,1357,1393,1746,1844,606,685,414,978,1954,1745, 407,934,1133,1182,1848,349,845,667,741,485,1820,910,963,1484,1477,441,846, 1731,1118,1206,1139,1436,1475,1508,1490,922,489,1366,1434,996,1690,1079,343, 813,470,2000,1689,857,1683,382,1339,1468,191,890,885,1213,1724,956,127,1597, 445,829,1598,1849,501,1087,254,755,764,1522,892,638,251,1214,762,575,954, 1894,889,1835,1718,506,1905,1721,1466,1401,508,1852,702,733,1465,1898,998, 239,1623,1001,253,247,1327,886,1150,1431,1516,942,1658,1780,1383,431,1269, 1694,1259,695,1016,1395,1267,446,971,1972,1955,351,1957,982,1147,1838,1454, 1143,1459,1657,727,1897,1993,478,1881,1691,477,757,925,1183,1831,1958,1906, 1009,1976,1453,491,223,2008,926,1643,1389,1373,1437,2018,861,1462,1870,1703, 950,1819,1485,923,985,1199,1447,1239,1507,981,1822,1962,1845,1987,1996,1245, 1367,1687,1945,1639,2004,947,731,1435,949,1741,911,1651,967,1867,1710,1927, 607,1754,1273,1493,1398,859,1514,499,1211,1207,1869,919,1941,2001,1884,1821, 1010,1707,1486,1521,1931,1961,623,1461,1735,1497,1528,973,1994,502,1002,749, 1875,1243,1778,2032,758,1595,1012,1491,1335,988,1756,855,1646,1739,875,1837, 381,1645,1846,761,1231,1119,1255,375,1524,1784,1451,1722,1939,367,878,1942, 1843,1261,1359,1747,1423,1807,1772,1877,1483,1513,997,1262}; int over(int n, int k) { long result = 1; for (int i = 1; i <= k; i++, n--) result = result * n / i; return result; } struct { int f, t; } lines[11] = { { 1, 3 }, { 1, 6 }, { 4, 6 }, { 4, 5 }, { 0, 5 }, { 0, 2 }, { 3, 6 }, { 3, 5 }, { 2, 6 }, { 2, 5 }, { 2, 3 }, }; #define HAS_LINE(v,b) (((v) & (1 << (b))) != 0) void calc_properties(int logo_vec, int (*nr_c_points)[7][6], int (*nr_segments)[7]) { int c_points[7] = { 0, 0, 0, 0, 0, 0, 0 }; for (int l = 0; l < 11; l++) if (HAS_LINE(logo_vec,l)) { c_points[lines[l].f]++; c_points[lines[l].t]++; } for (int p = 0; p < 7; p++) (*nr_c_points)[p][c_points[p]]++; int s_points[7] = { 0, 1, 2, 3, 4, 5, 6 }; for (bool change = 1; change; ) { change = false; for (int l = 0; l < 11; l++) if (HAS_LINE(logo_vec, l)) { if (s_points[lines[l].t] > s_points[lines[l].f]) { change = true; s_points[lines[l].t] = s_points[lines[l].f]; } else if (s_points[lines[l].f] > s_points[lines[l].t]) { change = true; s_points[lines[l].f] = s_points[lines[l].t]; } } int nr_s = 0; for (int p = 0; p < 7; p++) if (s_points[p] == p) nr_s++; (*nr_segments)[nr_s]++; } } int logo_nr_diff(int logo_vec1, int logo_vec2) { int diff = 0; for (int l = 0; l < 11; l++) if (HAS_LINE(logo_vec1, l) != HAS_LINE(logo_vec2, l)) diff++; return diff; } int mirror_vec(int vec) { static int mirror_lines[11] = { 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 10 }; int result = 0; for (int l = 0; l < 11; l++) if (HAS_LINE(vec, l)) result |= (1 << mirror_lines[l]); return result; } int nr_lines(int vec) { int nr_l = 0; for (int l = 0; l < 11; l++) if (HAS_LINE(vec, l)) nr_l++; return nr_l; } void analyze(int from, int to, int used) { int nr_c_points[7][6]; int exp_nr_c_points[7][6]; for (int p = 0; p < 7; p++) for (int c = 0; c < 6; c++) { nr_c_points[p][c] = 0; exp_nr_c_points[p][c] = 0; } int nr_segments[7]; int exp_nr_segments[7]; for (int s = 0; s < 7; s++) { nr_segments[s] = 0; exp_nr_segments[s] = 0; } for (int pos_logo_vec = 0; pos_logo_vec < (1 << 11); pos_logo_vec++) if (nr_lines(pos_logo_vec) == used) { calc_properties(pos_logo_vec, &exp_nr_c_points, &exp_nr_segments); } for (int logo = from; logo < to; logo++) calc_properties(data_vec[logo], &nr_c_points, &nr_segments); double f = (to - from)/(double)over(11, used); printf("\n"); for (int p = 0; p < 7; p++) { printf("%d: ", p); for (int c = 0; c < 6; c++) if (exp_nr_c_points[p][c] == 0) printf(" "); else printf(" %5.1lf", nr_c_points[p][c] - f * exp_nr_c_points[p][c]); printf("\n"); } printf("\n"); for (int s = 1; s < 7; s++) if (exp_nr_segments[s] != 0) printf("%d: %d %lf\n", s, nr_segments[s], f * exp_nr_segments[s]); int exp_nr_sym = over(5, 3); int nr_sym = 0; for (int logo1 = from; logo1 < to; logo1++) if (data_vec[logo1] == mirror_vec(data_vec[logo1])) nr_sym++; printf("\n%d %lf\n", nr_sym, f * exp_nr_sym); int nr_diff[12]; int exp_nr_diff[12]; for (int l = 0; l < 12; l++) { nr_diff[l] = 0; exp_nr_diff[l] = 0; } int exp_nr_nr_diff = 0; for (int pos_logo_vec1 = 0; pos_logo_vec1 < (1 << 11); pos_logo_vec1++) if (nr_lines(pos_logo_vec1) == used) { for (int pos_logo_vec2 = pos_logo_vec1+1; pos_logo_vec2 < (1 << 11); pos_logo_vec2++) if (nr_lines(pos_logo_vec2) == used) { exp_nr_diff[logo_nr_diff(pos_logo_vec1, pos_logo_vec2)]++; exp_nr_nr_diff++; } } int nr_nr_diff = 0; for (int logo1 = from; logo1 < to-1; logo1++) for (int logo2 = logo1+1; logo2 < to; logo2++) { nr_diff[logo_nr_diff(data_vec[logo1], data_vec[logo2])]++; nr_nr_diff++; } printf("\n"); f = nr_nr_diff / (double)exp_nr_nr_diff; for (int l = 0; l < 12; l++) if (exp_nr_diff[l] != 0) printf("%2d: %d %lf\n", l, nr_diff[l], f * exp_nr_diff[l]); printf("\n"); for (int l = 0; l < 12; l++) nr_diff[l] = 0; nr_nr_diff = 0; for (int logo = from; logo < to; logo++) { if ((logo % 27) < 26) { nr_diff[logo_nr_diff(data_vec[logo], data_vec[logo+1])]++; nr_nr_diff++; } if (logo + 27 < to) { nr_diff[logo_nr_diff(data_vec[logo], data_vec[logo+27])]++; nr_nr_diff++; } } f = nr_nr_diff / (double)exp_nr_nr_diff; for (int l = 0; l < 12; l++) if (exp_nr_diff[l] != 0) printf("%2d: %d %lf\n", l, nr_diff[l], f * exp_nr_diff[l]); printf("\n"); } int main(int argc, char *argv[]) { int nr_nr[11]; for (int i = 0; i < 11; i++) nr_nr[i] = 0; for (int i = 0; i < NR; i++) { int s = 0; for (int j = 0; j < 11; j++) if (HAS_LINE(data_vec[i], j)) s++; nr_nr[s]++; } for (int i = 0; i < 11; i++) printf("%2d: %3d, %d\n", i, nr_nr[i], over(11, i)); printf("\n"); for (int j = 0; j < 11; j++) { int s = 0; for (int i = 0; i < 270; i++) if (HAS_LINE(data_vec[i], j)) s++; printf("%2d: %3d\n", j, s); } analyze(0, 270, 6); analyze(270, NR, 7); { int nr_diff[12]; int exp_nr_diff[12]; for (int l = 0; l < 12; l++) { nr_diff[l] = 0; exp_nr_diff[l] = 0; } int exp_nr_nr_diff = 0; for (int pos_logo_vec1 = 0; pos_logo_vec1 < (1 << 11); pos_logo_vec1++) if (nr_lines(pos_logo_vec1) == 7) { for (int pos_logo_vec2 = 0; pos_logo_vec2 < (1 << 11); pos_logo_vec2++) if (nr_lines(pos_logo_vec2) == 6) { exp_nr_diff[logo_nr_diff(pos_logo_vec1, pos_logo_vec2)]++; exp_nr_nr_diff++; } } int nr_nr_diff = 0; for (int logo1 = 0; logo1 < 270; logo1++) for (int logo2 = 270; logo2 < NR; logo2++) { nr_diff[logo_nr_diff(data_vec[logo1], data_vec[logo2])]++; nr_nr_diff++; } printf("\n"); double f = nr_nr_diff / (double)exp_nr_nr_diff; for (int l = 0; l < 12; l++) if (exp_nr_diff[l] != 0) printf("%2d: %d %lf\n", l, nr_diff[l], f * exp_nr_diff[l]); printf("\n"); } return 0; }