免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: hniu
打印 上一主题 下一主题

计算24点的脚本 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-08-13 12:42 |只看该作者
不错, 如果 awk 有 eval 函数就能写一个纯 awk 的了

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
12 [报告]
发表于 2008-08-13 17:09 |只看该作者
时间紧没测试,像 1 5 5 5这四个数,结果是多少?
似乎没有考虑两个括号和括号嵌套的排列组合吧?

论坛徽章:
0
13 [报告]
发表于 2008-08-13 18:41 |只看该作者

回复 #12 r2007 的帖子

脚本的结果是

  1. (5 - 1 / 5) * 5 =24
  2. 5 * (5 - 1 / 5) =24
复制代码


当然这是一样的。

论坛徽章:
0
14 [报告]
发表于 2008-08-13 18:53 |只看该作者
原帖由 r2007 于 2008-8-13 17:09 发表
时间紧没测试,像 1 5 5 5这四个数,结果是多少?
似乎没有考虑两个括号和括号嵌套的排列组合吧?


你说得对,我又修改了脚本,增加了5种新的组合。这回应该全面了。

比如算 1 1 5 7,
不用双括号是不行的。

论坛徽章:
0
15 [报告]
发表于 2008-11-15 12:38 |只看该作者
冒昧美化了一下, 方便大家阅读:
-(dearvoid@LinuxEden:Forum)-(~/void/24dot/shell)-
[$$=4016 $?=0]
; cat 24dot.sh
#!/bin/bash
#
# Author: hniu (http://bbs.chinaunix.net/profile-uid-730781.html)
# From  : http://bbs.chinaunix.net/thread-1241657-1-1.html
#

if [ $# -ne 4 ]; then
    echo "Usage: $(basename $0) d1 d2 d3 d4"
    exit 1
fi

awk -v a=$1 -v b=$2 -v c=$3 -v d=$4 '
BEGIN {
  n[0] = a;
  n[1] = b;
  n[2] = c;
  n[3] = d;

  op[0] = "+";
  op[1] = "-";
  op[2] = "*";
  op[3] = "/";

  expr[0] = "(%d %s  %d) %s  %d  %s %d ";
  expr[1] = "(%d %s  %d  %s  %d) %s %d ";
  expr[2] = " %d %s (%d  %s  %d) %s %d ";
  expr[3] = " %d %s (%d  %s  %d  %s %d)";
  expr[4] = " %d %s  %d  %s (%d  %s %d)";
  expr[5] = "(%d %s  %d) %s (%d  %s %d)";

  for (ii = 0; ii < 4; ii++)
    for(jj = 0; jj < 4; jj++)
      for(kk = 0; kk < 4; kk++)
        if (ii == jj || jj == kk || ii == kk) {
          continue;
        } else {
          n[ii] = a;
          n[jj] = b;
          n[kk] = c;
          n[6 - ii - jj - kk] = d;
          for (one = 0; one < 4; one++)
            for (two = 0; two < 4; two++)
              for (three = 0; three < 4; three++)
                for (iExpr = 0; iExpr < 6; ++iExpr)
                  printf expr[iExpr] "\n", n[0], op[one], n[1], op[two], n[2], op[three], n[3];
        }
}' | sed 'h; s/^/"/; s/$/ = "/; G;' \
   | bc -l 2> /dev/null \
   | sed -n '/ 23.9999/{s/ 23.9999.*$/ 24/; p;}; / 24.0000/{s/ 24.0000.*/ 24/; p;}; / 24$/p;' \
   | sort -u
-(dearvoid@LinuxEden:Forum)-(~/void/24dot/shell)-
[$$=4016 $?=0]
; ./24dot.sh 3 3 7 7
(3 +  3  /  7) * 7  = 24
(3 /  7  +  3) * 7  = 24
7 * (3  +  3  / 7) = 24
7 * (3  /  7  + 3) = 24
-(dearvoid@LinuxEden:Forum)-(~/void/24dot/shell)-
[$$=4016 $?=0]
; bye

论坛徽章:
0
16 [报告]
发表于 2008-11-15 12:51 |只看该作者
每种算法都很多,但很多是重复的
((5 + 7) - 9) * 8 = 24
(5 + (7 - 9)) * 8 = 24
能不能简化一下

论坛徽章:
0
17 [报告]
发表于 2008-11-15 14:02 |只看该作者
要去除重复结果应该不会很容易 1) 判断哪些括号是不必要的; 2) (a + b) 跟 (b + a) 这种满足「交换律」的也要排除

论坛徽章:
0
18 [报告]
发表于 2008-11-15 14:23 |只看该作者
收藏先!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP