fork download
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <string.h>
  4.  
  5. typedef struct a {
  6. long t, r, d[3], p[2];
  7. } *A;
  8.  
  9. long *ma(int n) {
  10. return (long*)malloc(n * 4);
  11. }
  12.  
  13. int mv(long *d, long *s, int n) {
  14. long i = 0, _n = (n);
  15. for (; i < _n; ++i) {
  16. d[i] = s[i];
  17. }
  18. }
  19.  
  20. int tr(int r, long *d) {
  21. long z = 1;
  22. long i = 0, _n = (r);
  23. for (; i < _n; ++i) {
  24. z = z * d[i];
  25. }
  26. return z;
  27. }
  28.  
  29. A ga(int t, int r, long *d) {
  30. A z = (A)ma(5 + tr(r, d));
  31. z->t = t, z->r = r, mv(z->d, d, r);
  32. return z;
  33. }
  34.  
  35. A iota(A w) {
  36. long n = *w->p;
  37. A z = ga(0, 1, &n);
  38. long i = 0, _n = (n);
  39. for (; i < _n; ++i) {
  40. z->p[i] = i;
  41. }
  42. return z;
  43. }
  44.  
  45. A plus(A a, A w) {
  46. long r = w->r, *d = w->d, n = tr(r, d);
  47. A z = ga(0, r, d);
  48. long i = 0, _n = (n);
  49. for (; i < _n; ++i) {
  50. z->p[i] = a->p[i] + w->p[i];
  51. }
  52. return z;
  53. }
  54.  
  55. A from(A a, A w) {
  56. long r = w->r - 1, *d = w->d + 1, n = tr(r, d);
  57. A z = ga(w->t, r, d);
  58. mv(z->p, w->p + (n**a->p), n);
  59. return z;
  60. }
  61.  
  62. A box(A w) {
  63. A z = ga(1, 0, 0);
  64. *z->p = (long)w;
  65. return z;
  66. }
  67.  
  68. A cat(A a, A w) {
  69. long an = tr(a->r, a->d), wn = tr(w->r, w->d), n = an + wn;
  70. A z = ga(w->t, 1, &n);
  71. mv(z->p, a->p, an);
  72. mv(z->p + an, w->p, wn);
  73. return z;
  74. }
  75.  
  76. A find(A a, A w) {
  77. }
  78.  
  79. A rsh(A a, A w) {
  80. long r = a->r ? *a->d : 1, n = tr(r, a->p), wn = tr(w->r, w->d);
  81. A z = ga(w->t, r, a->p);
  82. mv(z->p, w->p, wn = n > wn ? wn : n);
  83. if (n -= wn)mv(z->p + wn, z->p, n);
  84. return z;
  85. }
  86.  
  87. A sha(A w) {
  88. A z = ga(0, 1, &w->r);
  89. mv(z->p, w->d, w->r);
  90. return z;
  91. }
  92.  
  93. A id(A w) {
  94. return w;
  95. }
  96.  
  97. A size(A w) {
  98. A z = ga(0, 0, 0);
  99. *z->p = w->r ? *w->d : 1;
  100. return z;
  101. }
  102.  
  103. int pi(int i) {
  104. printf("%d ", i);
  105. }
  106.  
  107. int nl() {
  108. printf("\n");
  109. }
  110.  
  111. int pr(A w) {
  112. long r = w->r, *d = w->d, n = tr(r, d);
  113. long i = 0, _n = (r);
  114. for (; i < _n; ++i) {
  115. pi(d[i]);
  116. }
  117. nl();
  118. if (w->t) {
  119. long i = 0, _n = (n);
  120. for (; i < _n; ++i) {
  121. printf("< ");
  122. pr(w->p[i]);
  123. }
  124. } else {
  125. long i = 0, _n = (n);
  126. for (; i < _n; ++i) {
  127. pi(w->p[i]);
  128. }
  129. };
  130. nl();
  131. }
  132.  
  133. char vt[] = "+{~<#,";
  134.  
  135. A (*vd[])() = {0, plus, from, find, 0, rsh, cat},
  136. (*vm[])() = {0, id, size, iota, box, sha, 0};
  137.  
  138. long st[26];
  139.  
  140. int qp(int a) {
  141. return a >= 'a' && a <= 'z';
  142. }
  143.  
  144. int qv(int a) {
  145. return a < 'a';
  146. }
  147.  
  148. A ex(long *e) {
  149. long a = *e;
  150. if (qp(a)) {
  151. if (e[1] == '=')
  152. return st[a - 'a'] = ex(e + 2);
  153. a = st[ a - 'a'];
  154. }
  155. return qv(a) ? (*vm[a])(ex(e + 1)) : e[1] ? (*vd[e[1]])(a, ex(e + 2)) : (A)a;
  156. }
  157.  
  158. int noun(int c) {
  159. A z;
  160. if (c < '0' || c > '9')
  161. return 0;
  162. z = ga(0, 0, 0);
  163. *z->p = c - '0';
  164. return z;
  165. }
  166.  
  167. int verb(int c) {
  168. long i = 0;
  169. for (; vt[i];)
  170. if (vt[i++] == c)
  171. return i;
  172. return 0;
  173. }
  174.  
  175. long *wd(char *s) {
  176. long a, n = strlen(s), *e = ma(n + 1);
  177. char c;
  178. long i = 0, _n = (n);
  179. for (; i < _n; ++i) {
  180. e[i] = (a = noun(c = s[i])) ? a : (a = verb(c)) ? a : c;
  181. }
  182. e[n] = 0;
  183. return e;
  184. }
  185.  
  186. int main() {
  187. char s[99];
  188. while (gets(s))
  189. pr(ex(wd(s)));
  190. return 0;
  191. }
  192.  
  193.  
Success #stdin #stdout 0.01s 1676KB
stdin
Standard input is empty
stdout
Standard output is empty