解释2013年IOCCC美国总统的一班一班
我发现这个代码在
ioccc,我有麻烦,甚至开始明白它是如何工作的!
void main(int riguing,char** acters) { puts(1[acters-~!(*(int*)1[acters]%4796%275%riguing)]); } 关于这是有效的代码以及它如何实际工作的解释将是太棒了! 解决方法
首先,在C(和C)中,k [指针]和指针[k]分别表示与*(k指针)和*(指针k)完全相同的事物.代码混淆器通常似乎喜欢使用第一个版本,因为许多人发现它是不寻常的.但是相当明显的是,指针k和k指针是相同的计算.
代码片段中的另一个小转移是使用 pointer-~!(something) 这是完全一样的 pointer + (something == 0 ? 2 : 1) 这是如何工作的: 的!运算符将任何真(非零)值转换为0,将false(0)值转换为布尔值true(1): !something: something == 0 ? 1 : 0 ?运算符是按位逆,所以它将0变成由所有1位组成的数字,它是-1和1,除了最后一位之外的所有1位,即-2.参见two’s complement维基百科文章. ~!something: something == 0 ? -2 : -1 从某事物中减去与添加否定(a – -b == a b)相同 a-~!something: something == 0 ? a + 2 : a + 1 最后 1[a-~!something]: something == 0 ? a[3] : a[2] 因此,根据某些计算是否为零,选择第二个或第三个命令行参数. 所以现在我们需要解读“一些计算”.我们从类型冲突运算符*(T *)(指针)开始,在这种情况下*(int *)(char *),读出任何指针指向,就好像它是一个T.所以在这种情况下从第一个命令行参数(argv [1])读取1 [acters]中的第一个sizeof(int)字符,就像它们是整数的内部表示一样.这将按照姓氏的前四个字符将每个总统编码为整数. 美国历史上曾多次出现过多次总统姓氏,只要具有相同名称的两位总统都有一个政党,这不是问题. 一对这样的一对,父亲和儿子约翰·亚当斯(联邦党人)和约翰·昆西·亚当斯(John Quincy Adams(当选为参议员为联邦党人,担任民主共和国总统))被淘汰,因为在第一个有效的总统(富兰克林皮尔斯),哈里森长老(威廉·亨利,威格),他的孙子本杰明当选为共和党人.父亲和儿子乔治H.W.而布什也是共和党人.而两位约翰逊,安德鲁和林登贝恩斯(据我所知,彼此无关),都是民主党人. 所以只剩下两个罗斯福,西奥多(共和党人)和富兰克林·德拉诺(民主党).罗斯福两位总统的伟大伟大的祖父是约翰内斯和雅各布兄弟,约翰内斯和雅各布,2007年的儿子(或尼古拉斯·范·罗森维尔)(1658-1742)和荷兰移民克劳斯·马特森森·范·罗森威尔的孙子,使他们成为第五表兄弟.不过,总统们通过埃莉诺·罗斯福,西奥多的侄女和FDR的妻子更加密切相关.为了使国际奥委会的进入工作,有必要将年轻的罗斯福代表为“fdr”,就像他所知道的那样. 所以只有(整数)G96’5%的索引,或(整数)G96’5%4,因为索引(aka argc)是4.这是一个简单的哈希函数,我想象是通过试错发现的列表总统姓氏及其隶属关系. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |