1 #include <stdio.h>
2 #include <stdlib.h>
3
4 static unsigned char *ptr[100];
5 static int ptrc;
6
7 #define M 256
8
9 static struct
10 {
11 int pos;
12 int cnt;
13 } max[M];
14
15
16 static int active[100];
17 static int activec;
18
19 static int active_pos;
20
21 static void
fill_max(void)22 fill_max(void)
23 {
24 int i, n, b, c, u;
25
26
27 memset(max, 0, sizeof(max));
28
29 for (b = 0; b < 0x800; b++)
30 {
31 c = 0;
32 for (i = 0; i < activec; i++)
33 {
34 for (u = i + 1; u < activec; u++)
35 {
36 if (ptr[active[i]][b] == ptr[active[u]][b])
37 {
38 goto bad;
39 }
40 }
41 c ++;
42 bad:;
43 }
44
45 for (i = 0; i < M; i ++)
46 {
47 if (max[i].cnt < c)
48 {
49 max[i].pos = b;
50 max[i].cnt = c;
51 break;
52 }
53 }
54 }
55 }
56
57 static void
select_max(void)58 select_max(void)
59 {
60 int i, m, c;
61
62 m = max[0].cnt;
63
64 if (max[0].cnt == 1)
65 {
66 printf("no solution!\n");
67 exit(1);
68 }
69 c = 0;
70 for (i = 0; i < M; i++)
71 {
72 if (m == max[i].cnt)
73 {
74 c++;
75 }
76 }
77
78 i = random() % c;
79 active_pos = max[i].pos;
80 printf("0x%03X (%d) ", active_pos, max[i].cnt);
81 }
82
83
84 static void
search_active(void)85 search_active(void)
86 {
87 int i, j, a;
88 int tmpa[100];
89
90
91 a = 0;
92 for (i = 0; i < activec; i++)
93 {
94 for (j = 0; j < activec; j++)
95 {
96 if (i == j)
97 {
98 continue;
99 }
100 if (ptr[active[i]][active_pos] ==
101 ptr[active[j]][active_pos])
102 {
103 tmpa[a] = active[i];
104 a++;
105 break;
106 }
107 }
108 }
109
110 printf("(%d) ", a);
111 for (i = 0; i < activec; i++)
112 {
113 printf("%02X ", ptr[active[i]][active_pos]);
114 }
115
116 printf("\n");
117
118 memcpy(active, tmpa, sizeof(active));
119 activec = a;
120 }
121
122 int
main(int argc,char * argv[])123 main(int argc, char *argv[])
124 {
125 int i, u, b, c;
126 FILE *f;
127
128
129 srandom(time(NULL));
130
131 ptrc = argc - 1;
132
133 /*
134 * read data
135 */
136
137 for (i = 0; i < ptrc; i++)
138 {
139 ptr[i] = malloc(0x800);
140 f = fopen(argv[i + 1], "rb");
141 fread(ptr[i], 1, 0x800, f);
142 fclose(f);
143 active[i] = i;
144 }
145 activec = ptrc;
146
147 while (activec > 0)
148 {
149 fill_max();
150 select_max();
151 search_active();
152 }
153
154 return 0;
155 }
156
157