- 论坛徽章:
- 7
|
本帖最后由 rubyish 于 2017-09-11 22:26 编辑
回复 35# 523066680
Zai xuehuile maketree de jiqiao zhihou
Shishi perl:
ganxie 523066680. zhidao!! 3Q ~~
update 0m1.166s
final version:
bull.pl
- #!/usr/bin/perl
- # version 26, subversion 0 (v5.26.0)
- use 5.016; # >= 5.016
- sub NUMBER() { 0 }
- sub AGAIN() { 1 }
- sub OK() { 13 }
- __INIT__:
- print STDERR 'INIT...';
- my @NUMBER = collect();
- my $GUESS = guess();
- __TEST__:
- print STDERR "\rTEST ";
- my $TEST = 5040;
- my @COUNT;
- =IF_WANT_PRINT
- my @AB = (
- 0x00, 0x01, 0x02, 0x03, 0x04, 0x10, 0x11,
- 0x12, 0x13, 0x20, 0x21, 0x22, 0x30, 0x40,
- );
- =cut
- for my $ans ( 0 .. $TEST - 1 ) {
- my $guess = $GUESS;
- #say "\nA [@{$NUMBER[$ans]}] TEST ", $ans + 1;
- for ( my $telle = 1 ; ; $telle++ ) {
- my $num = $guess->[NUMBER];
- my $that = AB( $ans, $num );
- #printf "$telle [@{$NUMBER[$num]}] AB %02x\n", $AB[$that];
- $COUNT[$telle]++, last if $that == OK;
- $guess = $guess->[AGAIN][$that];
- }
- }
- print STDERR "\rFINISH\n";
- my $TOTO;
- for my $i ( 1 .. $#COUNT ) {
- next unless $COUNT[$i];
- say "$i\t$COUNT[$i]";
- $TOTO += $i * $COUNT[$i];
- }
- say "\nTEST\t= $TEST";
- say "GUESS\t= $TOTO ";
- printf "AVE\t= %.3f\n", $TOTO / $TEST;
- # ____________________SUB____________________
- sub guess {
- my $guess = [];
- my $fun = sub {
- my ( $guess, $maybe ) = @_;
- my $num = $maybe->[0];
- $guess->[NUMBER] = $num;
- my @next;
- for my $may (@$maybe) {
- my $ab = AB( $num, $may );
- push @{ $next[$ab] }, $may;
- }
- for my $ab ( 0 .. 12 ) {
- next unless $next[$ab];
- __SUB__->( $guess->[AGAIN][$ab] = [], $next[$ab] );
- }
- };
- $fun->( $guess, [ 0 .. 5040 - 1 ] );
- return $guess;
- }
- sub AB {
- state $val = [ 0, 5, 9, 12, 13 ];
- my ( $N1, $N2 ) = @NUMBER[@_];
- my ( $A, $B ) = ( 0, 0 );
- for my $i ( 0 .. 3 ) {
- $A++, next if $N1->[$i] == $N2->[$i];
- for my $j ( 0 .. 3 ) {
- $B++, last if $N1->[$i] == $N2->[$j];
- }
- }
- $val->[$A] + $B;
- }
- sub collect {
- sub {
- my ( $a, $b ) = @_;
- return $b if @$b == 4;
- map __SUB__->( [ @$a[ 0 .. $_ - 1, $_ + 1 .. $#$a ] ],
- [ @$b, $a->[$_] ] ), 0 .. $#$a;
- } ->( [ 0 .. 9 ], [] );
- }
- __DATA__
- $_
复制代码
|
评分
-
查看全部评分
|