C 语言 IQ 题..

软件和网站开发以及相关技术探讨
poet
帖子: 2841
注册时间: 2006-09-11 22:47
送出感谢: 0
接收感谢: 5 次

#16

帖子 poet » 2008-07-03 12:35

BigSnake.NET 写了:7 楼很厉害, 怎么想到的??
实际上这个想法就是在无符号数与-1的比较上做文章

-1 按无符号是最大的数,如果i的第一次是0,第二次是-1,目标只要把 n 变成无符号数就可以了。而 &n 是个无符号数,符合这个原则。
头像
HuntXu
帖子: 5776
注册时间: 2007-09-29 3:09
送出感谢: 0
接收感谢: 6 次

#17

帖子 HuntXu » 2008-07-03 12:38

:em66
HUNT Unfortunately No Talent...
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
送出感谢: 0
接收感谢: 8 次
联系:

#18

帖子 bones7456 » 2008-07-03 12:41

学习7楼,第2题还有这两个解:
int *i, n=99; main() { for(i=0; i<n; i--) { printf("#"); } }
int i, *n=99; main() { for(i=0; i<n; i--) { printf("#"); } }
关注我的blog: ε==3
头像
aobi
帖子: 921
注册时间: 2008-06-22 12:27
送出感谢: 0
接收感谢: 0

#19

帖子 aobi » 2008-07-03 13:13

bones7456 写了:学习7楼,第2题还有这两个解:
int *i, n=99; main() { for(i=0; i<n; i--) { printf("#"); } }
int i, *n=99; main() { for(i=0; i<n; i--) { printf("#"); } }
so nice!
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 257 次

#20

帖子 eexpress » 2008-07-03 13:38

~moo/log/left/help-xiaoming → 小明帮忙摸左腿。。。。

你们都被摸光耍
● 鸣学
头像
vvoody
帖子: 749
注册时间: 2007-01-21 20:10
送出感谢: 0
接收感谢: 0
联系:

#21

帖子 vvoody » 2008-07-03 13:48

赞!
炎炎夏日锻炼大脑~~ :D
herberteuler
帖子: 45
注册时间: 2007-01-27 14:11
送出感谢: 0
接收感谢: 0

#22

帖子 herberteuler » 2008-07-03 13:59

第二个问题的另外一个改法是

代码: 全选

int i, n=99; main() { for(i=0; i<n; i--); { printf("#"); } }
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
送出感谢: 0
接收感谢: 8 次
联系:

#23

帖子 bones7456 » 2008-07-03 14:03

eexpress 写了:~moo/log/left/help-xiaoming → 小明帮忙摸左腿。。。。

你们都被摸光耍
摸你个木头~
关注我的blog: ε==3
头像
异域追梦者
帖子: 424
注册时间: 2008-02-18 0:25
送出感谢: 0
接收感谢: 0
联系:

#24

帖子 异域追梦者 » 2008-07-03 21:37

强大的无符号数
图片
头像
vvoody
帖子: 749
注册时间: 2007-01-21 20:10
送出感谢: 0
接收感谢: 0
联系:

#25

帖子 vvoody » 2008-07-04 0:41

贴个牛人写的求解脚本,运行时把两个脚本放在同一目录.

Copyright (C) WANG Cong

bash 部分

代码: 全选

#!/bin/bash

TEST_VAR='int i,n=99;main(){for(i=0;i<n;i--){printf("#");}}'

#Generated by Python with
#''.join(map(lambda x: '' if chr(x).isupper() else chr(x), range(32, 127)))
#except '$','(',')', '{','}', '[', ']', '@', "\`", "\"", "#", "'", "\\"
possible_chars=' !'"%&*+,-./0123456789:;<=>?^_abcdefghijklmnopqrstuvwxyz|~"
len=${#TEST_VAR}
num_chars=${#possible_chars}
tmpfile=$(mktemp /tmp/test-$$.XXXXXXX)
outfile="/tmp/test_sh.out"

function is_valid_and_ok()
{
       echo $1 > $tmpfile
       gcc -xc -c -o $outfile.o $tmpfile &>/dev/null
       if [[ $? -eq 0 ]]
       then
               gcc -o $outfile $outfile.o &>/dev/null
               if [[ $? -ne 0 ]]; then
                       return 0
               fi
               #nohup $outfile > $resultfile 2> /dev/null &
               #sleep 1 && killall $outfile 2> /dev/null
               n=$(./get_run_result.pl $outfile)
               echo $n
               if [[ $n -eq 99 ]] || [[ $n -eq 100 ]] || [[ $n -eq 1 ]]
               then
                       return 1
               fi
       fi
       return 0
}

#main
i=0
while(($i<$len - 16));
do
       tmp="${TEST_VAR:0:$i}${TEST_VAR:$((i+1))}"
       echo "delete: $tmp"
       is_valid_and_ok "$tmp"
       if [ $? -eq 1 ]
       then
               echo "result ==> $tmp" 1>&2
       fi
       i=$(($i+1))
done;

i=4
while (($i < $len - 14));
do
       j=0
       while(($j<$num_chars));
       do
               tmp="${TEST_VAR:0:$i}${possible_chars:$j:1}${TEST_VAR:$i}"
               echo "add: $tmp"
               is_valid_and_ok "$tmp"
               if [ $? -eq 1 ]
               then
                       echo "result ==> $tmp" 1>&2
               fi
               j=$(($j+1))
       done
       i=$(($i+1))
       if (($i == 11)) ; then
               i=17
       fi
done;

i=0
while(($i<$len - 16));
do
       j=0
       while(($j<$num_chars));
       do
               tmp="${TEST_VAR:0:$i}${possible_chars:$j:1}${TEST_VAR:$((i+1))}"
               echo "replace: $tmp"
               is_valid_and_ok "$tmp"
               if [ $? -eq 1 ]
               then
                       echo "result ==> $tmp" 1>&2
               fi
               j=$(($j+1))
       done
       i=$(($i+1))
       if (($i == 11)) ; then
               i=17
       fi
done;
perl 部分

代码: 全选

#!/usr/bin/perl -w

use strict;
use warnings;

my $n;
my $chars;

open(my $in_file, "$ARGV[0]|") or exit 1;
$n = read($in_file, $chars, 101);
print "$n\n";
close $in_file;
上次由 vvoody 在 2008-07-04 1:16,总共编辑 1 次。
头像
vvoody
帖子: 749
注册时间: 2007-01-21 20:10
送出感谢: 0
接收感谢: 0
联系:

#26

帖子 vvoody » 2008-07-04 0:41

result ==> int *i,n=99;main(){for(i=0;i<n;i--){printf("#");}}
result ==> int i,*n=99;main(){for(i=0;i<n;i--){printf("#");}}
result ==> int i,n=99;main(){for(i=0;-i<n;i--){printf("#");}}
result ==> int i,n=99;main(){for(i=0;~i<n;i--){printf("#");}}
result ==> int i,n=99;main(){for(i=0;i<&n;i--){printf("#");}}
result ==> int*i,n=99;main(){for(i=0;i<n;i--){printf("#");}}
result ==> int i,n=99;main(){for(i=0;i+n;i--){printf("#");}}
result ==> int i,n=99;main(){for(i=0;i<n;n--){printf("#");}}
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
送出感谢: 0
接收感谢: 7 次
联系:

#27

帖子 BigSnake.NET » 2008-07-04 10:10

http://paste.ubuntu.org.cn/7877

我也写了一个脚本, 超时定为0.2s所以找不到屏蔽for的那个解

代码: 全选

import sys, string, os

def TestSet():
    orig = 'int i, n=99; main() { for(i=0; i<n; i--) { printf("#"); } }'
    for i in string.printable:
        for j in range(0, len(orig)):
            yield orig[:j]+i+orig[j:]
            yield orig[:j]+i+orig[j+1:]
            yield orig[:j] + orig[j+1:]

i = 0
for test in TestSet():
    src_name = str(i)+'.c'
    f = file(src_name,'w')
    f.seek(0)
    f.write(test+'\n')
    f.close()
    if os.system('gcc '+src_name+' 2> /dev/null') != 0 :
        os.system('rm '+src_name)
    else:
        print 'now a.out is ok', i
        os.system('./a.out | head -c 101 > result & sleep .2 ; killall a.out')
        f = file('result','r')
        f.seek(0)
        result = f.readline()
        f.close()
        if result == '#'*99:
            os.system('mv '+src_name+' ./99')
        elif result == '#'*1:
            os.system('mv '+src_name+' ./1')
        elif result == '#'*100:
            os.system('mv '+src_name+' ./100')
        else:
            os.system('rm '+src_name)
    i+=1
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
送出感谢: 0
接收感谢: 8 次
联系:

#28

帖子 bones7456 » 2008-07-04 10:25

BigSnake.NET 写了:http://paste.ubuntu.org.cn/7877

我也写了一个脚本, 超时定为0.2s所以找不到屏蔽for的那个解

代码: 全选

import sys, string, os

def TestSet():
    orig = 'int i, n=99; main() { for(i=0; i<n; i--) { printf("#"); } }'
    for i in string.printable:
        for j in range(0, len(orig)):
            yield orig[:j]+i+orig[j:]
            yield orig[:j]+i+orig[j+1:]
            yield orig[:j] + orig[j+1:]

i = 0
for test in TestSet():
    src_name = str(i)+'.c'
    f = file(src_name,'w')
    f.seek(0)
    f.write(test+'\n')
    f.close()
    if os.system('gcc '+src_name+' 2> /dev/null') != 0 :
        os.system('rm '+src_name)
    else:
        print 'now a.out is ok', i
        os.system('./a.out | head -c 101 > result & sleep .2 ; killall a.out')
        f = file('result','r')
        f.seek(0)
        result = f.readline()
        f.close()
        if result == '#'*99:
            os.system('mv '+src_name+' ./99')
        elif result == '#'*1:
            os.system('mv '+src_name+' ./1')
        elif result == '#'*100:
            os.system('mv '+src_name+' ./100')
        else:
            os.system('rm '+src_name)
    i+=1
球猫很暴力啊. :lol:
关注我的blog: ε==3
头像
vvoody
帖子: 749
注册时间: 2007-01-21 20:10
送出感谢: 0
接收感谢: 0
联系:

#29

帖子 vvoody » 2008-07-04 18:51

string.printable 有点暴力啊,不用这么多吧 :D
poet
帖子: 2841
注册时间: 2006-09-11 22:47
送出感谢: 0
接收感谢: 5 次

#30

帖子 poet » 2008-07-04 20:24

从上面两个脚本看起来,似乎python的程序比perl要简洁很多呢。还是编程人的水平问题?
回复