<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="http://www.martinkysel.com/feed.xml" rel="self" type="application/atom+xml" /><link href="http://www.martinkysel.com/" rel="alternate" type="text/html" /><updated>2025-01-30T20:36:47+00:00</updated><id>http://www.martinkysel.com/feed.xml</id><title type="html">Martin Kysel</title><subtitle>Coding Challenges and More</subtitle><author><name>Martin Kysel</name></author><entry><title type="html">LeetCode ‘Min Stack’ Solution</title><link href="http://www.martinkysel.com/leetcode-min-stack/" rel="alternate" type="text/html" title="LeetCode ‘Min Stack’ Solution" /><published>2024-06-03T00:00:00+00:00</published><updated>2024-06-03T00:00:00+00:00</updated><id>http://www.martinkysel.com/leetcode-min-stack</id><content type="html" xml:base="http://www.martinkysel.com/leetcode-min-stack/"><![CDATA[<h5 id="short-problem-definition">Short Problem Definition:</h5>

<p>Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.</p>

<p>Implement the MinStack class:</p>

<p>MinStack() initializes the stack object.</p>

<p>void push(int val) pushes the element val onto the stack.</p>

<p>void pop() removes the element on the top of the stack.</p>

<p>int top() gets the top element of the stack.</p>

<p>int getMin() retrieves the minimum element in the stack.</p>

<p>You must implement a solution with O(1) time complexity for each function.</p>

<h4 id="link">Link</h4>

<p><a href="https://leetcode.com/problems/min-stack/">Min Stack</a></p>

<h5 id="complexity">Complexity:</h5>

<p>time complexity is <code class="language-plaintext highlighter-rouge">O(1)</code></p>

<p>space complexity is <code class="language-plaintext highlighter-rouge">O(N)</code></p>

<h5 id="execution">Execution:</h5>

<p>This one is a head scratcher. It took a bit to figure it out. My brain immediately went to heaps, but they don’t support a <code class="language-plaintext highlighter-rouge">last-inserted</code> operation. Plus insert is <code class="language-plaintext highlighter-rouge">log(N)</code>.</p>

<p>After a while I figured out that I can keep a running min and do some code gymnastics to keep it up-to-date.</p>

<p>I’ve seen solutions that have two stacks, one for the <code class="language-plaintext highlighter-rouge">val</code> and one for <code class="language-plaintext highlighter-rouge">min</code>. The code is simpler but needs twice the space.</p>
<h5 id="solution">Solution:</h5>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">MinStack</span><span class="p">:</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">stack</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">min_val</span> <span class="o">=</span> <span class="bp">None</span>

    <span class="k">def</span> <span class="nf">push</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">val</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="bp">None</span><span class="p">:</span>
        <span class="k">if</span> <span class="bp">self</span><span class="p">.</span><span class="n">min_val</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
            <span class="bp">self</span><span class="p">.</span><span class="n">min_val</span> <span class="o">=</span> <span class="n">val</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">min_val</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">min_val</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">stack</span><span class="p">.</span><span class="n">append</span><span class="p">((</span><span class="n">val</span><span class="p">,</span> <span class="bp">self</span><span class="p">.</span><span class="n">min_val</span><span class="p">))</span>

    <span class="k">def</span> <span class="nf">pop</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="bp">None</span><span class="p">:</span>
        <span class="n">ret</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">stack</span><span class="p">.</span><span class="n">pop</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">stack</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
            <span class="bp">self</span><span class="p">.</span><span class="n">min_val</span> <span class="o">=</span> <span class="bp">None</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="bp">self</span><span class="p">.</span><span class="n">min_val</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">min_val</span><span class="p">,</span> <span class="bp">self</span><span class="p">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span>
        <span class="k">return</span> <span class="n">ret</span>

    <span class="k">def</span> <span class="nf">top</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">self</span><span class="p">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>

    <span class="k">def</span> <span class="nf">getMin</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">self</span><span class="p">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span>

</code></pre></div></div>

<h4 id="chatgpt">ChatGPT</h4>

<p>ChatGPT can solve this problem correctly but does the inefficient two stack solution.
I suspect that is the reason why most submissions on LeetCode use two stacks…</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">MinStack</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">stack</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">min_stack</span> <span class="o">=</span> <span class="p">[]</span>

    <span class="k">def</span> <span class="nf">push</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">val</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="bp">None</span><span class="p">:</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">stack</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
        <span class="c1"># If min_stack is empty or the new value is less than or equal to the current minimum, push it onto min_stack
</span>        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="p">.</span><span class="n">min_stack</span> <span class="ow">or</span> <span class="n">val</span> <span class="o">&lt;=</span> <span class="bp">self</span><span class="p">.</span><span class="n">min_stack</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span>
            <span class="bp">self</span><span class="p">.</span><span class="n">min_stack</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">pop</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="bp">None</span><span class="p">:</span>
        <span class="k">if</span> <span class="bp">self</span><span class="p">.</span><span class="n">stack</span><span class="p">:</span>
            <span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">stack</span><span class="p">.</span><span class="n">pop</span><span class="p">()</span>
            <span class="c1"># If the value being popped is the current minimum, pop it from min_stack as well
</span>            <span class="k">if</span> <span class="n">val</span> <span class="o">==</span> <span class="bp">self</span><span class="p">.</span><span class="n">min_stack</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span>
                <span class="bp">self</span><span class="p">.</span><span class="n">min_stack</span><span class="p">.</span><span class="n">pop</span><span class="p">()</span>

    <span class="k">def</span> <span class="nf">top</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
        <span class="k">if</span> <span class="bp">self</span><span class="p">.</span><span class="n">stack</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">self</span><span class="p">.</span><span class="n">stack</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="bp">None</span>

    <span class="k">def</span> <span class="nf">getMin</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
        <span class="k">if</span> <span class="bp">self</span><span class="p">.</span><span class="n">min_stack</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">self</span><span class="p">.</span><span class="n">min_stack</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="bp">None</span>
</code></pre></div></div>]]></content><author><name>Martin Kysel</name></author><category term="coding-challenge" /><category term="leetcode" /><category term="python" /><summary type="html"><![CDATA[Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.]]></summary></entry><entry><title type="html">LeetCode ‘Copy List with Random Pointer’ Solution</title><link href="http://www.martinkysel.com/leetcode-copy-list-with-random/" rel="alternate" type="text/html" title="LeetCode ‘Copy List with Random Pointer’ Solution" /><published>2024-05-31T00:00:00+00:00</published><updated>2024-05-31T00:00:00+00:00</updated><id>http://www.martinkysel.com/leetcode-copy-list-with-random</id><content type="html" xml:base="http://www.martinkysel.com/leetcode-copy-list-with-random/"><![CDATA[<h5 id="short-problem-definition">Short Problem Definition:</h5>

<p>A linked list of length n is given such that each node contains an additional random pointer, which could point to any node in the list, or null.</p>

<p>Construct a deep copy of the list. The deep copy should consist of exactly n brand new nodes, where each new node has its value set to the value of its corresponding original node. Both the next and random pointer of the new nodes should point to new nodes in the copied list such that the pointers in the original list and copied list represent the same list state. None of the pointers in the new list should point to nodes in the original list.</p>

<h4 id="link">Link</h4>

<p><a href="https://leetcode.com/problems/copy-list-with-random-pointer">Copy List with Random Pointer</a></p>

<h5 id="complexity">Complexity:</h5>

<p>time complexity is <code class="language-plaintext highlighter-rouge">O(N)</code></p>

<p>space complexity is <code class="language-plaintext highlighter-rouge">O(N)</code></p>

<h5 id="execution">Execution:</h5>

<p>You could do this in three passes, but this solution compresses pass #1 and pass #2 into one.</p>

<p>Each object in python has a unique <code class="language-plaintext highlighter-rouge">id</code>. In other languages we could use the address in memory or the object directly.
I don’t like using objects as keys in maps, so I opted for a simple unique key derived from the id.</p>

<p>The logic is as follow:</p>
<ol>
  <li>copy objects without the random pointer. Save both mappings from new to old and vice versa.</li>
  <li>save the random pointers from old to random old</li>
  <li>In a second pass fill in the random pointers. Use the maps to determine the links</li>
</ol>

<p>The solution beats 95% of submissions.</p>

<h5 id="solution">Solution:</h5>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Solution</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">copyRandomList</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">head</span><span class="p">:</span> <span class="s">'Optional[Node]'</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s">'Optional[Node]'</span><span class="p">:</span>

        <span class="n">random_mapping</span> <span class="o">=</span> <span class="p">{}</span>
        <span class="n">id_mapping</span> <span class="o">=</span> <span class="p">{}</span> <span class="c1"># new to old
</span>        <span class="n">object_mapping</span> <span class="o">=</span> <span class="p">{}</span> <span class="c1"># old to new object
</span>
        <span class="n">copy_root</span> <span class="o">=</span> <span class="bp">None</span>

        <span class="n">ptr</span> <span class="o">=</span> <span class="n">head</span>
        <span class="n">previous_copy_ptr</span> <span class="o">=</span> <span class="bp">None</span>

        <span class="k">while</span> <span class="n">ptr</span> <span class="o">!=</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">copy_object</span> <span class="o">=</span> <span class="n">Node</span><span class="p">(</span><span class="n">ptr</span><span class="p">.</span><span class="n">val</span><span class="p">)</span>
            <span class="n">id_mapping</span><span class="p">[</span><span class="nb">id</span><span class="p">(</span><span class="n">copy_object</span><span class="p">)]</span> <span class="o">=</span> <span class="nb">id</span><span class="p">(</span><span class="n">ptr</span><span class="p">)</span>
            <span class="n">object_mapping</span><span class="p">[</span><span class="nb">id</span><span class="p">(</span><span class="n">ptr</span><span class="p">)]</span> <span class="o">=</span> <span class="n">copy_object</span>
            <span class="k">if</span> <span class="n">copy_root</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
                <span class="n">copy_root</span> <span class="o">=</span> <span class="n">copy_object</span>

            <span class="k">if</span> <span class="n">ptr</span><span class="p">.</span><span class="n">random</span> <span class="o">!=</span> <span class="bp">None</span><span class="p">:</span>
                <span class="n">random_mapping</span><span class="p">[</span><span class="nb">id</span><span class="p">(</span><span class="n">ptr</span><span class="p">)]</span> <span class="o">=</span> <span class="nb">id</span><span class="p">(</span><span class="n">ptr</span><span class="p">.</span><span class="n">random</span><span class="p">)</span>

            <span class="n">ptr</span> <span class="o">=</span> <span class="n">ptr</span><span class="p">.</span><span class="nb">next</span>

            <span class="k">if</span> <span class="n">previous_copy_ptr</span> <span class="o">!=</span> <span class="bp">None</span><span class="p">:</span>
                <span class="n">previous_copy_ptr</span><span class="p">.</span><span class="nb">next</span> <span class="o">=</span> <span class="n">copy_object</span>

            <span class="n">previous_copy_ptr</span> <span class="o">=</span> <span class="n">copy_object</span>

        <span class="n">ptr</span> <span class="o">=</span> <span class="n">copy_root</span>

        <span class="k">while</span> <span class="n">ptr</span> <span class="o">!=</span> <span class="bp">None</span><span class="p">:</span>
            <span class="c1"># find new to old
</span>            <span class="n">old_id</span> <span class="o">=</span> <span class="n">id_mapping</span><span class="p">[</span><span class="nb">id</span><span class="p">(</span><span class="n">ptr</span><span class="p">)]</span>

            <span class="n">old_random_id</span> <span class="o">=</span> <span class="n">random_mapping</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">old_id</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">old_random_id</span> <span class="o">!=</span> <span class="bp">None</span><span class="p">:</span>
                <span class="n">new_object</span> <span class="o">=</span> <span class="n">object_mapping</span><span class="p">[</span><span class="n">old_random_id</span><span class="p">]</span>
                <span class="n">ptr</span><span class="p">.</span><span class="n">random</span> <span class="o">=</span> <span class="n">new_object</span>
            
            <span class="n">ptr</span> <span class="o">=</span> <span class="n">ptr</span><span class="p">.</span><span class="nb">next</span>

        <span class="k">return</span> <span class="n">copy_root</span>
</code></pre></div></div>

<h4 id="chatgpt">ChatGPT</h4>

<p>ChatGPT can solve this problem correctly but slowly. I suspect that the map operations are slower.
I do like the logic of setting all pointers in the second pass. It is conceptually easier to grasp.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Solution</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">copyRandomList</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">head</span><span class="p">:</span> <span class="s">'Optional[Node]'</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s">'Optional[Node]'</span><span class="p">:</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">head</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">None</span>

        <span class="c1"># Dictionary to hold old nodes as keys and new nodes as values
</span>        <span class="n">old_to_new</span> <span class="o">=</span> <span class="p">{}</span>

        <span class="c1"># First pass: create all the new nodes and store them in the dictionary
</span>        <span class="n">current</span> <span class="o">=</span> <span class="n">head</span>
        <span class="k">while</span> <span class="n">current</span><span class="p">:</span>
            <span class="n">old_to_new</span><span class="p">[</span><span class="n">current</span><span class="p">]</span> <span class="o">=</span> <span class="n">Node</span><span class="p">(</span><span class="n">current</span><span class="p">.</span><span class="n">val</span><span class="p">)</span>
            <span class="n">current</span> <span class="o">=</span> <span class="n">current</span><span class="p">.</span><span class="nb">next</span>

        <span class="c1"># Second pass: assign next and random pointers
</span>        <span class="n">current</span> <span class="o">=</span> <span class="n">head</span>
        <span class="k">while</span> <span class="n">current</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">current</span><span class="p">.</span><span class="nb">next</span><span class="p">:</span>
                <span class="n">old_to_new</span><span class="p">[</span><span class="n">current</span><span class="p">].</span><span class="nb">next</span> <span class="o">=</span> <span class="n">old_to_new</span><span class="p">[</span><span class="n">current</span><span class="p">.</span><span class="nb">next</span><span class="p">]</span>
            <span class="k">if</span> <span class="n">current</span><span class="p">.</span><span class="n">random</span><span class="p">:</span>
                <span class="n">old_to_new</span><span class="p">[</span><span class="n">current</span><span class="p">].</span><span class="n">random</span> <span class="o">=</span> <span class="n">old_to_new</span><span class="p">[</span><span class="n">current</span><span class="p">.</span><span class="n">random</span><span class="p">]</span>
            <span class="n">current</span> <span class="o">=</span> <span class="n">current</span><span class="p">.</span><span class="nb">next</span>

        <span class="c1"># Return the head of the new list
</span>        <span class="k">return</span> <span class="n">old_to_new</span><span class="p">[</span><span class="n">head</span><span class="p">]</span>
</code></pre></div></div>]]></content><author><name>Martin Kysel</name></author><category term="coding-challenge" /><category term="leetcode" /><category term="python" /><summary type="html"><![CDATA[Construct a deep copy of the list with random pointers]]></summary></entry><entry><title type="html">LeetCode ‘Merge Sorted Array’ Solution</title><link href="http://www.martinkysel.com/leetcode-in-place-merge/" rel="alternate" type="text/html" title="LeetCode ‘Merge Sorted Array’ Solution" /><published>2024-05-30T00:00:00+00:00</published><updated>2024-05-30T00:00:00+00:00</updated><id>http://www.martinkysel.com/leetcode-in-place-merge</id><content type="html" xml:base="http://www.martinkysel.com/leetcode-in-place-merge/"><![CDATA[<h5 id="short-problem-definition">Short Problem Definition:</h5>

<p>ou are given two integer arrays nums1 and nums2, sorted in non-decreasing order, and two integers m and n, representing the number of elements in nums1 and nums2 respectively.</p>

<p>Merge nums1 and nums2 into a single array sorted in non-decreasing order.</p>

<p>The final sorted array should not be returned by the function, but instead be stored inside the array nums1. To accommodate this, nums1 has a length of m + n, where the first m elements denote the elements that should be merged, and the last n elements are set to 0 and should be ignored. nums2 has a length of n. Write a function called merge in python.</p>

<h5 id="link">Link</h5>

<p><a href="https://leetcode.com/problems/merge-sorted-array">Merge Sorted Array</a></p>

<h5 id="complexity">Complexity:</h5>

<p>time complexity is <code class="language-plaintext highlighter-rouge">O(N+M)</code></p>

<p>space complexity is <code class="language-plaintext highlighter-rouge">O(1)</code></p>

<h5 id="execution">Execution:</h5>

<p>I’ve seen the use of <code class="language-plaintext highlighter-rouge">sort</code> in a lot of the solutions but that puts us at <code class="language-plaintext highlighter-rouge">O(nlogn)</code> which we want to avoid.
We can’t start from the beginning because that would require moving things around in nums1.</p>

<p>This submission used less memory than most others.</p>

<h5 id="solution">Solution:</h5>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">List</span>

<span class="k">def</span> <span class="nf">merge</span><span class="p">(</span><span class="n">nums1</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">int</span><span class="p">],</span> <span class="n">m</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">nums2</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">int</span><span class="p">],</span> <span class="n">n</span><span class="p">:</span> <span class="nb">int</span><span class="p">):</span>
    <span class="n">idx1</span> <span class="o">=</span> <span class="n">m</span><span class="o">-</span><span class="mi">1</span>
    <span class="n">idx2</span> <span class="o">=</span> <span class="n">n</span><span class="o">-</span><span class="mi">1</span>

    <span class="k">for</span> <span class="n">tail</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">m</span><span class="o">+</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">idx1</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
            <span class="n">nums1</span><span class="p">[</span><span class="n">tail</span><span class="p">]</span> <span class="o">=</span> <span class="n">nums2</span><span class="p">[</span><span class="n">idx2</span><span class="p">]</span>
            <span class="n">idx2</span> <span class="o">-=</span> <span class="mi">1</span>
        <span class="k">elif</span> <span class="n">idx2</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
            <span class="n">nums1</span><span class="p">[</span><span class="n">tail</span><span class="p">]</span> <span class="o">=</span> <span class="n">nums1</span><span class="p">[</span><span class="n">idx1</span><span class="p">]</span>
            <span class="n">idx1</span> <span class="o">-=</span> <span class="mi">1</span>
        <span class="k">elif</span> <span class="n">nums1</span><span class="p">[</span><span class="n">idx1</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="n">nums2</span><span class="p">[</span><span class="n">idx2</span><span class="p">]:</span>
            <span class="n">nums1</span><span class="p">[</span><span class="n">tail</span><span class="p">]</span> <span class="o">=</span> <span class="n">nums1</span><span class="p">[</span><span class="n">idx1</span><span class="p">]</span>
            <span class="n">idx1</span> <span class="o">-=</span> <span class="mi">1</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">nums1</span><span class="p">[</span><span class="n">tail</span><span class="p">]</span> <span class="o">=</span> <span class="n">nums2</span><span class="p">[</span><span class="n">idx2</span><span class="p">]</span>
            <span class="n">idx2</span> <span class="o">-=</span> <span class="mi">1</span>
</code></pre></div></div>

<h4 id="chatgpt">ChatGPT</h4>

<p>ChatGPT can solve this problem correctly and efficiently:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">merge</span><span class="p">(</span><span class="n">nums1</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">nums2</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span>
    <span class="s">"""
    Merges two sorted arrays nums1 and nums2 into one sorted array within nums1.
    
    Parameters:
    nums1 (List[int]): The first sorted array with a length of m + n.
    m (int): The number of elements in nums1 that should be merged.
    nums2 (List[int]): The second sorted array.
    n (int): The number of elements in nums2.
    """</span>
    <span class="c1"># Start from the end of nums1 and nums2
</span>    <span class="n">i</span> <span class="o">=</span> <span class="n">m</span> <span class="o">-</span> <span class="mi">1</span>
    <span class="n">j</span> <span class="o">=</span> <span class="n">n</span> <span class="o">-</span> <span class="mi">1</span>
    <span class="n">k</span> <span class="o">=</span> <span class="n">m</span> <span class="o">+</span> <span class="n">n</span> <span class="o">-</span> <span class="mi">1</span>
    
    <span class="c1"># While there are still elements in both nums1 and nums2
</span>    <span class="k">while</span> <span class="n">i</span> <span class="o">&gt;=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">j</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">nums1</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">nums2</span><span class="p">[</span><span class="n">j</span><span class="p">]:</span>
            <span class="n">nums1</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">nums1</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
            <span class="n">i</span> <span class="o">-=</span> <span class="mi">1</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">nums1</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">nums2</span><span class="p">[</span><span class="n">j</span><span class="p">]</span>
            <span class="n">j</span> <span class="o">-=</span> <span class="mi">1</span>
        <span class="n">k</span> <span class="o">-=</span> <span class="mi">1</span>
    
    <span class="c1"># If there are still elements in nums2, copy them
</span>    <span class="k">while</span> <span class="n">j</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">:</span>
        <span class="n">nums1</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">nums2</span><span class="p">[</span><span class="n">j</span><span class="p">]</span>
        <span class="n">j</span> <span class="o">-=</span> <span class="mi">1</span>
        <span class="n">k</span> <span class="o">-=</span> <span class="mi">1</span>

<span class="c1"># Example usage:
</span><span class="n">nums1</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
<span class="n">m</span> <span class="o">=</span> <span class="mi">3</span>
<span class="n">nums2</span> <span class="o">=</span> <span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">]</span>
<span class="n">n</span> <span class="o">=</span> <span class="mi">3</span>
<span class="n">merge</span><span class="p">(</span><span class="n">nums1</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">nums2</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">nums1</span><span class="p">)</span>  <span class="c1"># Output should be [1, 2, 2, 3, 5, 6]
</span></code></pre></div></div>]]></content><author><name>Martin Kysel</name></author><category term="coding-challenge" /><category term="leetcode" /><category term="python" /><summary type="html"><![CDATA[Merge nums1 and nums2 into a single array sorted in non-decreasing order.]]></summary></entry><entry><title type="html">Elevating Your Tech Journey: Unleashing Potential Through Digital Nomad Software Engineering Mentorship</title><link href="http://www.martinkysel.com/elevating-your-tech-journey/" rel="alternate" type="text/html" title="Elevating Your Tech Journey: Unleashing Potential Through Digital Nomad Software Engineering Mentorship" /><published>2023-08-15T00:00:00+00:00</published><updated>2023-08-15T00:00:00+00:00</updated><id>http://www.martinkysel.com/elevating-your-tech-journey</id><content type="html" xml:base="http://www.martinkysel.com/elevating-your-tech-journey/"><![CDATA[<h2 id="introduction">Introduction</h2>
<p>In the ever-evolving landscape of software engineering, the digital nomad lifestyle has emerged as an exciting path for those seeking freedom, flexibility, and personal growth.
As a passionate software engineer who has embraced this nomadic journey, I am thrilled to extend a helping hand to aspiring developers on their own quests for excellence.
This blog post delves into the transformative power of digital nomad software engineering mentorship, highlighting the unique offerings I bring to the community.</p>

<h2 id="guidance-tailored-for-the-nomadic-spirit">Guidance Tailored for the Nomadic Spirit</h2>
<p>Having embarked on my own digital nomad adventure, I intimately understand the challenges and triumphs of maintaining a coding rhythm amidst changing landscapes.
Through personalized mentorship, I provide insights that resonate with the nomadic spirit – guidance that spans time zones, adapts to varying work environments, and celebrates the exhilarating fusion of cultures and technology.</p>

<h2 id="mastering-the-balancing-act">Mastering the Balancing Act</h2>
<p>Digital nomads are exceptional multitaskers, seamlessly blending work and exploration.
Drawing from my experiences, I help mentees strike the delicate balance between delivering high-quality code and savoring the world around them.
Together, we will navigate the art of time management, task prioritization, and crafting innovative solutions – all while embracing the freedom of the nomadic lifestyle.</p>

<h2 id="practical-technical-expertise">Practical Technical Expertise</h2>
<p>In the realm of software engineering, knowledge is key.
Drawing from my expertise, I provide hands-on guidance, assisting mentees in algorithm design, tackling complex challenges, and staying attuned to industry trends.</p>

<h2 id="a-journey-that-is-my-own">A Journey That is My Own</h2>
<p>Embracing the exhilarating digital nomad lifestyle, I’m on a mission to explore every nook and cranny of our incredible world.
Join me on an extraordinary journey of wanderlust and discovery as I strive to traverse every corner of our globe.
Follow our adventure-packed escapades, cultural immersions, and unconventional lifestyle on <a href="eltruckito.com">ElTruckito.com</a>, where the thrill of exploration meets the awe-inspiring landscapes of our planet.</p>

<h2 id="what-to-do-next">What to do Next?</h2>
<p>Embracing the digital nomad lifestyle while pursuing a career in software engineering is a remarkable journey.
As a mentor, I am honored to offer my expertise, experiences, and unwavering support to a community of aspiring developers who share this vision.
Through personalized guidance, a focus on practicality, and a commitment to nurturing both technical and personal growth, I am dedicated to helping digital nomads thrive as they code their way across the globe.
Together, we embark on a transformative partnership that amplifies potential, sparks innovation, and paves the way for a new era of tech-savvy nomads.</p>

<p>Take the next step by booking a mentorship session with me today!
Let’s collaborate, conquer coding challenges, and craft innovative solutions together.
Your adventure in tech awaits – book your session now at <a href="https://adplist.org/mentors/martin-kysel">ADPList.org</a> and let’s embark on this exciting journey of growth and discovery!</p>]]></content><author><name>Martin Kysel</name></author><category term="digital nomad" /><category term="mentorship" /><summary type="html"><![CDATA[In the ever-evolving landscape of software engineering, the digital nomad lifestyle has emerged as an exciting path for those seeking freedom, flexibility, and personal growth. As a passionate software engineer who has embraced this nomadic journey, I am thrilled to extend a helping hand to aspiring developers on their own quests for excellence.]]></summary></entry><entry><title type="html">HackerRank ‘String Similarity’ Solution</title><link href="http://www.martinkysel.com/hackerrank-string-similarity-solution/" rel="alternate" type="text/html" title="HackerRank ‘String Similarity’ Solution" /><published>2023-04-13T00:00:00+00:00</published><updated>2023-04-13T00:00:00+00:00</updated><id>http://www.martinkysel.com/hackerrank-string-similarity-solution</id><content type="html" xml:base="http://www.martinkysel.com/hackerrank-string-similarity-solution/"><![CDATA[<h5 id="short-problem-definition">Short Problem Definition:</h5>

<p>For two strings A and B, we define the similarity of the strings to be the length of the longest prefix common to both strings. For example, the similarity of strings “abc” and “abd” is 2, while the similarity of strings “aaa” and “aaab” is 3.</p>

<p>Calculate the sum of similarities of a string S with each of it’s suffixes.</p>

<h5 id="link">Link</h5>

<p><a href="https://www.hackerrank.com/challenges/string-similarity/">String Similarity</a></p>

<h5 id="complexity">Complexity:</h5>

<p>time complexity is <code class="language-plaintext highlighter-rouge">O(N)</code></p>

<p>space complexity is <code class="language-plaintext highlighter-rouge">O(n)</code></p>

<h5 id="execution">Execution:</h5>

<p>The stringSimilarity function calculates the similarity of each suffix of the input string s with the original string using the Z algorithm.
This algorithm maintains two pointers ‘l’ and ‘r’ that define the substring with the longest similarity seen so far.
For each character ‘i’ in the string s, the algorithm calculates the similarity of the suffix starting at ‘i’ using the Z algorithm.
It then updates ‘l’ and ‘r’ if the similarity of the current suffix exceeds that of the current substring with the longest similarity.
Finally, the algorithm returns the sum of all similarities plus the length of the original string, since the similarity of the entire string is equal to its length.</p>

<h5 id="solution">Solution:</h5>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#!/bin/python
#!/bin/python3
</span>
<span class="kn">import</span> <span class="nn">math</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">random</span>
<span class="kn">import</span> <span class="nn">re</span>
<span class="kn">import</span> <span class="nn">sys</span>

<span class="c1">#
# Complete the 'stringSimilarity' function below.
#
# The function is expected to return an INTEGER.
# The function accepts STRING s as parameter.
#
</span>
<span class="k">def</span> <span class="nf">stringSimilarity</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
    <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
    <span class="n">similarities</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="n">n</span>
    <span class="n">l</span><span class="p">,</span> <span class="n">r</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span>

    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">r</span><span class="p">:</span>
            <span class="n">similarities</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">r</span><span class="o">-</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">similarities</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="n">l</span><span class="p">])</span>

        <span class="k">while</span> <span class="n">i</span><span class="o">+</span><span class="n">similarities</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">n</span> <span class="ow">and</span> <span class="n">s</span><span class="p">[</span><span class="n">similarities</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span> <span class="o">==</span> <span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="n">similarities</span><span class="p">[</span><span class="n">i</span><span class="p">]]:</span>
            <span class="n">similarities</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>

        <span class="k">if</span> <span class="n">i</span><span class="o">+</span><span class="n">similarities</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">-</span><span class="mi">1</span> <span class="o">&gt;</span> <span class="n">r</span><span class="p">:</span>
            <span class="n">l</span> <span class="o">=</span> <span class="n">i</span>
            <span class="n">r</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="n">similarities</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span>

    <span class="k">return</span> <span class="nb">sum</span><span class="p">(</span><span class="n">similarities</span><span class="p">)</span> <span class="o">+</span> <span class="n">n</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
    <span class="n">fptr</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">environ</span><span class="p">[</span><span class="s">'OUTPUT_PATH'</span><span class="p">],</span> <span class="s">'w'</span><span class="p">)</span>

    <span class="n">t</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="nb">input</span><span class="p">().</span><span class="n">strip</span><span class="p">())</span>

    <span class="k">for</span> <span class="n">t_itr</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">t</span><span class="p">):</span>
        <span class="n">s</span> <span class="o">=</span> <span class="nb">input</span><span class="p">()</span>

        <span class="n">result</span> <span class="o">=</span> <span class="n">stringSimilarity</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>

        <span class="n">fptr</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">result</span><span class="p">)</span> <span class="o">+</span> <span class="s">'</span><span class="se">\n</span><span class="s">'</span><span class="p">)</span>

    <span class="n">fptr</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>

</code></pre></div></div>]]></content><author><name>Martin Kysel</name></author><category term="coding-challenge" /><category term="hackerrank" /><category term="python" /><summary type="html"><![CDATA[For two strings A and B, we define the similarity of the strings to be the length of the longest prefix common to both strings.]]></summary></entry><entry><title type="html">From Ugly to Beautiful: The Transformation of Martinkysel.com</title><link href="http://www.martinkysel.com/from-ugly-to-beautiful/" rel="alternate" type="text/html" title="From Ugly to Beautiful: The Transformation of Martinkysel.com" /><published>2023-02-25T00:00:00+00:00</published><updated>2023-02-25T00:00:00+00:00</updated><id>http://www.martinkysel.com/from-ugly-to-beautiful</id><content type="html" xml:base="http://www.martinkysel.com/from-ugly-to-beautiful/"><![CDATA[<p>Migrating a website from one platform to another can be a daunting task, but with the right tools and techniques, it doesn’t have to be a nightmare. In my case, I recently migrated my blog from WordPress to Jekyll, and I’m happy to report that the process was relatively smooth and painless.</p>

<h2 id="the-initial-problem-hosting-on-a-basement-server">The Initial Problem: Hosting on a Basement Server</h2>

<p>When I first started my blog on WordPress, I had a rather unusual setup - the site was hosted on a server in a friend’s basement. While it may sound like a bit of a “ghetto” arrangement, it seemed like a cost-effective solution at the time. However, it soon became apparent that this setup came with its fair share of problems.</p>

<p>One of the biggest issues was the server’s reliability. For reasons that were never quite clear, the server seemed to go down regularly, without any good explanation. This meant that my site was often inaccessible for hours or even days at a time, frustrating both myself and my readers.</p>

<p>To make matters worse, the site’s loading times were notoriously slow. This was likely due in part to the server’s less-than-optimal location and setup, but it also meant that visitors to my site had to endure lengthy wait times just to access my content. And as we all know, in the world of online content, every second counts.</p>

<p>As my blog began to grow and attract more readers, the maintenance of the site became an increasingly daunting task. With the server regularly going down and loading times being so slow, I found myself spending more and more time just trying to keep the site running smoothly. This detracted from the time and energy I wanted to devote to creating new content and engaging with my readers.</p>

<p>Eventually, in 2020, I began to investigate the possibility of moving my site to a proper hosting solution, such as AWS. However, as I quickly discovered, this option came with a hefty price tag. The cost of a properly hosted server, combined with the need for a distributed database, made this option simply unfeasible for me at the time.</p>

<p>It’s not just about hosting, maintaining WordPress can be a headache. While it’s an amazing system, opting for a static website can offer several advantages. It’s faster, easier to maintain, and more secure, making it a smart choice for those who value efficiency and security.</p>

<p>In the end, I realized that something had to be done to address the ongoing issues with my site’s performance and reliability. After careful consideration and research, I made the decision to migrate my site to Jekyll, a static site generator that promised faster load times and a more streamlined maintenance process. And while the process of migrating my site was not without its challenges, I can now say that I am thrilled with the improved performance and ease of use that Jekyll has brought to my blog.</p>

<p>I chose GitHub Pages as my hosting solution, as I regularly use Git and GitHub in my daily work, and the added bonus of open-sourcing the content was a nice benefit for the community.</p>

<h2 id="the-long-and-winding-road-of-migrating-to-markdown---according-to-the-internet">The Long and Winding Road of Migrating to Markdown - According to the Internet</h2>

<p>When I stumbled upon Swizec’s <a href="https://swizec.com/blog/how-to-export-a-large-wordpress-site-to-markdown/">article</a> on migrating from WordPress to Markdown, I was initially excited. His straightforward breakdown of the process made it seem like a simple task that could be completed in an afternoon. “Pfft, an afternoon of work at worst,” he wrote, listing off the steps like they were nothing: export from WordPress, find a script, sip margaritas.</p>

<p>It all sounded so easy and straightforward, and I couldn’t help but agree with Swizec’s assessment. “That sounds about right,” I thought to myself, feeling confident that I could tackle this migration with ease.</p>

<p>But then, Swizec hit me with a dose of reality. “Suddenly it’s 6 months later and you’re losing your mind,” he wrote. His words were a stark reminder that even the simplest tasks can often become complex and time-consuming.</p>

<p>As an optimist, however, I refused to be discouraged. Sure, the process might not be as straightforward as I initially thought, but surely it couldn’t be that difficult, right?</p>

<p>So, being the lazy optimist that I am, I decided to explore my options. I turned to Fiverr, hoping to find someone who could handle the migration for me. I was shocked to discover that most of the quotes I received ranged from $1500 to $8000. That seemed like an exorbitant amount of money for something that sounded like it should only take a few hours.</p>

<p>One freelancer even warned me that it could take 2-3 months to complete the migration, although he optimistically suggested that it might only take a month.</p>

<p>The whole experience left me feeling a bit frustrated and overwhelmed. But despite the initial setbacks, I remained determined to find a solution that would allow me to migrate my site without breaking the bank or losing my mind in the process. And while it might take a bit more time and effort than I initially anticipated, I’m confident that I’ll be able to find a way to make it work.</p>

<h2 id="what-made-this-blog-different">What Made This Blog Different</h2>

<p>Perhaps I was a bit fortunate that I had recently teamed up with <a href="https://github.com/spello2287">Juraj</a> to create a brand new website for <a href="https://nomadicworkplace.com/">Nomadic Workplace</a>, my umbrella company that enables me to pursue my digital nomad lifestyle while remaining legally employed in the US.</p>

<p>When it comes to martinkysel.com, I can confidently say that it boasts two significant advantages over other blogs out there. Firstly, the vast majority of its content follows a similar pattern and covers similar topics. This consistency makes it easier to script a migration without having to deal with a lot of edge cases.</p>

<p>Secondly, all of the comments on the blog are saved in Disqus. This means that they can be easily transferred and integrated into a new platform, without the risk of losing valuable feedback and engagement from readers.</p>

<p>Finally, let’s be honest - the old blog design was pretty unappealing. So, any improvement in this area would be a massive gain for both myself and my readers. With the new Jekyll-based site, I was able to create a much cleaner, more streamlined design that not only looks better but also makes it easier for readers to navigate and engage with the content.</p>

<h2 id="the-steps-of-the-actual-migration-process">The Steps of the Actual Migration Process</h2>

<p>So, how did the whole migration process actually go? Well, to start with, I discovered a migration tool developed by Lonekorean over on <a href="https://github.com/lonekorean/wordpress-export-to-markdown">Github</a>, which was almost perfect for my needs. However, there were a couple of essential components that it was missing.</p>

<p>Firstly, it didn’t have the ability to deal with <code class="language-plaintext highlighter-rouge">[code]</code> blocks, which seemed to be a non-standard feature of my old Wordpress site. This was a bit of a headache, but as is often the case with internet problems, I was able to find someone who had already struggled with and solved the issue in the past. In this case, it was a user called mxro, who had written some incredibly simple <a href="https://github.com/lonekorean/wordpress-export-to-markdown/issues/86#issuecomment-1304870098">Typescript</a> code to handle the preprocessing.</p>

<p>The second issue I encountered was with images. Thankfully, there were only a few scattered throughout the entire blog, so I was able to handle them all manually. While this was a bit time-consuming, it ultimately wasn’t a huge deal in the grand scheme of things.</p>

<p>Of course, the migration process wasn’t just about transferring content from one platform to another. I also had to select a new theme for the site, add some new icons, turn the banner into an avatar, and reset DNS entries. While these tasks weren’t necessarily difficult, they did require some careful attention to detail in order to ensure that everything was working smoothly and looking great.</p>

<h2 id="a-surprisingly-short-migration-process">A Surprisingly Short Migration Process</h2>

<p>The entire process took only <em>four hours</em> - no joke. I started around 8PM and got so absorbed in it that I barely noticed the time passing. I remember making a fresh batch of argentinean mate while working away. By around 11PM, I decided the website was good enough and made the move to switch the DNS entries over to the new website. Of course, there may be some kinks to iron out over the next few days as I discover any issues that may have gone wrong or missing, but overall, it was nowhere near the month or six months I was anticipating.
And if you don’t believe me, you can check the git history.
The blog’s source is open on <a href="https://github.com/mkysel/mkysel.github.io">GitHub Pages</a>.</p>

<h2 id="lessons-learned-be-skeptical">Lessons Learned: Be Skeptical</h2>

<p>Reflecting on this experience, I have come to realize that there are a few key takeaways that I believe are worth sharing with others.</p>

<p>Firstly, when it comes to using standard tools, the integration with existing systems can be seamless. In my case, because I was using widely accepted tools for the migration process, such as WordPress and Markdown, the transition was relatively smooth. However, the process could have been complicated if I had relied on more obscure or specialized tools.</p>

<p>Secondly, keep it simple stupid. Pick a system that requires the least maintenance.</p>

<p>Thirdly, it is important to approach time estimates with a healthy dose of skepticism. I was initially quoted a range of 1-3 months for the migration process by one service provider, which turned out to be completely off-base. It is essential to use common sense and T-shirt sizing estimates.</p>

<p>Lastly, be wary if your customer is another software engineer. Trying to “bullshit” your way through a negotiation will only lead to frustration and disappointment for both parties. Other engineers are highly skilled professionals who understand the complexities of building and maintaining software systems. They know what is feasible and what is not, and inaccurate estimates should alarm them to sketchy behavior.</p>]]></content><author><name>Martin Kysel</name></author><category term="migration" /><summary type="html"><![CDATA[Migrating a website from one platform to another can be a daunting task, but with the right tools and techniques, it doesn't have to be a nightmare. In my case, I recently migrated my blog from WordPress to Jekyll, and I'm happy to report that the process was relatively smooth and painless.]]></summary></entry><entry><title type="html">Migration of MartinKysel.com to Jekyll</title><link href="http://www.martinkysel.com/martinkysel-migration/" rel="alternate" type="text/html" title="Migration of MartinKysel.com to Jekyll" /><published>2023-02-24T00:00:00+00:00</published><updated>2023-02-24T00:00:00+00:00</updated><id>http://www.martinkysel.com/martinkysel-migration</id><content type="html" xml:base="http://www.martinkysel.com/martinkysel-migration/"><![CDATA[<p>I am happy to announce that the page has been migrated from <code class="language-plaintext highlighter-rouge">Wordpress</code> to <code class="language-plaintext highlighter-rouge">Jekyll</code> and <code class="language-plaintext highlighter-rouge">Github pages</code>.</p>

<h2 id="the-benefits-of-jekyll">The Benefits of Jekyll</h2>

<p>There are several benefits to this migration:
1) Faster load times:
Jekyll generates static pages, which means that there is no need to query a database or run server-side scripts to serve up content.
This has resulted in much faster page load times and a better user experience for you, the readers.
2) Improved security:
As Jekyll doesn’t require a database or server-side scripting, there is less potential for security vulnerabilities, which makes my life much easier.
3) Simpler design:
Jekyll is based on templates, which has hopefully resulted in a more consistent and visually appealing design.
This should make it easier for readers to navigate the site and find the information they are looking for.
4) Easier updates: 
Jekyll makes it easier to update the content on a website since it separates content from presentation.</p>

<p>Overall, the migration to Jekyll has resulted in a faster, more secure, and more user-friendly website, which should improve the overall experience for readers of martinkysel.com.</p>

<h2 id="no-more-ads">No More Ads!</h2>

<p>I hope that the decision to remove ads from this blog will be a positive move for everyone involved.
For readers, the absence of ads can result in a more enjoyable reading experience, free from distractions and slow loading times caused by ad content.
Maybe this improved experience can encourage readers to spend more time on the site, engaging with content and potentially sharing it with others.</p>

<p>If you still wanna buy me a coffee, you can click the sponsorship button on GitHub!</p>

<p>The ads sucked anyway…</p>

<h2 id="simplified-looks">Simplified Looks</h2>

<p>Simpler pages are typically easier to navigate because they present information in a clear and concise manner, with fewer distractions or unnecessary elements.
When a page is cluttered or overly complex, users may struggle to find the information they are looking for, leading to frustration and potentially causing them to leave the site.
The WordPress site was an old mess of fully of crappy elements from 2015.</p>

<p>By contrast, simpler pages tend to have a clear visual hierarchy that makes it easier for users to scan and locate the information they need.
This was achieved through the use of white space, consistent typography, and clear navigation menus that now guide users to the most important content.</p>

<p>And man, this page really needed to be simplified!</p>

<h2 id="ability-to-file-issues">Ability to File Issues</h2>

<p>If you see a bug in any of the pages, just head over to <a href="https://github.com/mkysel/mkysel.github.io">Github</a> and file an issue.
I am happy to incorporate any and all feedback.</p>

<h2 id="breakage">Breakage</h2>

<p>If anything broke, please let me know! Either in the Disqus system or on GitHub.</p>

<h2 id="where-to-learn-more">Where to Learn More?</h2>

<p>You can read more about the migration in my post <a href="https://martinkysel.com/from-ugly-to-beautiful">From Ugly to Beautiful: The Transformation of Martinkysel.com</a>.</p>]]></content><author><name>Martin Kysel</name></author><category term="migration" /><summary type="html"><![CDATA[I am happy to announce that the page has been migrated from Wordpress to Jekyll and Github pages. Read more about the various improvements done...]]></summary></entry><entry><title type="html">HackerRank ‘Balanced Strings’ Solution</title><link href="http://www.martinkysel.com/hackerrank-balanced-strings-solution/" rel="alternate" type="text/html" title="HackerRank ‘Balanced Strings’ Solution" /><published>2021-05-16T00:00:00+00:00</published><updated>2021-05-16T00:00:00+00:00</updated><id>http://www.martinkysel.com/hackerrank-balanced-strings-solution</id><content type="html" xml:base="http://www.martinkysel.com/hackerrank-balanced-strings-solution/"><![CDATA[<h5 id="short-problem-definition">Short Problem Definition:</h5>

<p>Consider a string, s, consisting only of the letters <code class="language-plaintext highlighter-rouge">a</code> and <code class="language-plaintext highlighter-rouge">b</code>. We say that string s is balanced if both of the following conditions are satisfied:</p>

<ol>
  <li>s has the same number of occurrences of <code class="language-plaintext highlighter-rouge">a</code> and <code class="language-plaintext highlighter-rouge">b</code>.</li>
  <li>In each prefix of s, the number of occurrences of <code class="language-plaintext highlighter-rouge">a</code> and <code class="language-plaintext highlighter-rouge">b</code> differ by <em>at most</em> 1.</li>
</ol>

<p>Your task is to write a regular expression accepting only balanced strings.</p>

<h5 id="link">Link</h5>

<p><a href="https://www.hackerrank.com/contests/regular-expresso/challenges/balanced-strings/problem">Balanced Strings</a></p>

<h5 id="execution">Execution:</h5>

<p>Substrings can differ by at most 1 which means that the string must consist of either “ab” or “ba”. Write a regex as such.</p>

<h5 id="solution">Solution:</h5>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Regex_Pattern</span> <span class="o">=</span> <span class="sa">r</span><span class="s">"^((ab)|(ba))*$"</span>	<span class="c1"># Do not delete 'r'.
</span></code></pre></div></div>]]></content><author><name>Martin Kysel</name></author><category term="coding-challenge" /><category term="hackerrank" /><category term="python" /><summary type="html"><![CDATA[Consider a string, s, consisting only of the letters `a` and `b`. We say that string s is balanced if both of the following conditions are satisfied...]]></summary></entry><entry><title type="html">HackerRank ‘Real Estate Broker’ Solution</title><link href="http://www.martinkysel.com/hackerrank-real-estate-broker-solution/" rel="alternate" type="text/html" title="HackerRank ‘Real Estate Broker’ Solution" /><published>2021-05-16T00:00:00+00:00</published><updated>2021-05-16T00:00:00+00:00</updated><id>http://www.martinkysel.com/hackerrank-real-estate-broker-solution</id><content type="html" xml:base="http://www.martinkysel.com/hackerrank-real-estate-broker-solution/"><![CDATA[<h5 id="short-problem-definition">Short Problem Definition:</h5>

<p>You are a real estate broker in ancient Knossos. You have m unsold houses, and each house j has an area, xj, and a minimum price, yj. You also have n clients, and each client i wants a house with an area greater than ai and a price less than or equal to bi.</p>

<p>Each client can buy <em>at most</em> one house, and each house can have <em>at most</em> one owner. What is the maximum number of houses you can sell?</p>

<h5 id="link">Link</h5>

<p><a href="https://www.hackerrank.com/challenges/real-estate-broker/problem">Real Estate Broker</a></p>

<h5 id="complexity">Complexity:</h5>

<p>time complexity is <code class="language-plaintext highlighter-rouge">O(NlogN + MlogM + N\*M)</code></p>

<p>space complexity is <code class="language-plaintext highlighter-rouge">O(1)</code></p>

<h5 id="execution">Execution:</h5>

<p>This challenge sounds pretty complex, but this greedy solution works perfectly. Sort houses by size, start selling the smallest houses first. Bigger houses can always be sold since there is a bigger pool of buyers for them. Sell each house to the buyer that has the smallest pool of money available.</p>

<p>Don’t overcomplicate the problem with graph algorithms :)</p>

<h5 id="solution">Solution:</h5>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#!/bin/python
</span>
<span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">print_function</span>

<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">sys</span>

<span class="c1">#
# Complete the realEstateBroker function below.
#
</span><span class="k">def</span> <span class="nf">realEstateBroker</span><span class="p">(</span><span class="n">clients</span><span class="p">,</span> <span class="n">houses</span><span class="p">):</span>
    <span class="n">houses</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">houses</span><span class="p">)</span>
    <span class="n">clients</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">clients</span><span class="p">,</span> <span class="n">key</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
    
    <span class="n">sold</span> <span class="o">=</span> <span class="mi">0</span>
    
    <span class="k">for</span> <span class="n">house</span> <span class="ow">in</span> <span class="n">houses</span><span class="p">:</span>
        <span class="k">for</span> <span class="n">client</span> <span class="ow">in</span> <span class="n">clients</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">house</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="n">client</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">and</span> <span class="n">house</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="n">client</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span>
                <span class="n">sold</span> <span class="o">+=</span> <span class="mi">1</span>
                <span class="n">clients</span><span class="p">.</span><span class="n">remove</span><span class="p">(</span><span class="n">client</span><span class="p">)</span>
                <span class="k">break</span>
    
    <span class="k">return</span> <span class="n">sold</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
    <span class="n">fptr</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">environ</span><span class="p">[</span><span class="s">'OUTPUT_PATH'</span><span class="p">],</span> <span class="s">'w'</span><span class="p">)</span>

    <span class="n">nm</span> <span class="o">=</span> <span class="nb">raw_input</span><span class="p">().</span><span class="n">split</span><span class="p">()</span>

    <span class="n">n</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">nm</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>

    <span class="n">m</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">nm</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>

    <span class="n">clients</span> <span class="o">=</span> <span class="p">[]</span>

    <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
        <span class="n">clients</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="nb">raw_input</span><span class="p">().</span><span class="n">rstrip</span><span class="p">().</span><span class="n">split</span><span class="p">()))</span>

    <span class="n">houses</span> <span class="o">=</span> <span class="p">[]</span>

    <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">m</span><span class="p">):</span>
        <span class="n">houses</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="nb">raw_input</span><span class="p">().</span><span class="n">rstrip</span><span class="p">().</span><span class="n">split</span><span class="p">()))</span>

    <span class="n">result</span> <span class="o">=</span> <span class="n">realEstateBroker</span><span class="p">(</span><span class="n">clients</span><span class="p">,</span> <span class="n">houses</span><span class="p">)</span>

    <span class="n">fptr</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">result</span><span class="p">)</span> <span class="o">+</span> <span class="s">'</span><span class="se">\n</span><span class="s">'</span><span class="p">)</span>

    <span class="n">fptr</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>
</code></pre></div></div>]]></content><author><name>Martin Kysel</name></author><category term="coding-challenge" /><category term="hackerrank" /><category term="python" /><summary type="html"><![CDATA[You are a real estate broker in ancient Knossos. You have m unsold houses, and each house j has an area, xj, and a minimum price, yj. You also have n clients, and each client i wants a house with an area greater than ai and a price less than or equal to bi. Each client can buy at most one house, and each house can have at most one owner. What is the maximum number of houses you can sell?]]></summary></entry><entry><title type="html">HackerRank ‘Majority’ Solution</title><link href="http://www.martinkysel.com/hackerrank-majority-solution/" rel="alternate" type="text/html" title="HackerRank ‘Majority’ Solution" /><published>2021-02-05T00:00:00+00:00</published><updated>2021-02-05T00:00:00+00:00</updated><id>http://www.martinkysel.com/hackerrank-majority-solution</id><content type="html" xml:base="http://www.martinkysel.com/hackerrank-majority-solution/"><![CDATA[<h5 id="short-problem-definition">Short Problem Definition:</h5>

<p>Neo has to save the world one last time. One of the battles has cost Neo his eyes. He has to fight the battle with the Deus ex machina.</p>

<p>In front of Neo is a set of <strong>N</strong> balls, each ball is color coded 0/1. Deus ex machina wants Neo to figure out which ball’s color is the majority ( appears more than &gt; N/2 ). If his choice of ball is correct, Deus ex machina will reach a truce and let humans live and if Neo fails to identify the ball with the majority, the entire human race would be put back into matrix.</p>

<p>Neo being blind won’t be able to see the balls let alone figure out the ball with the majority. He seeks the Oracle’s help. Neo picks any two balls from the set and asks Oracle if they are of the same color or not. If they are the same color, the Oracle answers <strong>YES</strong> and if they are not, Oracle answers <strong>NO</strong>. We will call <em>b_0/1 as ball b with color _0/1</em> respectively. Majority exists in this set, i.e.,</p>

<h5 id="link">Link</h5>

<p><a href="https://www.hackerrank.com/challenges/oracle1/problem">Majority</a></p>

<h5 id="complexity">Complexity:</h5>

<p>time complexity is <code class="language-plaintext highlighter-rouge">O(N^2)</code></p>

<p>space complexity is <code class="language-plaintext highlighter-rouge">O(1)</code></p>

<h5 id="requested-by">Requested By:</h5>

<p>Soha</p>

<h5 id="execution">Execution:</h5>

<p>I use exceptions to simplify the flow of the algorithm. The algorithm itself can be tested locally if you replace the areEqual function and create an array locally. This abstraction should make the flow of the algorithm clearer.</p>

<p>Disclaimer: the code gets 16/23 points. There must be more improvements possible. I am open to suggestions in the comments below.</p>

<p>The algorithm itself assumes that if two groups of elements of equal size are not equal they become irrelevant. Let’s say that we know that elements 0 and 1 are different. Hence we never have to look at them again.</p>

<p>Otherwise the algorithm uses an adapted N(logN) algorithm to compare all elements.</p>

<h5 id="solution">Solution:</h5>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#!/usr/bin/py
</span>
<span class="k">class</span> <span class="nc">MissingElementException</span><span class="p">(</span><span class="nb">Exception</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">a</span> <span class="o">=</span> <span class="n">a</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">b</span> <span class="o">=</span> <span class="n">b</span>
        
        
<span class="k">def</span> <span class="nf">areEqual</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">a</span> <span class="p">,</span><span class="n">b</span><span class="p">):</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">query</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">query</span><span class="p">[</span><span class="n">a</span><span class="p">]:</span>
        <span class="k">raise</span> <span class="n">MissingElementException</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">query</span><span class="p">[</span><span class="n">a</span><span class="p">][</span><span class="n">b</span><span class="p">]</span>

<span class="k">def</span> <span class="nf">algo</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">query</span><span class="p">):</span>

    <span class="n">relevant_groups</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="mi">2</span><span class="p">):</span>
        <span class="n">group</span> <span class="o">=</span> <span class="p">[</span><span class="n">i</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">relevant_groups</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">group</span><span class="p">)</span>

    <span class="k">while</span> <span class="n">relevant_groups</span><span class="p">:</span>
        <span class="n">group_a</span> <span class="o">=</span> <span class="n">relevant_groups</span><span class="p">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
        <span class="n">group_len</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">group_a</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">areEqual</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">group_a</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">group_a</span><span class="p">[</span><span class="n">group_len</span><span class="o">//</span><span class="mi">2</span><span class="p">]):</span>
            <span class="k">while</span> <span class="n">relevant_groups</span><span class="p">:</span>
                <span class="n">group_b</span> <span class="o">=</span> <span class="n">relevant_groups</span><span class="p">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
                <span class="n">group_len_b</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">group_b</span><span class="p">)</span>
                <span class="k">if</span> <span class="n">areEqual</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">group_b</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">group_b</span><span class="p">[</span><span class="n">group_len_b</span><span class="o">//</span><span class="mi">2</span><span class="p">]):</span>
                    <span class="k">if</span> <span class="n">areEqual</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">group_a</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">group_b</span><span class="p">[</span><span class="mi">0</span><span class="p">]):</span>
                        <span class="n">group</span> <span class="o">=</span> <span class="n">group_a</span>
                        <span class="n">group</span><span class="p">.</span><span class="n">extend</span><span class="p">(</span><span class="n">group_b</span><span class="p">)</span>
                        <span class="n">relevant_groups</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">group</span><span class="p">)</span>
                        <span class="k">break</span>
                    <span class="k">else</span><span class="p">:</span>
                        <span class="k">if</span> <span class="n">group_len</span> <span class="o">&gt;</span> <span class="n">group_len_b</span><span class="p">:</span>
                            <span class="n">relevant_groups</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">group_a</span><span class="p">)</span>
                            <span class="k">break</span>
                        <span class="k">elif</span> <span class="n">group_len</span> <span class="o">&lt;</span> <span class="n">group_len_b</span><span class="p">:</span>
                            <span class="n">relevant_groups</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">group_b</span><span class="p">)</span>
                            <span class="k">break</span>
                        <span class="k">else</span><span class="p">:</span>
                            <span class="k">break</span>
            <span class="k">if</span> <span class="ow">not</span> <span class="n">relevant_groups</span><span class="p">:</span>
                <span class="c1"># this should be the answer
</span>                <span class="k">return</span> <span class="n">group_a</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
    <span class="k">return</span> <span class="n">query</span>


<span class="k">def</span> <span class="nf">nextQuestion</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">plurality</span><span class="p">,</span> <span class="n">lies</span><span class="p">,</span> <span class="n">color</span><span class="p">,</span> <span class="n">exact_lies</span><span class="p">,</span> <span class="n">query</span><span class="p">):</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="k">print</span> <span class="n">algo</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">query</span><span class="p">)</span>
    <span class="k">except</span> <span class="n">MissingElementException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
        <span class="k">print</span> <span class="s">"%ld % ld"</span> <span class="o">%</span> <span class="p">(</span><span class="n">e</span><span class="p">.</span><span class="n">a</span><span class="p">,</span> <span class="n">e</span><span class="p">.</span><span class="n">b</span><span class="p">)</span>
        
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
    <span class="n">vals</span> <span class="o">=</span> <span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">raw_input</span><span class="p">().</span><span class="n">strip</span><span class="p">().</span><span class="n">split</span><span class="p">()]</span>
    <span class="n">query_size</span> <span class="o">=</span> <span class="nb">input</span><span class="p">()</span>
    <span class="n">query</span> <span class="o">=</span> <span class="p">{}</span>
    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">vals</span><span class="p">[</span><span class="mi">0</span><span class="p">]):</span>
        <span class="n">query</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>

    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">query_size</span><span class="p">):</span>
        <span class="n">temp</span> <span class="o">=</span> <span class="p">[</span><span class="n">j</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">raw_input</span><span class="p">().</span><span class="n">strip</span><span class="p">().</span><span class="n">split</span><span class="p">()]</span>
        <span class="k">if</span> <span class="n">temp</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">==</span> <span class="s">"YES"</span><span class="p">:</span>
            <span class="n">query</span><span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">temp</span><span class="p">[</span><span class="mi">0</span><span class="p">])][</span><span class="nb">int</span><span class="p">(</span><span class="n">temp</span><span class="p">[</span><span class="mi">1</span><span class="p">])]</span> <span class="o">=</span> <span class="mi">1</span>
            <span class="n">query</span><span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">temp</span><span class="p">[</span><span class="mi">1</span><span class="p">])][</span><span class="nb">int</span><span class="p">(</span><span class="n">temp</span><span class="p">[</span><span class="mi">0</span><span class="p">])]</span> <span class="o">=</span> <span class="mi">1</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">query</span><span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">temp</span><span class="p">[</span><span class="mi">0</span><span class="p">])][</span><span class="nb">int</span><span class="p">(</span><span class="n">temp</span><span class="p">[</span><span class="mi">1</span><span class="p">])]</span> <span class="o">=</span> <span class="mi">0</span>
            <span class="n">query</span><span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">temp</span><span class="p">[</span><span class="mi">1</span><span class="p">])][</span><span class="nb">int</span><span class="p">(</span><span class="n">temp</span><span class="p">[</span><span class="mi">0</span><span class="p">])]</span> <span class="o">=</span> <span class="mi">0</span>

    <span class="n">nextQuestion</span><span class="p">(</span><span class="n">vals</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">vals</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">vals</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">vals</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span> <span class="n">vals</span><span class="p">[</span><span class="mi">4</span><span class="p">],</span> <span class="n">query</span><span class="p">)</span>
</code></pre></div></div>]]></content><author><name>Martin Kysel</name></author><category term="coding-challenge" /><category term="hackerrank" /><category term="python" /><summary type="html"><![CDATA[Neo has to save the world one last time. One of the battles has cost Neo his eyes. He has to fight the battle with the Deus ex machina.]]></summary></entry></feed>