gpt4 book ai didi

perl - 帮我完成应用程序的最后一部分?它通过暴力破解每个可能的方程来解决第 4 channel 上的任何倒计时数字游戏

转载 作者:行者123 更新时间:2023-12-04 15:48:00 27 4
gpt4 key购买 nike

对于那些不熟悉游戏的人。你有 8 个数字,你必须使用 +、-、/和 * 来达到目标​​。

因此,如果目标是 254,而您的游戏号码是 2, 50, 5, 2, 1,那么您可以正确回答问题,说 5 * 50 = 250。那么 2+2 就是 4。加上它,得到 254。

部分游戏视频如下:

Video 1
video 2

基本上,我通过为数字和符号的所有烫发生成所有大小的所有烫发来强制使用游戏,并使用基本的 inflix 计算器来计算解决方案。

然而它包含一个缺陷,因为所有的解决方案都是这样解决的:((((1+1)*2)*3)*4)。它不会排列括号,这让我很头疼。

因此我无法解出所有方程。例如,给定

目标 16 和数字 1,1,1,1,1,1,1,1 在它应该执行 (1+1+1+1)*(1+1+1+1)=16 时失败。

我会喜欢有人可以帮助完成这个......用任何语言。

这是我到目前为止所写的:

 #!/usr/bin/env perl

use strict;
use warnings;

use Algorithm::Permute;

# GAME PARAMETERS TO FILL IN
my $target = 751;
my @numbers = ( '2', '4', '7', '9', '1', '6', '50', '25' );


my $num_numbers = scalar(@numbers);

my @symbols = ();

foreach my $n (@numbers) {
push(@symbols, ('+', '-', '/', '*'));
}

my $num_symbols = scalar(@symbols);

print "Symbol table: " . join(", ", @symbols);

my $lst = [];
my $symb_lst = [];

my $perms = '';
my @perm = ();

my $symb_perms = '';
my @symb_perm;

my $print_mark = 0;
my $progress = 0;
my $total_perms = 0;

my @closest_numbers;
my @closest_symb;
my $distance = 999999;

sub calculate {
my @oprms = @{ $_[0] };
my @ooperators = @{ $_[1] };

my @prms = @oprms;
my @operators = @ooperators;

#print "PERMS: " . join(", ", @prms) . ", OPERATORS: " . join(", ", @operators);

my $total = pop(@prms);

foreach my $operator (@operators) {
my $x = pop(@prms);

if ($operator eq '+') {
$total += $x;
}
if ($operator eq '-') {
$total -= $x;
}
if ($operator eq '*') {
$total *= $x;
}
if ($operator eq '/') {
$total /= $x;
}
}
#print "Total: $total\n";

if ($total == $target) {
#print "ABLE TO ACCURATELY SOLVE WITH THIS ALGORITHM:\n";
#print "PERMS: " . join(", ", @oprms) . ", OPERATORS: " . join(", ", @ooperators) . ", TOTAL=$total\n";
sum_print(\@oprms, \@ooperators, $total, 0);
exit(0);
}

my $own_distance = ($target - $total);
if ($own_distance < 0) {
$own_distance *= -1;
}

if ($own_distance < $distance) {
#print "found a new solution - only $own_distance from target $target\n";
#print "PERMS: " . join(", ", @oprms) . ", OPERATORS: " . join(", ", @ooperators) . ", TOTAL=$total\n";
sum_print(\@oprms, \@ooperators, $total, $own_distance);
@closest_numbers = @oprms;
@closest_symb = @ooperators;
$distance = $own_distance;
}

$progress++;
if (($progress % $print_mark) == 0) {
print "Tested $progress permutations. " . (($progress / $total_perms) * 100) . "%\n";
}
}

sub factorial {
my $f = shift;
$f == 0 ? 1 : $f*factorial($f-1);
}

sub sum_print {
my @prms = @{ $_[0] };
my @operators = @{ $_[1] };
my $total = $_[2];
my $distance = $_[3];
my $tmp = '';

my $op_len = scalar(@operators);

print "BEST SOLUTION SO FAR: ";
for (my $x = 0; $x < $op_len; $x++) {
print "(";
}

$tmp = pop(@prms);
print "$tmp";

foreach my $operator (@operators) {
$tmp = pop(@prms);
print " $operator $tmp)";
}

if ($distance == 0) {
print " = $total\n";
}
else {
print " = $total (distance from target $target is $distance)\n";
}
}

# look for straight match
foreach my $number (@numbers) {
if ($number == $target) {
print "matched!\n";
}
}

for (my $x = 1; $x < (($num_numbers*2)-1); $x++) {
$total_perms += factorial($x);
}

print "Total number of permutations: $total_perms\n";
$print_mark = $total_perms / 100;
if ($print_mark == 0) {
$print_mark = $total_perms;
}

for (my $num_size=2; $num_size <= $num_numbers; $num_size++) {
$lst = \@numbers;
$perms = new Algorithm::Permute($lst, $num_size);

print "Perms of size: $num_size.\n";

# print matching symb permutations
$symb_lst = \@symbols;
$symb_perms = new Algorithm::Permute($symb_lst, $num_size-1);

while (@perm = $perms->next) {
while (@symb_perm = $symb_perms->next) {
calculate(\@perm, \@symb_perm);
}

$symb_perms = new Algorithm::Permute($symb_lst, $num_size-1);
}
}

print "exhausted solutions";
print "CLOSEST I CAN GET: $distance\n";
sum_print(\@closest_numbers, \@closest_symb, $target-$distance, $distance);
exit(0);

这是示例输出:
[15:53: /mnt/mydocuments/git_working_dir/countdown_solver$] perl countdown_solver.pl
Symbol table: +, -, /, *, +, -, /, *, +, -, /, *, +, -, /, *, +, -, /, *, +, -, /, *, +, -, /, *, +, -, /, *Total number of permutations: 93928268313
Perms of size: 2.
BEST SOLUTION SO FAR: (2 + 4) = 6 (distance from target 751 is 745)
BEST SOLUTION SO FAR: (2 * 4) = 8 (distance from target 751 is 743)
BEST SOLUTION SO FAR: (4 + 7) = 11 (distance from target 751 is 740)
BEST SOLUTION SO FAR: (4 * 7) = 28 (distance from target 751 is 723)
BEST SOLUTION SO FAR: (4 * 9) = 36 (distance from target 751 is 715)
BEST SOLUTION SO FAR: (7 * 9) = 63 (distance from target 751 is 688)
BEST SOLUTION SO FAR: (4 * 50) = 200 (distance from target 751 is 551)
BEST SOLUTION SO FAR: (7 * 50) = 350 (distance from target 751 is 401)
BEST SOLUTION SO FAR: (9 * 50) = 450 (distance from target 751 is 301)
Perms of size: 3.
BEST SOLUTION SO FAR: ((4 + 7) * 50) = 550 (distance from target 751 is 201)
BEST SOLUTION SO FAR: ((2 * 7) * 50) = 700 (distance from target 751 is 51)
BEST SOLUTION SO FAR: ((7 + 9) * 50) = 800 (distance from target 751 is 49)
BEST SOLUTION SO FAR: ((9 + 6) * 50) = 750 (distance from target 751 is 1)
Perms of size: 4.
BEST SOLUTION SO FAR: (((9 + 6) * 50) + 1) = 751

最佳答案

Here是 Java 小程序( source )和 Javascript 版本。

关于perl - 帮我完成应用程序的最后一部分?它通过暴力破解每个可能的方程来解决第 4 channel 上的任何倒计时数字游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5938861/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com