<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>/devices/pseudo/bitbucket@0,0:pseudo (Posts about live programming)</title><link>https://www.jmcpdotcom.com/blog/</link><description></description><atom:link href="https://www.jmcpdotcom.com/blog/categories/live-programming.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2022 &lt;a href="mailto:blogadmin@jmcpdotcom.com"&gt;jmcp&lt;/a&gt; </copyright><lastBuildDate>Thu, 21 Apr 2022 02:58:35 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>An unexpected live coding challenge</title><link>https://www.jmcpdotcom.com/blog/posts/2021-05-09-live-coding-challenge/</link><dc:creator>jmcp</dc:creator><description>&lt;p&gt;A few weeks ago I was in a technical interview, and was asked to do a live coding challenge. I was surprised,
because this is the sort of thing that I expect a recruiter and hiring manager to mention ahead of time. Preparation
is very important, and while I know that there are many people for whom live coding is a thrill, there are plenty of
other people for whom it can be a terrifying experience.&lt;/p&gt;
&lt;p&gt;I'm glad to say that I'm not terrified by it, but it's definitely not an ideal environment for me.&lt;/p&gt;
&lt;p&gt;So after a few minutes of me describing what I've done in my career (it seemed pretty clear that the interviewer
hadn't actually read my resume), and a few technical questions, we got into the challenge.&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a id="rest_code_94c4ab25a06341f9af9f82a2930d9494-1" name="rest_code_94c4ab25a06341f9af9f82a2930d9494-1"&gt;&lt;/a&gt;&lt;span class="sd"&gt;"""&lt;/span&gt;
&lt;a id="rest_code_94c4ab25a06341f9af9f82a2930d9494-2" name="rest_code_94c4ab25a06341f9af9f82a2930d9494-2"&gt;&lt;/a&gt;&lt;span class="sd"&gt;For a given string composed of parenthesis ("(", "{", "["), check if the string is valid parenthesis.&lt;/span&gt;
&lt;a id="rest_code_94c4ab25a06341f9af9f82a2930d9494-3" name="rest_code_94c4ab25a06341f9af9f82a2930d9494-3"&gt;&lt;/a&gt;&lt;span class="sd"&gt;1. "()" -- valid&lt;/span&gt;
&lt;a id="rest_code_94c4ab25a06341f9af9f82a2930d9494-4" name="rest_code_94c4ab25a06341f9af9f82a2930d9494-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;2. "({})" -- valid&lt;/span&gt;
&lt;a id="rest_code_94c4ab25a06341f9af9f82a2930d9494-5" name="rest_code_94c4ab25a06341f9af9f82a2930d9494-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;3. "(}{)" -- invalid&lt;/span&gt;
&lt;a id="rest_code_94c4ab25a06341f9af9f82a2930d9494-6" name="rest_code_94c4ab25a06341f9af9f82a2930d9494-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;4. "{()}[{}]" -- valid&lt;/span&gt;
&lt;a id="rest_code_94c4ab25a06341f9af9f82a2930d9494-7" name="rest_code_94c4ab25a06341f9af9f82a2930d9494-7"&gt;&lt;/a&gt;&lt;span class="sd"&gt;5. "({(}))" -- invalid&lt;/span&gt;
&lt;a id="rest_code_94c4ab25a06341f9af9f82a2930d9494-8" name="rest_code_94c4ab25a06341f9af9f82a2930d9494-8"&gt;&lt;/a&gt;&lt;span class="sd"&gt;"""&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;I noted immediately that this is an issue which requires the processing function to track state, because you not
only need to determine open and closed pairings, but also what &lt;em&gt;type&lt;/em&gt; it is.&lt;/p&gt;
&lt;p&gt;It took a minute to sketch out the classifications that I needed, talking through my decision process all the while:&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a id="rest_code_3a321313d6c24950987b2691da17d836-1" name="rest_code_3a321313d6c24950987b2691da17d836-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;OPENS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"("&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"{"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"["&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_3a321313d6c24950987b2691da17d836-2" name="rest_code_3a321313d6c24950987b2691da17d836-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;CLOSES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;")"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"]"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_3a321313d6c24950987b2691da17d836-3" name="rest_code_3a321313d6c24950987b2691da17d836-3"&gt;&lt;/a&gt;
&lt;a id="rest_code_3a321313d6c24950987b2691da17d836-4" name="rest_code_3a321313d6c24950987b2691da17d836-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;braces&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"{"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"}"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_3a321313d6c24950987b2691da17d836-5" name="rest_code_3a321313d6c24950987b2691da17d836-5"&gt;&lt;/a&gt;&lt;span class="n"&gt;parens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"("&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;")"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_3a321313d6c24950987b2691da17d836-6" name="rest_code_3a321313d6c24950987b2691da17d836-6"&gt;&lt;/a&gt;&lt;span class="n"&gt;brackets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"["&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"]"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_3a321313d6c24950987b2691da17d836-7" name="rest_code_3a321313d6c24950987b2691da17d836-7"&gt;&lt;/a&gt;
&lt;a id="rest_code_3a321313d6c24950987b2691da17d836-8" name="rest_code_3a321313d6c24950987b2691da17d836-8"&gt;&lt;/a&gt;&lt;span class="n"&gt;classes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"braces"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;braces&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_3a321313d6c24950987b2691da17d836-9" name="rest_code_3a321313d6c24950987b2691da17d836-9"&gt;&lt;/a&gt;            &lt;span class="s2"&gt;"parens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;parens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_3a321313d6c24950987b2691da17d836-10" name="rest_code_3a321313d6c24950987b2691da17d836-10"&gt;&lt;/a&gt;            &lt;span class="s2"&gt;"brackets"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;brackets&lt;/span&gt;
&lt;a id="rest_code_3a321313d6c24950987b2691da17d836-11" name="rest_code_3a321313d6c24950987b2691da17d836-11"&gt;&lt;/a&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;I was able to stub out a check function pretty quickly, but got stuck when I went from the stub to implementation,
because I realised that I needed to keep track of what the previous element in the string was.&lt;/p&gt;
&lt;p&gt;Oh no! How do I do that? (A stack, btw)&lt;/p&gt;
&lt;p&gt;Mental blank :(&lt;/p&gt;
&lt;p&gt;I needed time to jog my memory, so I asked the interviewer to tell me about himself, what he
does on the team and a few other questions.&lt;/p&gt;
&lt;p&gt;This, I think, was a very good decision - with the focus of the interview &lt;em&gt;not&lt;/em&gt; on me, I could step back and
think about what basic data types in &lt;a class="reference external" href="https://www.python.org"&gt;Python&lt;/a&gt; I could use to implement a stack.&lt;/p&gt;
&lt;p&gt;The data type I needed is indeed pretty basic: a &lt;strong&gt;list()&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A &lt;a class="reference external" href="https://www.python.org"&gt;Python&lt;/a&gt; list() lets you push (the append() operation) and pop so with the addition of another data
structure&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a id="rest_code_0b9a9725e60347e6a14edd191169b9ca-1" name="rest_code_0b9a9725e60347e6a14edd191169b9ca-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;counts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"braces"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_0b9a9725e60347e6a14edd191169b9ca-2" name="rest_code_0b9a9725e60347e6a14edd191169b9ca-2"&gt;&lt;/a&gt;           &lt;span class="s2"&gt;"parens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_0b9a9725e60347e6a14edd191169b9ca-3" name="rest_code_0b9a9725e60347e6a14edd191169b9ca-3"&gt;&lt;/a&gt;           &lt;span class="s2"&gt;"brackets"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;a id="rest_code_0b9a9725e60347e6a14edd191169b9ca-4" name="rest_code_0b9a9725e60347e6a14edd191169b9ca-4"&gt;&lt;/a&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;and a short function to return the class of the element&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a id="rest_code_525b4f4fa7894bc7b819cb0174177f57-1" name="rest_code_525b4f4fa7894bc7b819cb0174177f57-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__classof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a id="rest_code_525b4f4fa7894bc7b819cb0174177f57-2" name="rest_code_525b4f4fa7894bc7b819cb0174177f57-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;""" returns whether 'c' is in brackets, braces or parens """&lt;/span&gt;
&lt;a id="rest_code_525b4f4fa7894bc7b819cb0174177f57-3" name="rest_code_525b4f4fa7894bc7b819cb0174177f57-3"&gt;&lt;/a&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;braces&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_525b4f4fa7894bc7b819cb0174177f57-4" name="rest_code_525b4f4fa7894bc7b819cb0174177f57-4"&gt;&lt;/a&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;"braces"&lt;/span&gt;
&lt;a id="rest_code_525b4f4fa7894bc7b819cb0174177f57-5" name="rest_code_525b4f4fa7894bc7b819cb0174177f57-5"&gt;&lt;/a&gt;    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;brackets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_525b4f4fa7894bc7b819cb0174177f57-6" name="rest_code_525b4f4fa7894bc7b819cb0174177f57-6"&gt;&lt;/a&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;"brackets"&lt;/span&gt;
&lt;a id="rest_code_525b4f4fa7894bc7b819cb0174177f57-7" name="rest_code_525b4f4fa7894bc7b819cb0174177f57-7"&gt;&lt;/a&gt;    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_525b4f4fa7894bc7b819cb0174177f57-8" name="rest_code_525b4f4fa7894bc7b819cb0174177f57-8"&gt;&lt;/a&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;"parens"&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;we're now in a much better position for the algorithm.&lt;/p&gt;
&lt;p&gt;By this time I had also calmed myself down, because everything came together pretty easily for me.&lt;/p&gt;
&lt;p&gt;With the above code blocks already noted, here is the body of the function:&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a id="rest_code_942deeba85214e24a7b424686a56f4e6-1" name="rest_code_942deeba85214e24a7b424686a56f4e6-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check_valid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a id="rest_code_942deeba85214e24a7b424686a56f4e6-2" name="rest_code_942deeba85214e24a7b424686a56f4e6-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;""" For the given examples at top, determine validity.&lt;/span&gt;
&lt;a id="rest_code_942deeba85214e24a7b424686a56f4e6-3" name="rest_code_942deeba85214e24a7b424686a56f4e6-3"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        Assumption: the input is _only_ braces, parens and brackets&lt;/span&gt;
&lt;a id="rest_code_942deeba85214e24a7b424686a56f4e6-4" name="rest_code_942deeba85214e24a7b424686a56f4e6-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a id="rest_code_942deeba85214e24a7b424686a56f4e6-5" name="rest_code_942deeba85214e24a7b424686a56f4e6-5"&gt;&lt;/a&gt;
&lt;a id="rest_code_942deeba85214e24a7b424686a56f4e6-6" name="rest_code_942deeba85214e24a7b424686a56f4e6-6"&gt;&lt;/a&gt;    &lt;span class="c1"&gt;# start&lt;/span&gt;
&lt;a id="rest_code_942deeba85214e24a7b424686a56f4e6-7" name="rest_code_942deeba85214e24a7b424686a56f4e6-7"&gt;&lt;/a&gt;    &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_942deeba85214e24a7b424686a56f4e6-8" name="rest_code_942deeba85214e24a7b424686a56f4e6-8"&gt;&lt;/a&gt;
&lt;a id="rest_code_942deeba85214e24a7b424686a56f4e6-9" name="rest_code_942deeba85214e24a7b424686a56f4e6-9"&gt;&lt;/a&gt;    &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a id="rest_code_942deeba85214e24a7b424686a56f4e6-10" name="rest_code_942deeba85214e24a7b424686a56f4e6-10"&gt;&lt;/a&gt;    &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_942deeba85214e24a7b424686a56f4e6-11" name="rest_code_942deeba85214e24a7b424686a56f4e6-11"&gt;&lt;/a&gt;
&lt;a id="rest_code_942deeba85214e24a7b424686a56f4e6-12" name="rest_code_942deeba85214e24a7b424686a56f4e6-12"&gt;&lt;/a&gt;    &lt;span class="n"&gt;counts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;__classof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&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;a id="rest_code_942deeba85214e24a7b424686a56f4e6-13" name="rest_code_942deeba85214e24a7b424686a56f4e6-13"&gt;&lt;/a&gt;
&lt;a id="rest_code_942deeba85214e24a7b424686a56f4e6-14" name="rest_code_942deeba85214e24a7b424686a56f4e6-14"&gt;&lt;/a&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]:&lt;/span&gt;
&lt;a id="rest_code_942deeba85214e24a7b424686a56f4e6-15" name="rest_code_942deeba85214e24a7b424686a56f4e6-15"&gt;&lt;/a&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;OPENS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_942deeba85214e24a7b424686a56f4e6-16" name="rest_code_942deeba85214e24a7b424686a56f4e6-16"&gt;&lt;/a&gt;            &lt;span class="c1"&gt;## increment count &amp;amp; add to stack&lt;/span&gt;
&lt;a id="rest_code_942deeba85214e24a7b424686a56f4e6-17" name="rest_code_942deeba85214e24a7b424686a56f4e6-17"&gt;&lt;/a&gt;            &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_942deeba85214e24a7b424686a56f4e6-18" name="rest_code_942deeba85214e24a7b424686a56f4e6-18"&gt;&lt;/a&gt;            &lt;span class="n"&gt;counts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;__classof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&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;a id="rest_code_942deeba85214e24a7b424686a56f4e6-19" name="rest_code_942deeba85214e24a7b424686a56f4e6-19"&gt;&lt;/a&gt;        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_942deeba85214e24a7b424686a56f4e6-20" name="rest_code_942deeba85214e24a7b424686a56f4e6-20"&gt;&lt;/a&gt;            &lt;span class="c1"&gt;## closing checks&lt;/span&gt;
&lt;a id="rest_code_942deeba85214e24a7b424686a56f4e6-21" name="rest_code_942deeba85214e24a7b424686a56f4e6-21"&gt;&lt;/a&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__classof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt;  &lt;span class="n"&gt;__classof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stack&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;a id="rest_code_942deeba85214e24a7b424686a56f4e6-22" name="rest_code_942deeba85214e24a7b424686a56f4e6-22"&gt;&lt;/a&gt;                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;"invalid"&lt;/span&gt;
&lt;a id="rest_code_942deeba85214e24a7b424686a56f4e6-23" name="rest_code_942deeba85214e24a7b424686a56f4e6-23"&gt;&lt;/a&gt;            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_942deeba85214e24a7b424686a56f4e6-24" name="rest_code_942deeba85214e24a7b424686a56f4e6-24"&gt;&lt;/a&gt;                &lt;span class="c1"&gt;# decrement count_ (__classof(c))&lt;/span&gt;
&lt;a id="rest_code_942deeba85214e24a7b424686a56f4e6-25" name="rest_code_942deeba85214e24a7b424686a56f4e6-25"&gt;&lt;/a&gt;                &lt;span class="n"&gt;counts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;__classof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&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;a id="rest_code_942deeba85214e24a7b424686a56f4e6-26" name="rest_code_942deeba85214e24a7b424686a56f4e6-26"&gt;&lt;/a&gt;                &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a id="rest_code_942deeba85214e24a7b424686a56f4e6-27" name="rest_code_942deeba85214e24a7b424686a56f4e6-27"&gt;&lt;/a&gt;
&lt;a id="rest_code_942deeba85214e24a7b424686a56f4e6-28" name="rest_code_942deeba85214e24a7b424686a56f4e6-28"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;"valid"&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;We're playing fast and loose here with input validity checking - there's no "is this an empty string?" and we're not
handling a single-character string, let alone validating that our input &lt;em&gt;only&lt;/em&gt; contains braces, parens and brackets.&lt;/p&gt;
&lt;p&gt;With this main() function, though, we're doing pretty well:&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a id="rest_code_1cde50fce4e045918e3d624351ad3ce1-1" name="rest_code_1cde50fce4e045918e3d624351ad3ce1-1"&gt;&lt;/a&gt;&lt;span class="c1"&gt;## main&lt;/span&gt;
&lt;a id="rest_code_1cde50fce4e045918e3d624351ad3ce1-2" name="rest_code_1cde50fce4e045918e3d624351ad3ce1-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;strings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"""()"""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_1cde50fce4e045918e3d624351ad3ce1-3" name="rest_code_1cde50fce4e045918e3d624351ad3ce1-3"&gt;&lt;/a&gt;           &lt;span class="sd"&gt;"""({})"""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_1cde50fce4e045918e3d624351ad3ce1-4" name="rest_code_1cde50fce4e045918e3d624351ad3ce1-4"&gt;&lt;/a&gt;           &lt;span class="sd"&gt;"""(}{)"""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_1cde50fce4e045918e3d624351ad3ce1-5" name="rest_code_1cde50fce4e045918e3d624351ad3ce1-5"&gt;&lt;/a&gt;           &lt;span class="sd"&gt;"""{()}[{}]"""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_1cde50fce4e045918e3d624351ad3ce1-6" name="rest_code_1cde50fce4e045918e3d624351ad3ce1-6"&gt;&lt;/a&gt;           &lt;span class="sd"&gt;"""({(}))"""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_1cde50fce4e045918e3d624351ad3ce1-7" name="rest_code_1cde50fce4e045918e3d624351ad3ce1-7"&gt;&lt;/a&gt;           &lt;span class="sd"&gt;"""](){}"""&lt;/span&gt;
&lt;a id="rest_code_1cde50fce4e045918e3d624351ad3ce1-8" name="rest_code_1cde50fce4e045918e3d624351ad3ce1-8"&gt;&lt;/a&gt;           &lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_1cde50fce4e045918e3d624351ad3ce1-9" name="rest_code_1cde50fce4e045918e3d624351ad3ce1-9"&gt;&lt;/a&gt;
&lt;a id="rest_code_1cde50fce4e045918e3d624351ad3ce1-10" name="rest_code_1cde50fce4e045918e3d624351ad3ce1-10"&gt;&lt;/a&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_1cde50fce4e045918e3d624351ad3ce1-11" name="rest_code_1cde50fce4e045918e3d624351ad3ce1-11"&gt;&lt;/a&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"""&lt;/span&gt;&lt;span class="si"&gt;{element:20}&lt;/span&gt;&lt;span class="s2"&gt;"""&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_1cde50fce4e045918e3d624351ad3ce1-12" name="rest_code_1cde50fce4e045918e3d624351ad3ce1-12"&gt;&lt;/a&gt;          &lt;span class="n"&gt;check_valid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;which gives us the following output:&lt;/p&gt;
&lt;pre class="code shell"&gt;&lt;a id="rest_code_a75a37f51bc54d8d84ed5627e9a5196d-1" name="rest_code_a75a37f51bc54d8d84ed5627e9a5196d-1"&gt;&lt;/a&gt;&lt;span class="o"&gt;()&lt;/span&gt;                   valid
&lt;a id="rest_code_a75a37f51bc54d8d84ed5627e9a5196d-2" name="rest_code_a75a37f51bc54d8d84ed5627e9a5196d-2"&gt;&lt;/a&gt;&lt;span class="o"&gt;({})&lt;/span&gt;                 valid
&lt;a id="rest_code_a75a37f51bc54d8d84ed5627e9a5196d-3" name="rest_code_a75a37f51bc54d8d84ed5627e9a5196d-3"&gt;&lt;/a&gt;&lt;span class="o"&gt;(}{)&lt;/span&gt;                 invalid
&lt;a id="rest_code_a75a37f51bc54d8d84ed5627e9a5196d-4" name="rest_code_a75a37f51bc54d8d84ed5627e9a5196d-4"&gt;&lt;/a&gt;&lt;span class="o"&gt;{()}[{}]&lt;/span&gt;             valid
&lt;a id="rest_code_a75a37f51bc54d8d84ed5627e9a5196d-5" name="rest_code_a75a37f51bc54d8d84ed5627e9a5196d-5"&gt;&lt;/a&gt;&lt;span class="o"&gt;({(}))&lt;/span&gt;               invalid
&lt;a id="rest_code_a75a37f51bc54d8d84ed5627e9a5196d-6" name="rest_code_a75a37f51bc54d8d84ed5627e9a5196d-6"&gt;&lt;/a&gt;&lt;span class="o"&gt;](){}&lt;/span&gt;                valid
&lt;/pre&gt;&lt;p&gt;Using the criteria specified, the final case is invalid, given that it starts with a terminating rather
than initiating/opening element - there's nothing to balance the element with. However at that point my
time was up and I didn't worry about it.&lt;/p&gt;
&lt;p&gt;My interviewer then asked whether I had considered using recursion to solve the problem.&lt;/p&gt;
&lt;p&gt;I hadn't considered recursion because I generally don't have to for the use-cases I need to write - and
in this particular problem space it didn't seem to me to be an effective use of resources.&lt;/p&gt;
&lt;p&gt;Consider the longest case, &lt;strong&gt;{()}[{}]&lt;/strong&gt;. If you're recursing on the check function, then you'll wind
up calling the function four times, so that's four new stack frames to be created and destroyed. That
doesn't strike me as particularly efficient in time or space. Iterating over the input, however,
avoids all of the setup + teardown overhead.&lt;/p&gt;
&lt;p&gt;Anyway, it was a relatively fun exercise, and I'm glad I did it. I was able to keep a cool head and
buy myself enough time to jog my memory and finish the problem, and it worked the first time (I know,
that _never_ happens!).&lt;/p&gt;
&lt;p&gt;For future encounters like this, I think it's handy to remember these points:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Breathe&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Talk through what you are doing, &lt;em&gt;and why&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you hit a problem, see point 1, and then say that you're stuck and need to think through a particular part of the issue.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you need to &lt;em&gt;stop talking&lt;/em&gt; so you can think, say that that's what you need to do.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It is my impression that if your interviewer is a decent person, they will help you work through
your point of stuckness so that you can complete as much as possible of the task.&lt;/p&gt;
&lt;!-- put references after this point --&gt;</description><category>live programming</category><category>programming</category><category>Python</category><category>software engineering</category><guid>https://www.jmcpdotcom.com/blog/posts/2021-05-09-live-coding-challenge/</guid><pubDate>Sat, 08 May 2021 16:00:00 GMT</pubDate></item></channel></rss>