- #!/usr/bin/env perl6
- #
- # 编写一个程序接收4个数字作为输入,数字可以由用户输入或者程序随机生成,
- # 然后在24游戏的规则下推算算术表达式。
- # 显示程序产生的算术表达式样例。
- class IPN24Game {
- has $.goal;
- has @.digit;
- has @.op;
- has @.expr;
- submethod BUILD(:$goal, :@digit, :@op) {
- $!goal = $goal;
- @!digit = @digit;
- @!op = processOp(@op, +@digit - 1);
- }
- sub processOp(@op, $need-count) {
- my @ret = ();
- @op.map: -> $op {@ret.push: $op for ^$need-count };
- return @ret;
- }
- method genExpr(:$show = False) {
- my @dp = perm(@!digit);
- my @op = perm(@!op, +@!digit - 1);
- my $gen-expr = start {
- my $expr;
- for (@dp X @op) -> (@digit, @op) {
- $expr = genExpr(@digit, @op);
- if $expr.EVAL == $!goal {
- say $expr if $show;
- @!expr.push: $expr;
- }
- }
- }
- await $gen-expr;
- return +@!expr;
- }
- method expr() { @!expr }
- multi sub perm(@array) {
- return @array.permutations().unique(:with(&uniq));
- }
- multi sub perm(@array, $need-count) {
- my (Promise @promises, @comb);
- my $channel = Channel.new;
- for @array.combinations($need-count) -> @cur-comb {
- if isValidItem(@comb, @cur-comb) {
- push @promises, start {
- $channel.send(@cur-comb.permutations());
- };
- }
- }
- await Promise.anyof(@promises);
- my @perm;
- loop (my @item = $channel.poll();@item !~~ [(Any)]; @item = $channel.poll()) {
- for @item -> @p {
- @perm.push: @p if isValidItem(@perm, @p);
- }
- }
- $channel.close();
- return @perm;
- }
- sub isValidItem(@array, @perm) returns Bool {
- for @array -> @item {
- return False if @item ~~ @perm;
- }
- return True;
- }
- sub uniq(@la, @ra) { @la ~~ @ra }
- sub genExpr(@digit is copy, @op) returns Str {
- my @expr = '(' x @op.elems - 1, @digit.shift;
- for @digit Z @op -> ($d, $o) {
- @expr.append: $o, $d, ')';
- }
- @expr.pop();
- return @expr.join(' ');
- }
- }
- my $game = IPN24Game.new(:goal<24>, :digit(8, 8, 4, 4), :op<+ - / *>);
- say $game.perl;
- say $game.genExpr();
- for $game.expr() {
- .say;
- }
- #该片段来自于http://www.codesnippet.cn/detail/1101201614411.html
来源: http://www.codesnippet.cn/detail/1101201614411.html