<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>SOTA on Chang Luo</title>
		<link>https://www.luochang.ink/categories/sota/</link>
		<description>Recent content in SOTA on Chang Luo</description>
		<generator>Hugo</generator>
		<language>zh-CN</language>
		
		
		
		
			<lastBuildDate>Sun, 24 May 2026 00:00:00 +0000</lastBuildDate>
		
			<atom:link href="https://www.luochang.ink/categories/sota/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Skill Zoo：一站式 Agent 技能管理工具</title>
				<link>https://www.luochang.ink/posts/skill_zoo/</link>
				<pubDate>Sun, 24 May 2026 00:00:00 +0000</pubDate>
				<guid>https://www.luochang.ink/posts/skill_zoo/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://www.luochang.ink/img/header-image.webp&#34; alt=&#34;Skill Zoo 应用封面&#34;&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;给所有流浪的技能宝宝一个家&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/skill-zoo&#34; target=&#34;_blank&#34;&gt;skill-zoo&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;自 Coding Agent 爆火以来，Agent 技能作为其能力的重要载体也备受关注。Agent 技能本质上是文档，但凭借其可插拔、任务间通用和渐进式披露等特性，已经变成了 prompt 的一种独特存在形式。&lt;/p&gt;&#xA;&lt;p&gt;Agent 技能尤其擅长有套路、有 SOP、需要风格迁移的任务，比如网页设计、数据分析、制作幻灯片等。下面是我用 ThariqS 佬开源的 HTML 模板做的 Slide。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.luochang.ink/img/skill-zoo-slide.jpg&#34; alt=&#34;使用 Agent 技能制作的简洁风格幻灯片&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;这个 Slide 偏简洁风，如果你喜欢其它风格，可以上 GitHub 搜索相关 skill。&lt;/p&gt;&#xA;&lt;h3 id=&#34;一如何管理技能&#34;&gt;一、如何管理技能&lt;/h3&gt;&#xA;&lt;p&gt;Agent 技能良莠不齐，下载下来用不用得上另说，上下文总归被占用了。如果技能数量太多，技能列表甚至会被截断。&lt;/p&gt;&#xA;&lt;p&gt;因此，技能是需要管理的：不用的要删除，过时的要更新。同时技能管理又是一件挺主观的事，哪些技能有用，哪些技能质量高，需要我们主动判断。阅读方便就变成一个很重要的指标。npx skills 这种 CLI 不方便阅读，需要一个 App 来提供阅读和管理功能。&lt;/p&gt;&#xA;&lt;p&gt;Skill Zoo 就打算做好这件事。它提供了一系列随点随用的功能，帮我们降低技能管理成本，拉近我们和技能之间的距离。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.luochang.ink/img/skill-zoo-home.jpg&#34; alt=&#34;Skill Zoo 首页的技能卡片视图&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;项目地址：&lt;a href=&#34;https://www.luochang.ink/skill-zoo/&#34; target=&#34;_blank&#34;&gt;luochang.ink/skill-zoo&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;二产品设计&#34;&gt;二、产品设计&lt;/h3&gt;&#xA;&lt;p&gt;为了达成这个目标，我开发了覆盖 Agent Skills 整个生命周期的管理功能。&lt;/p&gt;&#xA;&lt;h4 id=&#34;21-ssot-模式&#34;&gt;2.1 SSOT 模式&lt;/h4&gt;&#xA;&lt;p&gt;为解决 Agent 技能跨编程工具复用的问题，Skill Zoo 采用 &lt;strong&gt;唯一真实源（SSOT）+ 软链接&lt;/strong&gt; 的方法，将已有技能链接至其他编程工具的 Skill 目录使用。&lt;/p&gt;&#xA;&lt;p&gt;SSOT 是什么？Claude Code 和 Codex 都有技能文件夹。如果一个技能分别存放在不同的技能文件夹里，会造成技能重复存放、技能版本不可控等问题。SSOT 就是维护唯一的技能文件夹，统一管理技能。&lt;/p&gt;</description>
			</item>
			<item>
				<title>新瓶装旧酒：纸牌魔术 MCP</title>
				<link>https://www.luochang.ink/posts/card_magic_mcp/</link>
				<pubDate>Sat, 12 Jul 2025 00:00:00 +0000</pubDate>
				<guid>https://www.luochang.ink/posts/card_magic_mcp/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;Chico 和 Dico 是两名魔术师，他们有一个经典纸牌魔术：抽五张扑克牌，根据前四张，猜第五张是什么。完成这个魔术不需要任何魔术师的技巧，它完全建立在数学原理之上。只需要一点数学知识和充分的练习，你也能表演这个魔术。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/card-magic-mcp&#34; target=&#34;_blank&#34;&gt;card-magic-mcp&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;五年前，我写了一篇文章&lt;a href=&#34;https://www.luochang.ink/posts/chico_and_dico/&#34;&gt;《用魔法打败魔法》&lt;/a&gt;，介绍 Chico &amp;amp; Dico 魔术的数学原理，并用 Python 实现了这个魔术。随着时代的发展、科技的进步，今天我们有更简单的方法来玩这个魔术，不需要运行 Python，不需要看懂公式，只需要打开 &lt;a href=&#34;https://www.modelscope.cn/mcp/servers/FMoBall/card-magic-mcp&#34;&gt;ModelScope&lt;/a&gt; 和大模型对话，就可以轻松体验这个魔术↓↓↓&lt;/p&gt;&#xA;&lt;p&gt;访问 &lt;code&gt;ModelScope Playground&lt;/code&gt;: &lt;a href=&#34;https://www.modelscope.cn/studios/modelscope/mcp-playground?studio_additional_params=%7B%0A%20%20%22mcpServers%22%3A%20%7B%0A%20%20%20%20%22card-magic-mcp%22%3A%20%7B%0A%20%20%20%20%20%20%22type%22%3A%20%22sse%22%2C%0A%20%20%20%20%20%20%22url%22%3A%20%22https%3A%2F%2Fmcp.api-inference.modelscope.net%2Ffcfa3b28ef6a4f%2Fsse%22%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D&#34;&gt;card-magic-mcp&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;下面我将介绍这个魔术的数学原理和算法实现，然后讲解如何用 FastMCP 将魔术流程包装成大语言模型可以调用的工具（MCP Server）。&lt;/p&gt;&#xA;&lt;h3 id=&#34;chico--dico-的魔术&#34;&gt;Chico &amp;amp; Dico 的魔术&lt;/h3&gt;&#xA;&lt;p&gt;Chico 和 Dico 是两位魔术师，他们经常表演的一个魔术是这样的：Chico 将一副 52 张的扑克牌交给观众，让他抽取其中的 5 张。然后 Chico 将这 5 张牌按一定的顺序重新排列，再将其还给观众。上述整个过程 Dico 都是看不见的。然而，当观众按 Chico 排好的顺序依次展示前四张牌之后，Dico 却能准确地说出第五张牌是什么。&lt;/p&gt;&#xA;&lt;p&gt;乍一看这个魔术很神奇。随机抽取 5 张牌，你能从前 4 张牌中看出第 5 张牌是什么吗？对于普通人来说，当然不行。Chico 和 Dico 的秘诀在于 Chico 有机会将扑克重新排序。如果两人事先约定好某种协议，Chico 有可能通过前四张扑克排列的顺序，向 Dico 传递关于第 5 张牌的信息。&lt;/p&gt;&#xA;&lt;p&gt;关键在于如何实现这种协议。&lt;/p&gt;&#xA;&lt;h3 id=&#34;数学原理&#34;&gt;数学原理&lt;/h3&gt;&#xA;&lt;p&gt;在进行分析之前，我们需要把 Chico &amp;amp; Dico 的魔术抽象成一个数学模型。&lt;/p&gt;&#xA;&lt;p&gt;魔术本身已经提供了一些建模信息。假设一共有 \( n \) 张牌，抽取其中的 \( k \) 张。在对牌进行某种排序之后，我们需要利用前 \( (k - j) \) 张牌的信息，推测后 \( j \) 张牌是什么。&lt;/p&gt;</description>
			</item>
			<item>
				<title>摸鱼侠极客版</title>
				<link>https://www.luochang.ink/posts/moyu_bash/</link>
				<pubDate>Sun, 03 Jul 2022 00:00:00 +0000</pubDate>
				<guid>https://www.luochang.ink/posts/moyu_bash/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;老板：退退退&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/moyu-bash&#34; target=&#34;_blank&#34;&gt;moyu-bash&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-缘起&#34;&gt;1. 缘起&lt;/h3&gt;&#xA;&lt;p&gt;最近刷到一个微信小程序，叫 “摸鱼侠”，它长这样：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.luochang.ink/img/moyuxia-demo.PNG&#34; alt=&#34;nature system&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;这里面有个栏目叫 “今日已摸到”，还挺有意思的，它会计算今日截至当前为止挣到的工资。&lt;/p&gt;&#xA;&lt;p&gt;我寻思这小程序颜色太过艳丽，容易被老板抓包，便计上心来，打算写个 &lt;strong&gt;bash 版摸鱼侠&lt;/strong&gt;。和生产环境融为一体，纯键盘操控，老板来了一个 &lt;code&gt;ctrl c&lt;/code&gt; 便能毁尸灭迹，大大滴方便。&lt;/p&gt;&#xA;&lt;h3 id=&#34;2-出生&#34;&gt;2. 出生&lt;/h3&gt;&#xA;&lt;p&gt;这要实现起来也不难，只要把 &lt;code&gt;(工作秒数 - 休息秒数) * 每秒工资&lt;/code&gt; 就好嘛。&lt;/p&gt;&#xA;&lt;p&gt;我纯纯的 bash 新手，不对之处大家批评。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;# Author: github@luochang212&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#953800&#34;&gt;work_start&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;10:00:00    &lt;span style=&#34;color:#57606a&#34;&gt;# 上班时间&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#953800&#34;&gt;lunch_start&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;12:00:00    &lt;span style=&#34;color:#57606a&#34;&gt;# 午饭开始&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#953800&#34;&gt;lunch_end&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;13:00:00    &lt;span style=&#34;color:#57606a&#34;&gt;# 午饭结束&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#953800&#34;&gt;dinner_start&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;18:00:00    &lt;span style=&#34;color:#57606a&#34;&gt;# 晚饭开始&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#953800&#34;&gt;dinner_end&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;19:00:00    &lt;span style=&#34;color:#57606a&#34;&gt;# 晚饭结束&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#953800&#34;&gt;work_end&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;20:00:00    &lt;span style=&#34;color:#57606a&#34;&gt;# 下班时间&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#953800&#34;&gt;salary&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;40000&lt;/span&gt;    &lt;span style=&#34;color:#57606a&#34;&gt;# 月薪&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#953800&#34;&gt;day&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;22&lt;/span&gt;    &lt;span style=&#34;color:#57606a&#34;&gt;# 每月工作天数&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#953800&#34;&gt;CURRENT_TIME&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;date +&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;%T&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#953800&#34;&gt;EMOJI_ARRAY&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;(・▽ &amp;lt; )★&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;─=≡Σ((( つ•̀ 3 •́)つ&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;┗|｀O′|┛&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;_(┐「ε:)_&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;ヽ( ˘ω˘ )ゝ&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;get_second&lt;span style=&#34;color:#0550ae&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;read&lt;/span&gt; -r h m s &lt;span style=&#34;color:#0550ae&#34;&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;|&lt;/span&gt; tr &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;:&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt;  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;(((&lt;/span&gt;10#&lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; h*60*60&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt;+&lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;10# &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;m*60&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt;+10#&lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; s&lt;span style=&#34;color:#0550ae&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;calc_duration&lt;span style=&#34;color:#0550ae&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;start&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;get_second &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; 1&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;end&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;get_second &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; 2&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt;  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;((&lt;/span&gt;end-start&lt;span style=&#34;color:#0550ae&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;calc_work_time&lt;span style=&#34;color:#0550ae&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;lunch_time&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;calc_duration  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;lunch_start &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; lunch_end&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;dinner_time&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; dinner_start  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;dinner_end&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;calc_duration  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;CURRENT_TIME &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; work_start&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt; -gt &lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;elif&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;[&lt;/span&gt;  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; CURRENT_TIME  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;lunch_start&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt; -gt &lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;calc_duration  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;work_start &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; CURRENT_TIME&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;elif&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;[&lt;/span&gt;  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; CURRENT_TIME  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;lunch_end&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt; -gt &lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;calc_duration  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;work_start &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; lunch_start&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;elif&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;[&lt;/span&gt;  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; CURRENT_TIME  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;dinner_start&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt; -gt &lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;((&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; work_start  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;CURRENT_TIME&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt; - lunch_time&lt;span style=&#34;color:#0550ae&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;elif&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;calc_duration  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;CURRENT_TIME &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; dinner_end&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt; -gt &lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt;  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;((&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;calc_duration  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;work_start &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; dinner_start&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt; - lunch_time&lt;span style=&#34;color:#0550ae&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;elif&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;[&lt;/span&gt;  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; CURRENT_TIME  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;work_end&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt; -gt &lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;((&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; work_start  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;CURRENT_TIME&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt; - lunch_time - dinner_time&lt;span style=&#34;color:#0550ae&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;else&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;((&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; work_start  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;work_end&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt; - lunch_time - dinner_time&lt;span style=&#34;color:#0550ae&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;fi&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;show_work_time&lt;span style=&#34;color:#0550ae&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;work_sec&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;calc_work_time&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34; \)((\( work_sec / 3600)) hours and  \)((\( work_sec % 3600 / 60)) minutes and  \)((\( work_sec % 60)) seconds&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;calc_money&lt;span style=&#34;color:#0550ae&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;lunch_time&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; lunch_start  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;lunch_end&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;dinner_time&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;calc_duration  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;dinner_start &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; dinner_end&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;mnt&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;(((&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;calc_duration  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;work_start &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; work_end&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt; - lunch_time - dinner_time&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt; / 60&lt;span style=&#34;color:#0550ae&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;salary_per_mnt&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;((&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; salary * &lt;span style=&#34;color:#0550ae&#34;&gt;100000000&lt;/span&gt; /  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;day / &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; mnt&lt;span style=&#34;color:#0550ae&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;work_sec&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;calc_work_time&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;money&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;((&lt;/span&gt;salary_per_mnt * &lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;work_sec / 60&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt; / 1000000&lt;span style=&#34;color:#0550ae&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt;  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;money&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;show_money&lt;span style=&#34;color:#0550ae&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;money&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;calc_money&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;已挣到： \)((\( money / 100)). \)((\( money % 100)) 元&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;calc_work_end&lt;span style=&#34;color:#0550ae&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;[&lt;/span&gt;  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; CURRENT_TIME  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;work_start&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt; -gt &lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;距离下班还有：[还没开始上班]&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;elif&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;calc_duration  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;CURRENT_TIME &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; work_end&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt; -gt &lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;time_left&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;(&lt;/span&gt;calc_duration &lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; CURRENT_TIME  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;work_end&lt;span style=&#34;color:#0550ae&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;距离下班还有：\( (( \)time_left / 3600)) 小时 \( (( \)time_left % 3600 / 60)) 分钟 \( (( \)time_left % 60)) 秒&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;else&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;距离下班还有：[下班啦]&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;fi&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;random_emoji&lt;span style=&#34;color:#0550ae&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;len&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;\(&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;#EMOJI_ARRAY[*]}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6639ba&#34;&gt;echo&lt;/span&gt;  &lt;span style=&#34;color:#0a3069&#34;&gt;\)&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;{&lt;/span&gt;EMOJI_ARRAY&lt;span style=&#34;color:#0550ae&#34;&gt;[&lt;/span&gt;RANDOM % &lt;span style=&#34;color:#953800&#34;&gt;$len&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;]}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;random_emoji&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;show_money&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;calc_work_end&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;:&#xA;为了让界面可爱一点，我用颜文字润色了一下！&lt;/p&gt;</description>
			</item>
			<item>
				<title>用魔法打败魔法！</title>
				<link>https://www.luochang.ink/posts/chico_and_dico/</link>
				<pubDate>Fri, 21 Feb 2020 00:00:00 +0000</pubDate>
				<guid>https://www.luochang.ink/posts/chico_and_dico/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;Chico 和 Dico 是两位魔术师，他们有一个经典魔术：根据任意四张牌猜第五张牌。但完成这个魔术并不需要任何魔术师的技巧，因为它完全建立在数学原理之上。只需要一点数学知识和充分的练习，你也能表演这个魔术！&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/chico-and-dico&#34; target=&#34;_blank&#34;&gt;chico-and-dico&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;chico-和-dico-的魔术&#34;&gt;Chico 和 Dico 的魔术&lt;/h3&gt;&#xA;&lt;p&gt;Chico 和 Dico 是两位魔术师，他们经常表演的一个魔术是这样的：Chico 将一副 52 张的扑克牌交给一位观众，让他随机抽取其中的 5 张。然后 Chico 将这 5 张牌按一定的顺序重新排列，再将其还给观众。上述整个过程 Dico 都是看不见的。然而，当观众按 Chico 排好的顺序依次展示前四张牌之后，Dico 却能准确地说出第五张牌是什么。&lt;/p&gt;&#xA;&lt;p&gt;乍一看这个魔术很神奇。随机抽取 5 张牌，你能从前 4 张牌中看出第 5 张牌是什么吗？对于普通人来说，当然不可能。Chico 和 Dico 的秘诀在于 Chico 有机会将扑克重新排序。如果两人事先约定好某种协议，Chico 是有可能通过扑克排列的顺序，向 Dico 传递关于第 5 张牌的信息的。&lt;/p&gt;&#xA;&lt;p&gt;关键在于如何实现这种协议。&lt;/p&gt;&#xA;&lt;h3 id=&#34;数学模型&#34;&gt;数学模型&lt;/h3&gt;&#xA;&lt;p&gt;在进行分析之前，我们需要把 Chico 和 Dico 的魔术抽象成一个数学模型。&lt;/p&gt;&#xA;&lt;p&gt;魔术本身已经提供了一些建模信息。我们可以假设一共有 n 张牌，抽取其中的 k 张。在对牌组进行某种排序之后，我们需要利用前 (k - j) 张牌的信息，推测后 j 张牌是什么。&lt;/p&gt;&#xA;&lt;!-- 其中，中间那步排序操作，本质上是利用前 (k - j) 张牌的顺序信息对后 j 张牌进行编码。 --&gt;&#xA;&lt;p&gt;现在我们有 n, j, k 三个变量，下面我们来进一步探究三个变量之间究竟服从何种关系。&lt;/p&gt;</description>
			</item>
			<item>
				<title>【项目】TSP旅行路线规划</title>
				<link>https://www.luochang.ink/posts/tsp_route/</link>
				<pubDate>Wed, 10 Apr 2019 00:00:00 +0000</pubDate>
				<guid>https://www.luochang.ink/posts/tsp_route/</guid>
				<description>&lt;!--原题：用Jupyter notebook规划旅行路线--&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/tsp-route&#34; target=&#34;_blank&#34;&gt;tsp-route&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;对于在欧洲的小伙伴们，复活节假在这一周就正式开始啦。大家都是怎么计划旅行的呢？&lt;/p&gt;&#xA;&lt;p&gt;我的习惯是在出发前最后一晚，花上半小时，搜索目的地景点 (Point of interest, POI), 然后在Google Maps上为它们点上小星星，以免和它们擦肩而过。我的地图经过一番操作，就成了下面这副模样。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.luochang.ink/img/bristol.png&#34; alt=&#34;攒满了小星星&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;此时此刻，望着这些密集的星星，我不禁自问：如何才能走最少的路，遍历所有景点呢?&lt;/p&gt;&#xA;&lt;p&gt;搜索了谷歌和百度，都没找到我要路径规划功能。最接近需求的是谷歌地图的&amp;quot;Add destination&amp;quot;功能。然而这个功能只是依次连接你点选的地点。并不能由一组地点，确定连接它们的一条全局最短路径。&lt;/p&gt;&#xA;&lt;p&gt;没有现成应用怎么办，我打算自己动手写一个。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;下图是Google Add destination功能。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.luochang.ink/img/googlemap.JPG&#34; alt=&#34;Add destination 功能&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;适用模型tsp-模型&#34;&gt;适用模型：TSP 模型&lt;/h3&gt;&#xA;&lt;p&gt;用一句话概括需求就是：我们需要一条从某地方出发，遍历所有地点，最终回到起点的最短路径。&lt;/p&gt;&#xA;&lt;p&gt;这个需求其实就是运筹学的一个经典问题，旅行商问题(TSP)。旅行商问题的确切描述是这样的：一个商人在各个城市之间旅行，要求遍历所有城市并返回到出发点，要如何规划路线，才能使总路径最短。（打开&lt;a href=&#34;https://zh.wikipedia.org/wiki/%E6%97%85%E8%A1%8C%E6%8E%A8%E9%94%80%E5%91%98%E9%97%AE%E9%A2%98&#34; target=&#34;_blank&#34;&gt;维基百科&lt;/a&gt;了解更多)&lt;/p&gt;&#xA;&lt;h3 id=&#34;解决思路&#34;&gt;解决思路&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;用googlemaps包获取纬度和经度信息&lt;/li&gt;&#xA;&lt;li&gt;用OR-Tools包求解TSP问题&lt;/li&gt;&#xA;&lt;li&gt;最后用gmaps可视化结果&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;在敲代码的过程中，最难的地方莫过于看文档查API, 搞清楚输入输出和调用结构。不过敲完这一顿之后我还是不禁感慨，Google 太为开发者着想了。一旦学会调用API，实现一个简单应用的代码量还是很小的 orz&lt;/p&gt;&#xA;&lt;h3 id=&#34;食用指南&#34;&gt;食用指南&lt;/h3&gt;&#xA;&lt;p&gt;项目地址 &amp;ndash;&amp;gt; &lt;a href=&#34;https://github.com/luochang212/tsp-route&#34; target=&#34;_blank&#34;&gt;传送门&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;在运行代码之前，你需要以下配置：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;一个Jupyter Notebook. &lt;!--推荐安装Anaconda3，Anaconda3自带Jupyter Notebook和全套Python依赖.--&gt;&lt;/li&gt;&#xA;&lt;li&gt;你需要安装这些包：googleplaces, googlemaps, gmaps, ortools.&lt;/li&gt;&#xA;&lt;li&gt;你需要一个Google Maps API key, &lt;a href=&#34;https://developers.google.com/maps/documentation/distance-matrix/start#get-a-key&#34; target=&#34;_blank&#34;&gt;从这里获取API&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;完成配置等于成功的一半。在Jupyter notebook打开&lt;code&gt;TSPSolver.ipynb&lt;/code&gt;，将第二个代码块的所有变量，改成自己的，比如自己的目的地自己的区域和自己的API密码……最后从头到尾运行所有代码块，你就可以得到自己的定制路线辣~&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.luochang.ink/img/my_route.JPG&#34; alt=&#34;my route&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;配置代码如下。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;# input the places of interest (POI)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;places &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;YHA London Central Hostel&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;Coca-Cola London Eye&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;St. Paul&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;\&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;s Cathedral&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;Leadenhall Market&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;The National Gallery&amp;#39;&lt;/span&gt; \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;Big Ben&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;Buckingham Palace&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;Waterloo Station&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;# the region&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Location&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;London&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;# choose a mode&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Mode &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;walking&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#57606a&#34;&gt;# &amp;#34;driving&amp;#34;, &amp;#34;walking&amp;#34;, &amp;#34;bicycling&amp;#34;, &amp;#34;transit&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;# get Google API key from following website: &lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;# https://developers.google.com/maps/documentation/distance-matrix/start#get-a-key&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;password &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;YOUR_GOOGLE_API_KEY_HERE&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&#xA;&lt;center&gt; 欢迎Star, Pull, Pr.&lt;/center&gt;</description>
			</item>
	</channel>
</rss>
