- 论坛徽章:
- 7
|
本帖最后由 rubyish 于 2016-04-26 22:02 编辑
v3:- try [ 3, 3, 8, 8 ]; # 0.025 s
- try [ 2, 1, 1, 1, 1, 1, 1 ]; # 0.19 s
- try [ 1, 1, 1, 1, 1, 1, 1 ]; # 0.075 s
复制代码- #!/usr/bin/perl
- my $SCOR = 24;
- my @BALL = ( 1, 2, 4, 8 );
- my $PICK = 7;
- my %UNIQ;
- sub _ { $a->[0] <=> $b->[0] }
- sub fun {
- my ( $A, $B ) = @_;
- if ( !@$A and @$B == 1 ) {
- return if $B->[0][0] ne $SCOR;
- my $answer = substr $B->[0][1], 2, -2;
- print "$answer = $SCOR\n\n" and die;
- }
- if ( @$B == 2 ) {
- return if $UNIQ{ join $", map $_->[0], @$A, @$B }++;
- my ( $i, $x, $j, $y ) = map @$_, @$B;
- fun( [ sort { _ }[ $i + $j, "( $x + $y )" ], @$A ], [] );
- fun( [ sort { _ }[ $i - $j, "( $x - $y )" ], @$A ], [] );
- fun( [ sort { _ }[ $i * $j, "( $x * $y )" ], @$A ], [] );
- fun( [ sort { _ }[ $i / $j, "( $x / $y )" ], @$A ], [] ) if $j;
- }
- for my $i ( 0 .. $#$A ) {
- next if $i and $A->[$i][0] == $A->[ $i - 1 ][0];
- fun( [ @$A[ 0 .. $i - 1, $i + 1 .. $#$A ] ], [ @$B, $A->[$i] ] );
- }
- }
- sub try {
- my ( $roll, $fail ) = ( @_, 0, undef %UNIQ, undef $@ );
- print "\n[ ", join( ', ', @$roll ), " ]\n\n";
- print "NO ANSWER\n\n" and return if $fail;
- $roll = [ map [ $_, $_ ], sort { $a <=> $b } @$roll ];
- eval { fun $roll, [] };
- print "NO ANSWER\n\n" if !$@;
- }
- sub run {
- print "\n\n[ q: EXIT, enter: roll ]\n\n";
- my ( $Ok, %Polar ) = \$@;
- while (<>) {
- print "\n[ EXIT ]\n" and return if /q/;
- my $the = [ @BALL[ map { rand @BALL } 1 .. $PICK ] ];
- my $Express = join $", sort { $a <=> $b } @$the;
- try $the, $Polar{$Express};
- $Polar{$Express} = 2 if not $Ok;
- }
- }
- run;
复制代码 v3.1
- #!/usr/bin/perl
- use Tk;
- my @BALL = ( 1, 2, 4, 8 );
- my $PICK = 7;
- my $SCOR = 24;
- my %UNIQ;
- my $ANS;
- my @color = qw/coral limegreen skyblue gold
- hotpink purple snow4 bisque3
- tan orchid gray khaki plum/;
-
- sub _ { $a->[0] <=> $b->[0] }
- sub fun {
- my ( $A, $B ) = @_;
- if ( !@$A and @$B == 1 ) {
- return if $B->[0][0] ne $SCOR;
- my $answer = substr $B->[0][1], 2, -2;
- $ANS = "$answer = $SCOR\n";
- die;
- }
- if ( @$B == 2 ) {
- return if $UNIQ{ join $", map $_->[0], @$A, @$B }++;
- my ( $i, $x, $j, $y ) = map @$_, @$B;
- fun( [ sort { _ }[ $i + $j, "( $x + $y )" ], @$A ], [] );
- fun( [ sort { _ }[ $i - $j, "( $x - $y )" ], @$A ], [] );
- fun( [ sort { _ }[ $i * $j, "( $x * $y )" ], @$A ], [] );
- fun( [ sort { _ }[ $i / $j, "( $x / $y )" ], @$A ], [] ) if $j;
- }
- for my $i ( 0 .. $#$A ) {
- next if $i and $A->[$i][0] == $A->[ $i - 1 ][0];
- fun( [ @$A[ 0 .. $i - 1, $i + 1 .. $#$A ] ], [ @$B, $A->[$i] ] );
- }
- }
- sub draw {
- my ( $canvas, $b ) = @_;
- for my $i ( 1 .. $PICK ) {
- my $x = 50 * $i - 25;
- my $bi = $b->[ $i - 1 ];
- my $r = $BALL[$bi];
- $canvas->createOval(
- $x, 25, $x + 50, 75,
- -fill => $color[$bi],
- -width => 6
- );
- $canvas->createText(
- $x + 25, 48,
- -text => $r,
- -anchor => 'center',
- -font => 'Helvetica -36 bold'
- );
- }
- }
- sub try {
- my ( $canvas, $e ) = @_;
- undef %UNIQ;
- $ANS = "NO ANSWER\n";
- my $roll = [ map { rand @BALL } 1 .. $PICK ];
- draw $canvas, $roll;
- my @roll = map [ $_, $_ ], sort { $a <=> $b } @BALL[@$roll];
- eval { fun \@roll, [] };
- $e->configure( -text => $ANS );
- }
- sub show {
- my $win = MainWindow->new;
- $win->title('24');
- $win->Label( -text => 'press any key to continue' )->pack;
- my $canvas =
- $win->Canvas( -width => ( $PICK + 1 ) * 50, -height => 100, )->pack;
- my $lab = $win->Label(
- -width => $PICK * 6,
- -font => 'Helvetica -16 bold',
- -text => 'input solution',
- )->pack();
- my $ok = $win->Button(
- -text => ' next ',
- -default => 'active',
- -command => sub { try $canvas, $lab }
- )->pack( -side => 'right', -padx => 55 );
- $win->Button( -text => ' quit ', -command => sub { exit } )
- ->pack( -side => 'right', -padx => 55 );
- $win->bind( '<Any-KeyPress>' => sub { try $canvas, $lab } );
- try $canvas, $lab;
- MainLoop;
- }
- show;
复制代码 |
|