C language is wonderfully profound. After almost 20 years, I still find new ways to (ab-)use it. Here is a little problem:
Define a macro IN(x, set), called as
IN(x, (v0, v1, ..., vn))that expands into an expression
((x) == (v0) || (x) == (v1) || ... (x) == (vn))which evaluates to true iff x is a member of set {v0, ..., vn}, where the type of x and all vs is the same. Alternatively, define a macro IN1(x, ...) that expands to the same expression as IN(x, (...)).
I don't want to spoil the fun for other readers.
ReplyDelete(base64 -d)
----BEGIN SOLUTION----
I2RlZmluZSBGKHgsIHYsIHApICAoeCkgPT0gKHYpIHx8IHAKCi8qIEFSR04oLi4uKSBldmFsdWF0
ZXMgdG8gdGhlIGxpdGVyYWwgbnVtYmVyIG9mIHRoZSBwYXNzZWQtaW4gYXJndW1lbnRzLiAqLwoj
ZGVmaW5lIEFSR05fKF8sXzY0LF82MyxfNjIsXzYxLF82MCxfNTksXzU4LF81NyxfNTYsXzU1LF81
NCxfNTMsXzUyLF81MSxfNTAsXzQ5LF80OCxfNDcsXzQ2LF80NSxfNDQsXzQzLF80MixfNDEsXzQw
LF8zOSxfMzgsXzM3LF8zNixfMzUsXzM0LF8zMyxfMzIsXzMxLF8zMCxfMjksXzI4LF8yNyxfMjYs
XzI1LF8yNCxfMjMsXzIyLF8yMSxfMjAsXzE5LF8xOCxfMTcsXzE2LF8xNSxfMTQsXzEzLF8xMixf
MTEsXzEwLF85LF84LF83LF82LF81LF80LF8zLF8yLF8xLG4sLi4uKSAgbgojZGVmaW5lIEFSR04o
Li4uKSBBUkdOXygwLF9fVkFfQVJHU19fLDY0LDYzLDYyLDYxLDYwLDU5LDU4LDU3LDU2LDU1LDU0
LDUzLDUyLDUxLDUwLDQ5LDQ4LDQ3LDQ2LDQ1LDQ0LDQzLDQyLDQxLDQwLDM5LDM4LDM3LDM2LDM1
LDM0LDMzLDMyLDMxLDMwLDI5LDI4LDI3LDI2LDI1LDI0LDIzLDIyLDIxLDIwLDE5LDE4LDE3LDE2
LDE1LDE0LDEzLDEyLDExLDEwLDksOCw3LDYsNSw0LDMsMiwxLDApCgojZGVmaW5lIEZPTERfMV8o
eCwgdjEpICAgICAgICAgICAgICBGKHgsIHYxLCBmYWxzZSkKI2RlZmluZSBGT0xEXzJfKHgsIHYx
LCB2MikgICAgICAgICAgRih4LCB2MSwgRk9MRF8xXyh4LCB2MikpCiNkZWZpbmUgRk9MRF8zXyh4
LCB2MSwgdjIsIHYzKSAgICAgIEYoeCwgdjEsIEZPTERfMl8oeCwgdjIsIHYzKSkKI2RlZmluZSBG
T0xEXzRfKHgsIHYxLCB2MiwgdjMsIHY0KSAgRih4LCB2MSwgRk9MRF8zXyh4LCB2MSwgdjIsIHYz
KSkKLyogLi4uICovCiNkZWZpbmUgRk9MRF9JKG4pICAgICAgICAgRk9MRF8gIyMgbiAjIyBfCiNk
ZWZpbmUgRk9MRF8oeCwgbiwgLi4uKSAgRk9MRF9JKG4pKHgsICMjX19WQV9BUkdTX18pCiNkZWZp
bmUgRk9MRCh4LCAuLi4pICAgICAgRk9MRF8oeCwgQVJHTihfX1ZBX0FSR1NfXyksIF9fVkFfQVJH
U19fKQojZGVmaW5lIElOKHgsIC4uLikgICAgICAgIChGT0xEKHgsIF9fVkFfQVJHU19fKSkKCklO
KHgsIHYwLCB2MSwgdjIsIHYzLCB2NCk7IC8qIHJlcXVpcmVzIGBGT0xEXzVfKCknLCB3aGljaCBp
cyBub3QgZGVmaW5lZCAqLwpJTih4LCB2MCwgdjEsIHYyLCB2Myk7CklOKHgsIHYwLCB2MSwgdjIp
OwpJTih4LCB2MCwgdjEpOwpJTih4LCB2MCk7Cg==
----END SOLUTION----
Is your variant better?
It's similar, except I used __VA_ARGS__ for v2, ... in the definition of what you call FOLD_*_(), so that these definitions are equal in size for all values of '*'.
ReplyDelete