stay:将代码翻译为Gif动图,妈妈再也不用担心我调试找不到bug了
本文首发于微信公众号:呼哧好大枫。原作者与本文作者是同一人。
平常在做算法题或者是 debug 的时候很需要一款能够实时地将代码执行逻辑和数据以图形化的形式渲染出来的工具。之前尝试了几款(visual studio 的 debug 功能、VS Code 的 Debug Visualizer 插件),不是图形化的程度不够,就是使用起来太麻烦,效果都不尽如人意。直到我发现了这款:
stay:https://staying.fun/zh/features/algorithm-visualize
话不多说,直接看实际效果。下面是一个经典荷兰国旗算法的实现代码。其中还是有一些比较难以理解点的,尤其是在 0 区间和 1 区间的扩大和缩小,结合图形化的演示可以更直观地理解算法原理:
def sortColors(nums):
n = len(nums)
# 区间划分法
# [0, j]为0区间,初始为空
j = -1
# [j + 1, i]为1区间,初始为空
i = 0
# [i + 1, k)为2区间,初始为空
k = n
# 初始从1区间开始遍历,遇到0就交换到前面,遇到2就交换到后面
while i < k:
if nums[i] == 0:
# 扩大0区间,1区间向后移动一个位置
j += 1
if i != j:
nums[i], nums[j] = nums[j], nums[i]
i += 1
elif nums[i] == 2:
k -= 1
nums[i], nums[k] = nums[k], nums[i]
else:
i += 1
nums = [2, 0, 2, 1, 1, 0]
sortColors(nums)
print(nums) # 输出排序后的结果
在 stay 上的图形化渲染效果如下:

毫不夸张地说,staying 完美实现了我心目中最完美的代码图形化:在调试的时候,我更关心的不是代码底层堆栈的执行情况。我只是想像翻译软件一样,把代码一行一行地翻译成动图显示在我的面前。staying 实现的优点还不止这些:
- 以网站形式对外开放,不像现在很多工具动不动就要下载 APP;
- 界面简洁单一,没有大片的广告和付费引导,至少暂时可以没有,基本的功能都可以免费使用;

- 对一些复杂的算法(如树、图等)也有很好的支持

当然,stay 目前处于测试阶段(BETA),也有一些难以忍受的缺点:
- 目前仅支持 Python 和 JavaScript。做算法题还是 C++用得多一些,希望官方尽快上线 C++语言的支持;
- 似乎没有代码动图的导出功能,这对一些喜欢写题解的童鞋来说不是很方便。

stay:将代码翻译为Gif动图,妈妈再也不用担心我调试找不到bug了的更多相关文章
- 有了jsRender,妈妈再也不用担心我用jq拼接DOM拼接的一团糟了、页面整齐了、其他伙伴读代码也不那么费劲了
写在前面 说来也很巧, 下午再做一个页面,再普通不过的分页列表,我还是像往常一样,基于MVC环境下,我正常用PagedList.MVC AJAX做无刷新分页,这时候问题就来了,列表数据中有个轮播图用到 ...
- Python 在线免费批量美颜,妈妈再也不用担心我 P 图两小时啦
引言 首先我承认自己标题党了,我就想提升点阅读量我容易么我,前几天的篇纯技术文阅读量都扯着蛋了. 毕竟阅读量太低实在是没有写下去的动力,我只能用点小手段偶尔提升下阅读量. 这篇文章我转换下套路,先放结 ...
- [置顶]
【机器学习PAI实践十一】机器学习PAI为你自动写歌词,妈妈再也不用担心我的freestyle了(提供数据、代码
背景 最近互联网上出现一个热词就是"freestyle",源于一个比拼rap的综艺节目.在节目中需要大量考验选手的freestyle能力,freestyle指的是rapper即兴的 ...
- 机器学习PAI为你自动写歌词,妈妈再也不用担心我的freestyle了(提供数据、代码)
背景 最近互联网上出现一个热词就是“freestyle”,源于一个比拼rap的综艺节目.在节目中需要大量考验选手的freestyle能力,freestyle指的是rapper即兴的根据一段主题讲一串r ...
- 有了代码变更分解提交工具SmartCommit,再也不担心复合提交了
摘要:文将介绍一个代码提交辅助工具SmartCommit,其主要功能是通过杂糅变更分解算法自动生成分组提交方案,接受开发者的反馈和交互式调整,渐进式地引导和辅助开发者做出符合最佳实践的原子提交. 本文 ...
- 八大排序算法详解(动图演示 思路分析 实例代码java 复杂度分析 适用场景)
一.分类 1.内部排序和外部排序 内部排序:待排序记录存放在计算机随机存储器中(说简单点,就是内存)进行的排序过程. 外部排序:待排序记录的数量很大,以致于内存不能一次容纳全部记录,所以在排序过程中需 ...
- 八大排序算法——堆排序(动图演示 思路分析 实例代码java 复杂度分析)
一.动图演示 二.思路分析 先来了解下堆的相关概念:堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆:或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆.如 ...
- 八大排序算法——希尔(shell)排序(动图演示 思路分析 实例代码java 复杂度分析)
一.动图演示 二.思路分析 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止. 简单插 ...
- 八大排序算法——基数排序(动图演示 思路分析 实例代码java 复杂度分析)
一.动图演 二.思路分析 基数排序第i趟将待排数组里的每个数的i位数放到tempj(j=1-10)队列中,然后再从这十个队列中取出数据,重新放到原数组里,直到i大于待排数的最大位数. 1.数组里的数最 ...
- 八大排序算法——归并排序(动图演示 思路分析 实例代码java 复杂度分析)
一.动图演示 二.思路分析 归并排序就是递归得将原始数组递归对半分隔,直到不能再分(只剩下一个元素)后,开始从最小的数组向上归并排序 1. 向上归并排序的时候,需要一个暂存数组用来排序, 2. 将 ...
随机推荐
- Vue.js axios
1.安装与引入 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中,官方文档 在HTML文件中引入 <script src="https:/ ...
- Astro v5 x DevNow
先介绍下 DevNow DevNow Github 体验网站 DevNow 是一个精简的开源技术博客项目模版,支持 Vercel 一键部署,支持评论.搜索等功能,欢迎大家体验.同时也支持 Follow ...
- Shiro简单入门+个人理解(3)
最后一天,对shiro框架的应用也到此为至了,可能不是太全,但相对于一般的项目,它的作用已经使用了很多了 Shiro的授权: 授权:对用户资源访问的授权(是否允许用户访问此资源) 用户访问系统资源时的 ...
- nginx-tengine-invalid IPv6 address in resolver-解析器中无效的IPv6地址
问题描述:解析器中无效的IPv6地址 [root@dm ~]# nginx -t nginx: [emerg] invalid IPv6 address in resolver "[fe80 ...
- [sa-token]StpUtil.getLoginId
闲聊 一般情况下,我们想用uid,可能需要前端将uid传过来,或者将token传来,然后我们进行识别. 用了sa-token之后,可以使用StpUtil.getLoginId()方法获取当前会话的用户 ...
- Qt编写跨平台RTSP/RTMP/HTTP视频流播放器
一.前言 很早以前就做过这款播放器的入门版本,最开始用的ffmpeg去解析,后面陆续用vlc播放器.mpv播放器来做,毕竟播放器提供的接口使用也很方便,而且功能强大,后面发现播放器主要的应用场景是播放 ...
- Qt通用方法及类库3
函数名 //设置全局样式 static void setStyle(QUIWidget::Style style); static void setStyle(const QString &q ...
- 生产环境Sentinel改造实践(二):规则管理推送改造
前文介绍了Sentinel相关的核心概念,本文开始动手对规则管理推送进行改造. 这里挑选流控规则模式改造为示例 Sentinel Dashboard 改造 在com.alibaba.csp.senti ...
- [转]奇异值分解(SVD)方法求解最小二乘问题的原理
原文链接:奇异值分解(SVD)方法求解最小二乘问题的原理 翻译 搜索 复制
- POST、GET、@RequestBody和@RequestParam区别
参考链接: 1.POST.GET.@RequestBody和@RequestParam区别 2.@RequestBody的使用