鱼C论坛

 找回密码
 立即注册
查看: 214|回复: 3

[吹水] 一个问题DeepSeek-R1思考了377秒!

[复制链接]
发表于 2025-2-8 20:52:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zhangchenyvn 于 2025-2-9 09:40 编辑

IMG_1118.jpeg
问题(prompt):
  1. 设计一个命令行版的Python数据库,集成在单一Python脚本文件中,实现类似SQLite的基础功能,同时支持内存数据库操作和简单的排序功能。具体要求如下:

  2. 1. 创建一个名为 `Database` 的类,用于管理数据库中的表。每个表由一个名为 `Table` 的类实例表示,包含列名和数据类型,以及一个列表来存储记录。
  3. 2. `Table` 类应包含常用的数据库操作的函数实现。
  4. 3. 使用字典和列表组合的数据结构来存储表和记录,实现内存数据库模式,允许在内存中创建和操作表,无需持久化存储。
  5. 4. 创建一个名为 `OutputTable` 的类,用于格式化输出查询结果,确保输出美观易读。
  6. 5. 实现基本的排序功能,例如`ORDER BY`,以便可以根据指定列对查询结果进行升序或降序排列。排序逻辑需考虑不同数据类型(如数字和字符串)的比较规则。对于字符串类型,使用Python内置的字符串比较方法;对于数字类型,使用数值比较。
  7. 6. 提供一个简单的命令行界面,用户可以输入SQL命令进行数据库操作,程序能够解析这些命令并返回相应的结果。命令行界面应包括帮助文档,介绍如何使用各个命令。帮助文档应包含所有支持的SQL命令及其语法说明。
  8. 7. 确保所有代码集成在同一个Python文件中,便于管理和测试。文件应包含导入所需的库的语句,例如 `import sys` 和 `import datetime`。
  9. 8. 提供良好的数据持久化机制,将所有数据存储在类似于.db的二进制文件中,该文件应有一个文件头和文件主体,用于标识数据版本和存储格式。文件头可以是一个固定的字符串,如"DB_VERSION_1",表示当前数据格式版本。
  10. 9. 提供完整的实现,禁止使用 SQLite 等现成的数据库实现。注意实现过程中应处理常见的错误情况,如表不存在、字段错误等,以增强程序的健壮性。错误处理应包括异常抛出和友好提示信息。

  11. **特别注意**:贯彻OOP思想,一切皆对象,将可能的数据结构作为 class 来编写。

  12. 示例输出格式:
  13. ```
  14. +----+--------------+---------------------------+-------+
  15. | id | name         | url                       | alexa |
  16. +----+--------------+---------------------------+-------+
  17. ...
  18. | 2  | 淘宝          | https://www.taobao.com/   | 13    |
  19. | 3  | 菜鸟教程       | http://www.runoob.com/    | 4689  |
  20. | 4  | 微博          | http://weibo.com/         | 20    |
  21. ...
  22. +----+--------------+---------------------------+-------+
  23. ```
复制代码


他的答复:
  1. import sys
  2. import re
  3. import csv
  4. from io import StringIO
  5. import pickle
  6. from dataclasses import dataclass
  7. from typing import Dict, List, Tuple, Optional

  8. class DatabaseError(Exception):
  9.     """Base exception class for database errors"""
  10.     pass

  11. class TableExistsError(DatabaseError):
  12.     pass

  13. class TableNotFoundError(DatabaseError):
  14.     pass

  15. class ColumnNotFoundError(DatabaseError):
  16.     pass

  17. class DataTypeError(DatabaseError):
  18.     pass

  19. class Table:
  20.     def __init__(self, name: str, columns: List[Tuple[str, str]]):
  21.         self.name = name
  22.         self.columns = {col[0]: col[1] for col in columns}
  23.         self.records: List[Dict] = []

  24.     def insert(self, values: List[str]):
  25.         if len(values) != len(self.columns):
  26.             raise ValueError("Number of values doesn't match columns")
  27.         
  28.         record = {}
  29.         for (col_name, col_type), value in zip(self.columns.items(), values):
  30.             try:
  31.                 if col_type == 'int':
  32.                     record[col_name] = int(value)
  33.                 elif col_type == 'str':
  34.                     record[col_name] = str(value)
  35.                 else:
  36.                     raise DataTypeError(f"Unsupported type: {col_type}")
  37.             except ValueError:
  38.                 raise DataTypeError(f"Invalid {col_type} value: {value}")
  39.         
  40.         self.records.append(record)

  41.     def select(
  42.         self,
  43.         columns: Optional[List[str]] = None,
  44.         order_by: Optional[str] = None,
  45.         order_dir: str = 'ASC'
  46.     ) -> List[Dict]:
  47.         if columns is None:
  48.             columns = list(self.columns.keys())
  49.         else:
  50.             for col in columns:
  51.                 if col not in self.columns:
  52.                     raise ColumnNotFoundError(f"Column {col} not found")

  53.         if order_by:
  54.             if order_by not in self.columns:
  55.                 raise ColumnNotFoundError(f"Order column {order_by} not found")
  56.             
  57.             col_type = self.columns[order_by]
  58.             def sort_key(record):
  59.                 val = record[order_by]
  60.                 return (val if col_type == 'str' else str(val)) if col_type == 'str' else val
  61.             
  62.             sorted_records = sorted(
  63.                 self.records,
  64.                 key=sort_key,
  65.                 reverse=(order_dir.upper() == 'DESC')
  66.             )
  67.         else:
  68.             sorted_records = self.records.copy()

  69.         return [{col: record[col] for col in columns} for record in sorted_records]

  70.     def to_dict(self):
  71.         return {
  72.             'columns': list(self.columns.items()),
  73.             'records': self.records
  74.         }

  75. class Database:
  76.     def __init__(self):
  77.         self.tables: Dict[str, Table] = {}

  78.     def create_table(self, name: str, columns: List[Tuple[str, str]]):
  79.         if name in self.tables:
  80.             raise TableExistsError(f"Table {name} already exists")
  81.         self.tables[name] = Table(name, columns)

  82.     def get_table(self, name: str) -> Table:
  83.         if name not in self.tables:
  84.             raise TableNotFoundError(f"Table {name} not found")
  85.         return self.tables[name]

  86.     def save(self, filename: str):
  87.         data = {
  88.             name: table.to_dict()
  89.             for name, table in self.tables.items()
  90.         }
  91.         with open(filename, 'wb') as f:
  92.             f.write(b'DB_VERSION_1')
  93.             pickle.dump(data, f)

  94.     @classmethod
  95.     def load(cls, filename: str) -> 'Database':
  96.         db = cls()
  97.         with open(filename, 'rb') as f:
  98.             header = f.read(12)
  99.             if header != b'DB_VERSION_1':
  100.                 raise ValueError("Invalid database format")
  101.             data = pickle.load(f)
  102.             for name, table_data in data.items():
  103.                 columns = table_data['columns']
  104.                 records = table_data['records']
  105.                 table = Table(name, columns)
  106.                 table.records = records
  107.                 db.tables[name] = table
  108.         return db

  109. class OutputTable:
  110.     @staticmethod
  111.     def format(columns: List[str], records: List[Dict]) -> str:
  112.         if not records:
  113.             return "No results"
  114.         
  115.         col_widths = {
  116.             col: max(len(str(record.get(col, ''))) for record in records)
  117.             for col in columns
  118.         }
  119.         for col in columns:
  120.             col_widths[col] = max(col_widths[col], len(col))
  121.         
  122.         sep = '+' + '+'.join('-' * (w + 2) for w in col_widths.values()) + '+'
  123.         header = '|' + '|'.join(f' {col.ljust(col_widths[col])} ' for col in columns) + '|'
  124.         rows = []
  125.         for record in records:
  126.             row = '|' + '|'.join(
  127.                 f' {str(record.get(col, "")).ljust(col_widths[col])} '
  128.                 for col in columns
  129.             ) + '|'
  130.             rows.append(row)
  131.         
  132.         return '\n'.join([sep, header, sep] + rows + [sep])

  133. def parse_sql(sql: str):
  134.     sql = re.sub(r'\s+', ' ', sql.strip(), flags=re.UNICODE)
  135.     upper_sql = sql.upper()
  136.    
  137.     if upper_sql == 'HELP':
  138.         return ('HELP', None)
  139.    
  140.     if upper_sql.startswith('CREATE TABLE'):
  141.         match = re.match(r'CREATE TABLE (\w+) \((.+)\)', sql, re.IGNORECASE)
  142.         if not match:
  143.             raise ValueError("Invalid CREATE TABLE syntax")
  144.         table_name = match.group(1)
  145.         columns = [
  146.             tuple(col.strip().rsplit(' ', 1))
  147.             for col in match.group(2).split(',')
  148.         ]
  149.         return ('CREATE_TABLE', (table_name, columns))
  150.    
  151.     if upper_sql.startswith('INSERT INTO'):
  152.         match = re.match(r'INSERT INTO (\w+) VALUES \((.+)\)', sql, re.IGNORECASE)
  153.         if not match:
  154.             raise ValueError("Invalid INSERT syntax")
  155.         table_name = match.group(1)
  156.         values_part = match.group(2)
  157.         reader = csv.reader(
  158.             StringIO(values_part.replace("'", '"')),
  159.             quotechar='"',
  160.             skipinitialspace=True
  161.         )
  162.         values = next(reader)
  163.         return ('INSERT', (table_name, values))
  164.    
  165.     if upper_sql.startswith('SELECT'):
  166.         match = re.match(
  167.             r'SELECT (.+?) FROM (\w+)(?: ORDER BY (\w+)(?: (ASC|DESC))?)?$',
  168.             sql,
  169.             re.IGNORECASE
  170.         )
  171.         if not match:
  172.             raise ValueError("Invalid SELECT syntax")
  173.         columns_part = match.group(1).strip()
  174.         table_name = match.group(2)
  175.         order_by = match.group(3)
  176.         order_dir = (match.group(4) or 'ASC').upper()
  177.         columns = None if columns_part == '*' else [c.strip() for c in columns_part.split(',')]
  178.         return ('SELECT', (table_name, columns, order_by, order_dir))
  179.    
  180.     if upper_sql.startswith('SAVE '):
  181.         return ('SAVE', sql.split(' ', 1)[1].strip())
  182.    
  183.     if upper_sql.startswith('LOAD '):
  184.         return ('LOAD', sql.split(' ', 1)[1].strip())
  185.    
  186.     if upper_sql == 'EXIT':
  187.         return ('EXIT', None)
  188.    
  189.     raise ValueError(f"Unsupported command: {sql}")

  190. def main():
  191.     db = Database()
  192.     print("SimpleDB - Type 'HELP' for help")
  193.    
  194.     while True:
  195.         try:
  196.             command = input("SQL> ").strip()
  197.             if not command:
  198.                 continue
  199.             
  200.             cmd_type, args = parse_sql(command)
  201.             
  202.             if cmd_type == 'HELP':
  203.                 print("""
  204. Supported commands:
  205.   CREATE TABLE <table> (col1 type1, col2 type2...)
  206.   INSERT INTO <table> VALUES (val1, val2...)
  207.   SELECT [*|col1,col2...] FROM <table> [ORDER BY col [ASC|DESC]]
  208.   SAVE <filename>
  209.   LOAD <filename>
  210.   EXIT
  211.   HELP
  212.                 """.strip())
  213.             
  214.             elif cmd_type == 'CREATE_TABLE':
  215.                 table_name, columns = args
  216.                 db.create_table(table_name, columns)
  217.                 print(f"Table '{table_name}' created")
  218.             
  219.             elif cmd_type == 'INSERT':
  220.                 table_name, values = args
  221.                 table = db.get_table(table_name)
  222.                 table.insert(values)
  223.                 print(f"Inserted 1 row into {table_name}")
  224.             
  225.             elif cmd_type == 'SELECT':
  226.                 table_name, columns, order_by, order_dir = args
  227.                 table = db.get_table(table_name)
  228.                 records = table.select(columns, order_by, order_dir)
  229.                 output_columns = columns if columns else list(table.columns.keys())
  230.                 print(OutputTable.format(output_columns, records))
  231.             
  232.             elif cmd_type == 'SAVE':
  233.                 db.save(args)
  234.                 print(f"Database saved to {args}")
  235.             
  236.             elif cmd_type == 'LOAD':
  237.                 db = Database.load(args)
  238.                 print(f"Database loaded from {args}")
  239.             
  240.             elif cmd_type == 'EXIT':
  241.                 break
  242.             
  243.         except Exception as e:
  244.             print(f"Error: {str(e)}")

  245. if __name__ == "__main__":
  246.     main()
复制代码


就一个词:厉害!
测试:程序可用。
LICENSED under BSD3
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-2-8 21:01:40 | 显示全部楼层
DS硬实力是有的,就是最近响应有点慢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-2-8 21:42:24 From FishC Mobile | 显示全部楼层
本帖最后由 zhangchenyvn 于 2025-2-8 21:44 编辑
不二如是 发表于 2025-2-8 21:01
DS硬实力是有的,就是最近响应有点慢


我最近问过DeepSeek-R1五次这个问题,前四次全都石沉大海了(
半小时大概只能成功问一次R1
但系,R1出品必属精品,从回复特别慢那一天开始R1给我的代码就没有不可以运行的:-)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-2-9 12:49:09 | 显示全部楼层
腻害
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-19 23:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表