如何用 GPT-4 帮你写游戏(以24点游戏举例)

news2024/11/27 20:30:01

目录

给我一个24点游戏

游戏规则

 GPT给的代码

​改进

 再改进


最近呢掀起了一阵GPT-4的热潮,很多人都想用GPT-4,这里呢我就打一个广告(嘿嘿),如果不知道国内如何使用GPT的,可以看看这个博客:GPT-4的免费使用方法分享(续)_我爱OJ的博客-CSDN博客

目前你想要用上 GPT-4,主要的渠道是 ChatGPT Plus 。作为交了订阅费的用户,你可以在对话的时候选择模型来使用。

另一种渠道,就是申请官方 API 的排队。我在申请通义千问的时候,耐心被折磨了4,5 天了,每天回家都兴致勃勃的看手机有没有短信。所以这次申请完就放在一边了。啥时候通过申请,听天由命吧。(所以这次我就拿国内的GPT-3.5来为大家测试)

给我一个24点游戏

游戏规则

“24点”是一种扑克牌游戏,正如象棋、围棋一样是一种人们喜闻乐见的娱乐活动。

它以自己独具的数学魅力和丰富的内涵正逐渐被越来越多的人们所接受。这种游戏方式简单易学,能健脑益智,是一项极为有益的活动。

具体内容及操作方法

一副牌中抽去大小王剩下52张,任意抽取4张牌,利用四则运算把牌面上的数算成24。每张牌能且只能用一次。

游戏技巧

1.利用3×8=24、4×6=24、2×12=24求解。

把牌面上的四个数想办法凑成3和8、4和6、2和12,再相乘求解。实践证明,这种方法是利用率最大、命中率最高的一种方法。

2.利用0、1的运算特性求解。

如3、4、4、8可组成3×8×(4÷4)=24。又如4、7、1、1可组成4×1(7-1)×1=24。

3.看4张牌中是否有2,3,4,6,8,Q,

如果有,考虑用乘法,将剩余的3个数凑成对应数。如果有两个相同的6,8,Q,比如已有两个6,剩下的只要能凑成3,4,5都能算出24,已有两个8,剩下的只要能凑成2,3,4,已有两个Q,剩下的只要能凑成1,2,3都能算出24,比如(9,J,Q,Q)。如果没有2,3,4,6,8,Q,看是否能先把两个数凑成其中之一。总之,乘法是很重要的,24是30以下公因数最多的整数。

4、将4张牌加加减减得到24。

5、先相乘再加、减去某数。

6、在计算过程中有分数出现。有一个规律,设4个数为a,b,c,d。必有ab+c=24或ab-c=24 d=a或b。若d=a 有a(b+c/a)=24 或 a(b-c/a)=24。只能用此法的只有17种。

7、在计算过程中有较大数(30以上)出现。相对较难,但有时也只有该解法。比如(6,9,9,10)为9×10÷6+9。

 GPT给的代码

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
double eval(string s) // 计算字符串表达式的值
{
    int len = s.size();
    int p = 0; // 指向当前遍历到的位置
    double ans = 0.0; // 累计所有项的和
    int op = 1; // 当前符号的正负号,1表示加法或正号,-1表示减法或负号
    int last_op = 1; // 上一个符号的正负号
    double num = 0.0; // 当前遍历到的数值

    while(p < len)
    {
        char c = s[p];
        if(c == '+' || c == '-') // 遇到加减号
        {
            ans += op * last_op * num;
            num = 0.0;
            last_op = op = (c == '+') ? 1 : -1;
        }
        else if(c == '*' || c == '/') // 遇到乘除号
        {
            double next_num = 0.0;
            ++p;
            while(p < len && '0' <= s[p] && s[p] <= '9')
                next_num = next_num*10 + s[p++] - '0';
            num = (c == '*') ? num * next_num : num / next_num;
        }
        else if(c == '(') // 遇到左括号
        {
            int cnt = 1;
            int q = p + 1;
            while(q < len && cnt > 0)
            {
                if(s[q] == '(')
                    ++cnt;
                else if(s[q] == ')')
                    --cnt;
                ++q;
            }
            num = eval(s.substr(p+1, q-p-2));
            p = q;
        }
        else if(c == ' ') // 空格分隔符
        {
            ++p;
            continue;
        }
        else // 遇到数字
        {
            num = num*10 + c - '0';
            ++p;
        }
    }

    ans += op * last_op * num;

    return ans;
}
int main()
{
    srand(time(NULL)); // 初始化随机数生成器
    int a = rand()%9+1, b = rand()%9+1, c = rand()%9+1, d = rand()%9+1; // 生成四个1~9之间的整数
    cout << "请使用加、减、乘、除以及括号使得以下四个数构成算式的结果为24:" << endl;
    cout << a << " " << b << " " << c << " " << d << endl;

    bool found = false; // 标记是否找到合法的算式
    char ops[5] = {'+', '-', '*', '/'}; // 运算符集合
    for(int i=0; i<4 && !found; ++i) // 枚举第一个数到第四个数
        for(int j=0; j<4 && !found; ++j) // 枚举第二个数到第四个数
            if(j != i)
                for(int k=0; k<4 && !found; ++k) // 枚举第三个数到第四个数
                    if(k != j && k != i)
                        for(int l=0; l<4 && !found; ++l) // 枚举第四个数
                            if(l != k && l != j && l != i)
                            {
                                // 构造算式
                                string s = "";
                                s += to_string(a) + ops[i] + to_string(b) + ops[j] + to_string(c) + ops[k] + to_string(d);

                                // 枚举中间结果的算式
                                for(int i2=0; i2<4 && !found; ++i2)
                                    for(int j2=0; j2<4 && !found; ++j2)
                                        if(j2 != i2)
                                            for(int k2=0; k2<4 && !found; ++k2)
                                                if(k2 != j2 && k2 != i2)
                                                {
                                                    // 构造中间结果的算式
                                                    string s2 = "";
                                                    s2 += "(" + to_string(a) + ops[i] + to_string(b) + ")" + ops[i2] + "(" + to_string(c) + ops[j] + to_string(d) + ")" + ops[j2] + to_string(ops[k2] - '+' + '*');

                                                    // 计算结果
                                                    if(eval(s2) == 24)
                                                    {
                                                        cout << "恭喜您,找到了一个合法的算式:" << endl;
                                                        cout << s << " = " << eval(s) << endl;
                                                        found = true;
                                                    }
                                                }
                            }

    if(!found)
        cout << "很遗憾,没有找到合法的算式。" << endl;

    return 0;
}


不出意外的话意外就要来了 

但是但是,我上网找了半天,终于知道为什么了,因为我的C++版本太低了,解决办法也很简单 ,如下

 依次点击菜单:工具(Tools)->编译选项(Compiler Options) -> 代码生成/优化(Settings) ->代码生成( Code Generation),找到最后一项语言标准(即Language standard),可以看到后面的选项默认是空的。

下拉选项栏,选中ISO C++11,点击确定后再进行编译就不会报错了

 运行后是这样的:

可以看到,没有输出结果,这时我就来气了,就对GPT说

改进

下面是改正后的代码

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <stack>
#include <vector>
using namespace std;

double eval(vector<string>& tokens) // 计算逆波兰表达式的值
{
    stack<double> nums;
    for(string& token: tokens)
    {
        if(token == "+") // 加法
        {
            double num2 = nums.top();
            nums.pop();
            double num1 = nums.top();
            nums.pop();
            nums.push(num1 + num2);
        }
        else if(token == "-") // 减法
        {
            double num2 = nums.top();
            nums.pop();
            double num1 = nums.top();
            nums.pop();
            nums.push(num1 - num2);
        }
        else if(token == "*") // 乘法
        {
            double num2 = nums.top();
            nums.pop();
            double num1 = nums.top();
            nums.pop();
            nums.push(num1 * num2);
        }
        else if(token == "/") // 除法
        {
            double num2 = nums.top();
            nums.pop();
            double num1 = nums.top();
            nums.pop();
            nums.push(num1 / num2);
        }
        else // 数字
        {
            nums.push(stod(token)); // stod() 可以将字符串转换为 double 类型
        }
    }

    return nums.top();
}

bool solve(vector<int>& nums, vector<string>& tokens) // 递归解决24点游戏
{
    if(nums.empty()) // 无数字剩余,得出解法
    {
        return eval(tokens) == 24;
    }

    for(int i=0; i<nums.size(); ++i)
    {
        int num = nums[i];
        nums.erase(nums.begin() + i); // 去掉当前数
        tokens.push_back(to_string(num)); // 转换为字符串并加入逆波兰表达式
        if(solve(nums, tokens)) // 尝试解决剩余的数字
            return true;
        tokens.pop_back();
        nums.insert(nums.begin() + i, num); // 还原当前数
    }

    return false;
}

int main()
{
    srand(time(NULL)); // 初始化随机数生成器
    vector<int> nums(4);
    for(int& num: nums)
        num = rand()%9+1; // 生成四个 1~9 之间的整数
    cout << "请使用加、减、乘、除以及括号使得以下四个数构成算式的结果为24:" << endl;
    cout << nums[0] << " " << nums[1] << " " << nums[2] << " " << nums[3] << endl;

    vector<string> tokens;
    if(solve(nums, tokens)) // 寻找解法
    {
        cout << "恭喜您,找到了一个合法的算式:" << endl;
        for(string& token: tokens)
            cout << token << " ";
        cout << "= 24" << endl;
    }
    else
    {
        cout << "很遗憾,没有找到合法的算式。" << endl;
    }

    return 0;
}

输出结果

 很明显,这边已经强多了,但是我能让它这么轻而易举吗,于是我继续提问题:

 再改进

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <stack>
#include <string>
#include <vector>

using namespace std;

double eval(vector<string>& tokens) // 计算逆波兰表达式的值
{
    stack<double> nums;
    for (string& token : tokens) {
        if (token == "+") // 加法
        {
            double num2 = nums.top();
            nums.pop();
            double num1 = nums.top();
            nums.pop();
            nums.push(num1 + num2);
        }
        else if (token == "-") // 减法
        {
            double num2 = nums.top();
            nums.pop();
            double num1 = nums.top();
            nums.pop();
            nums.push(num1 - num2);
        }
        else if (token == "*") // 乘法
        {
            double num2 = nums.top();
            nums.pop();
            double num1 = nums.top();
            nums.pop();
            nums.push(num1 * num2);
        }
        else if (token == "/") // 除法
        {
            double num2 = nums.top();
            nums.pop();
            double num1 = nums.top();
            nums.pop();
            nums.push(num1 / num2);
        }
        else // 数字
        {
            nums.push(stod(token)); // stod() 可以将字符串转换为 double 类型
        }
    }

    return nums.top();
}

bool solve(vector<int>& nums, vector<string>& tokens, int step) // 递归解决24点游戏
{
    if (nums.empty()) // 无数字剩余,得出解法
    {
        if (eval(tokens) == 24)
        {
            cout << "恭喜您,找到了一个合法的算式:" << endl;
            for (string& token : tokens)
                cout << token << " ";
            cout << "= 24" << endl;
            return true;
        }
        else
        {
            return false;
        }
    }

    if (step == 0) // 已经尝试了 5 次,输出如何用这些数字组成 24
    {
        cout << "很遗憾,五次机会已用完。以下是如何用这些数字组成 24。" << endl;
        return false;
    }

    for (int i = 0; i < nums.size(); ++i) {
        int num = nums[i];
        nums.erase(nums.begin() + i); // 去掉当前数
        tokens.push_back(to_string(num)); // 转换为字符串并加入逆波兰表达式
        if (solve(nums, tokens, step - 1))
            return true;
        tokens.pop_back();
        nums.insert(nums.begin() + i, num); // 还原当前数
    }

    return false;
}

int main()
{
    srand(time(NULL)); // 初始化随机数生成器
    vector<int> nums(4);
    for (int& num : nums)
        num = rand() % 9 + 1; // 生成四个 1~9 之间的整数
    cout << "您有五次机会使用加、减、乘、除以及括号使得以下四个数构成算式的结果为 24:" << endl;
    cout << nums[0] << " " << nums[1] << " " << nums[2] << " " << nums[3] << endl;

    vector<string> tokens;
    bool found_solution = false; // 是否已经找到解法
    for (int i = 1; i <= 5; ++i) {
        cout << "第" << i << "次尝试:请输入您的算式(支持加减乘除和括号):" << endl;
        string input;
        getline(cin, input);
        tokens.push_back(input); // 将输入的字符串加入 vector 中
        if (eval(tokens) == 24)
        {
            cout << "恭喜您,找到了一个合法的算式:" << endl;
            cout << input << " = 24" << endl;
            found_solution = true;
            break;
        }
        else if (i < 5)
        {
            cout << "计算结果不为 24,请继续尝试。" << endl;
        }
        tokens.pop_back(); // 将输入的字符串从 vector 中弹出
    }

    if (!found_solution) // 五次机会用完,输出如何用这些数字组成 24
    {
        vector<string> empty_tokens;
        if (solve(nums, empty_tokens, 5))
        {
            // 已经在函数中输出了解法
        }
        else
        {
            cout << "无法组成 24,以下是如何使用这些数字组成 24:" << endl;
            // 输出如何用这些数字组成 24 的方法
            // ...
        }
    }

    return 0;
}

 GPT真的很认真修改代码,之后运行效果是这样的

 我不禁感慨了一句感慨:还学啥C++

当然,任何一个有经验的程序员,都可以站出来指出 GPT-4 辅助编程的种种缺点,然后断言它永远替代不了优秀的开发者。

你别忘了, GPT-4 发布才不到一年,目前一众大语言模型还在以狂飙的姿态进化中。再说了,谁说它的目标是替代「优秀的开发者」了?

目前,我还没有答案。想听听你的看法。欢迎留言,咱们一起交流讨论

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/577197.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STC89C52+DHT20设计的环境温湿度检测仪

一、项目背景 本项目基于STC89C52单片机和DHT20温湿度传感器,实现了一款环境温湿度检测仪。通过传感器采集环境的温度和湿度数据,利用IIC接口的OLED显示屏显示出来,便于用户实时监测环境温湿度状态。 在现代社会,人们对环境温湿度的要求越来越高。无论是工作场所还是居住…

局部特征匹配(LoFTR) 基于全局匹配的光流学习(GMFlow)

文章目录 特征匹配&#xff08;稀疏匹配与稠密匹配&#xff09;《LoFTR: Detector-Free Local Feature Matching with Transformers》【CVPR21】《GMFlow: Learning Optical Flow via Global Matching》【CVPR22】光流的定义第一个问题第二个问题方法该框架下存在的一个问题 Pr…

智慧园区管理平台优势详解

随着数字化和智能化的时代到来&#xff0c;越来越多的园区开始使用智慧园区管理平台来提高管理效率&#xff0c;降低管理成本和提升服务质量。智慧园区管理平台是一种通过智能化技术与物联网技术进行连接&#xff0c;对园区进行综合管理、智能化监控的信息化平台。下面将详细介…

大数据:云平台,阿里云VPC创建,创建安全组,云服务器ECS,

大数据&#xff1a;云平台 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其sql要学&…

Seata之@GlobalTransactional验证

下订单 -> 减库存 -> 扣余额 -> 改&#xff08;订单&#xff09;状态 1.数据库初始情况&#xff1a; 2.正常下单 http://localhost:2001/order/create?userId1&productId1&count10&money100 3.超时异常&#xff0c;没加GlobalTransactional 模拟Accou…

RabbitMQ系列(24)--RabbitMQ集群搭建

前言&#xff1a;当RabbitMQ服务器遇到内存崩溃、机器掉电或者主板故障等情况&#xff0c;该怎么办?单台RabbitMQ服务器可以满足每秒1000条消息的吞吐量&#xff0c;那如果应用需要RabbitMQ服务满足每秒10万条消息的吞吐量呢?购买昂贵的服务器来增强单机RabbitMQ服务的性能不…

阿里云ECS部署chat-web代理访问

1、ECS服务器申请 使用阿里云账号购买了一个美国&#xff08;弗吉尼亚&#xff09;的2C/2G的CentOS7.9 x64服务器。 2、系统版本升级 CentOS7.9默认的python和pip版本都是3.6的&#xff0c;需要升级到3.9以上&#xff0c;升级步骤百度&#xff0c;大致如下&#xff1a; wget…

vue diff算法与虚拟dom知识整理(12) patch精细化比较新增子节点

上文中我们编写了patch函数中对相同节点的几种处理 将简单的都写完了 但还留下了最麻烦的子节点比较 既新旧节点都有子节点 需要 精细化比较 我们先将src下的入口文件index.js 代码改成这样 import h from "./snabbdom/h"; import patch from "./snabbdom/pat…

C++实现Canny边缘检测(原理+底层代码)

文章目录 一、算法原理二、环境配置三、算法详解3.1、数据结构 Mat3.2、高斯滤波器的C实现3.3、用一阶偏导有限差分计算梯度幅值和方向 三、项目实战&#xff1a;C实现Canny边缘检测 一、算法原理 canny边缘检测算法步骤&#xff1a; 1、使用高斯滤波器对图像进行平滑处理。 2、…

recurdyn履带问题

1.问题&#xff1a;整车履带仿真出错&#xff0c;车辆越障时遇到障碍物直接弹开 思路&#xff1a; 关于这类模型需要调节履带和地面之间的接触参数、Bushing force&#xff0c;还有驱动函数。 弹飞了是因为接触刚度太大了&#xff0c;调小一些&#xff0c;在100以内继续调节…

从代码角度理解DETR

一个cnn的backbone, 提图像的feature, 比如, HWC.同时对这个feature做position_embedding.然后二者相加 (在Transformer里面就是二者相加)输入encoder,输入decoder (这里有object queries.)然后接Prediction Heads, 比如分类和回归. 下面的代码参考自: https://github.com/fac…

单片机原理及应用——持续更新

目录 一、单片机概述 1、单片机简介 2、单片机的特点 3、MSC-51系列与AT89S5x系列单片机 &#xff08;1&#xff09;MSC-51系列单片机 &#xff08;2&#xff09;AT89S5x系列单片机 二、AT89S52单片机的片内硬件结构 1、AT89S52单片机的硬件组成 2、AT89S52单片机的引…

Springboot +spring security,OAuth2 四种授权模式概念

一.简介 这篇文章来讲下Spring Security OAuth2 四种授权模式。 二.什么是OAuth2 OAuth 2.0 是一种用于授权的开放标准&#xff0c;允许用户授权第三方应用程序访问他们的资源&#xff0c;例如照片、视频或其他个人信息。OAuth 2.0 提供了一些不同的授权模式&#xff0c;包括…

我有一个朋友,分享给我的字节跳动测试开发真题

朋友入职已经两周了&#xff0c;整体工作环境还是非常满意的&#xff01;所以这次特意抽空给我写出了这份面试题&#xff0c;而我把它分享给小伙伴们&#xff0c;面试&入职的经验&#xff01; 大概是在3月中的时候他告诉我投递了简历&#xff0c;5月的时候经过了3轮面试收获…

Windows10中搭建ftp服务器以实现文件传输

开启ftp服务&#xff1a; 1、打开控制面板》程序和功能》 启用或关闭Windows功能 2、找到Internet Information Services&#xff0c;开启以下服务 勾选之后&#xff0c;ftp服务开启成功。 配置IIS&#xff0c;搭建ftp 1、WinS键搜索iis&#xff0c;回车打开》右击网站 》添加…

QUIC 协议:特性、应用场景及其对物联网/车联网的影响

什么是 QUIC 协议 QUIC&#xff08;Quick UDP Internet Connections&#xff09;是由谷歌公司开发的一种基于用户数据报协议&#xff08;UDP&#xff09;的传输层协议&#xff0c;旨在提高网络连接的速度和可靠性&#xff0c;以取代当前互联网基础设施中广泛使用的传输控制协议…

/dev/kmem /proc/kallsyms

文章目录 前言概述使用 /dev/kmem使用 /proc/kallsyms验证进阶 前言 上篇文章我们介绍了 /dev/mem&#xff0c;今天再来介绍下它的好兄弟 /dev/kmem crw-r----- 1 root kmem 1, 1 May 26 06:10 /dev/mem crw-r----- 1 root kmem 1, 2 May 26 06:10 /dev/kmem对比一下&#xf…

第十四届全国大学生数学竞赛决赛(非数类)游记+答案解析

2023/5/27 20:08&#xff1a;今天早上9:00~12:00考了数学竞赛国赛。广州是真的热啊&#xff01;西安才17度&#xff0c;还下着小雨&#xff0c;到广州之后那个艳阳直接给我人干废了&#xff0c;去酒店的路上步行了20分钟真的要死了已经。 拿到卷子的我是崩溃的&#xff0c;用正…

计算机视觉:填充(padding)技术

本文重点 在前面的课程中,我们学习了使用3*3的过滤器去卷积一个5*5的图像,那么最终会得到一个3*3的输出。那是因为 33 过滤器在 55 矩阵中,只可能有 33 种可能的位置。 这背后的数学解释是,如果我们有一个nn的图像,用ff的过滤器做卷积,那么输出的维度就是(n−f+1)(n−f…

码出高效_第一章 | 有意思的二进制表示及运算

目录 0与1的世界1.如何理解32位机器能够同时处理处理32位电路信号&#xff1f;2.如何理解负数的加减法运算3.溢出在运算中如何理解4.计算机种常用的存储单位及转换5.位移运算规则6.有趣的 && 和 & 浮点数1.定点小数&#xff08;为什么会出现浮点数表示&#xff1f;…