免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4042 | 回复: 6
打印 上一主题 下一主题

[数值计算] 难题来了!四色球算24 [复制链接]

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-01-12 15:08 |只看该作者 |倒序浏览
5可用积分
本帖最后由 bikkuri 于 2016-01-12 15:09 编辑

有红绿蓝黄四种颜色的球,分别代表1,2,4,8。
  1. R=1;G=2;B=4;Y=8
复制代码
现在要求从装满这四种颜色的球的箱子里,随机抽取7次,然后用7个球代表的数字运用加减乘除和括号算出24。
要求的输出有:
抽出的7个球的颜色,例如:BYYGRBG
算出24的方法,例如:Y*(B+G+G)-Y*(B+R)=8*(4+2+2)-8*(4+1)=24

请各位高手赐教!

评分

参与人数 1信誉积分 +10 收起 理由
Herowinter + 10 我不会, 坐等大神解答.

查看全部评分

论坛徽章:
1
15-16赛季CBA联赛之广东
日期:2017-05-24 00:30:25
2 [报告]
发表于 2016-01-12 17:25 |只看该作者
本帖最后由 cclxpp123 于 2016-08-03 16:55 编辑

用c++解决应该好一些,加上括号,排列组合的情况很复杂,不知道有无什么优化的算法

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
3 [报告]
发表于 2016-02-21 23:12 |只看该作者
本帖最后由 rubyish 于 2016-02-26 22:41 编辑



g [ 1, 1, 1, 1, 1, 1, 2 ];    # 1.6x s
h [ 1, 1, 1, 1, 1, 1, 2 ];    # 11.x s


ru ? wan 24 dian ?

try:
  1. my $THAT = 24;
  2. my @BOX  = ( 1 .. 13 );
  3. my $PICK = 4;
复制代码

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
4 [报告]
发表于 2016-02-24 21:31 |只看该作者
本帖最后由 rubyish 于 2016-04-26 22:02 编辑

v3:
  1. try [ 3, 3, 8, 8 ];             # 0.025 s
  2. try [ 2, 1, 1, 1, 1, 1, 1 ];    # 0.19 s
  3. try [ 1, 1, 1, 1, 1, 1, 1 ];    # 0.075 s
复制代码
  1. #!/usr/bin/perl

  2. my $SCOR = 24;
  3. my @BALL = ( 1, 2, 4, 8 );
  4. my $PICK = 7;
  5. my %UNIQ;

  6. sub _ { $a->[0] <=> $b->[0] }

  7. sub fun {
  8.     my ( $A, $B ) = @_;

  9.     if ( !@$A and @$B == 1 ) {
  10.         return if $B->[0][0] ne $SCOR;
  11.         my $answer = substr $B->[0][1], 2, -2;
  12.         print "$answer = $SCOR\n\n" and die;
  13.     }

  14.     if ( @$B == 2 ) {
  15.         return if $UNIQ{ join $", map $_->[0], @$A, @$B }++;
  16.         my ( $i, $x, $j, $y ) = map @$_, @$B;

  17.         fun( [ sort { _ }[ $i + $j, "( $x + $y )" ], @$A ], [] );
  18.         fun( [ sort { _ }[ $i - $j, "( $x - $y )" ], @$A ], [] );
  19.         fun( [ sort { _ }[ $i * $j, "( $x * $y )" ], @$A ], [] );
  20.         fun( [ sort { _ }[ $i / $j, "( $x / $y )" ], @$A ], [] ) if $j;
  21.     }

  22.     for my $i ( 0 .. $#$A ) {
  23.         next if $i and $A->[$i][0] == $A->[ $i - 1 ][0];
  24.         fun( [ @$A[ 0 .. $i - 1, $i + 1 .. $#$A ] ], [ @$B, $A->[$i] ] );
  25.     }
  26. }

  27. sub try {
  28.     my ( $roll, $fail ) = ( @_, 0, undef %UNIQ, undef $@ );
  29.     print "\n[ ", join( ', ', @$roll ), " ]\n\n";
  30.     print "NO ANSWER\n\n" and return if $fail;
  31.     $roll = [ map [ $_, $_ ], sort { $a <=> $b } @$roll ];
  32.     eval { fun $roll, [] };
  33.     print "NO ANSWER\n\n" if !$@;
  34. }

  35. sub run {
  36.     print "\n\n[ q: EXIT, enter: roll ]\n\n";
  37.     my ( $Ok, %Polar ) = \$@;

  38.     while (<>) {
  39.         print "\n[ EXIT ]\n" and return if /q/;
  40.         my $the = [ @BALL[ map { rand @BALL } 1 .. $PICK ] ];
  41.         my $Express = join $", sort { $a <=> $b } @$the;
  42.         try $the, $Polar{$Express};
  43.         $Polar{$Express} = 2 if not $Ok;
  44.     }
  45. }

  46. run;
复制代码
v3.1
  1. #!/usr/bin/perl
  2. use Tk;
  3. my @BALL = ( 1, 2, 4, 8 );
  4. my $PICK = 7;
  5. my $SCOR = 24;
  6. my %UNIQ;
  7. my $ANS;
  8. my @color = qw/coral limegreen skyblue gold
  9.   hotpink purple snow4 bisque3
  10.   tan orchid gray khaki plum/;
  11.   
  12. sub _ { $a->[0] <=> $b->[0] }

  13. sub fun {
  14.     my ( $A, $B ) = @_;
  15.     if ( !@$A and @$B == 1 ) {
  16.         return if $B->[0][0] ne $SCOR;
  17.         my $answer = substr $B->[0][1], 2, -2;
  18.         $ANS = "$answer  =  $SCOR\n";
  19.         die;
  20.     }
  21.     if ( @$B == 2 ) {
  22.         return if $UNIQ{ join $", map $_->[0], @$A, @$B }++;
  23.         my ( $i, $x, $j, $y ) = map @$_, @$B;

  24.         fun( [ sort { _ }[ $i + $j, "( $x + $y )" ], @$A ], [] );
  25.         fun( [ sort { _ }[ $i - $j, "( $x - $y )" ], @$A ], [] );
  26.         fun( [ sort { _ }[ $i * $j, "( $x * $y )" ], @$A ], [] );
  27.         fun( [ sort { _ }[ $i / $j, "( $x / $y )" ], @$A ], [] ) if $j;
  28.     }

  29.     for my $i ( 0 .. $#$A ) {
  30.         next if $i and $A->[$i][0] == $A->[ $i - 1 ][0];
  31.         fun( [ @$A[ 0 .. $i - 1, $i + 1 .. $#$A ] ], [ @$B, $A->[$i] ] );
  32.     }
  33. }

  34. sub draw {
  35.     my ( $canvas, $b ) = @_;
  36.     for my $i ( 1 .. $PICK ) {
  37.         my $x  = 50 * $i - 25;
  38.         my $bi = $b->[ $i - 1 ];
  39.         my $r  = $BALL[$bi];
  40.         $canvas->createOval(
  41.             $x, 25, $x + 50, 75,
  42.             -fill  => $color[$bi],
  43.             -width => 6
  44.         );
  45.         $canvas->createText(
  46.             $x + 25, 48,
  47.             -text   => $r,
  48.             -anchor => 'center',
  49.             -font   => 'Helvetica -36 bold'
  50.         );
  51.     }
  52. }

  53. sub try {
  54.     my ( $canvas, $e ) = @_;
  55.     undef %UNIQ;
  56.     $ANS = "NO ANSWER\n";
  57.     my $roll = [ map { rand @BALL } 1 .. $PICK ];
  58.     draw $canvas, $roll;
  59.     my @roll = map [ $_, $_ ], sort { $a <=> $b } @BALL[@$roll];
  60.     eval { fun \@roll, [] };
  61.     $e->configure( -text => $ANS );
  62. }

  63. sub show {
  64.     my $win = MainWindow->new;
  65.     $win->title('24');
  66.     $win->Label( -text => 'press any key to continue' )->pack;

  67.     my $canvas =
  68.       $win->Canvas( -width => ( $PICK + 1 ) * 50, -height => 100, )->pack;

  69.     my $lab = $win->Label(
  70.         -width => $PICK * 6,
  71.         -font  => 'Helvetica -16 bold',
  72.         -text  => 'input solution',
  73.     )->pack();

  74.     my $ok = $win->Button(
  75.         -text    => '     next     ',
  76.         -default => 'active',
  77.         -command => sub { try $canvas, $lab }
  78.     )->pack( -side => 'right', -padx => 55 );

  79.     $win->Button( -text => '     quit     ', -command => sub { exit } )
  80.       ->pack( -side => 'right', -padx => 55 );
  81.     $win->bind( '<Any-KeyPress>' => sub { try $canvas, $lab } );
  82.     try $canvas, $lab;
  83.     MainLoop;
  84. }

  85. show;

复制代码

论坛徽章:
4
程序设计版块每日发帖之星
日期:2015-10-14 06:20:00每日论坛发贴之星
日期:2015-10-14 06:20:00程序设计版块每日发帖之星
日期:2016-05-02 06:20:00程序设计版块每日发帖之星
日期:2016-05-08 06:20:00
5 [报告]
发表于 2016-04-21 15:44 |只看该作者
正常情况下,第一次以及最后一次没有(+ - * /),但是可以有括号?

论坛徽章:
4
程序设计版块每日发帖之星
日期:2015-10-14 06:20:00每日论坛发贴之星
日期:2015-10-14 06:20:00程序设计版块每日发帖之星
日期:2016-05-02 06:20:00程序设计版块每日发帖之星
日期:2016-05-08 06:20:00
6 [报告]
发表于 2016-04-21 17:43 |只看该作者
本帖最后由 mswsg 于 2016-04-21 20:46 编辑

我们来算算有多少种组合:四个球,取7次,那么共有4的7次方(4^7)中组合,
'+ - ) x / ( ' 共六种符号,将这两种符号放在7个数字中间以及旁侧,共有6^8中组合,
_1_2_3_4_5_6_7_,
_表示可以放运算符的地方,那么综合两者共有4^7*6^8中组合(即约275亿)
很明显,很多算术表达式是不合法的。
我的想法就是构造出所有的可能,然后选择出计算结果为24的组合,
可惜运行起来很慢,上面的用perl写的东西,也没有给出到底有多少种组合为24。
本人perl白痴,哪位大侠能否翻译成python贴上来,好好学习下。
另外,谁有好的思路也可交流下。
我的代码如下,直接运行即可 python test.py
运行半小时的只出来几条结果:
(1-1+8+8*4/1/2)
(1*1*8+8+4*1*2)
(1/1*8+8+4/1*2)
(1-1-8+8*4-1/2)
(1+1*8+8+4+1+2)
(1-1+8+8+4/1*2)
(1+1+8+8+4/1+2)
(1*1*8+8*4*1/2)
(1+1-8+8*4/1-2)
(1*1*8+8+4/1*2)
(1-1*8+8*4+1-2)
(1+1-8+8*4*1-2)
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. __author__ = 'shengwei ma'
  4. import random

  5. R = 1
  6. G = 2
  7. B = 4
  8. Y = 8
  9. seq = [R, G, B, Y]
  10. cal = ['+', '-', '*', '/', '(', ')']
  11. choose =[]

  12. all_choose =[]
  13. while len(choose) < 16384:
  14.     ele = [random.choice(seq), random.choice(seq), random.choice(seq), random.choice(seq), \
  15.            random.choice(seq), random.choice(seq), random.choice(seq)]
  16.     if ele not in choose:
  17.         choose.append(ele)
  18. for i in range(len(choose)):
  19.     while len(all_choose) < 1679616:
  20.         total = random.choice(cal) + str(choose[i][0]) + random.choice(cal) + str(choose[i][1]) + random.choice(cal) + \
  21.     str(choose[i][2]) + random.choice(cal) + str(choose[i][3]) + random.choice(cal) + str(choose[i][4]) + \
  22.             random.choice(cal) + str(choose[i][5]) + random.choice(cal) + str(choose[i][6]) + random.choice(cal)
  23.         if total not in all_choose:
  24.             all_choose.append(total)
  25.             try:
  26.                 value = eval(total)
  27.             except:
  28.                 pass
  29.             else:
  30.                 if value == 24:
  31.                     print total
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP