<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>PwzXxm</title><link>https://pwzxxm.com/</link><description>Learning and sharing ideas. Enjoy what you are passionated about.</description><generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>patrick.weizhixu@gmail.com (PwzXxm)</managingEditor><webMaster>patrick.weizhixu@gmail.com (PwzXxm)</webMaster><copyright>This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.</copyright><lastBuildDate>Tue, 08 Oct 2024 18:21:55 +0800</lastBuildDate><atom:link href="https://pwzxxm.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Notify Me on Slack when the GitHub Pull Request Merged</title><link>https://pwzxxm.com/notify-me-on-slack-when-the-github-pull-request-merged/</link><pubDate>Tue, 08 Oct 2024 18:21:55 +0800</pubDate><author>patrick.weizhixu@gmail.com (PwzXxm)</author><guid>https://pwzxxm.com/notify-me-on-slack-when-the-github-pull-request-merged/</guid><description><![CDATA[<p>Tired of refreshing the GitHub web pages and waiting for the PR from colleagues to be merged.
Try to dump these things out of my head to concentrate on real work.</p>
<h2 id="steps">Steps</h2>
<p>There are only three steps and step 2 is optional.</p>
<ol>
<li>Creating a Slack App via <a href="https://api.slack.com/messaging/webhooks" target="_blank" rel="noopener noreffer ">https://api.slack.com/messaging/webhooks</a>. What you want is the Webhook URLs under <strong>Incoming Webhooks</strong> which starts with <code>https://hooks.slack.com/services/</code>, so that you can send the notification message to it.</li>
<li>Aware of the <a href="https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api" target="_blank" rel="noopener noreffer ">Rate Limit of GitHub API</a> and create a personal access token or creating GitHub Apps depending on your needs.</li>
<li>With help of ChatGPT and a few fixes, we derived at this script</li>
</ol>
<div class="code-block code-line-numbers" style="counter-reset: code-block 0">
    <div class="code-header language-python">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">requests</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">argparse</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">time</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">re</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Could be none or personal access token https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api</span>
</span></span><span class="line"><span class="cl"><span class="n">GITHUB_TOKEN</span><span class="o">=</span><span class="s2">&#34;&lt;your_github_token&gt;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># On how to get webhooks token https://api.slack.com/messaging/webhooks</span>
</span></span><span class="line"><span class="cl"><span class="n">SLACK_WEBHOOK</span><span class="o">=</span><span class="s2">&#34;https://hooks.slack.com/services/XXXXXXXXXXX/YYYYYYYYYY/ZZZZZZZZZZZZZZ&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">WAIT_DURATION_SEC</span><span class="o">=</span><span class="mi">600</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">parse_args</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s1">&#39;Check if a GitHub pull request was merged and send a Slack message.&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;pr_url&#39;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;GitHub pull request URL.&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">parse_pr_url</span><span class="p">(</span><span class="n">pr_url</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    Parses the PR URL and returns the owner, repository, and PR number.
</span></span></span><span class="line"><span class="cl"><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">    Example URL: https://github.com/owner/repo/pull/123
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">pattern</span> <span class="o">=</span> <span class="sa">r</span><span class="s1">&#39;https?://github\.com/(?P&lt;owner&gt;[^/]+)/(?P&lt;repo&gt;[^/]+)/pull/(?P&lt;pr_number&gt;\d+)&#39;</span>
</span></span><span class="line"><span class="cl">    <span class="k">match</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="k">match</span><span class="p">(</span><span class="n">pattern</span><span class="p">,</span> <span class="n">pr_url</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="k">match</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="k">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">&#39;owner&#39;</span><span class="p">),</span> <span class="k">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">&#39;repo&#39;</span><span class="p">),</span> <span class="nb">int</span><span class="p">(</span><span class="k">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">&#39;pr_number&#39;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Invalid GitHub pull request URL.&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">check_if_pr_merged</span><span class="p">(</span><span class="n">owner</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">pr_number</span><span class="p">,</span> <span class="n">github_token</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;https://api.github.com/repos/</span><span class="si">{</span><span class="n">owner</span><span class="si">}</span><span class="s1">/</span><span class="si">{</span><span class="n">repo</span><span class="si">}</span><span class="s1">/pulls/</span><span class="si">{</span><span class="n">pr_number</span><span class="si">}</span><span class="s1">&#39;</span>
</span></span><span class="line"><span class="cl">    <span class="n">headers</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;Accept&#39;</span><span class="p">:</span> <span class="s1">&#39;application/vnd.github.v3+json&#39;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">github_token</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">headers</span><span class="p">[</span><span class="s1">&#39;Authorization&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;token </span><span class="si">{</span><span class="n">github_token</span><span class="si">}</span><span class="s1">&#39;</span>
</span></span><span class="line"><span class="cl">    <span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">pr_data</span> <span class="o">=</span> <span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">pr_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;merged&#39;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Error fetching PR data: </span><span class="si">{</span><span class="n">url</span><span class="si">}</span><span class="s1"> </span><span class="si">{</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="si">}</span><span class="s1"> </span><span class="si">{</span><span class="n">response</span><span class="o">.</span><span class="n">reason</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="kc">False</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">send_slack_message</span><span class="p">(</span><span class="n">slack_webhook_url</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">payload</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;text&#39;</span><span class="p">:</span> <span class="n">message</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">slack_webhook_url</span><span class="p">,</span> <span class="n">json</span><span class="o">=</span><span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="o">!=</span> <span class="mi">200</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Error sending Slack message: </span><span class="si">{</span><span class="n">slack_webhook_url</span><span class="si">}</span><span class="s1"> </span><span class="si">{</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="si">}</span><span class="s1"> </span><span class="si">{</span><span class="n">response</span><span class="o">.</span><span class="n">reason</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">args</span> <span class="o">=</span> <span class="n">parse_args</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">owner</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">pr_number</span> <span class="o">=</span> <span class="n">parse_pr_url</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">pr_url</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">except</span> <span class="ne">ValueError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;Monitoring PR #</span><span class="si">{</span><span class="n">pr_number</span><span class="si">}</span><span class="s2"> in repository &#39;</span><span class="si">{</span><span class="n">owner</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">repo</span><span class="si">}</span><span class="s2">&#39; for merge status.&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">is_merged</span> <span class="o">=</span> <span class="n">check_if_pr_merged</span><span class="p">(</span><span class="n">owner</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">pr_number</span><span class="p">,</span> <span class="n">GITHUB_TOKEN</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">is_merged</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">message</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;Pull request </span><span class="si">{</span><span class="n">args</span><span class="o">.</span><span class="n">pr_url</span><span class="si">}</span><span class="s1"> has been merged.&#39;</span>
</span></span><span class="line"><span class="cl">            <span class="n">send_slack_message</span><span class="p">(</span><span class="n">SLACK_WEBHOOK</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="k">break</span>
</span></span><span class="line"><span class="cl">        <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="n">WAIT_DURATION_SEC</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">main</span><span class="p">()</span></span></span></code></pre></div></div>
<p>After aliasing, you could do <code>ntfslk https://github.com/owner/repo/pull/123 &amp;</code> to put it in the background.
When the script scans and finds out the PR is merged, a notification will pop up in the channel.</p>]]></description></item><item><title>Blog Renovation - From Jekyll to Hugo</title><link>https://pwzxxm.com/blog-renovation/</link><pubDate>Sun, 27 Dec 2020 14:43:36 +1100</pubDate><author>patrick.weizhixu@gmail.com (PwzXxm)</author><guid>https://pwzxxm.com/blog-renovation/</guid><description><![CDATA[<p>In the past years, the blog was generated using <a href="https://jekyllrb.com/" target="_blank" rel="noopener noreffer ">Jekyll</a>.
Recently, I decided to migrate to <a href="https://gohugo.io/" target="_blank" rel="noopener noreffer ">Hugo</a> along with other changes, such as utilising discussion plugin <a href="https://valine.js.org/" target="_blank" rel="noopener noreffer ">Valine</a>.</p>]]></description></item><item><title>LeetCode Weekly Contest 156 and others</title><link>https://pwzxxm.com/lc-week-2/</link><pubDate>Wed, 02 Oct 2019 00:00:00 +0000</pubDate><author>patrick.weizhixu@gmail.com (PwzXxm)</author><guid>https://pwzxxm.com/lc-week-2/</guid><description><![CDATA[<p>Second week of LeetCode Challenge. Participated the virtual contest.</p>
<h2 id="weekly-contest-156">Weekly Contest 156</h2>
<h3 id="1207-unique-number-of-occurrences">1207. Unique Number of Occurrences</h3>
<p><a href="https://leetcode.com/contest/weekly-contest-156/problems/unique-number-of-occurrences/" target="_blank" rel="noopener noreffer ">https://leetcode.com/contest/weekly-contest-156/problems/unique-number-of-occurrences/</a></p>
<p>Brute force. Record total occurrence of each number and iterate over it to see if there is any duplication.</p>
<div class="code-block code-line-numbers" style="counter-reset: code-block 0">
    <div class="code-header language-cpp">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Solution</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"><span class="k">public</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">    <span class="kt">bool</span> <span class="n">uniqueOccurrences</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&amp;</span> <span class="n">arr</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">unordered_map</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="o">&gt;</span> <span class="n">occ</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">unordered_map</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">bool</span><span class="o">&gt;</span> <span class="n">flag</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">arr</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="n">occ</span><span class="p">[</span><span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="p">(</span><span class="k">const</span> <span class="k">auto</span> <span class="nl">x</span> <span class="p">:</span> <span class="n">occ</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">x</span><span class="p">.</span><span class="n">second</span><span class="p">)</span> <span class="o">!=</span> <span class="n">flag</span><span class="p">.</span><span class="n">end</span><span class="p">())</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="n">x</span><span class="p">.</span><span class="n">second</span><span class="p">])</span> <span class="k">return</span> <span class="nb">false</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="n">flag</span><span class="p">[</span><span class="n">x</span><span class="p">.</span><span class="n">second</span><span class="p">]</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="nb">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span></span></span></code></pre></div></div>
<h3 id="1208-get-equal-substrings-within-budget">1208. Get Equal Substrings Within Budget</h3>
<p><a href="https://leetcode.com/contest/weekly-contest-156/problems/get-equal-substrings-within-budget/" target="_blank" rel="noopener noreffer ">https://leetcode.com/contest/weekly-contest-156/problems/get-equal-substrings-within-budget/</a></p>]]></description></item><item><title>LeetCode Weekly Contest 155 and others</title><link>https://pwzxxm.com/lc-week-1/</link><pubDate>Thu, 19 Sep 2019 00:00:00 +0000</pubDate><author>patrick.weizhixu@gmail.com (PwzXxm)</author><guid>https://pwzxxm.com/lc-week-1/</guid><description><![CDATA[<p>This is the first week of LeetCode Challenges. It includes weekly contest 155 and other problems.</p>
<h2 id="weekly-contest-155">Weekly Contest 155</h2>
<p><a href="https://leetcode.com/contest/weekly-contest-155" target="_blank" rel="noopener noreffer ">https://leetcode.com/contest/weekly-contest-155</a></p>
<h3 id="1200-minimum-absolute-difference">1200. Minimum Absolute Difference</h3>
<p><a href="https://leetcode.com/contest/weekly-contest-155/problems/minimum-absolute-difference/" target="_blank" rel="noopener noreffer ">https://leetcode.com/contest/weekly-contest-155/problems/minimum-absolute-difference/</a></p>
<p>Brute force. Find the minimum absolute difference and then iterate the list again to output the pairs with minimum absolute difference.</p>
<div class="code-block code-line-numbers" style="counter-reset: code-block 0">
    <div class="code-header language-cpp">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Solution</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"><span class="k">public</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">vector</span><span class="o">&lt;</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&gt;</span> <span class="n">minimumAbsDifference</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&amp;</span> <span class="n">arr</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">vector</span><span class="o">&lt;</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&gt;</span> <span class="n">ans</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="n">arr</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="k">return</span> <span class="n">ans</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">sort</span><span class="p">(</span><span class="n">arr</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">arr</span><span class="p">.</span><span class="n">end</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="kt">int</span> <span class="n">mini</span> <span class="o">=</span> <span class="mh">0x3f3f3f3f</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">arr</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="n">mini</span> <span class="o">=</span> <span class="n">min</span><span class="p">(</span><span class="n">mini</span><span class="p">,</span> <span class="n">abs</span><span class="p">(</span><span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">-</span> <span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]));</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">arr</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="p">(</span><span class="n">abs</span><span class="p">(</span><span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">-</span> <span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="o">==</span> <span class="n">mini</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span> <span class="p">(</span><span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="n">ans</span><span class="p">.</span><span class="n">push_back</span><span class="p">({</span><span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]});</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="n">ans</span><span class="p">.</span><span class="n">push_back</span><span class="p">({</span><span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="p">]});</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">ans</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span></span></span></code></pre></div></div>
<h3 id="1201-ugly-number-iii">1201. Ugly Number III</h3>
<p><a href="https://leetcode.com/contest/weekly-contest-155/problems/ugly-number-iii/" target="_blank" rel="noopener noreffer ">https://leetcode.com/contest/weekly-contest-155/problems/ugly-number-iii/</a></p>]]></description></item><item><title>CLDictP: A Command-Line Dictionary Tool</title><link>https://pwzxxm.com/cldictp/</link><pubDate>Wed, 04 Jul 2018 00:00:00 +0000</pubDate><author>patrick.weizhixu@gmail.com (PwzXxm)</author><guid>https://pwzxxm.com/cldictp/</guid><description><![CDATA[<p>A command line dictionary written in Perl using Merriam-Webster APIs.</p>
<p>This is my first project using Perl. I feel it is tedious to type formatted definitions to <a href="https://quizlet.com/" target="_blank" rel="noopener noreffer ">Quizlet</a>(A website which can make flashcards for you) and I&rsquo;m too lazy to open browser and online dictionary pages. Why not combining these two?</p>
<p>It uses following APIs:</p>
<ul>
<li>
<p>Merriam-Webster Learner</p>
</li>
<li>
<p>Merriam-Webster Collegiate</p>
</li>
</ul>
<p>For each entry, it contains:</p>
<ul>
<li>
<p>Pronunciation: IPA(International Phonetic Alphabet)</p>
</li>
<li>
<p>Part of Speech</p>]]></description></item><item><title>Static Linked List - Another Way To Represent Graphs</title><link>https://pwzxxm.com/static-linked-list/</link><pubDate>Tue, 29 May 2018 00:00:00 +0000</pubDate><author>patrick.weizhixu@gmail.com (PwzXxm)</author><guid>https://pwzxxm.com/static-linked-list/</guid><description><![CDATA[<p>Static Linked List is a data structure that stores linked list in static arrays. It is usually used to represent graphs. It is very interesting that its Chinese name literally translated as &ldquo;Linked Forward Star&rdquo;. You have two choices of paths to understand this.</p>
<ul>
<li>
<p>Start from <a href="#forward-star" rel="">Forward Star</a>.</p>
</li>
<li>
<p>Start from <a href="#adjacency-list" rel="">Adjacency List</a>.</p>
</li>
</ul>
<p>However, I would recommend to explore both ideas to have a better understanding. If you know some of it or you just don&rsquo;t care, you can jump to <a href="#static-linked-list" rel="">here</a> straight away.</p>]]></description></item><item><title>POJ 3279 Fliptile</title><link>https://pwzxxm.com/poj-3279/</link><pubDate>Mon, 23 Apr 2018 00:00:00 +0000</pubDate><author>patrick.weizhixu@gmail.com (PwzXxm)</author><guid>https://pwzxxm.com/poj-3279/</guid><description><![CDATA[<p>There are \(M \times N\) \((1 \le M, N \le 15)\)square tiles. Each tile can be flipped and the color of tile can change between black(1) and white(0).</p>
<p>When you flip a tile, 4 adjacent tiles will also be flipped. Note that the four adjacent flipped tiles will NOT cause their adjacent tiles to flip.</p>
<p>Given a configuration, find the minimum number of flips so that all square tiles become white. If having the minimum number is the same, choose the least lexicographical one<sup>1</sup>.</p>]]></description></item><item><title>Build a Proxy Server to Access Chinese IP Including Netease Music</title><link>https://pwzxxm.com/proxy-server-cn-netease-music/</link><pubDate>Fri, 23 Mar 2018 15:39:00 +1100</pubDate><author>patrick.weizhixu@gmail.com (PwzXxm)</author><guid>https://pwzxxm.com/proxy-server-cn-netease-music/</guid><description><![CDATA[<p>Sometimes we need to access Chinese content, like Youku Video, Netease Music (Cloud Music) and QQ music. It is very annoying to get &ldquo;Can Only Be Streamed in Mainland China&rdquo; or similar messages. Being tired of that, fortunately I have got a VPS from Aliyun and I build a proxy server using <a href="https://shadowsocks.org/en/index.html" target="_blank" rel="noopener noreffer ">Shadowsocks</a> on it and everything works smoothly now.</p>
<h3 id="vps">VPS</h3>
<p>You need to have a VPS with <strong>Chinese</strong> IP address, there are tons of choices, like Aliyun(Alibaba Cloud) and Tencent Cloud etc.</p>]]></description></item><item><title>USACO Party Lamps</title><link>https://pwzxxm.com/usaco-lamps/</link><pubDate>Wed, 31 Aug 2016 00:00:00 +0000</pubDate><author>patrick.weizhixu@gmail.com (PwzXxm)</author><guid>https://pwzxxm.com/usaco-lamps/</guid><description><![CDATA[<p>A set of \(N\) \((10 \le N \le 100)\) lamps, numbered from 1 to N.</p>
<p>Four types of button:</p>
<table>
  <thead>
      <tr>
          <th>Button type</th>
          <th>Usage</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>1</td>
          <td>flip all lamps (On to Off, Off to On)</td>
      </tr>
      <tr>
          <td>2</td>
          <td>flip odd numbered lamps (e.g. 1, 3, 5)</td>
      </tr>
      <tr>
          <td>3</td>
          <td>flip even numbered lamps (e.g. 2, 4, 6)</td>
      </tr>
      <tr>
          <td>4</td>
          <td>flip \(3k+1 ; with ; k \ge 0\) numbered lamps (e.g. 1, 4, 7)</td>
      </tr>
  </tbody>
</table>
<br>
<p>Given \(C\) (number of button presses, \(0 \le C \le 10000\)) and final state of some of the lamps, find all possible distinct configuration.</p>]]></description></item><item><title>POJ 3268 Silver Cow Party</title><link>https://pwzxxm.com/poj-3268/</link><pubDate>Sat, 14 May 2016 00:00:00 +0000</pubDate><author>patrick.weizhixu@gmail.com (PwzXxm)</author><guid>https://pwzxxm.com/poj-3268/</guid><description>&lt;p>There are one cow from each \(N\) (\(1 \le N \le 1000\)) farms want to go to the number X farm to have a party, hurrah! One cow from each farm need to go to the party and go back. There are \(M\) (\(1 \le M \le 100,000\)) weighted (represents time) one-direction roads connects pairs of roads. Cows are smart though, they want to go via the shortest path. The question is, what is the longest time the cow will take.&lt;/p></description></item></channel></rss>