<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Eduardo</title>
    <description>The latest articles on DEV Community by Eduardo (@eduherminio).</description>
    <link>https://dev.to/eduherminio</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F959%2Fc7cc7337-90d6-4e86-82f3-8b97a94e41cc.jpg</url>
      <title>DEV Community: Eduardo</title>
      <link>https://dev.to/eduherminio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eduherminio"/>
    <language>en</language>
    <item>
      <title>Solving Advent of Code 2020 - Day 10</title>
      <dc:creator>Eduardo</dc:creator>
      <pubDate>Fri, 11 Dec 2020 00:14:04 +0000</pubDate>
      <link>https://dev.to/eduherminio/solving-advent-of-code-2020-day-10-4dh1</link>
      <guid>https://dev.to/eduherminio/solving-advent-of-code-2020-day-10-4dh1</guid>
      <description>&lt;h2&gt;
  
  
  Why Day 10
&lt;/h2&gt;

&lt;p&gt;Not only I've found &lt;a href="https://adventofcode.com/2020/day/10"&gt;Day 10 of this year's Advent of Code&lt;/a&gt; challenging, but also I've come up with a particular enough solution that I'd like to share (and document!) somewhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem rules
&lt;/h2&gt;

&lt;p&gt;I strongly encourage you to read &lt;a href="https://adventofcode.com/2020/day/10"&gt;the full puzzle description&lt;/a&gt; if you aren't familiar with it, here I'm just gonna try to extract problem the restrictions with no amazing elves story behind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;We're given a list of integers, each of one representing the output joltage supported by a different joltage adapter.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Sample input: &lt;code&gt;16 10 15 5 1 11 7 19 6 12 4&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Each one of our adapters can take an input joltage up to 3 jolts lower than its rating while still producing its rated output joltage (quite shocking, right?).&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;We need to use our adapters to connect a charging outlet (0 jolts) to our device (3 jolts more than the highest of our adapters).&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Warming up: part 1
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Let's assume we use all our adapters chained one after the other: between each one of them there will be a joltage difference.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What is the number of 1-jolt differences multiplied by the number of 3-jolt differences?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The approach for this part is relatively simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sorting the input in ascending order.&lt;/li&gt;
&lt;li&gt;Creating two counters: number of 1-jolt differences and number of 3-jolt differences.&lt;/li&gt;
&lt;li&gt;Looping through our ordered list, comparing each item with the previous one and incrementing the relevant counter consequently. The initial 'previous' value is 0.&lt;/li&gt;
&lt;li&gt;Incrementing the 3-jolt counter by one, since that's a known problem restriction.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The solution asked is the product of both counters.&lt;/p&gt;

&lt;p&gt;Something similar to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;Solve_1&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;ascendingInput&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadAllLines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"input.txt"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;OrderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;ToList&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;ones&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;threes&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;previous&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;ascendingInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ascendingInput&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;previous&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="p"&gt;++&lt;/span&gt;&lt;span class="n"&gt;ones&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="p"&gt;++&lt;/span&gt;&lt;span class="n"&gt;threes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;previous&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="p"&gt;++&lt;/span&gt;&lt;span class="n"&gt;threes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// Last connection is highest adapter + 3 jolts&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;$"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ones&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;threes&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The real challenge: part 2
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;How many different ways are there to arrange your adapters, not necessarily using them all?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As the problem hints (&lt;code&gt;"there must be more than a trillion valid ways to arrange them!"&lt;/code&gt;), trying to brute-force all the possible sequences may not be the ideal approach.&lt;/p&gt;

&lt;p&gt;We're going to follow a different one: &lt;strong&gt;finding which adapters are optional&lt;/strong&gt;, and based on that, &lt;strong&gt;trying to deduct how many different ways of arranging our adapters are there&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Finding optional adapters
&lt;/h3&gt;

&lt;p&gt;First things first, let's try to identify those parameters that are optional:&lt;/p&gt;

&lt;p&gt;Statement 1:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Given   Three consecutive adapters (A &amp;lt;= B &amp;lt;= C)
When    A and C have a voltage difference of three or less jolts
Then    B is optional
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That one was easy, right?&lt;/p&gt;

&lt;h3&gt;
  
  
  Optional adapters and bifurcations
&lt;/h3&gt;

&lt;p&gt;How does having an optional adapter exactly affect the number of possible ways of arranging our sequence? Let's see:&lt;/p&gt;

&lt;p&gt;Statement 2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Given   Given any sequence of adapters [N-Z] (N &amp;lt; O &amp;lt; ... &amp;lt; Z)
When    The first adapter is optional (and could be removed)
Then    The number of possible arrangements of the sequence [N-Z]
          is twice the number of possible arrangements in the subsequence [O-Z] (O &amp;lt; ... &amp;lt; Z):
          all the arrangements in [O-Z] plus the same arrangements preceded by N.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sounds good, right? Maybe too good to be true.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using the examples to find our mistake
&lt;/h3&gt;

&lt;p&gt;If both statements were right:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The solution to the example 1, with three optional adapters, would be 2^3 = 8, which is correct.&lt;/li&gt;
&lt;li&gt;The solution to the example 2, with fifteen optional adapters, would be 2^15 = 32.768, which is not correct.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's have a look at the failing example, more specifically at the first group of lines:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;(0), 1, 2 ... 42, 45, 46, 47, 48, 49, (52)&lt;/p&gt;

&lt;p&gt;(0), 1, 2 ... 42, 45, 46, 47, 49, (52)&lt;/p&gt;

&lt;p&gt;(0), 1, 2 ... 42, 45, 46, 48, 49, (52)&lt;/p&gt;

&lt;p&gt;(0), 1, 2 ... 42, 45, 46, 49, (52)&lt;/p&gt;

&lt;p&gt;(0), 1, 2 ... 42, 45, 47, 48, 49, (52)&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://twitter.com/ericwastl"&gt;Eric Wastl&lt;/a&gt;, AoC creator, could have provided us with any random arrangements (there were 19208 different ways of using the adapters for this example), but these specific ones seem to follow a certain pattern. Let's try to see what is it.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(0), 1, 2 ... 42, 45, 46, 47, 48, 49, (52)&lt;/code&gt; → &lt;em&gt;Complete sequence&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(0), 1, 2 ... 42, 45, 46, 47, {}, 49, (52)&lt;/code&gt; → &lt;em&gt;Missing 48&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(0), 1, 2 ... 42, 45, 46, {}, 48, 49, (52)&lt;/code&gt; → &lt;em&gt;Missing 47&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(0), 1, 2 ... 42, 45, 46, {}, {}, 49, (52)&lt;/code&gt; → &lt;em&gt;Missing 47 and 48&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(0), 1, 2 ... 42, 45, {}, 47, 48, 49, (52)&lt;/code&gt; → &lt;em&gt;Missing 46&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Let's continue ourselves:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(0), 1, 2 ... 42, 45, {}, {}, 48, 49, (52)&lt;/code&gt; → &lt;em&gt;Missing 46 and 47&lt;/em&gt;`&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(0), 1, 2 ... 42, 45, {}, 47, {}, 49, (52)&lt;/code&gt; → &lt;em&gt;Missing 46 and 48&lt;/em&gt;`&lt;/p&gt;

&lt;p&gt;But the following one isn't a valid sequence:&lt;/p&gt;

&lt;p&gt;&lt;del&gt;&lt;code&gt;(0), 1, 2 ... 42, 45, {}, {}, {}, 49, (52)&lt;/code&gt;&lt;/del&gt; → Missing 46, 47 and 48&lt;/p&gt;

&lt;p&gt;If we iterate over the optional adapters from the right (48 &amp;gt; 47 &amp;gt; 46 ...), we see that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Initially, the number of valid arrangements is one (the whole sequence).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;(0), 1, ... 49, (52)&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The first optional adapter, 48, duplicates the number of valid arrangements in the sequence, which was initially 1 and is 2 afterwards.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;(0), 1, 2 ... 47, {48}, 49, (52)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(0), 1, 2 ... 47, {}, 49, (52)&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The second one, 47, duplicates the number of valid arrangements in the sequence, which was initially 2 and is 4 afterwards.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;(0), 1, 2 ... 46, {47}, 48, 49, (52)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(0), 1, 2 ... 46, {47}, 49, (52)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(0), 1, 2 ... 46, {}, 48, 49, (52)&lt;/code&gt; [new]&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(0), 1, 2 ... 46, {}, 49, (52)&lt;/code&gt; [new]&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The third one, 46, can't duplicate the number of valid arrangements in the sequence, because those combinations where neither 46, 47 and 48 are included are invalid.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;(0), 1, 2 ... 45, {46}, 47, 48, 49, (52)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(0), 1, 2 ... 45, {46}, 47, 49, (52)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(0), 1, 2 ... 45, {46}, 48, 49, (52)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(0), 1, 2 ... 45, {46}, 49 (52)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(0), 1, 2 ... 45, {}, 47, 48, 49, (52)&lt;/code&gt; [new]&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(0), 1, 2 ... 45, {}, 47, 49, (52)&lt;/code&gt; [new]&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(0), 1, 2 ... 45, {}, 48, 49, (52)&lt;/code&gt; [new]&lt;/p&gt;

&lt;p&gt;&lt;del&gt;&lt;code&gt;(0), 1, 2 ... 45, {}, 49, (52)&lt;/code&gt; [new]&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;Analyzing all the cases we checked that &lt;strong&gt;46 can only provide another extra 0.75n, increasing the total by 1.75 rather than duplicating it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We can also validate that mathematically:&lt;/p&gt;

&lt;p&gt;If 47 provides n combinations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;46 was supposed to provide another n ones, to reach 2n in total.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, it will only be able to provide part of them: another &lt;strong&gt;xn&lt;/strong&gt; combinations, being x the number of 47 and 48 combinations where at least one of those optional adapters are present.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;50% of the combinations provided by 47 didn't include the 47 adapter itself, that is 0.5n.&lt;/li&gt;
&lt;li&gt;48 provided 0.5n combinations, and half of them didn't included 48. That is 0.25n&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That means that x, or &lt;strong&gt;the number of combinations that include either 47 or 48&lt;/strong&gt;, &lt;strong&gt;is&lt;/strong&gt; 0.5n + 0.25n = &lt;strong&gt;0.75n&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This rule can be generalized to (at least) any optional adapter that is used immediately before another 2 optional adapters, which is enough to solve our problem.&lt;/p&gt;

&lt;p&gt;So, fixing Statement 2, we get:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Given   Given any sequence of adapters [N-Z] (N &amp;lt; O &amp;lt; P &amp;lt; ... &amp;lt; Z)
When    The first adapter is optional (and could be removed)
Then    The number of possible arrangements of the sequence [N-Z] is:
          a/ 1.75 2x the number of arrangements in the subsequence [O-Z]
             when the first two adapters in [O-Z] are also optional
          b/ 2x the number of arrangements in the subsequence [O-Z]
             otherwise
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Implementation
&lt;/h2&gt;

&lt;p&gt;Putting together both statements, we can implement the solution to the part 2 like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;Solve_2&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;descendingInput&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadAllLines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"input.txt"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;OrderByDescending&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;ToList&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="kt"&gt;ulong&lt;/span&gt; &lt;span class="n"&gt;totalNumberOfWays&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;GetOptionalAdapters&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;descendingInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;++&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;descendingInput&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;descendingInput&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;// Statement 1&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;descendingInput&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;optionalParametersList&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;GetOptionalAdapters&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;ToList&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;optionalAdapter&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;optionalParametersList&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;totalNumberOfWays&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;optionalParametersList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;optionalAdapter&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;optionalParametersList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;optionalAdapter&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;totalNumberOfWays&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;     &lt;span class="c1"&gt;// Statement 2&lt;/span&gt;
            &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;totalNumberOfWays&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;totalNumberOfWays&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All the code shown here was taken from my &lt;a href="https://github.com/eduherminio/AoC2020/blob/main/src/AoC_2020/Day_10.cs"&gt;Advent of Code 2020 repository&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Disclaimer: this way of resolving the puzzle is not necessarily the best one. As a matter of a fact, it's not.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can read &lt;a href="https://www.reddit.com/r/adventofcode/comments/ka9pc3/2020_day_10_part_2_suspicious_factorisation/gf969fr/"&gt;here&lt;/a&gt; some mathematical concepts behind the puzzle.&lt;/li&gt;
&lt;li&gt;Some examples of implementations that follow that idea or similar ones are:

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/rubnvp/advent-of-code-2020/blob/main/day-10/main.js"&gt;In JavaScript&lt;/a&gt; by &lt;a href="https://github.com/rubnvp"&gt;Rubén Valseca&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/erikiva/advent-of-code/blob/master/2020/src/dev/erikiva/aoc2020/Day10.kt"&gt;In Kotlin&lt;/a&gt; by &lt;a href="https://github.com/erikiva"&gt;Natalia Vidal&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/guillermoig/AoC2020/blob/main/src/AoC-D10/AoC-D10-02.php"&gt;In PHP&lt;/a&gt; by &lt;a href="https://github.com/guillermoig"&gt;Guillermo Ibáñez&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/jabadia/adventOfCode2020/blob/main/d10/d10p2.py"&gt;In Python&lt;/a&gt; by &lt;a href="https://javierabadia.medium.com/advent-of-code-d%C3%ADa-10-d82063d9ab19"&gt;Javier Abadía&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/juananmuxed/adventofcode-2020/blob/master/days/10/problem10.js"&gt;In JavaScript + memes&lt;/a&gt; by &lt;a href="https://github.com/juananmuxed"&gt;Juan Antonio 'Muxed'&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/mariomka/AdventOfCode2020/blob/master/day10/src/lib.rs"&gt;In Rust&lt;/a&gt; by &lt;a href="https://github.com/mariomka"&gt;Mario Juárez&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>adventofcode</category>
      <category>competitiveprogramming</category>
      <category>codingpuzzle</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Deprecating methods with optional arguments</title>
      <dc:creator>Eduardo</dc:creator>
      <pubDate>Sat, 05 Dec 2020 17:04:39 +0000</pubDate>
      <link>https://dev.to/eduherminio/deprecating-methods-with-optional-arguments-3428</link>
      <guid>https://dev.to/eduherminio/deprecating-methods-with-optional-arguments-3428</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Optional arguments
&lt;/h3&gt;

&lt;p&gt;From C# 4 methods, indexers, constructors, and delegates can have both &lt;a href="https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/named-and-optional-arguments"&gt;named and optional arguments&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In the following example, &lt;code&gt;int bar&lt;/code&gt; is a named argument and &lt;code&gt;bool isZeroIndexArray&lt;/code&gt; is an optional argument, which becomes &lt;code&gt;true&lt;/code&gt; if no other value is provided.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;isZeroIndexArray&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;ObsoleteAttribute&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Since .NET Framework 1.1 &lt;code&gt;ObsoleteAttribute&lt;/code&gt; can be used to &lt;a href="https://docs.microsoft.com/en-us/dotnet/api/system.obsoleteattribute"&gt;"mark program elements as no longer in use"&lt;/a&gt;. Those program elements include classes, methods, fields, etc.&lt;/p&gt;

&lt;p&gt;It's a common practice to place it in those elements that are no longer maintained and/or may disappear in future versions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;Obsolete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"This method is obsolete. Please use xxxx instead."&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;isZeroIndexArray&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Semantic versioning
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://semver.org/"&gt;Semantic versioning&lt;/a&gt; is a common practice in software development nowadays (or at least it should be!).&lt;/p&gt;

&lt;p&gt;Essentially, it's a way of versioning software that sticks to the following rules:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Given a version number MAJOR.MINOR.PATCH, increment the:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;MAJOR version when you make incompatible API changes,&lt;/li&gt;
&lt;li&gt;MINOR version when you add functionality in a backwards compatible manner, and&lt;/li&gt;
&lt;li&gt;PATCH version when you make backwards compatible bug fixes.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Deprecating methods that have optional arguments
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Real life scenario
&lt;/h3&gt;

&lt;p&gt;Sometimes one doesn't want their users to continue using a method/class/property because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There are plans to remove it in the future.&lt;/li&gt;
&lt;li&gt;There is already a working alternative in place that mimics its behavior.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Given that scenario, there are some chances that, sticking to semantic versioning and &lt;a href="https://semver.org/#how-should-i-handle-deprecating-functionality"&gt;its advice about handling deprecation&lt;/a&gt;, you want to release some minor versions where the legacy part of your code appears as 'obsolete' before actually removing it (and therefore bumping your major version).&lt;/p&gt;

&lt;p&gt;And there are also some (smaller) chances that the method that needs to be deprecated contains &lt;a href="https://dev.to/eduherminio/deprecating-methods-with-optional-arguments-3428#optional-arguments"&gt;optional arguments&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That's the scenario we're going to focus on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Initial implementation and &lt;em&gt;gotcha&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Let's go back to one of the examples presented in the &lt;a href="https://dev.to/eduherminio/deprecating-methods-with-optional-arguments-3428#introduction"&gt;introduction&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;We've always had the following method in our library:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OurClass&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;isZeroIndexArray&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We now want to allow our users to use &lt;code&gt;Foo()&lt;/code&gt; method in a more flexible way, so we've implemented:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FooConfiguration&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;IsZeroIndexArray&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Verbosity&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;FooConfiguration&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;IsZeroIndexArray&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OurClass&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FooConfiguration&lt;/span&gt; &lt;span class="n"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since we don't want to duplicate or complicate our &lt;code&gt;Foo()&lt;/code&gt; implementation, ideally we'd like to get rid of &lt;code&gt;void Foo(bool)&lt;/code&gt;; but &lt;strong&gt;we don't want to bump our major version&lt;/strong&gt; (yet). &lt;/p&gt;

&lt;p&gt;However, &lt;strong&gt;we do want to release our new code&lt;/strong&gt; with &lt;code&gt;void Foo(FooConfiguration?)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The solution, as we previously hinted, is marking the old one as obsolete, adding the new one and releasing the code with a new minor version. But &lt;strong&gt;there's a &lt;em&gt;gotcha&lt;/em&gt;&lt;/strong&gt; when doing that:&lt;/p&gt;

&lt;p&gt;If we simply do&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OurClass&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;Obsolete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"This method is obsolete. Please use Foo(FooConfiguration?) instead."&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;isZeroIndexArray&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FooConfiguration&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;we will potentially break the following user's code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;OurClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;They'll get compiler errors similar to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;error CS0121: The call is ambiguous between the following methods or properties: &lt;span class="s1"&gt;'OurClass.Foo(bool)'&lt;/span&gt; and &lt;span class="s1"&gt;'OurClass.Foo(FooConfiguration?)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is, we would be violating semantic versioning rules, so 💩.&lt;/p&gt;

&lt;h3&gt;
  
  
  Correct implementation
&lt;/h3&gt;

&lt;p&gt;Fortunately not all hope is gone and there's a way of keeping the required compatibility while releasing our new functionality:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OurClass&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;Obsolete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"This method is obsolete. Please use Foo(FooConfiguration?) instead."&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;isZeroIndexArray&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FooConfiguration&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;configuration&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Did you notice the change? Now &lt;strong&gt;our legacy &lt;code&gt;void Foo(bool isZeroIndexArray)&lt;/code&gt; doesn't have its optional argument any more&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This allows all possible usages of our method to keep compiling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Will use Foo(bool FooConfiguration? = null)&lt;/span&gt;
&lt;span class="n"&gt;OurClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Will use Foo(bool isZeroIndexArray) and get a compiler warning&lt;/span&gt;
&lt;span class="n"&gt;OurClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Will use Foo(bool isZeroIndexArray) and get a compiler warning&lt;/span&gt;
&lt;span class="n"&gt;OurClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And if we implement correctly &lt;code&gt;void Foo(FooConfiguration?)&lt;/code&gt;, we'll manage to keep &lt;code&gt;Foo()&lt;/code&gt;'s behavior consistent.&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
      <category>library</category>
      <category>versioning</category>
    </item>
    <item>
      <title>Getting ready for Advent of Code 2020</title>
      <dc:creator>Eduardo</dc:creator>
      <pubDate>Thu, 26 Nov 2020 12:35:52 +0000</pubDate>
      <link>https://dev.to/eduherminio/getting-ready-for-advent-of-code-2020-3mkf</link>
      <guid>https://dev.to/eduherminio/getting-ready-for-advent-of-code-2020-3mkf</guid>
      <description>&lt;h1&gt;
  
  
  What's all the fuzz about
&lt;/h1&gt;

&lt;p&gt;It's almost December and &lt;a href="https://adventofcode.com/"&gt;Advent of Code&lt;/a&gt; is back! For those of you who don't know it yet, AoC is an initiative by the great &lt;a href="https://twitter.com/ericwastl"&gt;Eric Wastl&lt;/a&gt; that consists of a series of 25 puzzles released daily between 1st and 25th of December.&lt;/p&gt;

&lt;p&gt;In 2019 &lt;a href="https://adventofcode.com/2019/stats"&gt;almost 100,000 people&lt;/a&gt; completed at least one of the two parts of the first problem and almost 3,000 of them completed them all; and I expect those numbers to increase this year due to the multiple lock-downs/stay-at-home recommendations in place worldwide.&lt;/p&gt;

&lt;p&gt;People use Advent of Code as an excuse to learn a new language or paradigm, challenge their friends/colleagues (it has &lt;a href="https://adventofcode.com/2019/leaderboard"&gt;public&lt;/a&gt; and private leaderboards) or simply challenge themselves every day for a few minutes/hours and starting or ending the day with the satisfaction of getting stuff done.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hgLkfvhl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/r9e0tyx9bp0rdputa20q.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hgLkfvhl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/r9e0tyx9bp0rdputa20q.gif" alt="Advent of Code 2015 gif animation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, AoC is not only about solving problems, but also about learning from (or directly admiring) other people's solutions and creativity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Some people solve certain problems using &lt;a href="https://www.reddit.com/r/adventofcode/comments/e7ylwd/i_solved_day_8_entirely_in_minecraft/"&gt;&lt;strong&gt;Minecraft&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Others manage to solve all problems using &lt;a href="https://github.com/pengi/advent_of_code/tree/master/2019"&gt;&lt;strong&gt;Excel&lt;/strong&gt;&lt;/a&gt; (which sometimes requires implementing &lt;a href="https://esolangs.org/wiki/Intcode#:~:text=Intcode%20is%20an%20esoteric%20programming,%2C%2021%2C%2023%20and%2025."&gt;made-up programming languages&lt;/a&gt; in a &lt;a href="https://www.reddit.com/r/adventofcode/comments/ea8mif/2019_day_13_excel_did_you_think_i_would_give_up/"&gt;spreadsheet&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A few geniuses stick to more canonical languages/approaches, but &lt;a href="https://www.reddit.com/r/adventofcode/comments/jf03dr/2019_optimized_solutions_in_c_9_ms_total/"&gt;&lt;strong&gt;solve all 25 problems in 9ms&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Did anyone mentioned &lt;a href="https://www.youtube.com/playlist?list=PLm-JYoU3uw-aIWvjuzHk2KOQSjLQT6Ac-"&gt;Arduino&lt;/a&gt;?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;And what about Unity &lt;a href="https://www.reddit.com/r/adventofcode/comments/a6sej7/day_15_unity_visualization/"&gt;here&lt;/a&gt; or &lt;a href="https://www.reddit.com/r/adventofcode/comments/eb79s0/2019_day_10_blowing_up_asteroids_in_unity/"&gt;there&lt;/a&gt;?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But please don't let those amazing examples intimidate you, most of us solve the problems in more down-to-earth ways and just enjoy reading about other people's solutions afterwards. And of once a problem is out, you can solve whenever you find time for it, not only during that day (or year!).&lt;/p&gt;

&lt;p&gt;You can listen to &lt;a href="https://youtu.be/gibVyxpi-qA"&gt;this inspiring talk&lt;/a&gt; by Eric himself where he speaks about why he decided to organize it for the first time, the unexpected success he got the first advent day of the first year (his estimation about the number of participants was of by... 5,600% after the first 12 hours), how he keeps preparing it every year and &lt;a href="https://www.reddit.com/r/adventofcode"&gt;the amazing community&lt;/a&gt; that has arisen around it.&lt;/p&gt;

&lt;h2&gt;
  
  
  My personal Advent of Code preparation
&lt;/h2&gt;

&lt;p&gt;As stated, the beauty of Advent of Code is that each individual does it in their own way.&lt;/p&gt;

&lt;p&gt;In my case, I don't focus on competing in any leaderboards, but just having fun writing some code and trying to make it both understandable and relatively performant.&lt;/p&gt;

&lt;p&gt;I discovered AoC in 2018, and that same year while going through the problems I started creating some kind of &lt;a href="https://github.com/eduherminio/AoCHelper"&gt;'mini-framework' for solving AoC problems using .NET&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I have to admit I had almost as much fun solving the actual problems as I did writing that util, which I released in 2019 as &lt;a href="https://www.nuget.org/packages/AoCHelper/"&gt;AoCHelper NuGet library&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This year I've tried to improve AoCHelper before starting the actual problem solving, to try to focus on finding the solutions to those problems rather than on tweaking the framework, but we'll see 😉.&lt;br&gt;
&lt;strong&gt;And yeah, that has been all my 'preparation'.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In case anyone is curious about it, here you can see the entrypoint to my console app (on the left) and how all my problem classes look like (on the right).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--moXaxjto--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/tps922jtxt7u9kxh611r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--moXaxjto--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/tps922jtxt7u9kxh611r.png" alt="Personal workspace while using AoCHelper library: main program class on the left and problem class on the right"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If I name the problem classes correctly and have the input files in the right folder, I just need to invoke:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;AoCHelper&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;Solver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SolveAll&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and I'll get some output that measured the performance of each solution:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vhxUyw91--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/c4qyaaq3mwdyrh7vs8mr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vhxUyw91--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/c4qyaaq3mwdyrh7vs8mr.png" alt="Console output showing a table with the solution to multiple problems and the elapsed time that took to solve each one"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  EDIT
&lt;/h3&gt;

&lt;p&gt;I've also created &lt;a href="https://github.com/eduherminio/AdventOfCode.Template"&gt;this GitHub repository template&lt;/a&gt; to allow anyone to quickly start solving puzzles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Come join us 😏
&lt;/h2&gt;

&lt;p&gt;There are tons of tools like mine out there written in/for multiple languages, and honestly most people don't bother or care about doing anything like that, because the only thing that &lt;a href="//adventofcode.com"&gt;adventofcode.com&lt;/a&gt; needs is final solution to the problem!&lt;/p&gt;

&lt;p&gt;For the last two years &lt;a href="https://github.com/Bogdanp/awesome-advent-of-code"&gt;this repo&lt;/a&gt; has been aggregating other repositories with solutions and utilities in different languages: Python, JS, TS, Ruby, Java, C++, Ada, Clojure, Prolog and a long etc. You can go there and just have a look, or open a PR to share your own ones!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After all that wording, did I manage to convince you to challenge yourself or your classmates/friends/colleagues from December 1st?&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;PD: Feel free to share your private leaderboard code in the comments if you want other DEV users to join you there!&lt;/p&gt;

</description>
      <category>adventofcode</category>
      <category>competitiveprogramming</category>
      <category>codingpuzzle</category>
    </item>
    <item>
      <title>Rock, Paper, Scissors, Lizard, Spock</title>
      <dc:creator>Eduardo</dc:creator>
      <pubDate>Tue, 13 Oct 2020 21:32:43 +0000</pubDate>
      <link>https://dev.to/eduherminio/rock-paper-scissors-lizard-spock-44ei</link>
      <guid>https://dev.to/eduherminio/rock-paper-scissors-lizard-spock-44ei</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In &lt;a href="https://dev.to/eduherminio/rock-paper-scissors-a-mathematical-approach-33dj"&gt;my very first post&lt;/a&gt; we went through solving &lt;em&gt;Rock, Paper, Scissors&lt;/em&gt; game using a 'mathematical' approach, and that entry ended with an open question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can you find a similar, mathematical approach for &lt;a href="https://bigbangtheory.fandom.com/wiki/Rock,_Paper,_Scissors,_Lizard,_Spock"&gt;&lt;em&gt;Rock, Paper, Scissors, Lizard, Spock&lt;/em&gt;&lt;/a&gt;?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I invested no time at all in thinking about this variant until a few days ago, when &lt;a href="https://github.com/jotagarciaz"&gt;@jotagarciaz&lt;/a&gt; asked that same question to me and sparked my curiosity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Game analysis: "Lizard, Spock" or "Spock, Lizard?"
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Rock, Paper, Scissors, Lizard, Spock&lt;/em&gt; is an expansion of &lt;em&gt;Rock, Paper, Scissors&lt;/em&gt; created by &lt;a href="http://www.samkass.com/theories/RPSSL.html"&gt;Sam Kass and Karen Bryla&lt;/a&gt;.&lt;br&gt;
It was popularized by &lt;a href="https://www.youtube.com/watch?v=x5Q6-wMx-K8"&gt;&lt;em&gt;The Big Bang Theory&lt;/em&gt;&lt;/a&gt; TV series.&lt;/p&gt;

&lt;p&gt;Let's start from the original game:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Scissors cuts Paper&lt;/li&gt;
&lt;li&gt;Paper covers Rock&lt;/li&gt;
&lt;li&gt;(and as it always has) Rock crushes Scissors&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LrJBTWkr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fgdh8sy835w2orl35p33.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LrJBTWkr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fgdh8sy835w2orl35p33.png" alt="'Rock, Paper, Scissors' arrow diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Those traditional &lt;em&gt;Rock, Paper, Scissors&lt;/em&gt; rules still apply, but two new options are added to the game: Lizard and Spock.&lt;/p&gt;

&lt;p&gt;Let's introduce the simplest rules related to those new options:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Rock crushes Lizard&lt;/li&gt;
&lt;li&gt;Lizard poisons Spock&lt;/li&gt;
&lt;li&gt;Spock smashes Scissors&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7bRLOYhg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xe2jqqlztebri1zdkjyp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7bRLOYhg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xe2jqqlztebri1zdkjyp.png" alt="'Rock, Paper, Scissors, Lizard, Spock' incomplete arrow diagram with Rock → Lizard, Lizard → Spock and Spock → Scissors arrows (besides traditional Rock, Paper, Scissors arrows)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No huge surprises for now. Let's add another rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Lizard eats Paper&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qyWDFoeX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kgqm3f527kt1hzt16cb2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qyWDFoeX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kgqm3f527kt1hzt16cb2.png" alt="'Rock, Paper, Scissors, Lizard, Spock' incomplete arrow diagram with Rock → Lizard, Lizard → Spock, Spock → Scissors and Lizard → Paper arrows, with the latter one highlighted (besides traditional Rock, Paper, Scissors arrows)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can already imagine a possible pattern in the arrow diagram, which gets confirmed when adding the next one:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Spock vaporizes Rock&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YnwCmZt2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/s0axc67zmm76dvrof29t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YnwCmZt2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/s0axc67zmm76dvrof29t.png" alt="'Rock, Paper, Scissors, Lizard, Spock' incomplete arrow diagram with Rock → Lizard, Lizard → Spock, Spock → Scissors, Lizard → Paper and Spock → Rock arrows, with the latter one highlighted (besides traditional Rock, Paper, Scissors arrows)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Scissors decapitates Lizard&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7RSkted1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/f5b4led2soh78hl19lcj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7RSkted1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/f5b4led2soh78hl19lcj.png" alt="'Rock, Paper, Scissors, Lizard, Spock' incomplete arrow diagram with Rock → Lizard, Lizard → Spock, Spock → Scissors and Lizard → Paper, Spock → Rock and Scissors → Lizard arrows, with the latter one highlighted (besides traditional Rock, Paper, Scissors arrows)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Paper disproves Spock&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iDMsjNsh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/m8ohlm68vab878jv5um4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iDMsjNsh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/m8ohlm68vab878jv5um4.png" alt="'Rock, Paper, Scissors, Lizard, Spock' complete arrow diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After going through all the new rules one by one, we can conclude that there's definitely a pattern.&lt;/p&gt;

&lt;p&gt;We can also observe such pattern by reflecting those rules in a double entry table, &lt;strong&gt;providing we use &lt;em&gt;Rock, Paper, Scissors, Spock, Lizard&lt;/em&gt; order&lt;/strong&gt; (that is, swapping Lizard and Spock positions in the game's name).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LNbd00vy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/p6a4m9yzlfbnnegwl1l0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LNbd00vy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/p6a4m9yzlfbnnegwl1l0.png" alt="Double entry table comparing 'Rock, Paper, Scissors, Spock, Lizard' 'battles'"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Shocking, right? The game's most popular name is &lt;em&gt;&lt;strong&gt;Rock, Paper, Scissors, Lizard, Spock&lt;/strong&gt;&lt;/em&gt;, as that's how it appears in &lt;em&gt;The Big Bang Theory&lt;/em&gt;; but according to the acronyms used in &lt;a href="http://www.samkass.com/theories/RPSSL.html"&gt;Sam's page&lt;/a&gt;, their creators originally named it 'right' (&lt;em&gt;&lt;strong&gt;Rock, Paper, Scissors, Spock, Lizard&lt;/strong&gt;&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;I wonder how Doctor Sheldon Lee Cooper missed that!&lt;/p&gt;
&lt;h2&gt;
  
  
  Solving the game
&lt;/h2&gt;

&lt;p&gt;Once all rules are applied, we end up with this final diagram:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--m-kxXg87--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/vpx11ipcnbstcoyedhzk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--m-kxXg87--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/vpx11ipcnbstcoyedhzk.png" alt="'Rock, Paper, Scissors, Lizard, Spock' complete arrow diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Analyzing this figure and/or the table we saw above, we can write the pattern we've identified as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Any given option alternates between winning and losing against the other ones if you evaluate it following this (cyclic) order: Rock, Paper, Scissors, Spock, Lizard.&lt;/li&gt;
&lt;li&gt;The sequence starts by either losing against the next option in the list (or the first one clockwise in the diagram) or winning against the previous one (or the first one anti/counterclockwise in the diagram).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's a really solid start, but still not enough. We need some mathematical relationship to be able to transform that into code.&lt;/p&gt;

&lt;p&gt;Let's remember &lt;a href="https://dev.to/eduherminio/rock-paper-scissors-a-mathematical-approach-33dj#putting-everything-together"&gt;what we concluded for &lt;em&gt;Rock, Paper, Scissors&lt;/em&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;If both numbers are the same, no one wins&lt;/li&gt;
&lt;li&gt;If both numbers are consecutive, the bigger one wins&lt;/li&gt;
&lt;li&gt;If both numbers aren’t consecutive, the smaller one wins&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;We have to find something similar for our pattern, and that's why we added numbers to the diagram above.&lt;/p&gt;

&lt;p&gt;Let's write down some examples and try to induct a general rule that satisfies them all:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spock beats Scissors  → 4 beats 3 → &amp;gt; number wins&lt;/li&gt;
&lt;li&gt;Spock beats Rock      → 4 beats 1 → &amp;gt; number wins&lt;/li&gt;
&lt;li&gt;Paper beats Spock     → 2 beats 4 → &amp;lt; number wins&lt;/li&gt;
&lt;li&gt;Lizard beats Spock    → 5 beats 4 → &amp;gt; number wins&lt;/li&gt;
&lt;li&gt;Lizard beats Paper    → 5 beats 2 → &amp;gt; number wins&lt;/li&gt;
&lt;li&gt;Scissors beat&lt;a href="https://ell.stackexchange.com/questions/32268/scissors-cut-cuts-paper-which-is-correct/32288#32288"&gt;s&lt;/a&gt; Lizard     → 3 beats 5 → &amp;lt; number wins&lt;/li&gt;
&lt;li&gt;Rock beats Lizard     → 1 beats 5 → &amp;lt; number wins&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By carefully observing the examples, we can induct that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;If the difference between both numbers is odd, the bigger one wins&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If the difference between both numbers is even:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;If both numbers are the same, no one wins&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If both numbers are not the same, the smaller one wins&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feel free to take any other example and verify that it satisfies those statements.&lt;/p&gt;

&lt;p&gt;If we implement them using C# 8, we get the following function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;CalculateWinner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;player1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;player2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;player1&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;player2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;%&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;switch&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;player1&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;player2&lt;/span&gt;
            &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
            &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;player1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;player2&lt;/span&gt; &lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;Min&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;player1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;player2&lt;/span&gt; &lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;Max&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@"¯\_(ツ)_/¯"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When we compare it with &lt;a href="https://dev.to/eduherminio/rock-paper-scissors-a-mathematical-approach-33dj#putting-everything-together"&gt;&lt;em&gt;Rock, Paper, Scissors&lt;/em&gt; solution&lt;/a&gt;, we see that this algorithm is a generalization of the algorithm we used there, exactly how it's supposed to be, given that we're now solving an expansion of that game.&lt;/p&gt;

&lt;h2&gt;
  
  
  Console application
&lt;/h2&gt;

&lt;p&gt;Here is an example of an interactive console application that plays &lt;em&gt;Rock, Paper, Scissors, Spock, Lizard&lt;/em&gt; with us, and which is based on the previously defined algorithm.&lt;/p&gt;

&lt;p&gt;Note that this code can also be used for &lt;em&gt;Rock, Paper, Scissors&lt;/em&gt; game if we remove Spock and Lizard from &lt;code&gt;enum Item&lt;/code&gt; (line 6).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Linq&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Program&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;Item&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Rock&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Paper&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Scissors&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Spock&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Lizard&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;ItemArray&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Enum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetNames&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;Random&lt;/span&gt; &lt;span class="n"&gt;Rnd&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Random&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ticks&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="m"&gt;0x0000FFFF&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Let's play! Type '&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"', '"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ItemArray&lt;/span&gt;&lt;span class="p"&gt;[..^&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])}&lt;/span&gt;&lt;span class="s"&gt;' or '&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ItemArray&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Last&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s"&gt;'"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;Enum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;TryParse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadLine&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;Trim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'\''&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ignoreCase&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;out&lt;/span&gt; &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;humanInput&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"\tComputer says \"no\": invalid input\n"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;computerInput&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Enum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ItemArray&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Rnd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ItemArray&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;)]);&lt;/span&gt;
            &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"\tYou've chosen &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;humanInput&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;\n\tComputer has chosen &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;computerInput&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;CalculateWinner&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;humanInput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;computerInput&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="nf"&gt;PrintResultMessage&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;humanInput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;CalculateWinner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;player1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;player2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;player1&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;player2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;%&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;switch&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;player1&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;player2&lt;/span&gt;
                &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
                &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;player1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;player2&lt;/span&gt; &lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;Min&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;player1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;player2&lt;/span&gt; &lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;Max&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@"¯\_(ツ)_/¯"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;PrintResultMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;humanInput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;resultMessage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
            &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s"&gt;"It's a draw!"&lt;/span&gt;
            &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;humanInput&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s"&gt;"You win!"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"You lose!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"\t&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;resultMessage&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;\n"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also find this code &lt;a href="https://github.com/eduherminio/eduherminio.github.io/tree/master/code/2020-10-13-rock-paper-scissors-lizard-spock"&gt;here&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;I hope you've enjoyed this analysis of &lt;em&gt;Rock, Paper, Scissors, Spock, Lizard&lt;/em&gt; and/or that you've found the provided solution interesting!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>csharp</category>
      <category>dotnet</category>
      <category>math</category>
    </item>
    <item>
      <title>Waiting in Arduino III: wise methods (simple example)</title>
      <dc:creator>Eduardo</dc:creator>
      <pubDate>Wed, 30 Sep 2020 21:26:21 +0000</pubDate>
      <link>https://dev.to/eduherminio/waiting-in-arduino-iii-wise-methods-simple-example-34pl</link>
      <guid>https://dev.to/eduherminio/waiting-in-arduino-iii-wise-methods-simple-example-34pl</guid>
      <description>&lt;h2&gt;
  
  
  Introduction: changes in our laser cutting machine project
&lt;/h2&gt;

&lt;p&gt;Let's imagine we started building &lt;a href="https://dev.to/eduherminio/waiting-in-arduino-i-delay-function-is-not-your-friend-4keh#case-study"&gt;our laser cutting machine&lt;/a&gt; and just realized that the &lt;a href="https://dev.to/eduherminio/waiting-in-arduino-i-delay-function-is-not-your-friend-4keh#naive-solution-using-raw-delay-endraw-"&gt;initial state machine&lt;/a&gt; we came up with was too simple to be true:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;There's an extra state we need to take into account: the motor moving at a reduced speed before completely stopping.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Not every state lasts the same amount of time.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's a diagram of how we want our DIY project to behave with time, according to our now estimations:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QtMWWnl6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/v09sf5t6yhi8sgaogfbz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QtMWWnl6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/v09sf5t6yhi8sgaogfbz.png" alt="Simple laser cutting machine behavior diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  'Wise' methods approach
&lt;/h2&gt;

&lt;p&gt;In the previous diagram we can observe multiple different states, which we need to associate with different constants or behaviors.&lt;/p&gt;

&lt;p&gt;An approach we can use in such cases is following a &lt;strong&gt;'wise' methods pattern&lt;sup&gt;TM&lt;/sup&gt;&lt;/strong&gt;, which simply consists of using methods who are fully responsible for acting according to a given state.&lt;/p&gt;

&lt;p&gt;Some examples of those methods are, &lt;code&gt;calculate_waiting_time()&lt;/code&gt;, &lt;code&gt;do_stuff()&lt;/code&gt; and &lt;code&gt;print_message()&lt;/code&gt;: their behaviors depend on the value of &lt;code&gt;current_state&lt;/code&gt;. For instance, this is our implementation of &lt;code&gt;do_stuff()&lt;/code&gt; using &lt;code&gt;switch&lt;/code&gt; statements:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;do_stuff&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;MotorFast&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;turn_laser_off&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="n"&gt;turn_motor_fast&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;MotorSlow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;turn_motor_slow&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;LaserOn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;turn_motor_off&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="n"&gt;turn_laser_on&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nl"&gt;default:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;turn_motor_off&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="n"&gt;turn_laser_off&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;It's also worth mentioning that we handle the application state by defining &lt;code&gt;enum class State&lt;/code&gt; and storing an instance of it as a global variable (&lt;code&gt;current_state&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;next_state()&lt;/code&gt; method takes care of calculating the next state in our cycle using &lt;a href="https://www.cprogramming.com/tutorial/modulus.html"&gt;modulus operator&lt;/a&gt; and &lt;a href="https://en.cppreference.com/w/cpp/language/static_cast"&gt;&lt;code&gt;static_cast&lt;/code&gt;&lt;/a&gt;. We can use the small trick of storing the number of &lt;code&gt;enum&lt;/code&gt; elements as an element itself to keep it as close to the &lt;code&gt;enum&lt;/code&gt; as possible, with the only purpose of trying to avoid forgetting to update it if we add or remove states.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;State&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;MotorFast&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;MotorSlow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;LaserOn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

  &lt;span class="n"&gt;Total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="n"&gt;State&lt;/span&gt; &lt;span class="n"&gt;current_state&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;State&lt;/span&gt; &lt;span class="nf"&gt;next_state&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;static_cast&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="k"&gt;static_cast&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;static_cast&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Total&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Here is the complete, full implementation of our brand new laser cutting machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include "limits.h"
&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;time_motor_fast&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;time_motor_slow&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;750&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;time_laser_on&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3250&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;message_motor_fast&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"[info] Turning motor fast"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;message_motor_slow&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"[info] Turning motor slow"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;message_laser_on&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"[info] Turning motor off and laser ON"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;State&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;MotorFast&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;MotorSlow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;LaserOn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

  &lt;span class="n"&gt;Total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;saved_time&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;State&lt;/span&gt; &lt;span class="n"&gt;current_state&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9600&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;current_state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;MotorFast&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;turn_motor_fast&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;current_moment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;millis&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calculate_waiting_time&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_moment&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;saved_time&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;saved_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;current_moment&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;current_state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;next_state&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;print_message&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;do_stuff&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;stop_in_case_of_emergency&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;State&lt;/span&gt; &lt;span class="nf"&gt;next_state&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;static_cast&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="k"&gt;static_cast&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;static_cast&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Total&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="nf"&gt;calculate_waiting_time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;MotorFast&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;time_motor_fast&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;MotorSlow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;time_motor_slow&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;LaserOn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;time_laser_on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nl"&gt;default:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ULONG_MAX&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;do_stuff&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;MotorFast&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;turn_laser_off&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="n"&gt;turn_motor_fast&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;MotorSlow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;turn_motor_slow&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;LaserOn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;turn_motor_off&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="n"&gt;turn_laser_on&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nl"&gt;default:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;turn_motor_off&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="n"&gt;turn_laser_off&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;print_message&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;MotorFast&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message_motor_fast&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;MotorSlow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message_motor_slow&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;LaserOn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message_laser_on&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nl"&gt;default:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Error printing message"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;is_emergency_button_pressed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; 
  &lt;span class="c1"&gt;// Serial.println("Checking emergency button");&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;available&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Stopping due to emergency: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Please reset"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;stop_in_case_of_emergency&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;is_emergency_button_pressed&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;turn_motor_off&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;turn_laser_off&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;turn_laser_on&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"laser on"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;turn_laser_off&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"laser off"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;turn_motor_fast&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"motor fast"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;turn_motor_slow&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"motor slow"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;turn_motor_off&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"motor off"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can also find this code &lt;a href="https://github.com/eduherminio/eduherminio.github.io/tree/master/code/waiting-in-arduino/4_wise_methods_simple/4_wise_methods_simple.ino"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;As we already learned, the &lt;a href="https://dev.to/eduherminio/waiting-in-arduino-ii-millis-function-to-the-rescue-33k6"&gt;the usage of &lt;code&gt;millis()&lt;/code&gt;&lt;/a&gt; allows us to keep checking the emergency stop button very often.&lt;/p&gt;

&lt;p&gt;The combination of that technique with this 'wise' methods pattern provides us with a clear separation of concerns, allowing us to forget about states when coding/reviewing the main logic flow of the application.&lt;/p&gt;

&lt;p&gt;This helps us to have a very easy to follow logic in our &lt;code&gt;loop()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;current_moment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;millis&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calculate_waiting_time&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_moment&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;saved_time&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;saved_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;current_moment&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;current_state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;next_state&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="n"&gt;print_message&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;do_stuff&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;stop_in_case_of_emergency&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;In the next entries of this series we'll have a look at more complex examples of this 'wise' methods pattern, as well as at other alternative patterns to use in combination with &lt;code&gt;millis()&lt;/code&gt; that can be followed to achieve similar clean code.&lt;/p&gt;

</description>
      <category>arduino</category>
      <category>cpp</category>
      <category>diy</category>
    </item>
    <item>
      <title>Waiting in Arduino II: millis() function to the rescue</title>
      <dc:creator>Eduardo</dc:creator>
      <pubDate>Sun, 06 Sep 2020 21:37:41 +0000</pubDate>
      <link>https://dev.to/eduherminio/waiting-in-arduino-ii-millis-function-to-the-rescue-33k6</link>
      <guid>https://dev.to/eduherminio/waiting-in-arduino-ii-millis-function-to-the-rescue-33k6</guid>
      <description>&lt;h2&gt;
  
  
  Introduction: Blinking a LED without &lt;code&gt;delay()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;In the first post we linked to an &lt;a href="https://www.arduino.cc/en/tutorial/BlinkWithoutDelay"&gt;official Arduino tutorial&lt;/a&gt; to quote why the &lt;code&gt;delay()&lt;/code&gt; pattern wasn't mean to be used for waiting between tasks. If you fully read it back then, it probably spoiled you the alternative we're going to present in this post: using &lt;a href="https://www.arduino.cc/reference/en/language/functions/time/millis/"&gt;&lt;code&gt;millis()&lt;/code&gt; function&lt;/a&gt; instead.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;millis()&lt;/code&gt; "returns the number of milliseconds passed since the Arduino board began running the current program", so it cannot just replace &lt;code&gt;delay()&lt;/code&gt; (otherwise they would just be the same method!).&lt;/p&gt;

&lt;p&gt;Here's the pattern that can be used to replace &lt;code&gt;delay()&lt;/code&gt; with &lt;code&gt;millis()&lt;/code&gt; (which you can compare with the &lt;a href="https://dev.to/eduherminio/waiting-in-arduino-i-delay-function-is-not-your-friend-4keh#introduction-blinking-a-led"&gt;equivalent code using delay&lt;/a&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;waitingMs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// 2 seconds&lt;/span&gt;
&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;previousMillis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;ledState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LOW&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;pinMode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LED_BUILTIN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OUTPUT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;currentMillis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;millis&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;currentMillis&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;previousMillis&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;waitingMs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;previousMillis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;currentMillis&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;ledState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;ledState&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LED_BUILTIN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ledState&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can also find this code &lt;a href="https://github.com/eduherminio/eduherminio.github.io/tree/master/code/waiting-in-arduino/2_blink_led_without_delay/2_blink_led_without_delay.ino"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We create a global variable to store a certain amount of milliseconds (&lt;code&gt;previousMillis&lt;/code&gt;), which we initialize to 0.&lt;/li&gt;
&lt;li&gt;We create a global variable to store the current state of the LED (&lt;code&gt;ledState&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;In each loop iteration we invoke &lt;code&gt;millis()&lt;/code&gt; to get the number of current milliseconds and save its value to a local variable named &lt;code&gt;currentMillis&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;We compare the difference between the current number of milliseconds (&lt;code&gt;currentMillis&lt;/code&gt;) with the number of milliseconds we have saved (&lt;code&gt;previousMillis&lt;/code&gt;) to see if it is bigger than the time we wanted to wait (&lt;code&gt;waitingMs&lt;/code&gt;):

&lt;ul&gt;
&lt;li&gt;If it is, we update the global variable &lt;code&gt;previousMillis&lt;/code&gt; with the current number of milliseconds (&lt;code&gt;currentMillis&lt;/code&gt;) and perform whatever operation we were planning to (in this case, change the state of a LED: update the value of &lt;code&gt;ledState&lt;/code&gt; variable and apply it using &lt;code&gt;digitalWrite&lt;/code&gt; method).&lt;/li&gt;
&lt;li&gt;Otherwise, just continue the execution of the sketch.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Going back to our case study
&lt;/h2&gt;

&lt;p&gt;Let's get back to our &lt;a href="https://dev.to/eduherminio/waiting-in-arduino-i-delay-function-is-not-your-friend-4keh#case-study"&gt;case study&lt;/a&gt;: we want to build a simple the laser cutting machine.&lt;/p&gt;

&lt;p&gt;We identified a &lt;a href="https://dev.to/eduherminio/waiting-in-arduino-i-delay-function-is-not-your-friend-4keh#naive-solution-using-raw-delay-endraw-"&gt;first solution&lt;/a&gt; based on a fairly right state machine, but it had a main flaw: it wouldn't be able to identify immediately (or at all) when the big, round, red emergency stop button was pressed.&lt;/p&gt;

&lt;p&gt;The main issue of our first implementation was using &lt;a href="https://www.arduino.cc/reference/en/language/functions/time/delay/"&gt;&lt;code&gt;delay()&lt;/code&gt; method&lt;/a&gt;, which essentially doesn't allow us to check the emergency button as often as we would like to.&lt;/p&gt;

&lt;h2&gt;
  
  
  A solution using &lt;code&gt;millis()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Let's apply the pattern we just learned to our code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;waiting_time_ms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// 3s&lt;/span&gt;
&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;saved_moment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9600&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;current_moment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;millis&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_moment&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;saved_moment&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;waiting_time_ms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;saved_moment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;current_moment&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;        &lt;span class="c1"&gt;// 0 -&amp;gt; 1 -&amp;gt; 0 -&amp;gt; 1 -&amp;gt; 0 -&amp;gt; 1 -&amp;gt; 0 ...&lt;/span&gt;
    &lt;span class="n"&gt;do_action&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;stop_in_case_of_emergency&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// This is checked every few milliseconds&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;do_action&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;turn_laser_off&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="n"&gt;turn_motor_on&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;turn_motor_off&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="n"&gt;turn_laser_on&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;turn_laser_on&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"laser on"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;turn_laser_off&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"laser off"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;turn_motor_on&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"motor on"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;turn_motor_off&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"motor off"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;is_emergency_button_pressed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Serial.println("Checking emergency button");&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;available&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Stopping due to emergency: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Please reset"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;stop_in_case_of_emergency&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;is_emergency_button_pressed&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;turn_motor_off&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;turn_laser_off&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can also find this code &lt;a href="https://github.com/eduherminio/eduherminio.github.io/tree/master/code/waiting-in-arduino/3_basic_millis_implementation/3_basic_millis_implementation.ino"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The main functional difference between this implementation and the &lt;a href="https://dev.to/eduherminio/waiting-in-arduino-i-delay-function-is-not-your-friend-4keh#naive-solution-using-raw-delay-endraw-"&gt;&lt;code&gt;delay()&lt;/code&gt; one&lt;/a&gt; is that here each loop iteration lasts only few milliseconds (vs more than 6 seconds in the other case).&lt;/p&gt;

&lt;p&gt;Arduino performs many more operations while running this code, but after all, that's what we have it for, right? We don't pay any extra 'price'* for it.&lt;/p&gt;

&lt;p&gt;In fact, it's just the opposite: for us (makers/programmers), &lt;strong&gt;Arduino calculating the value of &lt;code&gt;millis()&lt;/code&gt; and comparing it against the content of a saved variable every few milliseconds is way more efficient than Arduino waiting in the &lt;code&gt;delay()&lt;/code&gt; method&lt;/strong&gt;, because the former one allows us to perform any other operation while 'waiting'.&lt;/p&gt;

&lt;p&gt;In general terms, this &lt;code&gt;millis()&lt;/code&gt; pattern is the approach that one should adopt if they want to level up their Arduino coding and/or use it for real life projects.&lt;/p&gt;

&lt;p&gt;There will more entries in this series exploring more complex ways of tackling this problem (so stay tuned!), but all of them rely on the mentioned &lt;code&gt;millis()&lt;/code&gt; pattern, so it's vital to assimilate that one first.&lt;/p&gt;




&lt;p&gt;* As a mere anecdote, here's the result of compiling both sketches (using &lt;a href="https://github.com/arduino/arduino-cli"&gt;arduino-cli&lt;/a&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;*&lt;/span&gt;       Compiling 1_delay_implementation
Sketch uses 3664 bytes &lt;span class="o"&gt;(&lt;/span&gt;11%&lt;span class="o"&gt;)&lt;/span&gt; of program storage space. Maximum is 32256 bytes.
Global variables use 302 bytes &lt;span class="o"&gt;(&lt;/span&gt;14%&lt;span class="o"&gt;)&lt;/span&gt; of dynamic memory, leaving 1746 bytes &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="nb"&gt;local &lt;/span&gt;variables. Maximum is 2048 bytes.
&lt;span class="k"&gt;*&lt;/span&gt;       Compiling 3_basic_millis_implementation
Sketch uses 3588 bytes &lt;span class="o"&gt;(&lt;/span&gt;11%&lt;span class="o"&gt;)&lt;/span&gt; of program storage space. Maximum is 32256 bytes.
Global variables use 282 bytes &lt;span class="o"&gt;(&lt;/span&gt;13%&lt;span class="o"&gt;)&lt;/span&gt; of dynamic memory, leaving 1766 bytes &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="nb"&gt;local &lt;/span&gt;variables. Maximum is 2048 bytes.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Using millis is slightly more efficient, storage and memory wise! Of course, it executes many more operations per second when running, but that's a price we happily pay in these kind of devices that are based on executing the same code over and over again, providing those operations take very short time!&lt;/p&gt;

</description>
      <category>arduino</category>
      <category>cpp</category>
      <category>diy</category>
    </item>
    <item>
      <title>Waiting in Arduino I: delay() function is not your friend</title>
      <dc:creator>Eduardo</dc:creator>
      <pubDate>Sun, 06 Sep 2020 21:37:19 +0000</pubDate>
      <link>https://dev.to/eduherminio/waiting-in-arduino-i-delay-function-is-not-your-friend-4keh</link>
      <guid>https://dev.to/eduherminio/waiting-in-arduino-i-delay-function-is-not-your-friend-4keh</guid>
      <description>&lt;h2&gt;
  
  
  Introduction: Blinking a LED
&lt;/h2&gt;

&lt;p&gt;Displaying &lt;a href="https://en.wikipedia.org/wiki/%22Hello,_World!%22_program"&gt;'Hello, world!'&lt;/a&gt; is usually the first thing you learn (or get taught) when you're getting familiar with a new programming language.&lt;/p&gt;

&lt;p&gt;An exception to that statement shows up when you start programming devices that aren't necessarily designed to directly print information on a screen, such as microcontrollers. That's why, &lt;strong&gt;in the case of Arduino, displaying 'Hello, world!' is effectively replaced with blinking a LED&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is typically the first Arduino program (or &lt;a href="https://www.arduino.cc/en/tutorial/sketch"&gt;sketch&lt;/a&gt;) that Arduino enthusiasts write (simpler code can be found in &lt;a href="https://www.arduino.cc/en/Tutorial/Blink"&gt;this official tutorial&lt;/a&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;waitingTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// 2 seconds&lt;/span&gt;
&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;ledState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LOW&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;pinMode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LED_BUILTIN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OUTPUT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LED_BUILTIN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ledState&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;waitingTime&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;ledState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;ledState&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can also find this code &lt;a href="https://github.com/eduherminio/eduherminio.github.io/tree/master/code/waiting-in-arduino/0_blink_led/0_blink_led.ino"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For those readers that are not well versed in Arduino (and that haven't already closed this tab), &lt;code&gt;setup()&lt;/code&gt; method is executed once (at the beginning of the program, i.e., when the Arduino board is powered on or restarted) and the &lt;code&gt;loop()&lt;/code&gt; method is executed over and over again.&lt;/p&gt;

&lt;p&gt;Which means that an Arduino board with this program loaded would execute the following instructions indefinitely:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Configures the pin where the LED is connected as output.&lt;/li&gt;
&lt;li&gt;Turns the LED on or off according to the value of &lt;code&gt;ledState&lt;/code&gt; (initially off).&lt;/li&gt;
&lt;li&gt;Waits two seconds.&lt;/li&gt;
&lt;li&gt;Updates the value of &lt;code&gt;ledState&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Goes back to step 2.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Understanding why using &lt;code&gt;delay()&lt;/code&gt; is not always a good idea
&lt;/h2&gt;

&lt;p&gt;So what's all this wording about? Is there something wrong the the blinking LED program shown above? No, absolutely no (and whoever tells you the opposite is a liar 😛). As in any other programming language, each Arduino program/sketch has a very concrete purpose, which in this case is serving as 'Hello, world!' or welcoming sample for beginners.&lt;/p&gt;

&lt;p&gt;That example uses the &lt;a href="https://www.arduino.cc/reference/en/language/functions/time/delay/"&gt;&lt;code&gt;delay()&lt;/code&gt; function&lt;/a&gt; in order to wait for things to happen for the sake of simplicity, but that's in general not a good pattern to follow.&lt;/p&gt;

&lt;p&gt;The main reason for such a hard statement is that while your Arduino board is stuck performing a &lt;code&gt;delay()&lt;/code&gt;, it cannot do (almost) anything else. In &lt;a href="https://www.arduino.cc/en/tutorial/BlinkWithoutDelay"&gt;this tutorial in Arduino official page&lt;/a&gt; that is explained with the following example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sometimes you need to do two things at once. For example you might want to blink an LED while reading a button press. In this case, you can't use &lt;code&gt;delay()&lt;/code&gt;, because Arduino pauses your program during the &lt;code&gt;delay()&lt;/code&gt;. If the button is pressed while Arduino is paused waiting for the &lt;code&gt;delay()&lt;/code&gt; to pass, your program will miss the button press.&lt;/p&gt;

&lt;p&gt;An analogy would be warming up a pizza in your microwave, and also waiting some important email. You put the pizza in the microwave and set it for 10 minutes. The analogy to using &lt;code&gt;delay()&lt;/code&gt; would be to sit in front of the microwave watching the timer count down from 10 minutes until the timer reaches zero. If the important email arrives during this time you will miss it.&lt;/p&gt;

&lt;p&gt;What you would do in real life would be to turn on the pizza, and then check your email, and then maybe do something else (that doesn't take too long!) and every so often you will come back to the microwave to see if the timer has reached zero, indicating that your pizza is done.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Another practical example can be:&lt;/p&gt;

&lt;p&gt;You have two LEDs, a red one and a green one. You want your red LED to blink every 2 seconds, and your green one every 7 seconds.&lt;/p&gt;

&lt;p&gt;If you use &lt;code&gt;delay()&lt;/code&gt; method for your green LED, how is the red LED supposed to blink every two seconds if Arduino just waits doing almost literally nothing for seven seconds?&lt;/p&gt;

&lt;p&gt;In short, &lt;strong&gt;&lt;code&gt;delay()&lt;/code&gt; function in Arduino is (generally) not your friend.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Case study
&lt;/h2&gt;

&lt;p&gt;Let's imagine that we are building a laser cutting machine as our side project and our aim is to control it using an Arduino board.&lt;/p&gt;

&lt;p&gt;We want to be able to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Move pieces towards a laser using a DC motor that powers a conveyor belt. Stop the motor when the pieces are in front the laser.&lt;/li&gt;
&lt;li&gt;Turn the laser on when the pieces are in the right position. Turn it off when the operation is complete.&lt;/li&gt;
&lt;li&gt;Be able to stop the machine using a big, red 'Emergency stop' button if needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YVfdYynH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8ndoxcu1g48h95p0jbdw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YVfdYynH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8ndoxcu1g48h95p0jbdw.jpg" alt="Conveyor belt DIY project"&gt;&lt;/a&gt;&lt;br&gt;
Conveyor belt DIY project (&lt;a href="https://www.instructables.com/id/MODULAR-PORTABLE-CONVEYOR-BELT-SPEED-CONTROL-BY-AR/"&gt;source&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Let's assume for now that it takes three seconds to move a piece from the beginning of the conveyor belt to the laser position and another three seconds to cut the piece using the laser.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;All the code that appears in this series is simplified so that it can be run without any actuators, just connecting your Arduino to your laptop, loading the sketch and looking at the serial monitor output. Pressing the emergency button can be simulated by sending anything through the serial port using Arduino's serial monitor window.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rfkAKJtx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/yybbvhlf1e0tg98ram46.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rfkAKJtx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/yybbvhlf1e0tg98ram46.PNG" alt="Simulating an emergency stop"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Naive solution: using &lt;code&gt;delay()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;After analyzing our goal, one can conclude that it can be achieved by creating a &lt;a href="https://en.wikipedia.org/wiki/Finite-state_machine"&gt;state machine&lt;/a&gt; with three different states:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;State 1: Motor on, laser off. The piece is moving through the conveyor belt.&lt;/li&gt;
&lt;li&gt;State 2: Motor off, laser on. The laser is cutting the piece.&lt;/li&gt;
&lt;li&gt;State 3: Motor off, laser off. Emergency mode (something went wrong), manual intervention is required.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9l7dKVnA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/w9agsl8j9sevnnzxaidt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9l7dKVnA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/w9agsl8j9sevnnzxaidt.png" alt="State machine"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This first implementation uses &lt;code&gt;delay()&lt;/code&gt; for handling the amount of time between states 1 and 2.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;waiting_time_ms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// 3s&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9600&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;turn_laser_off&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="n"&gt;turn_motor_on&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;waiting_time_ms&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;stop_in_case_of_emergency&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// This is checked every three seconds&lt;/span&gt;

  &lt;span class="n"&gt;turn_motor_off&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="n"&gt;turn_laser_on&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;waiting_time_ms&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;stop_in_case_of_emergency&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// This is checked every three seconds&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;turn_laser_on&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"laser on"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;turn_laser_off&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"laser off"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;turn_motor_on&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"motor on"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;turn_motor_off&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"motor off"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;is_emergency_button_pressed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Checking emergency button"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;available&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Stopping due to emergency: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Please reset"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;stop_in_case_of_emergency&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;is_emergency_button_pressed&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;turn_motor_off&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;turn_laser_off&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can also find this code &lt;a href="https://github.com/eduherminio/eduherminio.github.io/tree/master/code/waiting-in-arduino/1_delay_implementation/1_delay_implementation.ino"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The main issue with this piece of code is that when the microcontroller executes our &lt;code&gt;delay(3000)&lt;/code&gt;, it pauses the program for 3 seconds; therefore &lt;code&gt;stop_in_case_of_emergency&lt;/code&gt; method is only invoked every 3 seconds, which implies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If someone kept the emergency button pressed, our machine wouldn't immediately stop: it could take it up to 3 seconds to do it.&lt;/li&gt;
&lt;li&gt;If someone just pressed the emergency button and released it, it could be easily missed by our program if that didn't happen just before the emergency check.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jump straight to &lt;a href="https://dev.to/eduherminio/waiting-in-arduino-ii-millis-function-to-the-rescue-33k6"&gt;Waiting in Arduino II: millis() function to the rescue&lt;/a&gt; to analyze a better way of coding this.&lt;/p&gt;

</description>
      <category>arduino</category>
      <category>cpp</category>
      <category>diy</category>
    </item>
    <item>
      <title>Rock, Paper, Scissors: a mathematical approach</title>
      <dc:creator>Eduardo</dc:creator>
      <pubDate>Tue, 07 Jul 2020 12:33:55 +0000</pubDate>
      <link>https://dev.to/eduherminio/rock-paper-scissors-a-mathematical-approach-33dj</link>
      <guid>https://dev.to/eduherminio/rock-paper-scissors-a-mathematical-approach-33dj</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I'm sure all of you have played &lt;em&gt;Rock, Paper, Scissors&lt;/em&gt;, a simple hand game that is said to &lt;a href="https://en.wikipedia.org/wiki/Rock_paper_scissors#Origins"&gt;have been around for nearly 2000 years&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d-Ddq4_a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://upload.wikimedia.org/wikipedia/commons/6/67/Rock-paper-scissors.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d-Ddq4_a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://upload.wikimedia.org/wikipedia/commons/6/67/Rock-paper-scissors.svg" alt="Rock, Paper, Scissors!"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But has any of you acted as a referee in that game?&lt;br&gt;
Probably not, and that was exactly the purpose of the &lt;a href="https://contest.tuenti.net/Challenges?id=0"&gt;first problem&lt;/a&gt; of Tuenti Challenge 10 (a competitive programming contest that took place early this year): &lt;strong&gt;you had to programmatically create a referee for it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Essentially, the problem consisted of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Given a pair of inputs, each one of them being &lt;code&gt;R&lt;/code&gt; (rock), &lt;code&gt;P&lt;/code&gt; (paper) or &lt;code&gt;S&lt;/code&gt; (scissors); print either the winning one or &lt;code&gt;-&lt;/code&gt; in case of a draw, i.e.:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;for input &lt;code&gt;R S&lt;/code&gt; your program has to print &lt;code&gt;R&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;for input &lt;code&gt;P P&lt;/code&gt; your program has to print &lt;code&gt;-&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hopefully that sounds easy. What makes this challenge a good one for beginners is its simplicity: it can be easily solved with a bunch of &lt;code&gt;if/else&lt;/code&gt; statements.&lt;/p&gt;

&lt;p&gt;However, in this post we'll be exploring an alternative, 'mathematical' and hopefully more interesting approach to solve it. Let's have a look!&lt;/p&gt;
&lt;h2&gt;
  
  
  Getting analytical
&lt;/h2&gt;

&lt;p&gt;First things first, we need numbers to be able to justify the &lt;em&gt;mathematical&lt;/em&gt; word in the title of this article. Let's associate each possibility with a number:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1: Rock&lt;/li&gt;
&lt;li&gt;2: Paper&lt;/li&gt;
&lt;li&gt;3: Scissors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If we combine those numbers and the rules of the game, we get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Paper (2) covers Rock (1)&lt;/li&gt;
&lt;li&gt;Scissors (3) cut&lt;a href="https://ell.stackexchange.com/a/32288"&gt;s&lt;/a&gt; Paper (2)&lt;/li&gt;
&lt;li&gt;Rock (1) smashes Scissors (3)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What do we have here?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;[CS reader] "That's.. that's.. a circular linked list!"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Well, indeed, but we're not going down that path today. However, the key fact to observe has to do with exactly that: &lt;strong&gt;all combinations follow the same pattern&lt;/strong&gt; (big number beats small number) &lt;strong&gt;but the last one&lt;/strong&gt; (where small number beats big number).&lt;/p&gt;

&lt;p&gt;And that's a fact that remains true even if we shift the possibilities (keeping the same order) and use different, consecutive numbers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Paper (227)&lt;/li&gt;
&lt;li&gt;Scissors (228)&lt;/li&gt;
&lt;li&gt;Rock (229)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Which would leave us with&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scissors (228) beats Paper (227)&lt;/li&gt;
&lt;li&gt;Rock (229) smashes Scissors (228)&lt;/li&gt;
&lt;li&gt;Paper (227) covers Rock (229)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Spotting the difference
&lt;/h2&gt;

&lt;p&gt;Our base conclusion is that &lt;strong&gt;all combinations follow the same pattern except for one&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In order to create an algorithm that can solve our problem, the first step now is &lt;strong&gt;being able to identify that odd combination&lt;/strong&gt;, the one that doesn't follow the general rule.&lt;/p&gt;

&lt;p&gt;Let's put together our pairs of numbers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2 beats 1, 228 beats 227&lt;/li&gt;
&lt;li&gt;3 beats 2, 229 beats 228&lt;/li&gt;
&lt;li&gt;1 beats 3, 227 beats 229&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now it may be easier to spot that &lt;strong&gt;the combination that behaves differently is the one whose numbers aren't consecutive&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Putting everything together
&lt;/h2&gt;

&lt;p&gt;Let's summarize what we've got:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;If both numbers are the same, no one wins&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If both numbers are consecutive, the bigger one wins&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If both numbers aren't consecutive, the smaller one wins&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's try to put those three conditions together in code (I'm using C# 8 syntax here):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Input&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;player1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;229&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;player2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;227&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Output calculation&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;players&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;[]{&lt;/span&gt; &lt;span class="n"&gt;player1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;player2&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;winnerNumber&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;player2&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;player1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;switch&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;players&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Max&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;players&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Min&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can use the result of &lt;code&gt;Math.Abs(player2 - player1)&lt;/code&gt; in a &lt;a href="https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#switch-expressions"&gt;switch expression&lt;/a&gt; to check if the numbers are equal, consecutive or something else; and act accordingly.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;[Disappointed reader] "Hey, but hold on a second, those are numbers, not strings!"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Correct.&lt;/p&gt;

&lt;p&gt;We already know that it doesn't really matter which numbers we choose, providing they follow a given order. That allows us to get advantage of &lt;code&gt;enum&lt;/code&gt;s, which are based on integers, in the following way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Linq&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;RockPaperScissors&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Program&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;Item&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Input&lt;/span&gt;
            &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;str1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"R"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;str2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"P"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="c1"&gt;// Output calculation&lt;/span&gt;
            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;player1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;Enum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;str1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;player2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;Enum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;str2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;players&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;player1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;player2&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;player2&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;player1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
              &lt;span class="k"&gt;switch&lt;/span&gt;
              &lt;span class="p"&gt;{&lt;/span&gt;
                  &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"-"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;players&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Max&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                  &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;players&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Min&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
              &lt;span class="p"&gt;};&lt;/span&gt;

            &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Winner: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's have a look at what's exactly happening here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;We create an &lt;code&gt;enum Item&lt;/code&gt; with elements that match the strings we'll be getting as inputs. Note that we could give those elements any consecutive values (i.e., 227, 228 and 229, as we did in our example), or just let the language automatically do it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;That allows us to use &lt;code&gt;Enum.Parse()&lt;/code&gt; to get the correct &lt;code&gt;Item&lt;/code&gt; from each input, and cast them to get our numbers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We feed our algorithm with those numbers, which chooses &lt;code&gt;-&lt;/code&gt; as output if it declares the game a draw, or the string representation of whoever &lt;code&gt;Item&lt;/code&gt; has won (&lt;code&gt;R&lt;/code&gt;, &lt;code&gt;S&lt;/code&gt; or &lt;code&gt;P&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Hope you liked it!&lt;/p&gt;

&lt;p&gt;You can find &lt;a href="https://github.com/eduherminio/eduherminio.github.io/tree/master/code/2020-07-07-rock-paper-scissors"&gt;here&lt;/a&gt; the complete implementation I used for the challenge, which includes reading the data from an input file and writing the results to an output one.&lt;/p&gt;

&lt;p&gt;Now a small test for you, avid reader:&lt;/p&gt;

&lt;p&gt;Can you find a similar, mathematical approach for &lt;a href="https://bigbangtheory.fandom.com/wiki/Rock,_Paper,_Scissors,_Lizard,_Spock"&gt;Rock, Paper, Scissors, Lizard, Spock&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oH77z8Pd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://upload.wikimedia.org/wikipedia/commons/f/fe/Rock_Paper_Scissors_Lizard_Spock_en.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oH77z8Pd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://upload.wikimedia.org/wikipedia/commons/f/fe/Rock_Paper_Scissors_Lizard_Spock_en.svg" alt="Rock, Paper, Scissors, Lizard, Spock!"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>csharp</category>
      <category>dotnet</category>
      <category>math</category>
    </item>
  </channel>
</rss>
