V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
shilyx
V2EX  ›  程序员

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

  •  
  •   shilyx · 2018-09-26 12:05:52 +08:00 · 5928 次点击
    这是一个创建于 2010 天前的主题,其中的信息可能已经有所发展或是发生改变。
    #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 看一楼,我的失误
    GTim
        59
    GTim  
       2018-09-27 14:40:24 +08:00
    楼主哪里找来的题目?
    shilyx
        60
    shilyx  
    OP
       2018-09-27 16:47:28 +08:00
    @GTim 我老早就意识到了这个特性,不过昨天拿出来而已。

    前两天看到有个朋友发帖提问 c 语言知识点,但是他的问题都是 malloc、free,涉及到未定义行为,不是不会答,而是不好答。所以就拿这个点出来问一问。
    GTim
        61
    GTim  
       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   ·   我们的愿景   ·   实用小工具   ·   975 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 20:19 · PVG 04:19 · LAX 13:19 · JFK 16:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.