DeepSeek测试

yuyu888 于 2025-02-11 发布

前言

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"); // 示例调用
    }
}