0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenAI 在精简代码方面的出色表现令人震惊

KiCad 来源:KiCad 作者:KiCad 2025-04-28 18:24 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文转载自https://glama.ai/blog/2024-08-29-reverse-engineering-minified-code-using-openai

wKgaoWcy1ZqAczN2AAUdifcOBoY436.png   在浏览互联网寻找灵感时,我发现了一个看起来很有趣的组件:

https://reactive.network/hackathon

我觉得带有运行 ASCII 艺术的区块看起来很酷,但我不太明白它是如何实现的,于是我开始查看源代码。

我找到了看起来可以完成这项工作的代码,但它被精简化了。

const { floor: ra, abs: KE, min: QE } = Math,    O5 = ["reactive.network REACTIVE.NETWORK", "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,^`'. .:â–‘â–’â–“â–ˆ"],    G7 = Date.now() % 3 ? O5[1] : O5[0],    V5 = G7.length,    JE = { fps: 60 };function eT(e, t, n, r) {    const i = t.time * 8e-5,        s = QE(t.cols, t.rows),        o = t.metrics.aspect * 0.2,        l = { x: ((4 * (e.x - t.cols / 6.25)) / s) * o, y: (5 * (e.y - t.rows / 4)) / s },        u = ra(KE(YE(l) - i) * V5 + (ra(e.x / 1) % 2) * 2) % V5;    return G7[u];}const tT = () => {    const e = j.useRef(null),        [t, n] = j.useState({ height: null, width: null });    return (        j.useEffect(() => {            function r() {                n({ height: window.innerHeight, width: window.innerWidth });            }            if (typeof window < "u") return n({ height: window.innerHeight, width: window.innerWidth }), window.addEventListener("resize", r), () => window.removeEventListener("resize", r);        }, []),        j.useEffect(() => {            const r = e.current;            if (!r) return;            const i = 12,                s = ra(t.width / i) * 1.6,                o = ra(t.height / i),                l = { aspect: s / o },                u = setInterval(() => {                    let c = "";                    for (let d = 0; d < o; d++) {                        for (let f = 0; f < s; f++) c += eT({ x: f, y: d }, { cols: s, rows: o, metrics: l, time: Date.now() });                        c += ``;                    }                    r.textContent = c;                }, 1e3 / JE.fps);            return () => clearInterval(u);        }, [t]),        a.jsx("div", { style: { position: "absolute", top: 0, left: 0, width: "100%", height: "100%" }, children: a.jsx("div", { ref: e, style: { width: "100%", height: "100%", whiteSpace: "pre", overflow: "hidden" } }) })    );};function nT(e) {    return Math.cos(e.x * e.x - e.y * e.y);}const { floor: ia, abs: rT, min: iT } = Math,    D5 = ["reactive.network REACTIVE.NETWORK", "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,^`'. .:â–‘â–’â–“â–ˆ"],    X7 = Date.now() % 3 ? D5[1] : D5[0],    F5 = X7.length,    sT = { fps: 60 };function oT(e, t, n, r) {    const i = t.time * 8e-5,        s = iT(t.cols, t.rows),        o = t.metrics.aspect * 0.2,        l = { x: ((4 * (e.x - t.cols / 6.25)) / s) * o, y: (5 * (e.y - t.rows / 4)) / s },        u = ia(rT(nT(l) - i) * F5 + (ia(e.x / 1) % 2) * 2) % F5;    return X7[u];}const aT = () => {    const e = j.useRef(null),        [t, n] = j.useState({ height: null, width: null });    return (        j.useEffect(() => {            function r() {                n({ height: window.innerHeight, width: window.innerWidth });            }            if (typeof window < "u") return n({ height: window.innerHeight, width: window.innerWidth }), window.addEventListener("resize", r), () => window.removeEventListener("resize", r);        }, []),        j.useEffect(() => {            const r = e.current;            if (!r) return;            const i = 12,                s = ia(t.width / i) * 1.6,                o = ia(t.height / i),                l = { aspect: s / o },                u = setInterval(() => {                    let c = "";                    for (let d = 0; d < o; d++) {                        for (let f = 0; f < s; f++) c += oT({ x: f, y: d }, { cols: s, rows: o, metrics: l, time: Date.now() });                        c += ``;                    }                    r.textContent = c;                }, 1e3 / sT.fps);            return () => clearInterval(u);        }, [t]),        a.jsx("div", { style: { position: "absolute", top: 0, left: 0, width: "100%", height: "100%" }, children: a.jsx("div", { ref: e, style: { width: "100%", height: "100%", whiteSpace: "pre", overflow: "hidden" } }) })    );},
通常情况下,我会通过阅读最小化的代码来理解其实现(或者查找 .map 文件来还原原始代码)。不过,我意识到我从未尝试过让 ChatGPT 帮我做这件事...... 于是,我复制了上述所有代码,并要求 ChatGPT “解释代码”。以下是回复:

提供的代码非常复杂,但我会将其分解为更易于理解的格式,解释其不同部分及其功能。
概述该代码使用 JavaScript 定义了几个函数和组件,特别是在 React 应用程序的上下文中。它处理使用预定义字符集中的字符生成一些动态文本内容,可能是 ASCII 艺术或某种视觉效果。此外,它还包括用于事件处理、性能计时和 HTML 内容转换的实用函数。
关键部件和功能字符集选择:
const { floor: ra, abs: KE, min: QE } = Math;const O5 = ["reactive.network REACTIVE.NETWORK", "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,^`'. .:â–‘â–’â–“â–ˆ"];const G7 = Date.now() % 3 ? O5[1] : O5[0];const V5 = G7.length;这部分代码导入了一些常见的数学函数(floor、、abs和min),并定义了两组字符,存储在中O5。
根据当前时间(Date.now() % 3),它会选择其中一个集合(G7)以供稍后使用。
所选字符集的长度存储在中V5。
动态角色选择功能:
function eT(e, t, n, r) {    const i = t.time * 8e-5;    const s = QE(t.cols, t.rows);    const o = t.metrics.aspect * 0.2;    const l = { x: ((4 * (e.x - t.cols / 6.25)) / s) * o, y: (5 * (e.y - t.rows / 4)) / s };    const u = ra(KE(YE(l) - i) * V5 + (ra(e.x / 1) % 2) * 2) % V5;    return G7[u];}该eT函数根据输入位置(e.x,e.y)和当前时间(t.time)生成一个字符。
它使用一些纵横比计算来调整位置,并根据G7位置和时间的组合选择一个字符。
YE从代码中无法直接看出该函数的用途,但它似乎是此计算中使用的自定义函数。
tT用于显示动态内容的React 组件( ):
const tT = () => {    const e = j.useRef(null);    const [t, n] = j.useState({ height: null, width: null });    j.useEffect(() => {        function r() {            n({ height: window.innerHeight, width: window.innerWidth });        }        if (typeof window < "u") {            n({ height: window.innerHeight, width: window.innerWidth });            window.addEventListener("resize", r);            return () => window.removeEventListener("resize", r);        }    }, []);
    j.useEffect(() => {        const r = e.current;        if (!r) return;        const i = 12;        const s = ra(t.width / i) * 1.6;        const o = ra(t.height / i);        const l = { aspect: s / o };        const u = setInterval(() => {            let c = "";            for (let d = 0; d < o; d++) {                for (let f = 0; f < s; f++) c += eT({ x: f, y: d }, { cols: s, rows: o, metrics: l, time: Date.now() });                c += ``;            }            r.textContent = c;        }, 1e3 / JE.fps);        return () => clearInterval(u);    }, [t]);
    return a.jsx("div", { style: { position: "absolute", top: 0, left: 0, width: "100%", height: "100%" }, children: a.jsx("div", { ref: e, style: { width: "100%", height: "100%", whiteSpace: "pre", overflow: "hidden" } }) });};这是一个 React 组件,它设置一个间隔,以使用动态生成的字符定期更新div元素的内容( )。e.current
它根据窗口大小计算列数(s)和行数( ),然后用函数生成的字符填充。odiveT
该效果以每秒指定的帧数运行(JE.fps)。
我继续询问“用 TypeScript 实现等效代码并使其易于阅读”,并得到了以下答复:

import React, { useEffect, useRef, useState } from 'react';
const selectedCharacterSet =  "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,^`'. .:â–‘â–’â–“â–ˆ";const characterSetLength = selectedCharacterSet.length;
const calculateCharacter = (  x: number,  y: number,  cols: number,  rows: number,  aspect: number,  time: number,): string => {  const timeFactor = time * 0.000_08;  const size = Math.min(cols, rows);  const aspectRatio = aspect * 0.2;  const position = {    x: ((4 * (x - cols / 6.25)) / size) * aspectRatio,    y: (5 * (y - rows / 4)) / size,  };
  const index =    Math.floor(      Math.abs(        Math.cos(position.x * position.x - position.y * position.y) -          timeFactor,      ) *        characterSetLength +        (Math.floor(x) % 2) * 2,    ) % characterSetLength;  return selectedCharacterSet[index];};
type Size = {  height: null | number;  width: null | number;};
const AsciiArtGenerator: React.FC = () => {  const textRef = useRef(null);  const [size, setSize] = useState({ height: null, width: null });
  useEffect(() => {    const handleResize = () => {      setSize({ height: window.innerHeight, width: window.innerWidth });    };
    // Initial size setting    handleResize();
    window.addEventListener('resize', handleResize);    return () => {      window.removeEventListener('resize', handleResize);    };  }, []);
  useEffect(() => {    const element = textRef.current;    if (!element || !size.width || !size.height) return undefined;
    const cols = Math.floor(size.width / 12) * 1.6;    const rows = Math.floor(size.height / 12);    const aspectRatio = cols / rows;
    const intervalId = setInterval(() => {      let content = '';
      for (let y = 0; y < rows; y++) {        for (let x = 0; x < cols; x++) {          content += calculateCharacter(            x,            y,            cols,            rows,            aspectRatio,            Date.now(),          );        }
        content += 'n';      }
      element.textContent = content;    }, 1_000 / 60); // 60 fps
    return () => {      clearInterval(intervalId);    };  }, [size]);
  return (    
);}; export default () => { return ;};
令我惊讶的是,响应不仅足够好,而且可读性也很强。

上述组件的实际运行情况如下:

比较输出结果,LLM 响应似乎忽略了一些实现细节,但它仍然是一个值得学习的好实现。这绝对是一个我以前从未考虑过的巧妙用例!

注意:如果想第一时间收到 KiCad 内容推送,请点击下方的名片,按关注,再设为星标。

常用合集汇总:

和 Dr Peter 一起学 KiCad

KiCad 8 探秘合集

KiCad 使用经验分享

KiCad 设计项目(Made with KiCad)

常见问题与解决方法

KiCad 开发笔记

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4976

    浏览量

    74378
  • OpenAI
    +关注

    关注

    9

    文章

    1249

    浏览量

    10279
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    OpenAI正式发布ChatGPT Images 2.0版本

    人工智能技术迅猛发展的浪潮中,OpenAI始终是引领行业变革的先锋力量。近日,OpenAI正式发布ChatGPT Images 2.0版本,这一消息如同一颗重磅炸弹,科技圈引发了强
    的头像 发表于 04-22 11:32 1180次阅读

    OpenAi国内能用吗?2026年详细使用教程!

    这两年 AI 工具越来越火,从写代码、做内容,到自动化办公,很多人都会用到 OpenAI 的产品,比如 ChatGPT。但是很多人会问:国内到底能不能用?怎么才能稳定用?这篇文章就把这件事讲清楚
    的头像 发表于 03-27 15:10 678次阅读
    <b class='flag-5'>OpenAi</b><b class='flag-5'>在</b>国内能用吗?2026年详细使用教程!

    C语言中一些令人震惊的结构介绍

    C语言同意一些令人震惊的结构,下面的结构是合法的吗,如果是它做些什么? int a = 5, b = 7, c; c = a+++b; 考察点: 这个问题将作为这个测验的一个愉快的结尾
    发表于 12-23 08:15

    GPT-5.1发布 OpenAI开始拼情商

    Thinking:高级推理模型,简单任务上更快,复杂任务上更持久,也更容易理解。 对于新上线的GPT-5.1大模型,OpenAI 官方表示出色的 AI 不仅是要够聪明,还要让人与
    的头像 发表于 11-13 15:49 819次阅读

    CW32L010F8P600的优势

    的场景,易于升级迭代,减少对EEPROM的依赖,耐用性更高。 代码安全防护:代码安全防护方面达到黑客级别。保护用户
    发表于 11-13 07:07

    内存价格涨幅超过黄金! 怎么搞的?

    近期内存市场的涨势令人震惊。行业分析报告显示,2025年第三季度DRAM合约价格同比上涨高达171.8%,这一数字甚至超过了同期黄金的涨幅。有业内观察人士指出,2025年第四季度将标志着 “DRAM牛市” 的真正开始。市场普遍预期,2026年可能会出现更严重的DRAM供应短缺。
    的头像 发表于 11-06 16:46 3560次阅读
    内存价格涨幅超过黄金! 怎么搞的?

    NVIDIA携手OpenAI构建AI基础设施

    NVIDIA 首席执行官黄仁勋、OpenAI 首席执行官 Sam Altman 和 OpenAI 总裁 Greg Brockman 宣布了一项新的合作伙伴关系,旨在推动 OpenAI 的发展,并支持几乎所有行业和用户大规模使用
    的头像 发表于 09-23 14:38 1090次阅读

    了解SOLIDWORKS202仿真方面的改进

    和效率,从而帮助设计师更好地应对复杂的设计挑战。本文将深入探讨SOLIDWORKS 2025仿真方面的改进,揭示这些改进如何助力设计师实现更有效、更准确的仿真分析。
    的头像 发表于 09-04 10:36 842次阅读
    了解SOLIDWORKS202仿真<b class='flag-5'>方面的</b>改进

    OpenAI或在周五凌晨发布GPT-5 OpenAI以低价向美国政府提供ChatGPT

    外界一直期待的OpenAI新一代大语言模型GPT-5或将发布。据外媒的报道,GPT-5很可能在周五凌晨发布。这是OpenAI2023年的3月份推出自然语言处理模型GPT-4之后,两
    的头像 发表于 08-07 14:13 1.5w次阅读

    国产主板耐用性和可靠性上有哪些具体表现

    国产主板耐用性和可靠性上有着诸多令人瞩目的具体表现不同领域发挥着关键作用。
    的头像 发表于 07-22 18:21 1225次阅读

    解析SMA接口电磁兼容性方面的卓越表现

    德索精密工业通过材料选用、工艺处理以及结构和内导体设计等多方面的不懈努力,使得其生产的SMA接口电磁兼容性方面表现卓越,
    的头像 发表于 05-20 08:48 823次阅读
    解析SMA接口<b class='flag-5'>在</b>电磁兼容性<b class='flag-5'>方面的</b>卓越<b class='flag-5'>表现</b>

    距离Robotaxi上线仅剩数周,特斯拉尚未开始无安全员测试引发质疑

    令人震惊的是,截至上个月,特斯拉尚未开始进行无安全员的道路测试。
    的头像 发表于 05-15 17:58 663次阅读

    解析 SMA 接口电磁兼容性方面的卓越表现

    德索精密工业通过材料选用、工艺处理以及结构和内导体设计等多方面的不懈努力,使得其生产的SMA接口电磁兼容性方面表现卓越,
    的头像 发表于 05-14 09:12 815次阅读
    解析 SMA 接口<b class='flag-5'>在</b>电磁兼容性<b class='flag-5'>方面的</b>卓越<b class='flag-5'>表现</b>

    如何获取 OpenAI API Key?API 获取与代码调用示例 (详解教程)

    OpenAI API Key 获取与使用详解:从入门到精通 OpenAI 正以其 GPT 和 DALL-E 等先进模型引领全球人工智能创新。其 API 为开发者和企业提供了强大的 AI 能力集成途径
    的头像 发表于 05-04 11:42 1.9w次阅读
    如何获取 <b class='flag-5'>OpenAI</b> API Key?API 获取与<b class='flag-5'>代码</b>调用示例 (详解教程)