<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Blog on 1am Philosophy</title><link>https://otsutez.github.io/blog/</link><description>Recent content in Blog on 1am Philosophy</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><copyright>Otsute (CC BY 4.0)</copyright><lastBuildDate>Thu, 20 Nov 2025 17:20:48 +1100</lastBuildDate><atom:link href="https://otsutez.github.io/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>AOC Day 8 [Part 1] - Union Find and Kruskal's Algorithm</title><link>https://otsutez.github.io/blog/aoc-day8/</link><pubDate>Tue, 09 Dec 2025 21:03:23 +0700</pubDate><guid>https://otsutez.github.io/blog/aoc-day8/</guid><description>&lt;p&gt;In today&amp;rsquo;s puzzle, we&amp;rsquo;re given a list of 3d coordinates each representing the location of an electrical junction box. In part 1 we&amp;rsquo;re asked to connect together the closest 1000 pairs of junction boxes and find the product of the size of the three largest circuits.&lt;/p&gt;





&lt;pre tabindex="0"&gt;&lt;code&gt;162,817,812
57,618,57
906,360,560
592,479,940
352,342,300
466,668,158
...&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Note that if a pair is already in the same circuit, nothing happens. What we&amp;rsquo;re basically doing in this problem is building a minimum spanning tree from a complete graph where each edge&amp;rsquo;s weight is the straight line distance between 2 junction boxes.&lt;/p&gt;</description><content:encoded><![CDATA[<p>In today&rsquo;s puzzle, we&rsquo;re given a list of 3d coordinates each representing the location of an electrical junction box. In part 1 we&rsquo;re asked to connect together the closest 1000 pairs of junction boxes and find the product of the size of the three largest circuits.</p>





<pre tabindex="0"><code>162,817,812
57,618,57
906,360,560
592,479,940
352,342,300
466,668,158
...</code></pre><p>Note that if a pair is already in the same circuit, nothing happens. What we&rsquo;re basically doing in this problem is building a minimum spanning tree from a complete graph where each edge&rsquo;s weight is the straight line distance between 2 junction boxes.</p>
<p>Implementing Kruskal&rsquo;s algorithm with the Union Find data structure has been on my To-do list since learning about it in my algorithm design course. This is a perfect opportunity for me to do just that! First I parsed the coordinates and create a sorted list of edges between each boxes. Then I implemented the Union-Find data structure with the help of my course&rsquo;s slides and <a href="https://www.geeksforgeeks.org/dsa/introduction-to-disjoint-set-data-structure-or-union-find-algorithm/">Geeks for Geeks</a>. It&rsquo;s actually quite easy to implement. The parent array is used to keep track of connected components and root vertices. The subtree array is used to keep track of the size of each rooted subtree. We use recursion to implement the Find operation. The size of each subtree is compared when uniting sets and the taller tree is appointed as the new root for the new tree.</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="k">class</span> <span class="nc">UnionFind</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">parent</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">subtree</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="k">public</span><span class="o">:</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">    <span class="n">UnionFind</span><span class="p">(</span><span class="kt">int</span> <span class="n">size</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 7</span><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">size</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">            <span class="n">parent</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">            <span class="n">subtree</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">    
</span></span><span class="line"><span class="ln">13</span><span class="cl">    <span class="kt">int</span> <span class="nf">find</span><span class="p">(</span><span class="kt">int</span> <span class="n">v</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="n">parent</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">==</span> <span class="n">v</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">            <span class="k">return</span> <span class="n">v</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">        <span class="k">return</span> <span class="n">find</span><span class="p">(</span><span class="n">parent</span><span class="p">[</span><span class="n">v</span><span class="p">]);</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">
</span></span><span class="line"><span class="ln">20</span><span class="cl">    <span class="kt">bool</span> <span class="nf">unite</span><span class="p">(</span><span class="kt">int</span> <span class="n">u</span><span class="p">,</span> <span class="kt">int</span> <span class="n">v</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">        <span class="kt">int</span> <span class="n">repu</span> <span class="o">=</span> <span class="n">find</span><span class="p">(</span><span class="n">u</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">        <span class="kt">int</span> <span class="n">repv</span> <span class="o">=</span> <span class="n">find</span><span class="p">(</span><span class="n">v</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="n">repu</span> <span class="o">==</span> <span class="n">repv</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="ln">24</span><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="n">subtree</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="n">subtree</span><span class="p">[</span><span class="n">v</span><span class="p">])</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">            <span class="n">parent</span><span class="p">[</span><span class="n">repv</span><span class="p">]</span> <span class="o">=</span> <span class="n">repu</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">            <span class="n">subtree</span><span class="p">[</span><span class="n">repu</span><span class="p">]</span> <span class="o">+=</span> <span class="n">subtree</span><span class="p">[</span><span class="n">repv</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">            <span class="n">parent</span><span class="p">[</span><span class="n">repu</span><span class="p">]</span> <span class="o">=</span> <span class="n">repv</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">            <span class="n">subtree</span><span class="p">[</span><span class="n">repv</span><span class="p">]</span> <span class="o">+=</span> <span class="n">subtree</span><span class="p">[</span><span class="n">repu</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">        <span class="k">return</span> <span class="nb">true</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">    <span class="p">}</span></span></span></code></pre></div><p>For part 1 we just have to perform Kruskal&rsquo;s algorithm on the first 1000 smallest edges, then find the 3 biggest circuits and multiply their sizes. For part 2, we do full Kruskal&rsquo;s algorithm to create the minimum spanning tree with n - 1 edges. We then look at the last edge and multiply the x coordinates of the two boxes connected by that edge.</p>
<hr>
<h2 id="things-ive-learnt">Things I&rsquo;ve learnt</h2>
<h3 id="padding-output">Padding output</h3>
<p>This is how you pad integers when printing to standard output. Look into <code>&lt;iomanip&gt;</code> header to learn more about standard output formatting.</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="ln">1</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iomanip&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">setfill</span><span class="p">(</span><span class="sc">&#39; &#39;</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">setw</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="mi">25</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="p">}</span></span></span></code></pre></div>]]></content:encoded></item><item><title>AOC Day 5 [Part 2] - Greedy Algorithms</title><link>https://otsutez.github.io/blog/aoc-day5/</link><pubDate>Fri, 05 Dec 2025 21:49:18 +1100</pubDate><guid>https://otsutez.github.io/blog/aoc-day5/</guid><description>&lt;p&gt;&lt;a href="https://adventofcode.com"&gt;Advent of Code&lt;/a&gt; is a famous website that releases one programming puzzle each day, starting from the 1st and usually ending on the 25th (like an advent calendar) of December. This year, only 12 puzzles will be released in the first 12 days. While this is sad news for many Advent of Code enjoyers like me, I think this gives me an opportunity to finish every day&amp;rsquo;s puzzle for the first time. Anyway, I want to write about how greedy algorithm can be used to solve part 2 of today&amp;rsquo;s problem (Day 5 [Part 2]).&lt;/p&gt;</description><content:encoded><![CDATA[<p><a href="https://adventofcode.com">Advent of Code</a> is a famous website that releases one programming puzzle each day, starting from the 1st and usually ending on the 25th (like an advent calendar) of December. This year, only 12 puzzles will be released in the first 12 days. While this is sad news for many Advent of Code enjoyers like me, I think this gives me an opportunity to finish every day&rsquo;s puzzle for the first time. Anyway, I want to write about how greedy algorithm can be used to solve part 2 of today&rsquo;s problem (Day 5 [Part 2]).</p>
<p>Part 2 of today&rsquo;s puzzle is basically given a list of ranges,</p>





<pre tabindex="0"><code>3-5
10-14
16-20
12-18</code></pre><p>count how many distinct numbers there are in all these ranges. In the above example, there are 14 distinct numbers: <code>3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20</code>.</p>
<p>Here&rsquo;s my solution to the problem. First read in and store all the ranges in a vector. Then sort the ranges in ascending order of starting points, then ascending order of ending point. Then apply a greedy algorithm where we take the leftmost range, if this range intersects with another range (<code>this.end &gt;= another.start</code>), increase the endpoint of this range if it&rsquo;s greater (<code>this.end = max(this.end, another.end)</code>). Repeat until there are no more ranges to the right that intersects with our range. At the end, we will have a new range that merged as many ranges as possible. We know that this new range does not intersect with any other range in our collection and so we can count the number of distinct numbers by calculating <code>range.end - range.start + 1</code>.</p>
<p>Below is the C++ code used to solve this problem.</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="k">using</span> <span class="n">ll</span> <span class="o">=</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="c1">// Range struct
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="c1"></span><span class="k">typedef</span> <span class="k">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">    <span class="n">ll</span> <span class="n">start</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">    <span class="n">ll</span> <span class="n">end</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="p">}</span> <span class="n">Range</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="c1">// Comparison function for std::sort()
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="c1"></span><span class="kt">bool</span> <span class="nf">comp_range</span><span class="p">(</span><span class="k">const</span> <span class="n">Range</span> <span class="o">&amp;</span><span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="n">Range</span> <span class="o">&amp;</span><span class="n">b</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">start</span> <span class="o">!=</span> <span class="n">b</span><span class="p">.</span><span class="n">start</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">        <span class="k">return</span> <span class="n">a</span><span class="p">.</span><span class="n">start</span> <span class="o">&lt;</span> <span class="n">b</span><span class="p">.</span><span class="n">start</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">    <span class="k">return</span> <span class="n">a</span><span class="p">.</span><span class="n">end</span> <span class="o">&lt;</span> <span class="n">b</span><span class="p">.</span><span class="n">end</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="kt">void</span> <span class="nf">part_two</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">ifstream</span> <span class="n">f</span><span class="p">(</span><span class="s">&#34;./puzzle_input/day5.txt&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">Range</span><span class="o">&gt;</span> <span class="n">ranges</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">
</span></span><span class="line"><span class="ln">21</span><span class="cl">    <span class="c1">// Read in ranges
</span></span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="c1"></span>    <span class="k">for</span> <span class="p">(;;)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">        <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">range</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">        <span class="n">getline</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">range</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="n">range</span><span class="p">.</span><span class="n">empty</span><span class="p">())</span> <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">        <span class="n">Range</span> <span class="n">r</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">        <span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="n">range</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="sc">&#39;-&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">        <span class="n">r</span><span class="p">.</span><span class="n">start</span> <span class="o">=</span> <span class="n">stoll</span><span class="p">(</span><span class="n">range</span><span class="p">.</span><span class="n">substr</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">i</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">        <span class="n">r</span><span class="p">.</span><span class="n">end</span> <span class="o">=</span> <span class="n">stoll</span><span class="p">(</span><span class="n">range</span><span class="p">.</span><span class="n">substr</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="ln">30</span><span class="cl">        <span class="n">ranges</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">r</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">
</span></span><span class="line"><span class="ln">33</span><span class="cl">    <span class="c1">// Sort ranges
</span></span></span><span class="line"><span class="ln">34</span><span class="cl"><span class="c1"></span>    <span class="n">std</span><span class="o">::</span><span class="n">sort</span><span class="p">(</span><span class="n">ranges</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">ranges</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="o">&amp;</span><span class="n">comp_range</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">
</span></span><span class="line"><span class="ln">36</span><span class="cl">    <span class="c1">// Greedy algorithm to merge ranges
</span></span></span><span class="line"><span class="ln">37</span><span class="cl"><span class="c1"></span>    <span class="n">ll</span> <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl">    <span class="n">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">39</span><span class="cl">    <span class="k">while</span> <span class="p">(</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">ranges</span><span class="p">.</span><span class="n">size</span><span class="p">())</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">40</span><span class="cl">        <span class="n">Range</span> <span class="n">r</span> <span class="o">=</span> <span class="n">ranges</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">41</span><span class="cl">        <span class="k">while</span> <span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">&lt;</span> <span class="n">ranges</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&amp;&amp;</span> <span class="n">ranges</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">start</span> <span class="o">&lt;=</span> <span class="n">r</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="ln">42</span><span class="cl">            <span class="n">r</span><span class="p">.</span><span class="n">end</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">max</span><span class="p">(</span><span class="n">ranges</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">end</span><span class="p">,</span> <span class="n">r</span><span class="p">.</span><span class="n">end</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">43</span><span class="cl">            <span class="n">i</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">44</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">45</span><span class="cl">        <span class="n">count</span> <span class="o">+=</span> <span class="n">r</span><span class="p">.</span><span class="n">end</span> <span class="o">-</span> <span class="n">r</span><span class="p">.</span><span class="n">start</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">46</span><span class="cl">        <span class="n">i</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">47</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">48</span><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">count</span> <span class="o">&lt;&lt;</span> <span class="sc">&#39;\n&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">49</span><span class="cl"><span class="p">}</span></span></span></code></pre></div><hr>
<h2 id="things-ive-learnt">Things I&rsquo;ve learnt</h2>
<p>I would also like to use this blog to document knowledge about C++ that I&rsquo;ve learnt while doing AOC.</p>
<h3 id="reading-from-a-file-in-c">Reading from a file in C++</h3>
<p>Include the <code>&lt;fstream&gt;</code> header and initialize an <code>ifstream</code> with the path to the file that you want to open. Then you can read the file using the <code>&gt;&gt;</code> operator or <code>getline()</code>. You can read the file line by line using a for loop!</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="ln">1</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;fstream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">ifstream</span> <span class="n">f</span><span class="p">(</span><span class="s">&#34;./path/to/file&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl">    <span class="k">for</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">line</span><span class="p">;</span> <span class="n">getline</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">line</span><span class="p">);)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl">        <span class="c1">// do something with line
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="c1"></span>    <span class="p">}</span>
</span></span><span class="line"><span class="ln">8</span><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">9</span><span class="cl"><span class="p">}</span></span></span></code></pre></div><h3 id="modulo-in-c">Modulo in C++</h3>
<p>The <code>%</code> operator in many programming languages is not actually the modulo operation, it&rsquo;s a return the remainder operation. It doesn&rsquo;t work correctly when you do <code>-a % b</code> where <code>-a</code> is a negative number. For example <code>-4 mod 3 = -2</code> but <code>-4 % 3 = -1</code>. To get actual modulo operation, you have to do this</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="ln">1</span><span class="cl"><span class="p">(</span><span class="n">a</span> <span class="o">%</span> <span class="n">b</span> <span class="o">+</span> <span class="n">b</span><span class="p">)</span> <span class="o">%</span> <span class="n">b</span><span class="p">;</span></span></span></code></pre></div>]]></content:encoded></item><item><title>The Idealist Me</title><link>https://otsutez.github.io/blog/idealist/</link><pubDate>Thu, 20 Nov 2025 17:57:23 +1100</pubDate><guid>https://otsutez.github.io/blog/idealist/</guid><description>&lt;p&gt;To be an idealist is to have a certain kind of belief. To believe that the world can be better and that by doing the right thing, we can actually make it better. I&amp;rsquo;m an idealist and I believe that noble causes lead to great achievements. Take Wikipedia for example, a project with the pure aim of creating a large, comprehensive and accurate source of information that is accessible for everyone. I would say that Wikipedia has succeeded in this goal monumentally and is now one of the most reliable and accessible source of information one can use to educate oneself. Miraculously, Wikipedia did all this just by relying on donations and volunteers, they never aimed to make a profit at all. How in the world did they manage to do that? Anyway, what I&amp;rsquo;m trying to say is that ideals change the world. When enough people believe in a noble cause and invest time and effort into it, they can actually change the world for the better. There are other great examples out there, the Linux kernel to name one. One day, I would like to contribute to these great causes, whether monetarily or directly. But before then, I&amp;rsquo;ll keep using Linux and reading Wikipedia pages.&lt;/p&gt;</description><content:encoded><![CDATA[<p>To be an idealist is to have a certain kind of belief. To believe that the world can be better and that by doing the right thing, we can actually make it better. I&rsquo;m an idealist and I believe that noble causes lead to great achievements. Take Wikipedia for example, a project with the pure aim of creating a large, comprehensive and accurate source of information that is accessible for everyone. I would say that Wikipedia has succeeded in this goal monumentally and is now one of the most reliable and accessible source of information one can use to educate oneself. Miraculously, Wikipedia did all this just by relying on donations and volunteers, they never aimed to make a profit at all. How in the world did they manage to do that? Anyway, what I&rsquo;m trying to say is that ideals change the world. When enough people believe in a noble cause and invest time and effort into it, they can actually change the world for the better. There are other great examples out there, the Linux kernel to name one. One day, I would like to contribute to these great causes, whether monetarily or directly. But before then, I&rsquo;ll keep using Linux and reading Wikipedia pages.</p>
]]></content:encoded></item></channel></rss>