前言
DeepSeek 在春节狠狠的火了一次, kimi热度也很高;与chatgpt(这里用的是4.0版本, 没有用openai的推理模型)比,到底谁更强呢?
也试了下百度的文心一言, 一言难尽,两个字:垃圾
我做了一些简单的测试,主要是一些逻辑问题,综合看确实deepseek更强
问题一 考勤问题
问:
我们公司的考勤制度如下:
1、上班时间是浮动的;最早9:00开始,最晚19:00结束, 其中12:00-13:00为午休时间;打卡减掉午休时间上满8小就行了;
2、上班时间以天为单位,上满8小时为1天,大于等于6小时,小于8小时为0.75天, 以此类推,大于等于4小时,小于6小时为0.5天;大于等于2小时,小于4小时为0.25天;小于2小时计0天;举例:
1、比如打卡时间9:00-18:00 或者10:00-19:00 均认为符合规定,实际上班时间为1天;
2、如果打卡时间为12:35–19:30,则认为只上了6个小时, 实际上班时间为0.75天,其中午休时间12:35-13:00,共25分钟不计入考勤核算天数;19:00-19:30的时间也不计入考勤时间
那么现在有一个员工的他的打卡时间是13:05-19:05, 请问他实际工作了多少天
答案是:0.5天
DeepSeek, kimi, chatgpt 基本上都能回答正确;
之前问的问题不会很规范,DeepSeek依然能做出正确回答, kimi, chatgpt会漏掉一些信息
问题二 比较大小
问:
23的32次方和32的23次方谁大?请使用初中数学课本里的数学知识做出证明,注意初中数学里没有学对数
答案是:23的32次方大
DeepSeek, kimi 可以得到正确结论;chatgpt结论都是个错的
但是 DeepSeek, kimi 的证明过程,有点暴力,会涉及到一定计算量,不够优美
实际上如果教初中生解答这么讲,会更容易一些:
因为:
$32^{23}$=$(2^{5})^{23}$= $2^{115}$
$23^{32}$>$16^{32}$=$(2^{4})^{32}$=$2^{128}$>$2^{115}$=$32^{23}$
所以:$23^{32}$>$32^{23}$
问题三 画螺旋线
问:
我想画一个图, 初始为一个1010像素的一个正方形;颜色为黄色,边框为黑色, 然后再其右边画一个大正方形, 边长加10像素;顶边对齐,然后内部切分为1010的小正方形,这些1010的小正方形边框均为黑色,以与上个正方形共用顶点为起点,画一个对角线,对角线上的1010的小正方形均标记为黄色;然后再在这个大正方形的下方画一个大正方形,要求新的大正方形的边长比上一个大正方形的边长加10;右边对齐;然后内部切分为1010的小正方形,这些1010的小正方形边框均为黑色; 再以共用顶点为起点, 画一个对角线,对角线上的10*10的小正方形均标记为黄色;
以此类推再在新的大正方形左边换一个更大的正方形,边长加10像素,底边对齐;然后内部切分为1010的小正方形,这些1010的小正方形边框均为黑色; 再以共用顶点为起点, 画一个对角线,对角线上的10*10的小正方形均标记为黄色;
如此一直画下去,规则为:新的正方形,边长要加10像素;内部切分为1010的小正方形,这些1010的小正方形边框均为黑色; 再以和上一个大正方形共用顶点为起点, 画一个对角线,对角线上的10*10的小正方形均标记为黄色;
新产生的大正方形,位置为右,下,左,上,右,下,左,上… 循环; 对齐的边为顶边,右边, 底边,左边… 依次循环
请用java代码 实现一个函数, 要求输入循环次数,和路径, 本地生成该图片
kimi 有点懵逼
chatgpt 答案感人, 离题千里
DeepSeek思考许久, 回答正确:
显示效果如下:
代码:
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
public class SquareGenerator {
public static void generateImage(int cycles, String path) throws IOException {
List<Square> squares = new ArrayList<>();
squares.add(new Square(0, 0, 10, -1)); // 初始正方形
int directionIndex = 0; // 方向索引:0-右,1-下,2-左,3-上
for (int i = 0; i < cycles; i++) {
Square last = squares.get(squares.size() - 1);
Square newSquare = createNewSquare(last, directionIndex);
squares.add(newSquare);
directionIndex = (directionIndex + 1) % 4;
}
// 计算画布大小
int minX = 0, maxX = 0, minY = 0, maxY = 0;
for (Square s : squares) {
minX = Math.min(minX, s.x);
maxX = Math.max(maxX, s.x + s.size);
minY = Math.min(minY, s.y);
maxY = Math.max(maxY, s.y + s.size);
}
int width = maxX - minX;
int height = maxY - minY;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);
g.translate(-minX, -minY); // 平移坐标系
for (Square s : squares) {
drawSquare(g, s);
}
g.dispose();
ImageIO.write(image, "PNG", new File(path));
}
private static Square createNewSquare(Square last, int direction) {
int newSize = last.size + 10;
int x = last.x, y = last.y;
switch (direction) {
case 0: // 右,顶边对齐
x = last.x + last.size;
y = last.y;
break;
case 1: // 下,右边对齐
x = (last.x + last.size) - newSize;
y = last.y + last.size;
break;
case 2: // 左,底边对齐
x = last.x - newSize;
y = (last.y + last.size) - newSize;
break;
case 3: // 上,左边对齐
x = last.x;
y = last.y - newSize;
break;
}
return new Square(x, y, newSize, direction);
}
private static void drawSquare(Graphics2D g, Square s) {
int x = s.x, y = s.y, size = s.size;
// 绘制大正方形边框
g.setColor(Color.BLACK);
g.drawRect(x, y, size, size);
if (s.direction == -1) { // 初始正方形填充黄色
g.setColor(Color.YELLOW);
g.fillRect(x + 1, y + 1, size - 2, size - 2);
} else { // 其他正方形处理小格子
int k = size / 10;
// 绘制小格子边框
for (int i = 0; i < k; i++) {
for (int j = 0; j < k; j++) {
int cellX = x + j * 10;
int cellY = y + i * 10;
g.setColor(Color.BLACK);
g.drawRect(cellX, cellY, 10, 10);
}
}
// 填充对角线上的小格子
g.setColor(Color.YELLOW);
for (int i = 0; i < k; i++) {
for (int j = 0; j < k; j++) {
boolean fill = false;
switch (s.direction) {
case 0: // 右:i == j
case 2: // 左:i == j
fill = (i == j);
break;
case 1: // 下:i + j == k-1
case 3: // 上:i + j == k-1
fill = (i + j == k - 1);
break;
}
if (fill) {
int cellX = x + j * 10 + 1;
int cellY = y + i * 10 + 1;
g.fillRect(cellX, cellY, 9, 9);
}
}
}
}
}
static class Square {
int x, y, size, direction;
Square(int x, int y, int size, int direction) {
this.x = x;
this.y = y;
this.size = size;
this.direction = direction;
}
}
public static void main(String[] args) throws IOException {
generateImage(3, "squares.png"); // 示例调用
}
}
其实效果不是我想要的,但是问题在我问错了, 然后在其答案上稍加修改,就能得到理想效果:
效果图:
修改后代码:
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
public class SquareGenerator {
static Integer addSize = 0;
public static void generateImage(int cycles, String path) throws IOException {
List<Square> squares = new ArrayList<>();
squares.add(new Square(0, 0, 10, -1)); // 初始正方形
int directionIndex = 0; // 方向索引:0-右,1-下,2-左,3-上
for (int i = 0; i < cycles; i++) {
Square last = squares.get(squares.size() - 1);
Square newSquare = createNewSquare(last, directionIndex);
squares.add(newSquare);
directionIndex = (directionIndex + 1) % 4;
}
// 计算画布大小
int minX = 0, maxX = 0, minY = 0, maxY = 0;
for (Square s : squares) {
minX = Math.min(minX, s.x);
maxX = Math.max(maxX, s.x + s.size);
minY = Math.min(minY, s.y);
maxY = Math.max(maxY, s.y + s.size);
}
int width = maxX - minX;
int height = maxY - minY;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);
g.translate(-minX, -minY); // 平移坐标系
for (Square s : squares) {
drawSquare(g, s);
}
g.dispose();
ImageIO.write(image, "PNG", new File(path));
}
private static Square createNewSquare(Square last, int direction) {
double temp = addSize * 1.1 + 10;
addSize = (int) Math.round(temp / 10.0) * 10;
int newSize = last.size + addSize;
int x = last.x, y = last.y;
switch (direction) {
case 0: // 右,顶边对齐
x = last.x + last.size;
y = last.y;
break;
case 1: // 下,右边对齐
x = (last.x + last.size) - newSize;
y = last.y + last.size;
break;
case 2: // 左,底边对齐
x = last.x - newSize;
y = (last.y + last.size) - newSize;
break;
case 3: // 上,左边对齐
x = last.x;
y = last.y - newSize;
break;
}
return new Square(x, y, newSize, direction);
}
private static void drawSquare(Graphics2D g, Square s) {
int x = s.x, y = s.y, size = s.size;
// 绘制大正方形边框
g.setColor(Color.GREEN);
g.drawRect(x, y, size, size);
if (s.direction == -1) { // 初始正方形填充黄色
g.setColor(Color.RED);
g.fillRect(x + 1, y + 1, size - 2, size - 2);
} else { // 其他正方形处理小格子
int k = size / 10;
// 绘制小格子边框
// for (int i = 0; i < k; i++) {
// for (int j = 0; j < k; j++) {
// int cellX = x + j * 10;
// int cellY = y + i * 10;
// g.setColor(Color.BLACK);
// g.drawRect(cellX, cellY, 10, 10);
// }
// }
// 填充对角线上的小格子
g.setColor(Color.RED);
// for (int i = 0; i < k; i++) {
// for (int j = 0; j < k; j++) {
// boolean fill = false;
// int cellX = x + j * 10;
// int cellY = y + i * 10;
// switch (s.direction) {
// case 0: // 右:i == j
// case 2: // 左:i == j
// fill = (i == j);
// break;
// case 1: // 下:i + j == k-1
// case 3: // 上:i + j == k-1
// fill = (i + j == k - 1);
// break;
// }
// if (fill) {
//// int cellX = x + j * 10 + 1;
//// int cellY = y + i * 10 + 1;
// g.fillRect(cellX, cellY, 9, 9);
// }
// }
// }
// 画螺旋线
for (int i = 0; i < k; i++) {
for (int j = 0; j < k; j++) {
boolean fill = false;
switch (s.direction) {
case 0: // 右
if(k*k<((k-i)*(k-i)+(j+1)*(j+1)) && k*k>((k-i-1)*(k-i-1)+j*j)){
fill = true;
}else {
fill = false;
}
break;
case 1: // 下
if(k*k<((i+1)*(i+1)+(j+1)*(j+1)) && k*k>(j*j+i*i) ){
fill = true;
}else {
fill = false;
}
break;
case 2: // 左
if(k*k<((i+1)*(i+1)+(k-j)*(k-j)) && k*k>((k-j-1)*(k-j-1)+i*i) ){
fill = true;
}else {
fill = false;
}
break;
case 3: //上
if(k*k<((k-j)*(k-j)+(k-i)*(k-i)) && k*k>((k-j-1)*(k-j-1)+(k-i-1)*(k-i-1)) ){
fill = true;
}else {
fill = false;
}
break;
}
if (fill) {
int cellX = x + j * 10 + 1;
int cellY = y + i * 10 + 1;
g.fillRect(cellX, cellY, 9, 9);
}
}
}
}
}
static class Square {
int x, y, size, direction;
Square(int x, int y, int size, int direction) {
this.x = x;
this.y = y;
this.size = size;
this.direction = direction;
}
}
public static void main(String[] args) throws IOException {
generateImage(20, "/Users/xxx/Downloads/squares11.png"); // 示例调用
}
}