游戏说明 - [专区-算法与编码]猜数字游戏 - 专题
参考:
[Perl版块]猜数字游戏专题
- 523066680
- Administrator
- 帖子: 573
- 注册时间: 2016年07月19日 12:14
- 联系:
Re: [Perl版块]猜数字游戏专题
生成搜索树
Code: [show] | [select all]
- rubyish
- 渐入佳境
- 帖子: 52
- 注册时间: 2018年04月23日 09:58
- 联系:
- rubyish
- 渐入佳境
- 帖子: 52
- 注册时间: 2018年04月23日 09:58
- 联系:
Re: [Perl版块]猜数字游戏专题
v2:
sample:
sample:
ANS = 0493 0123 20 0145 11 0426 20 0473 30 0483 30 0493 40 COUNT = 6 ---------- ANS = 0495 0123 10 0456 21 0467 20 0485 30 0495 40 COUNT = 5 ---------- ANS = 0496 0123 10 0456 30 0457 20 0486 30 0496 40 COUNT = 5 ----------
#!/usr/bin/perl -w # version 28, subversion 0 (v5.28.0) # 2018-11-14 use 5.028; my @all = map [ split // ], grep !/(.).*\1/, "0123" .. "9876"; my $tree = make( \@all ); TEST(); # ____________________SUB____________________ sub TEST { for my $ans (@all) { guess($ans); } } sub GUESS() { 0 } sub AB() { 1 } sub guess { my $ans = shift; my $count = 0; my $pos = 0; $pos |= ( 1 << $_ ) for @$ans; my $next = $tree; say "ANS = ", join '', @$ans; while ($next) { my $guess = $next->[GUESS]; my @guess = split //, $guess; my $A = 0; my $B = 0; for my $i ( 0 .. 3 ) { $guess[$i] == $ans->[$i] ? $A++ : ( $pos & ( 1 << $guess[$i] ) ) ? $B++ : undef; } $next = $next->[AB]{ $A . $B }; $count++; say $guess, "\t", $A . $B; } say "COUNT =\t$count"; say "----------\n"; } sub make { my $all = shift; my $tree = []; M_( $tree, $all ); return $tree; } sub M_ { my ( $tree, $all ) = @_; my $guess = $all->[0]; $tree->[GUESS] = join '', @$guess; my $pos = 0; $pos |= ( 1 << $_ ) for @$guess; for my $i ( 1 .. $#$all ) { my $num = $all->[$i]; my $A = 0; my $B = 0; for my $j ( 0 .. 3 ) { $guess->[$j] == $num->[$j] ? $A++ : ( $pos & ( 1 << $num->[$j] ) ) ? $B++ : undef; } push @{ $tree->[AB]{ $A . $B } }, $num; } while ( my ( $ab, $maybe ) = each %{ $tree->[AB] } ) { $tree->[AB]{$ab} = []; M_( $tree->[AB]{$ab}, $maybe ); } } __DATA__ $_
$_
- rubyish
- 渐入佳境
- 帖子: 52
- 注册时间: 2018年04月23日 09:58
- 联系:
Re: [Perl版块]猜数字游戏专题
v3:
real 0m0.640s
sample:
real 0m0.640s
sample:
time perl abc.pl1 1 2 13 3 108 4 596 5 1668 6 1768 7 752 8 129 9 5 AVE = 5.56031746031746 real 0m0.640s user 0m0.626s sys 0m0.012s
#!/usr/bin/perl -w # version 28, subversion 0 (v5.28.0) # 2018-11-14, 2018-11-17 use 5.028; my @INDES = ( 0, 5, 9, 12, 13 ); my @all = map [ split // ], grep !/(.).*\1/, "0123" .. "9876"; my $tree = make( \@all ); TEST(); # ____________________SUB____________________ sub TEST { my @record; for my $ans (@all) { #say "ANS = ", @$ans; my $count = guess($ans); #say "COUNT =\t$count"; #say "----------\n"; $record[$count]++; } my $ave = 0; for my $i ( 1 .. $#record ) { say "$i $record[$i]"; $ave += $i * $record[$i]; } say "AVE = ", $ave / @all; } sub GUESS() { 0 } sub AB() { 1 } sub guess { my $ans = shift; my $count = 0; my $pos = ( 1 << $ans->[0] ) | ( 1 << $ans->[1] ) | ( 1 << $ans->[2] ) | ( 1 << $ans->[3] ); my $next = $tree; while ($next) { my $guess = $next->[GUESS]; my $A = 0; my $B = 0; for my $i ( 0 .. 3 ) { $guess->[$i] == $ans->[$i] ? $A++ : ( $pos & ( 1 << $guess->[$i] ) ) ? $B++ : undef; } $next = $next->[AB][ $INDES[$A] + $B ]; $count++; #say @$guess, "\t", $A . $B; } return $count; } sub make { my $all = shift; my $tree = []; M_( $tree, $all ); return $tree; } sub M_ { my ( $tree, $all ) = @_; my $guess = $all->[0]; $tree->[GUESS] = $guess; my $pos = ( 1 << $guess->[0] ) | ( 1 << $guess->[1] ) | ( 1 << $guess->[2] ) | ( 1 << $guess->[3] ); for my $i ( 1 .. $#$all ) { my $num = $all->[$i]; my $A = 0; my $B = 0; for my $j ( 0 .. 3 ) { $guess->[$j] == $num->[$j] ? $A++ : ( $pos & ( 1 << $num->[$j] ) ) ? $B++ : undef; } push @{ $tree->[AB][ $INDES[$A] + $B ] }, $num; } for my $i ( 0 .. $#{ $tree->[AB] } ) { my $maybe = $tree->[AB][$i] // next; $tree->[AB][$i] = []; M_( $tree->[AB][$i], $maybe ); } } __DATA__ $_
$_
在线用户
正浏览此版面之用户: 没有注册用户 和 4 访客