24 点游戏
作者:Filip Sergot
24 点游戏可以测试一个人的心算能力。
编写一个程序,随机选择并显示四个数字,每个数字从一到九,允许重复。程序应该提示玩家使用这四个数字输入一个等式。程序应该检查并计算表达式。目标是让玩家输入一个计算结果为 24 的表达式。
只允许使用乘法、除法、加法和减法运算符/函数。除法应该使用浮点数或有理数运算等来保留余数。如果使用中缀表达式求值器,则允许使用括号。
不允许从提供的数字中形成多位数。(因此,当给出 1、2、2 和 1 时,答案 12+12 是错误的)。
给出数字的顺序不必保留。
注意
不要求使用特定类型的表达式求值器。例如,RPN 求值器也是可以接受的。
任务不是让程序生成表达式,也不是测试表达式是否可行。
更多
http://rosettacode.org/wiki/24_game#Raku
有什么有趣的?
语法
求值
提示
滚动
强制转换
源代码:24-game.pl
use v6;
use MONKEY-SEE-NO-EVAL; # we use EVAL to process user input
grammar Exp24 {
token TOP { ^ <exp> $ }
token exp { <term> [ <op> <term> ]* }
token term { '(' <exp> ')' | \d }
token op { '+' | '-' | '*' | '/' }
}
my @default-digits = roll 4, 1..9; # to a gamer, that's a "4d9" roll
sub MAIN ($digits = Nil){
my @digits = $digits.split(/\s+/);
@digits = @digits.elems == 4 ?? @digits !! @default-digits;
say "Here are your digits: {@digits}";
while my $exp = prompt "\n24-Exp? " {
unless is-valid($exp, @digits) {
say "Sorry, your expression is not valid!";
next;
}
my $value = EVAL $exp;
say "$exp = $value";
if $value == 24 {
say "You win!";
last;
}
say "Sorry, your expression doesn't evaluate to 24!";
}
}
sub is-valid($exp, @digits) {
unless ?Exp24.parse($exp) {
say "Expression doesn't match rules!";
return False;
}
unless $exp.comb(/\d/).sort.join == @digits.sort.join {
say "Expression must contain digits {@digits} only!";
return False;
}
return True;
}
Perl 6 示例