草庐IT

让 new bing 使用 GPT-4 编写一个令人满意的程序全过程赏析

大风无痕 2023-04-20 原文

让 new bing 使用 GPT-4 编写一个令人满意的程序全过程赏析

标签:new bing、GPT-4

文章目录

前言

前天 Open AI 的 GPT-4上线了,所能达到的高度惊爆人的眼球。上线当天,我就把应用 GPT-4 的新版微软搜索引擎 bing 使用环境配置好了。今天试着用这个 bing 的聊天功能,一步步与 bing 沟通,真还让 bing 替我编写了一个令我满意的 Python 程序。而这个画阿基米德螺旋线的 Python 程序,我在几年前自己 Coding 竟然花了半个月,才达到满意的结果。新科技带来的变化,令人眼花缭乱、一时难以判断走向,是不是很惊恐?
下面就在这里展现、赏析这个聊天过程吧。

1 让 bing 编写一个画螺旋线的程序

1.1 我的要求(1)

1.2 bing 的回答全文(1)

由于 bing Chat 还不支持完整截图,去网页打开吧。点击此处或者复制链接后在 new bing 中打开(需要在 new bing 中登录后才能打开,下同)。

1.3 bing 编写的程序

为了美观,略有改动(step *= 0.99改为step *= 0.999),下同。

# 导入turtle模块,用于绘图
import turtle
# 导入math模块,用于计算
import math
# 创建一个turtle对象,命名为t
t = turtle.Turtle()
# 设置画笔的颜色和速度
t.color("blue")
t.speed(0)
# 设置阿基米德螺旋线的参数
a = 5 # 螺旋线的起始半径
b = 0.1 # 螺旋线的增长系数
angle = 0 # 螺旋线的起始角度
step = 5 # 螺旋线的步长

# 循环绘制阿基米德螺旋线,直到半径超过200像素或角度超过1080度
while a < 200 and angle < 1080:
    # 计算阿基米德螺旋线上当前点的极坐标(r, theta)
    r = a + b * angle # 半径等于起始半径加上增长系数乘以角度
    theta = math.radians(angle) # 角度转换为弧度制
    
    # 计算阿基米德螺旋线上当前点的直角坐标(x, y)
    x = r * math.cos(theta) # x坐标等于半径乘以余弦值
    y = r * math.sin(theta) # y坐标等于半径乘以正弦值
    
    # 移动画笔到当前点,并画出一小段曲线
    t.goto(x, y)
    
    # 更新角度和步长,使得曲线更平滑
    angle += step 
    step *= 0.999

# 结束绘图,并保持窗口显示直到用户关闭    
turtle.done()

1.4 程序运行的结果

2 让 bing 去掉多余的第一笔

看上去从原点到螺旋线的起点的那条很短的直线即第一笔不是螺旋线的一部分,是多余的。

2.1 我的要求(2)

2.2 bing 的回答全文(2)

点击此处或者复制链接后在 new bing 中打开

2.3 我的要求(3)

2.4 bing 的回答全文(3)

点击此处或者复制链接后在 new bing 中打开

2.5 我的要求(4)

2.6 bing 的回答全文(4)

点击此处或者复制链接后在 new bing 中打开

2.7 我的要求(5)

2.8 bing 的回答全文(5)

点击此处或者复制链接后在 new bing 中打开

2.9 bing 编写的程序

# 导入turtle模块,用于绘图
import turtle
# 导入math模块,用于计算
import math
# 创建一个turtle对象,命名为t
t = turtle.Turtle()
# 设置画笔的颜色和速度
t.color("blue")
t.speed(0)
# 设置阿基米德螺旋线的参数
a = 5 # 螺旋线的起始半径
b = 0.1 # 螺旋线的增长系数
angle = 0 # 螺旋线的起始角度
step = 5 # 螺旋线的步长

# 抬起画笔,不留痕迹(新增代码)
t.penup()

# 循环绘制阿基米德螺旋线,直到半径超过200像素或角度超过1080度
while a < 200 and angle < 1080:
    # 计算阿基米德螺旋线上当前点的极坐标(r, theta)
    r = a + b * angle # 半径等于起始半径加上增长系数乘以角度
    theta = math.radians(angle) # 角度转换为弧度制
    
    # 计算阿基米德螺旋线上当前点的直角坐标(x, y)
    x = r * math.cos(theta) # x坐标等于半径乘以余弦值
    y = r * math.sin(theta) # y坐标等于半径乘以正弦值
    
    # 移动画笔到当前点,并画出一小段曲线
    t.goto(x, y)
    
    # 更新角度和步长,使得曲线更平滑
    angle += step 
    step *= 0.999

# 放下画笔,开始绘制(新增代码)
t.pendown()

# 结束绘图,并保持窗口显示直到用户关闭    
turtle.done()

2.10 程序运行的结果

3 改正第二笔起笔没有放下的错误

从运行结果看,第一笔前把笔抬起后,没有及时放下,导致后边的笔画全部没有画,需要改正。

3.1 我的要求(6)

3.2 bing 的回答全文(6)

点击此处或者复制链接后在 new bing 中打开

3.3 我的要求(7)

3.4 bing 的回答全文(7)

点击此处或者复制链接后在 new bing 中打开

3.5 bing 编写的程序

# 导入turtle模块,用于绘图
import turtle
# 导入math模块,用于计算
import math
# 创建一个turtle对象,命名为t
t = turtle.Turtle()
# 设置画笔的颜色和速度
t.color("blue")
t.speed(0)
# 设置阿基米德螺旋线的参数
a = 5 # 螺旋线的起始半径
b = 0.1 # 螺旋线的增长系数
angle = 0 # 螺旋线的起始角度
step = 5 # 螺旋线的步长

# 抬起画笔,不留痕迹(新增代码)
t.penup()

# 循环绘制阿基米德螺旋线,直到半径超过200像素或角度超过1080度
while a < 200 and angle < 1080:
    # 计算阿基米德螺旋线上当前点的极坐标(r, theta)
    r = a + b * angle # 半径等于起始半径加上增长系数乘以角度
    theta = math.radians(angle) # 角度转换为弧度制
    
    # 计算阿基米德螺旋线上当前点的直角坐标(x, y)
    x = r * math.cos(theta) # x坐标等于半径乘以余弦值
    y = r * math.sin(theta) # y坐标等于半径乘以正弦值
    
    # 移动画笔到当前点,并画出一小段曲线
    t.goto(x, y)
    
    # 更新角度和步长,使得曲线更平滑
    angle += step 
    step *= 0.999

# 放下画笔,开始绘制(新增代码)
t.pendown()

# 结束绘图,并保持窗口显示直到用户关闭    
turtle.done()

3.6 程序运行的结果

3.7 我的要求(8)

3.8 bing 的回答全文(8)

点击此处或者复制链接后在 new bing 中打开

3.9 bing 编写的程序

# 导入turtle模块,用于绘图
import turtle
# 导入math模块,用于计算
import math
# 创建一个turtle对象,命名为t
t = turtle.Turtle()
# 设置画笔的颜色和速度
t.color("blue")
t.speed(0)
# 设置阿基米德螺旋线的参数
a = 5 # 螺旋线的起始半径
b = 0.1 # 螺旋线的增长系数
angle = 0 # 螺旋线的起始角度
step = 5 # 螺旋线的步长

# 抬起画笔,不留痕迹(新增代码)
t.penup()

# 循环绘制阿基米德螺旋线,直到半径超过200像素或角度超过1080度
while a < 200 and angle < 1080:
    # 计算阿基米德螺旋线上当前点的极坐标(r, theta)
    r = a + b * angle # 半径等于起始半径加上增长系数乘以角度
    theta = math.radians(angle) # 角度转换为弧度制
    
    # 计算阿基米德螺旋线上当前点的直角坐标(x, y)
    x = r * math.cos(theta) # x坐标等于半径乘以余弦值
    y = r * math.sin(theta) # y坐标等于半径乘以正弦值
    
    # 放下画笔,开始绘制(新增代码)
    t.pendown()
    
    # 移动画笔到当前点,并画出一小段曲线
    t.goto(x, y)
    
    # 更新角度和步长,使得曲线更平滑
    angle += step 
    step *= 0.999

# 结束绘图,并保持窗口显示直到用户关闭    
turtle.done()

3.10 程序运行的结果

3.11 我的要求(9)

3.12 bing 的回答全文(9)

点击此处或者复制链接后在 new bing 中打开

3.13 bing 编写的程序

# 导入turtle模块,用于绘图
import turtle
# 导入math模块,用于计算
import math
# 创建一个turtle对象,命名为t
t = turtle.Turtle()
# 设置画笔的颜色和速度
t.color("blue")
t.speed(0)
# 设置阿基米德螺旋线的参数
a = 5 # 螺旋线的起始半径
b = 0.1 # 螺旋线的增长系数
angle = 0 # 螺旋线的起始角度
step = 5 # 螺旋线的步长

# 循环绘制阿基米德螺旋线,直到半径超过200像素或角度超过1080度
while a < 200 and angle < 1080:
    # 计算阿基米德螺旋线上当前点的极坐标(r, theta)
    r = a + b * angle # 半径等于起始半径加上增长系数乘以角度
    theta = math.radians(angle) # 角度转换为弧度制
    
    # 计算阿基米德螺旋线上当前点的直角坐标(x, y)
    x = r * math.cos(theta) # x坐标等于半径乘以余弦值
    y = r * math.sin(theta) # y坐标等于半径乘以正弦值
    
    if angle > 0: # 如果角度大于0,说明不是第一笔(新增代码)
        t.pendown() # 放下画笔,开始绘制(新增代码)
    else: # 否则,说明是第一笔(新增代码)
        t.penup() # 抬起画笔,不留痕迹(新增代码)
    
    # 移动画笔到当前点,并画出一小段曲线
    t.goto(x, y)
    
    # 更新角度和步长,使得曲线更平滑
    angle += step 
    step *= 0.999

# 结束绘图,并保持窗口显示直到用户关闭    
turtle.done()

3.14 程序运行的结果


至此,必应终于把多余的第一笔去掉了。表扬一下。

3.15 我的要求(10)

3.16 bing 的回答全文(10)

点击此处或者复制链接后在 new bing 中打开

为了 new bing 以后能正确画出,特意总结了一下,令人发笑的是 new bing 还找了理由推脱。

3.17 我的要求(11)

3.18 bing 的回答全文(11)

(略)

3.19 我的要求(12)

3.20 bing 的回答全文(12)

点击此处或者复制链接后在 new bing 中打开

4 让画笔箭头方向跟螺旋线方向一致

画笔箭头方向始终朝着右面,感觉怪怪的,让 bing 改一下。

4.1 我的要求(13)

4.2 bing 的回答全文(13)

点击此处或者复制链接后在 new bing 中打开

4.3 bing 编写的程序

# 导入turtle模块,用于绘图
import turtle
# 导入math模块,用于计算
import math
# 创建一个turtle对象,命名为t
t = turtle.Turtle()
# 设置画笔的颜色和速度
t.color("blue")
t.speed(0)
# 设置阿基米德螺旋线的参数
a = 10 # 螺旋线的起始半径(修改代码)
b = 0.1 # 螺旋线的增长系数
angle = 0 # 螺旋线的起始角度(修改代码)
step = 5 # 螺旋线的步长

# 移动画笔到原点(0, 0)(新增代码)
t.goto(0, 0)

# 循环绘制阿基米德螺旋线,直到半径超过200像素或角度超过1080度
while a < 200 and angle < 1080:
    # 计算阿基米德螺旋线上当前点的极坐标(r, theta)
    r = a + b * angle # 半径等于起始半径加上增长系数乘以角度
    theta = math.radians(angle) # 角度转换为弧度制
    
    # 计算阿基米德螺旋线上当前点的直角坐标(x, y)
    x = r * math.cos(theta) # x坐标等于半径乘以余弦值
    y = r * math.sin(theta) # y坐标等于半径乘以正弦值
    
    if angle > 0: # 如果角度大于0,说明不是第一笔(新增代码)
        t.pendown() # 放下画笔,开始绘制(新增代码)
    else: # 否则,说明是第一笔(新增代码)
        t.penup() # 抬起画笔,不留痕迹(新增代码)

    # 设置画笔朝向与螺旋线方向一致(新增代码)
    t.setheading(angle)

    # 移动画笔到当前点,并画出一小段曲线
    t.goto(x, y)
    
    # 更新角度和步长,使得曲线更平滑
    angle += step 
    step *= 0.99

# 结束绘图,并保持窗口显示直到用户关闭    
turtle.done()

4.4 程序运行的结果


还是不正确,画笔箭头方向与螺旋线垂直了。

4.5 我的要求(14)

4.6 bing 的回答全文(14)

(略)

4.7 bing 编写的程序

# 设置画笔的颜色和速度
t.color("blue")
t.speed(0)
# 设置阿基米德螺旋线的参数
a = 10 # 螺旋线的起始半径(修改代码)
b = 0.1 # 螺旋线的增长系数
angle = 0 # 螺旋线的起始角度(修改代码)
step = 5 # 螺旋线的步长

# 移动画笔到原点(0, 0)(新增代码)
t.goto(0, 0)

# 循环绘制阿基米德螺旋线,直到半径超过200像素或角度超过1080度
while a < 200 and angle < 1080:
    # 计算阿基米德螺旋线上当前点的极坐标(r, theta)
    r = a + b * angle # 半径等于起始半径加上增长系数乘以角度
    theta = math.radians(angle) # 角度转换为弧度制
    
    # 计算阿基米德螺旋线上当前点的直角坐标(x, y)
    x = r * math.cos(theta) # x坐标等于半径乘以余弦值
    y = r * math.sin(theta) # y坐标等于半径乘以正弦值
    
    if angle > 0: # 如果角度大于0,说明不是第一笔(新增代码)
        t.pendown() # 放下画笔,开始绘制(新增代码)
    else: # 否则,说明是第一笔(新增代码)
        t.penup() # 抬起画笔,不留痕迹(新增代码)

    # 设置画笔朝向与螺旋线方向一致(新增代码)
    t.setheading(angle + 90)

    # 移动画笔到当前点,并画出一小段曲线
    t.goto(x, y)
    
    # 更新角度和步长,使得曲线更平滑
    angle += step 
    step *= 0.999

# 结束绘图,并保持窗口显示直到用户关闭    
turtle.done()

4.8 程序运行的结果

结语

通过与 new bing 沟通,让 bing 为我编写了一个令人满意的程序。从中可以得出以下启发:

  • 1、我们需要 new bing 做的事情可以逐步描述,并不需要一次描述清楚;
  • 2、new bing 还会犯糊涂,需要不断指正。

有关让 new bing 使用 GPT-4 编写一个令人满意的程序全过程赏析的更多相关文章

  1. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  2. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  3. ruby-on-rails - 如何为空白字段编写 rspec? [Rails3.1] - 2

    我使用rails3.1+rspec和factorygirl。我对必填字段(validates_presence_of)的验证工作正常。我如何让测试将该事实用作“成功”而不是“失败”规范是:describe"Addanindustrywithnoname"docontext"Unabletocreatearecordwhenthenameisblank"dosubjectdoind=Factory.create(:industry_name_blank)endit{shouldbe_invalid}endend但是我失败了:Failures:1)Addanindustrywithnona

  4. ruby-on-rails - 尝试为 Rails 中的用户名验证编写 REGEX - 2

    我正在尝试用Ruby(Rails)编写一个正则表达式,以便用户名的字符仅包含数字和字母(也没有空格)。我有这个正则表达式,/^[a-zA-Z0-9]+$/,但它似乎没有用,我在Rails中收到一个错误,说“The如果正则表达式使用多行anchor(^或$),这可能会带来安全风险。您是要使用\A和\z,还是忘记添加:multiline=>true选项?"我的user.rb模型中此实现的完整代码是:classUser我做错了什么以及如何修复此正则表达式,使其仅对数字和字母有效而不对空格有效?谢谢。 最佳答案 简短回答:使用/\A[a-z

  5. ruby-on-rails - 如何编写跨模型、 Controller 和 View 的 Rails mixin - 2

    为了减少我的小Rails应用程序中的代码重复,我一直致力于将我的模型之间的通用代码放入它自己的单独模块中,到目前为止一切顺利。模型的东西相当简单,我只需要在开头包含模块,例如:classIso这工作正常,但是现在,我将有一些Controller和View代码,这些代码也将在这些模型之间通用,到目前为止,我有这个用于我的可发送内容:#Thisisamodulethatisusedforpages/formsthatarecanbe"sent"#eitherviafax,email,orprinted.moduleSendablemoduleModeldefself.included(kl

  6. ruby - 在不添加 "end"的情况下编写 Ruby 的任何方法? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭11年前。Ruby是一种美丽的语言,但有一个我讨厌写很多次的关键词“结束”。有什么方法可以写出简洁的代码而不用每次都写“end”吗?

  7. ruby - 如何为字母、元音和辅音等德语字符类编写正则表达式? - 2

    例如,我设置了这些:L=/[a-z,A-Z,ßäüöÄÖÜ]/V=/[äöüÄÖÜaeiouAEIOU]/K=/[ßb-zBZ&&[^#{V}]]/因此/(#{K}#{V}{2})/匹配"azAZßäÜ"中的"ßäÜ"。有没有更好的方法来处理它们?我能否将这些常量放在我的Ruby安装文件夹中某个文件中的模块中,这样我就可以在我在计算机上编写的任何新脚本中包含/要求它们?(我是新手,我知道我混淆了这个术语;请纠正我。)此外,我能否只获取元字符\L、\V和\K(或任何尚未在Ruby中设置)以在正则表达式中代表它们,所以我不必一直做字符串插值? 最佳答案

  8. ruby-on-rails - 如何编写 Rails 4 测试以使用 omniauth-google-oauth2 gem 创建 session ? - 2

    我正在尝试为使用omniauth-google-oauth2gem创建session编写测试。我是否需要将env["omniauth.auth"]变量与post:create一起传递?也许当我试图这样做时,我做错了。我得到的错误如下所示...Rake测试错误1)Error:SessionsControllerTest#test_should_get_create:NoMethodError:undefinedmethod`provider'fornil:NilClassapp/models/user.rb:6:in`from_omniauth'app/controllers/sessi

  9. ruby-on-rails - 在 RSpec 中编写请求规范的正确方法是什么? - 2

    tl;dr:跳到最后一段最近一直在尝试使用RSpec的requestspecs做一些更有针对性的测试。我的测试主要是这样的:通用cucumber功能规范,即用户转到带有评论的帖子,对评论点赞,作者获得积分modelspecs当模型实际上具有某些功能时,即User#upvote(comment)controllerspecs我在其中stub了大部分内容,只是试图确保代码按照我期望的方式运行viewspecs当View中有一些复杂的东西时,例如仅在用户尚未投票时呈现upvote链接,这些被stub为好吧问题是当我有一些导致错误的特定场景时,一切似乎都在我无法重现它的模型/View层中工作。

  10. node.js - 从未编写过任何自动化测试,我应该如何开始行为驱动开发? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。多年来,我一直在使用多种语言进行编程,并且认为自己总体上相当擅长。但是,我从未编写过任何自动化测试:没有单元测试,没有TDD,没有BDD,什么都没有。我已经尝试开始为我的项目编写适当的测试套件。我可以看到在进行任何更改后能够自动测试项目中所有代码的理论值(value)。我可以看到像RSpec和Mocha这样的测试框架应该如何使设置和运行所述测试变得相当容易

随机推荐