]> mj.ucw.cz Git - misc.git/blob - parens.c
Ursary: Map of controls
[misc.git] / parens.c
1 #include <stdio.h>
2
3 int isprime(int i)
4 {
5         int j=2;
6         while (j*j <= i) {
7                 if (!(i%j)) return 0;
8                 j++;
9         }
10         return 1;
11 }
12
13 int nextprime(int i)
14 {
15         while (!isprime(++i))
16                 ;
17         return i;
18 }
19
20 void enc(int i)
21 {
22         if (!i) putchar('.');
23         else {
24                 putchar('(');
25                 int j=1;
26                 while (i > 1) {
27                         j = nextprime(j);
28                         int k=0;
29                         while (!(i%j))
30                                 i/=j, k++;
31                         enc(k);
32                 }
33                 putchar(')');
34         }
35 }
36
37 int dec(void)
38 {
39         int j=1, k=1;
40         int c=getchar();
41         if (c == '.') return 0;
42         if (c != '(') exit(1);
43         while ((c = getchar()) != ')') {
44                 ungetc(c, stdin);
45                 j = nextprime(j);
46                 int l = dec();
47                 while (l--)
48                         k *= j;
49         }
50         return k;
51 }
52
53 int main(int argc, char **argv)
54 {
55         if (argc > 1 && !strcmp(argv[1], "-e")) {
56                 int i;
57                 scanf("%d", &i);
58                 enc(i);
59                 putchar('\n');
60         } else {
61                 int i = dec();
62                 printf("%d\n", i);
63         }
64         return 0;
65 }