微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

解释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.这是一个简单的哈希函数,我想象是通过试错发现的列表总统姓氏及其隶属关系.

原文地址:https://www.jb51.cc/c/114193.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐