[c 语言谜题] 程序填空,老程序员来做做 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
shilyx
V2EX    程序员

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

  •  
  •   shilyx 2018-09-26 12:05:52 +08:00 6827 次点击
    这是一个创建于 2571 天前的主题,其中的信息可能已经有所发展或是发生改变。
    #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:为了确保为数不多的趣味性,请勿直接贴出语句。
    第 1 条附言    2018-09-27 14:22:01 +08:00
    经过一天的时间,很多网友都破译了答案

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

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

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

    附答案:

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

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

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

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

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

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


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

    另外 gcc 下 10 个字符无警告 8a62c72686689179794818bb4efe89be7e1139e6c729a71842eb6cc4bdeb42bb
    besto
        32
    besto  
       2018-09-26 15:28:02 +08:00
    @innoink
    @garzon
    我想了一下,如果只要求 printf 能输出内容(意思是不注释掉),而不要求程序能输出内容的话
    那答案应该是 5...
    38d4392beb95eee3a4b727373a710578de8f340551985c5180297c20ffffb82a
    besto
        33
    besto  
       2018-09-26 15:29:37 +08:00
    @besto 哎呀错了错了,这样会忽略分号,无视无视
    besto
        34
    besto  
       2018-09-26 15:40:33 +08:00
    @XiaoxiaoPu 有分号且程序有输出的确实可以到 9 4ccce30e94240276e8312a60e59f662783a24df6f5695e65d626196d2220c764
    ysc3839
        35
    ysc3839  
       2018-09-26 16:18:28 +08:00
    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
        36
    whoami9894  
       2018-09-26 16:32:42 +08:00
    10,ptr => func
    好像楼上有好几个一样的了
    2c37e77354dad4539dde1674c773f95d73faba8e9011aaa0d864d49b7c9ed793
    Phox
        37
    Phox  
       2018-09-26 16:33:19 +08:00
    @XiaoxiaoPu 是的,不带换行的计算结果和你一样
    @cjw1115 10 字符无告警,不带换行计算结果和你一样,但是输出(nil) 应该不算吧?
    marvinGet
        38
    marvinGet  
       2018-09-26 16:50:09 +08:00
    来个明白人结贴 说一下答案
    yujincheng08
        39
    yujincheng08  
       2018-09-26 17:01:51 +08:00
    10, 2c37e77354dad4539dde1674c773f95d73faba8e9011aaa0d864d49b7c9ed793
    hmzt
        40
    hmzt  
       2018-09-26 17:03:58 +08:00
    涨知识了,不过编译器为什么会支持这种写法,语法上完全不通
    pkokp8
        41
    pkokp8  
       2018-09-26 17:12:56 +08:00 via Android
    @pkokp8 又想了下,想出两种方法,不带换行 9 字符
    编译器 gcc 5.4.0
    第一个加-Wall 有警告,第二个默认编译参数有警告

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

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

    @where2go 看一楼,我的失误
    yemoluo
        59
    yemoluo  
       2018-09-27 14:40:24 +08:00
    楼主哪里找来的题目?
    shilyx
        60
    shilyx  
    OP
       2018-09-27 16:47:28 +08:00
    @GTim 我老早就意识到了这个特性,不过昨天拿出来而已。

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

    估计当年和 pascal 交过手,pascal 支持局部函数。
    wheeler
        66
    wheeler  
       2018-09-27 20:55:04 +08:00
    @shilyx
    9
    #include <stdio.h>

    int main() {
    p();}p(){
    printf("%p\n", **************************************************************p);
    return 0;
    }
    noinil
        67
    noinil  
       2018-09-27 22:00:50 +08:00
    弱弱地问一下, 你们写的一长串字符是怎么用的啊?
    besto
        68
    besto  
       2018-09-28 10:02:43 +08:00
    @noinil sha256 值
    marvinGet
        69
    marvinGet  
       2018-09-28 18:01:52 +08:00
    @wheeler 收下膝盖
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5349 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSON: 3.9.8.5 34ms UTC 08:56 PVG 16:56 LAX 01:56 JFK 04:56
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86