• 请不要在回答技术问题时复制粘贴 AI 生成的内容
shilyx
V2EX  ›  程序员

[c 语言谜题] 程序填空,老程序员来做做

  •  
  •   shilyx ·
    shilyx · Sep 26, 2018 · 7977 views
    This topic created in 2969 days ago, the information mentioned may be changed or developed.
    #include <stdio.h>

    int main() {
    []
    printf("%p\n", **************************************************************p);
    return 0;
    }

    在 [] 标记内加入一条语句,使得:
    1、程序编译通过,无错误(警告随意);链接通过,无错误(警告随意)
    2、程序能够运行,无崩溃和运行时错误
    3、源代码为.c 文件
    4、如果用 vs,则使用 Release 配置;用 gcc 也行
    5、加入的语句不能忽略分号
    6、printf 一句必须能够正常输出内容

    问:
    1、要加入的语句的长度最小是几(含分号、空白、字符、符号等)?
    2、这个最小长度的语句的 sha256 哈希值是多少?

    ps:为了确保为数不多的趣味性,请勿直接贴出语句。
    Supplement 1  ·  Sep 27, 2018
    经过一天的时间,很多网友都破译了答案

    本来我预定的答案是长度 10,哈希 2C37E77354DAD4539DDE1674C773F95D73FABA8E9011AAA0D864D49B7C9ED793
    一些网友答出来了

    后来我发现一些网友答到了长度 9,哈希 53808D5ADA17E1D087FECEE8C2C18ED0D013DFD482583D04A064D418D3D84F33,我也经过冥思苦想,实在是没想到答案。好在我写了一个程序给枚举出来了,毕竟有哈希嘛。

    这个谜题考察的就是函数指针解引用的特殊情况,对于函数指针 p,直接 p()可以调用,(*p)()也可以调用,p===*p,所以再加几个*也是可行的。

    附答案:

    长度 10,兼容 gcc、g++、vs 等编译器,base64:aW50KCpwKSgpOw==

    长度 9,兼容 gcc,不兼容 g++、vs,base64:aW50IHAoKXt9

    究竟哪个算胜利呢?
    Supplement 2  ·  Sep 28, 2018
    4ccce30e94240276e8312a60e59f662783a24df6f5695e65d626196d2220c764 是优胜者,长度 9,base64:cCgpO31wKCl7。比我的预设答案好,而且兼容多种编译器
    69 replies  •  2018-09-28 18:01:52 +08:00
    shilyx
    shilyx
    OP
    Sep 26, 2018
    1
    在 [] 标记内加入一条语句 -> 将[]替换成一条语句

    本来我发的全角符号,结果发出去成半角了。
    BlackKey
    BlackKey
    Sep 26, 2018
    2
    目前想出来的最小长度是 11
    besto
    besto
    Sep 26, 2018
    3
    @BlackKey 我想出最短正常语句的也有 15 了...
    besto
    besto
    Sep 26, 2018
    4
    修改一下, 最短可以到 10, 910e692fdda462dde57e91a4778de7cdbf4f2090ffdebe770b90be808ed5d024
    bfdh
    bfdh
    Sep 26, 2018
    5
    @BlackKey 同 11
    garzon
    garzon
    Sep 26, 2018
    6
    10,2c37e77354dad4539dde1674c773f95d73faba8e9011aaa0d864d49b7c9ed793
    besto
    besto
    Sep 26, 2018
    7
    @garzon 我发现我和你用的是同一句只是我把这句话放到一个文件里算 sha256 会多加一个回车...
    garzon
    garzon
    Sep 26, 2018
    8
    @besto 233,还是 python hashlib 大法好
    bfdh
    bfdh
    Sep 26, 2018
    9
    @garzon
    @besto
    你们竟然把空格都省略了。。。
    Ediacaran
    Ediacaran
    Sep 26, 2018
    10
    3, ca877a9acb1c71ee2b0c6443ee1177c1db48c7bcc8af9a8cb2dc0938148dccf2

    gcc 和 clang 都是可以的,VC 没测试
    Ediacaran
    Ediacaran
    Sep 26, 2018
    11
    没有输出算吗
    innoink
    innoink
    Sep 26, 2018 via Android
    12
    哈哈,3
    我想知道注释算不算要求的语句
    endyul
    endyul
    Sep 26, 2018
    13
    6、printf 一句必须能够正常输出内容
    w01230
    w01230
    Sep 26, 2018
    14
    先看一下,目前想出来的长度远大于 11.
    chenstack
    chenstack
    Sep 26, 2018❤️1
    15
    答案同#6,一开始总想着用指向自己的指针实现,结果并不行,后面才意识到能用函数,再后面才发现只用声明就能用。
    povvoq
    povvoq
    Sep 26, 2018 via Android
    16
    }int f(){//\
    我只能想到这种
    chenstack
    chenstack
    Sep 26, 2018
    17
    修改过程同#3,去掉初值只保留声明,从 15 缩减到 10
    povvoq
    povvoq
    Sep 26, 2018 via Android
    18
    @pkokp8 不对,printf 没输出了,想不到,告辞
    w01230
    w01230
    Sep 26, 2018
    19
    @chenstack 看了提示, 新长度 11.
    innoink
    innoink
    Sep 26, 2018
    20
    @pkokp8 这个只要 //\就行了
    innoink
    innoink
    Sep 26, 2018
    21
    @chenstack 能无限解引用的东西,大概只有一种
    Phox
    Phox
    Sep 26, 2018
    22
    不应该是 9 哇? 645e319a3085376dbee5a71b8359010b1d9a035283156aa1b1323552bb0fac04
    povvoq
    povvoq
    Sep 26, 2018 via Android
    23
    @innoink 哈哈,的确,脑子没转过来,没想到,不过看到 6 必须有输出,这个方法不行
    Phox
    Phox
    Sep 26, 2018
    24
    @Phox 另外,中规中举无告警的 15,3adb4717467d81e0f3e91e6890171320c5a7c75468176c6fac58e7d6e8e1a88b
    GeruzoniAnsasu
    GeruzoniAnsasu
    Sep 26, 2018
    25
    这里有个不同于#4 #6 的:
    无\n
    a1588fb5c7d40509cd82615825c32c65231d0713c81b054871bce4e8cd58c035
    有\n
    c69b85657ed71cf4d671ef6f4b4861adef7c9019cfd547e020ac118388744412

    长度 14
    innoink
    innoink
    Sep 26, 2018
    26
    910e692fdda462dde57e91a4778de7cdbf4f2090ffdebe770b90be808ed5d024 10 开-Wall 会有警告
    bf9b20a32821ab49a932547b80e122e5bf66368bea36a5cd07a76d58e81f972a 10 gcc 通过,g++通不过
    还有 14 的写法,很多变化,可以完全无警告
    besto
    besto
    Sep 26, 2018
    27
    @innoink 同思路无警告只需 12 就行了
    innoink
    innoink
    Sep 26, 2018
    28
    @besto 初始化一下就行了
    innoink
    innoink
    Sep 26, 2018
    29
    @besto 其实还可以#define
    cjw1115
    cjw1115
    Sep 26, 2018
    30
    10,2c37e77354dad4539dde1674c773f95d73faba8e9011aaa0d864d49b7c9ed793
    XiaoxiaoPu
    XiaoxiaoPu
    Sep 26, 2018
    31
    @Phox 哈哈,绞尽脑汁终于想到这个了。不过你的 hash 是带了换行的吧?不带换行的是 4ccce30e94240276e8312a60e59f662783a24df6f5695e65d626196d2220c764


    @GeruzoniAnsasu 跟我第一次的思路一样,证明我确实想出来了,无换行的 sha1sum 是 52f9449d2dd0ef1deb042f99a8ab1ad852c667cb

    另外 gcc 下 10 个字符无警告 8a62c72686689179794818bb4efe89be7e1139e6c729a71842eb6cc4bdeb42bb
    besto
    besto
    Sep 26, 2018
    32
    @innoink
    @garzon
    我想了一下,如果只要求 printf 能输出内容(意思是不注释掉),而不要求程序能输出内容的话
    那答案应该是 5...
    38d4392beb95eee3a4b727373a710578de8f340551985c5180297c20ffffb82a
    besto
    besto
    Sep 26, 2018
    33
    @besto 哎呀错了错了,这样会忽略分号,无视无视
    besto
    besto
    Sep 26, 2018
    34
    @XiaoxiaoPu 有分号且程序有输出的确实可以到 9 4ccce30e94240276e8312a60e59f662783a24df6f5695e65d626196d2220c764
    ysc3839
    ysc3839
    Sep 26, 2018
    35
    9, 05f1e6c363cd142e9b72dfa47079a743ebc336670ce1bf05a06e6f4568800e38

    测试结果
    > cl t.c && t.exe
    Microsoft (R) C/C++ Optimizing Compiler Version 19.15.26730 for x64
    Copyright (C) Microsoft Corporation. All rights reserved.

    t.c
    Microsoft (R) Incremental Linker Version 14.15.26730.0
    Copyright (C) Microsoft Corporation. All rights reserved.

    /out:t.exe
    t.obj
    00007FF78B881020
    whoami9894
    whoami9894
    Sep 26, 2018
    36
    10,ptr => func
    好像楼上有好几个一样的了
    2c37e77354dad4539dde1674c773f95d73faba8e9011aaa0d864d49b7c9ed793
    Phox
    Phox
    Sep 26, 2018
    37
    @XiaoxiaoPu 是的,不带换行的计算结果和你一样
    @cjw1115 10 字符无告警,不带换行计算结果和你一样,但是输出(nil) 应该不算吧?
    marvinGet
    marvinGet
    Sep 26, 2018
    38
    来个明白人结贴 说一下答案
    yujincheng08
    yujincheng08
    Sep 26, 2018
    39
    10, 2c37e77354dad4539dde1674c773f95d73faba8e9011aaa0d864d49b7c9ed793
    hmzt
    hmzt
    Sep 26, 2018
    40
    涨知识了,不过编译器为什么会支持这种写法,语法上完全不通
    povvoq
    povvoq
    Sep 26, 2018 via Android
    41
    @pkokp8 又想了下,想出两种方法,不带换行 9 字符
    编译器 gcc 5.4.0
    第一个加-Wall 有警告,第二个默认编译参数有警告

    53808d5ada17e1d087fecee8c2c18ed0d013dfd482583d04a064d418d3d84f33
    4ccce30e94240276e8312a60e59f662783a24df6f5695e65d626196d2220c764
    garzon
    garzon
    Sep 26, 2018
    42
    @pkokp8 53808d5ada17e1d087fecee8c2c18ed0d013dfd482583d04a064d418d3d84f33 这个我也得到了,然而一开始在 g++( http://cpp.sh )上编译不通过就没管,刚才试了下 gcc 竟然通过了
    bp0
    bp0
    Sep 26, 2018
    43
    只能想出来无输出的,坐等答案。
    kkeiko
    kkeiko
    Sep 26, 2018 via iPhone
    44
    11 个 642afa25aff165250678f5fa3dd07b97a335957583763e83d182ca6d8bdc8aff
    povvoq
    povvoq
    Sep 26, 2018 via Android
    45
    @garzon g++比较严格,不允许这种写法
    where2go
    where2go
    Sep 26, 2018
    46
    echo -n xxxx|sha256sum -
    10 无空格 2c37e77354dad4539dde1674c773f95d73faba8e9011aaa0d864d49b7c9ed793
    where2go
    where2go
    Sep 26, 2018
    47
    echo xxxx |sha256sum -
    echo 不加 -n 是这个
    910e692fdda462dde57e91a4778de7cdbf4f2090ffdebe770b90be808ed5d024 -
    where2go
    where2go
    Sep 26, 2018
    48
    还有个同 #25 的 14 字节的方案, 但是我为什么要这么闲呢
    where2go
    where2go
    Sep 26, 2018
    49
    "在 [] 标记内加入一条语句" 的意思应该是 加完语句还要保留中括号吧
    wevsty
    wevsty
    Sep 26, 2018
    50
    看了各位的回复以后我才想到的答案是 11。
    另外我表示谁要是给我写出这么长的*我肯定打回去重写。
    SHA256:
    9540245df67cac5bdd321924dae6521872883f4c593dd96ecdb2e734b2d4347b
    wheeler
    wheeler
    Sep 26, 2018
    51
    9
    和#34 楼一样。
    zouchtssn
    zouchtssn
    Sep 27, 2018
    52
    mark
    where2go
    where2go
    Sep 27, 2018
    53
    gcc 8.2, 这个特性应该较早就支持了
    9 53808d5ada17e1d087fecee8c2c18ed0d013dfd482583d04a064d418d3d84f33
    24bit
    24bit
    Sep 27, 2018
    54
    10 2c37e77354dad4539dde1674c773f95d73faba8e9011aaa0d864d49b7c9ed793

    为什么可以这样呢?
    dinjufen
    dinjufen
    Sep 27, 2018
    55
    过了这么久了,可以公布下答案吗
    ysc3839
    ysc3839
    Sep 27, 2018
    56
    @ysc3839 前面搞错了,正确的 sha256 是 4ccce30e94240276e8312a60e59f662783a24df6f5695e65d626196d2220c764。
    co3site
    co3site
    Sep 27, 2018
    57
    带空格 11 位 9540245df67cac5bdd321924dae6521872883f4c593dd96ecdb2e734b2d4347b
    实在想不到更短的了,楼主能广布答案了吗?
    shilyx
    shilyx
    OP
    Sep 27, 2018
    58
    @co3site
    @dinjufen
    @24bit
    @bp0
    @marvinGet 答案来了

    @where2go 看一楼,我的失误
    yemoluo
    yemoluo
    Sep 27, 2018
    59
    楼主哪里找来的题目?
    shilyx
    shilyx
    OP
    Sep 27, 2018
    60
    @GTim 我老早就意识到了这个特性,不过昨天拿出来而已。

    前两天看到有个朋友发帖提问 c 语言知识点,但是他的问题都是 malloc、free,涉及到未定义行为,不是不会答,而是不好答。所以就拿这个点出来问一问。
    yemoluo
    yemoluo
    Sep 27, 2018
    61
    @shilyx 这种奇巧的问题,对我特别有吸引力,一下子学了好多知识的感觉
    z0z
    z0z
    Sep 27, 2018
    62
    昨天我差点被这道题整死
    whoami9894
    whoami9894
    Sep 27, 2018 via Android
    63
    9 字符的那个…… gcc 支持闭包吗
    shilyx
    shilyx
    OP
    Sep 27, 2018
    65
    @whoami9894 gcc 的私有扩展,局部函数。

    估计当年和 pascal 交过手,pascal 支持局部函数。
    wheeler
    wheeler
    Sep 27, 2018
    66
    @shilyx
    9
    #include <stdio.h>

    int main() {
    p();}p(){
    printf("%p\n", **************************************************************p);
    return 0;
    }
    noinil
    noinil
    Sep 27, 2018
    67
    弱弱地问一下, 你们写的一长串字符是怎么用的啊?
    besto
    besto
    Sep 28, 2018
    68
    @noinil sha256 值
    marvinGet
    marvinGet
    Sep 28, 2018
    69
    @wheeler 收下膝盖
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4430 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 120ms · UTC 07:06 · PVG 15:06 · LAX 23:06 · JFK 02:06
    ♥ Do have faith in what you're doing.