IOCCC 2013 解释美国总统的一行行聚会

2023-12-22

我在上找到了这段代码ioccc http://ioccc.org/2013/cable1/我什至开始理解它是如何工作的!

void main(int riguing, char** acters) {
  puts(1[acters-~!(*(int*)1[acters]%4796%275%riguing)]);
}

如果能解释一下这是如何有效的代码以及它实际上是如何工作的,那就太棒了!


首先,在 C(和 C++)中k[pointer] and pointer[k]意思完全相同,即*(k + pointer) and *(pointer + k), 分别。代码混淆器通常似乎喜欢使用第一个版本,因为很多人发现它不寻常。但相当明显的是pointer + k and k + pointer是相同的计算。

代码片段中的另一个小转移是使用

pointer-~!(something)

这与

pointer + (something == 0 ? 2 : 1)

这是如何运作的:

The !运算符将任何 true(非零)值转换为 0,将 false (0) 值转换为布尔 true (1):

!something:     something == 0 ? 1 : 0

The ~运算符是按位取反的,所以它变成0转化为全 1 位组成的数,即-1 and 1转化为除最后一位外全部为 1 的数,即-2。请参阅维基百科文章二进制补码 http://en.wikipedia.org/wiki/Two%27s_complement.

~!something:    something == 0 ? -2 : -1

从某物中减去它与添加负数相同(a - -b == a + b)

a-~!something:  something == 0 ? a + 2 : a + 1

Finally

1[a-~!something]: something == 0 ? a[3] : a[2]

因此,它根据某些计算是否为零来选择第二个或第三个命令行参数。

所以现在我们需要破译“一些计算”。我们从类型双关运算符开始*(T *)(pointer), 在这种情况下*(int*)(char*),读出指针指向的任何内容,就好像它是一个T。所以在这种情况下,它读取第一个sizeof(int)字符来自1[acters]-- 也就是说,从第一个命令行参数开始(argv[1])——就好像它们是整数的内部表示一样。这将根据每位总统姓氏的前四个字符将其编码为整数。

虽然美国历史上曾出现过多次总统姓氏重复的情况,但只要两位同名总统属于同一个政党,就不成问题。

其中一对父子约翰·亚当斯 (John Adams, Jr.)(联邦党人)和约翰·昆西·亚当斯 (John Quincy Adams)(作为联邦党人当选参议员,作为民主共和党人当选总统)因在第一个有效投票之前被淘汰总统(富兰克林·皮尔斯)​​,老哈里森(威廉·亨利,辉格党人)也是如此,他的孙子本杰明被选为共和党人。乔治·H·W·布什 (George H.W.和乔治·W·布什都是共和党人。两位约翰逊,安德鲁和林登贝恩斯(据我所知,彼此没有亲属关系)都是民主党人。

这样就只剩下两位罗斯福了,西奥多(共和党)和富兰克林·德拉诺(民主党)。两位罗斯福总统的曾曾曾祖父是约翰内斯和雅各布斯兄弟,他们是罗斯福总统的儿子。尼古拉斯·罗斯福 http://en.wikipedia.org/wiki/Nicholas_Roosevelt_%281658%E2%80%931742%29(或尼古拉斯·范·罗森维尔特)(1658-1742 年)和荷兰移民克拉斯·马尔滕森·范·罗森维尔特的孙子,使他们成为第五代堂兄弟。然而,通过西奥多的侄女、罗斯福总统的妻子埃莉诺·罗斯福,两位总统之间的关系更为密切。为了使 IOCCC 条目发挥作用,有必要将年轻的罗斯福表示为“fdr”,正如他的俗称。

这样就只剩下(integer)%4796%275%riguing, or (integer)%4796%275%4,自riguing (aka argc) 是 4。这是一个简单的哈希函数,我想它是通过使用总统姓氏及其隶属关系列表进行反复试验发现的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IOCCC 2013 解释美国总统的一行行聚会 的相关文章

随机推荐

  • C++中的“new”运算符,指针问题

    愚蠢的问题 但是每当你调用 new 时 你总是有一个指针吗 SomeClass person new SomeClass 这是因为您需要一个指针来指向为 SomeClass 变量 person 分配的新内存空间吗 谢谢 If new成功完成
  • kml 谷歌扩展不在模式中

    我居住的司法管辖区使用谷歌地球发布了数据 他们指向的kml文件包含
  • 张量流图构造中没有形状错误,但在图计算过程中出现形状不匹配错误

    张量流图构造没有出现错误 但在图计算过程中出现形状不匹配错误tf gradients 我猜错误是在反向传播中 这是我得到的错误 InvalidArgumentError 请参阅上面的回溯 reshape 的输入是一个具有 16777216
  • Anaconda Prompt 不会启动 _NamespacePath

    我有一个奇怪的错误 我找不到解决方案 每次启动 Anaconda Prompt 运行 Windows 10 时 我都会在底部收到以下错误 即使我尝试使用 conda 我也会收到相同的错误 在安装信息之后 我尝试卸载并重新安装 Anacond
  • CSharpCodeProvider 似乎停留在 .NET 2.0,如何获得新功能?

    我有以下相当标准的代码作为包装器CSharpCodeProvider 这个类工作得很好 并且执行得很好等等 但是 尽管我的应用程序是针对 NET 3 5 构建的 并且在进行此编译时引用了 v3 5 程序集 但我仍然无法访问任何额外好的 C
  • 使用 rustc 和 clang 运行 LLVM 文件

    我正在尝试运行 ll文件带有 clang 并出现链接器错误 我有一个文件test rs它只包含一个 main 函数println 陈述 我使用以下命令生成 LLVM IRrustc emit llvm ir crate type bin t
  • 用于字符串插值的 Swift 协议

    我必须实现什么协议来控制 Swift 中字符串插值中对象的表示方式 我不想指定打印的内容 如下所示 struct A var a A println a 您需要实施Printable协议 该协议应该被那些希望定制自己的类型的类型所采用 文本
  • 为什么 VStack 不能在带有滚动视图的 GeometryReader 中工作?

    我的 vStack 滚动视图在没有 GeometryReader 的情况下也能工作 在 AppleTV 中 我没有在 iOS 中进行测试 然后我添加了几何读取器 VStack 像 ZStack 一样 折叠 我能做什么来解决这个问题 是的 我
  • ASP.NET MVC 站点地图和/或安全调整

    ASP NET MVC 中是否有与 Web 表单中的 SiteMap 和安全调整功能等效的功能 我刚刚开始学习 MVC 一直在寻找解决方案 以防止在学习时走上错误的道路 Check ASP NET MVC 站点地图提供程序 https gi
  • 将 Param 与参数数组绑定

    我有一个函数可以执行此操作 function registerUser firstName lastName address postcode email password params array firstName lastName a
  • Oracle 中触发器无效

    在对表进行某些更改后 我的数据库中的某些触发器变得无效 但他们似乎仍在工作 我遇到的唯一问题是 如果我使用 SQL Developer 触发器的左侧会出现红叉 表明它们无效 这是一个大问题吗 我知道我可以重新编译触发器来解决这个问题 但我不
  • 为什么我的许可证没有显示?

    In my
  • Asp.Net MVC 验证 - 依赖字段

    我目前正在尝试进行 MVC 验证 并且遇到了一些问题 其中需要一个字段 具体取决于另一个字段的值 下面是一个例子 我还没弄清楚 如果 PaymentMethod Cheque 那么 ChequeName 应该是必需的 否则可以通过 Requ
  • NSMutableArray 线程安全

    在我的应用程序中 我正在从多个线程访问和更改可变数组 一开始 当我尝试使用以下命令访问对象时 它崩溃了objectAtIndex 因为索引超出范围 该索引处的对象已从另一个线程的数组中删除 我在网上搜索了如何解决这个问题 我决定尝试这个so
  • facebook c# sdk - 用户尚未授权应用程序执行此操作

    我正在构建一个控制台应用程序 它将将流发布到页面墙上 问题 我收到 用户尚未授权应用程序执行此操作 我正在使用 opengraph 来获取访问令牌 我错过了什么吗 任何帮助是极大的赞赏 谢谢 constants string apiKey
  • Android 在 AsyncTask onPostExecute 中使用接口返回值[重复]

    这个问题在这里已经有答案了 在下面的代码中我想返回值AsyncTask使用接口 但我得到了错误的值 并且无法返回正确的值onPostExecute 我开发了这个link https stackoverflow com questions 1
  • 无法从 JAVA 连接到 Mongo SSL 副本集

    我正在尝试使用 SSL 加密设置最新版本的 MongoDB 我能够从 mongo shell 进行连接 但是当我从 Java 客户端连接时出现错误 Works mongo admin host mongo1 xxxx com ssl ssl
  • 查看由数字表示的文件的特定行

    好吧 这可能是一件显而易见的事情 但它让我无法理解 因为到目前为止 它可能可以用一种我不知道的更简单的方式来完成 假设有一个 文件 我只想查看该文件的行号 X 上的内容 解决方案是什么 这是我能想到的 head X lt file tail
  • Github文件夹结构更改

    我正在使用 Github 进行网站项目 我已经检查更改有一段时间了 但现在我想更改我的文件夹结构 基本上是更好地组织文件 这会弄乱我的 Github 存储库吗 如果是 那么确保我的版本保持完整并且我的新文件夹结构与 Git 同步的最佳方法是
  • IOCCC 2013 解释美国总统的一行行聚会

    我在上找到了这段代码ioccc http ioccc org 2013 cable1 我什至开始理解它是如何工作的 void main int riguing char acters puts 1 acters int 1 acters 4