That makes more sense; I didn't think Perl was as slow as he claimed.
You can even get a similarly-structured program in C with macro abuse and C99's compound literals:
#include <stdio.h>
#define NUMARGS(...) (sizeof((int[]){__VA_ARGS__}) / sizeof(int))
#define FOR_EACH_DIGIT(v) for (int v = 0; v < 10; v++)
#define EXCEPT(v, ...) if (in(v, (int[]){__VA_ARGS__}, NUMARGS(__VA_ARGS__))) continue
#define FOR_EACH_DIGIT_EXCEPT(v, ...) FOR_EACH_DIGIT(v) { EXCEPT(v, __VA_ARGS__);
#define TEN(...) ten((int[]){__VA_ARGS__}, NUMARGS(__VA_ARGS__))
int in(int v, int a[], int n) {
for (int i = 0; i < n; i++) if (a[i] == v) return 1;
return 0;
}
int ten(int a[], int n) {
int v = 0;
for (int i = 0; i < n; i++) v = v * 10 + a[i];
return v;
}
int main() {
FOR_EACH_DIGIT_EXCEPT(s, 0)
FOR_EACH_DIGIT_EXCEPT(e, s)
FOR_EACH_DIGIT_EXCEPT(n, s, e)
FOR_EACH_DIGIT_EXCEPT(d, s, e, n)
FOR_EACH_DIGIT_EXCEPT(m, 0, s, e, n, d)
FOR_EACH_DIGIT_EXCEPT(o, s, e, n, d, m)
FOR_EACH_DIGIT_EXCEPT(r, s, e, n, d, m, o)
FOR_EACH_DIGIT_EXCEPT(y, s, e, n, d, m, o, r)
int send = TEN(s, e, n, d), more = TEN(m, o, r, e), money = TEN(m, o, n, e, y);
if (send + more == money) printf("%d + %d = %d\n", send, more, money);
}}}}}}}}
return 0;
}
Definitely not idiomatic C, but at least it's fast (0.07 seconds).