“本文转载自https://glama.ai/blog/2024-08-29-reverse-engineering-minified-code-using-openai”
在浏览互联网寻找灵感时,我发现了一个看起来很有趣的组件:
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版本,这一消息如同一颗重磅炸弹,在科技圈引发了强
OpenAi在国内能用吗?2026年详细使用教程!
这两年 AI 工具越来越火,从写代码、做内容,到自动化办公,很多人都会用到 OpenAI 的产品,比如 ChatGPT。但是很多人会问:在国内到底能不能用?怎么才能稳定用?这篇文章就把这件事讲清楚
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 不仅是要够聪明,还要让人与
内存价格涨幅超过黄金! 怎么搞的?
近期内存市场的涨势令人震惊。行业分析报告显示,2025年第三季度DRAM合约价格同比上涨高达171.8%,这一数字甚至超过了同期黄金的涨幅。有业内观察人士指出,2025年第四季度将标志着 “DRAM牛市” 的真正开始。市场普遍预期,2026年可能会出现更严重的DRAM供应短缺。
NVIDIA携手OpenAI构建AI基础设施
NVIDIA 首席执行官黄仁勋、OpenAI 首席执行官 Sam Altman 和 OpenAI 总裁 Greg Brockman 宣布了一项新的合作伙伴关系,旨在推动 OpenAI 的发展,并支持几乎所有行业和用户大规模使用
了解SOLIDWORKS202仿真方面的改进
和效率,从而帮助设计师更好地应对复杂的设计挑战。本文将深入探讨SOLIDWORKS 2025在仿真方面的改进,揭示这些改进如何助力设计师实现更有效、更准确的仿真分析。
OpenAI或在周五凌晨发布GPT-5 OpenAI以低价向美国政府提供ChatGPT
外界一直在期待的OpenAI新一代大语言模型GPT-5或将发布。据外媒的报道,GPT-5很可能在周五凌晨发布。这是OpenAI在2023年的3月份推出自然语言处理模型GPT-4之后,两
如何获取 OpenAI API Key?API 获取与代码调用示例 (详解教程)
OpenAI API Key 获取与使用详解:从入门到精通 OpenAI 正以其 GPT 和 DALL-E 等先进模型引领全球人工智能创新。其 API 为开发者和企业提供了强大的 AI 能力集成途径
OpenAI 在精简代码方面的出色表现令人震惊
评论