Created
October 14, 2019 17:32
-
-
Save togakangaroo/d00002a7ab395e67f3249da4c6ef5aa4 to your computer and use it in GitHub Desktop.
an example of doing an op-code #daily-programmer challenge with literate coding
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="utf-8"?> | |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> | |
<head> | |
<!-- 2019-10-14 Mon 12:29 --> | |
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> | |
<meta name="viewport" content="width=device-width, initial-scale=1" /> | |
<title>‎</title> | |
<meta name="generator" content="Org mode" /> | |
<meta name="author" content="George Mauer" /> | |
<style type="text/css"> | |
<!--/*--><![CDATA[/*><!--*/ | |
.title { text-align: center; | |
margin-bottom: .2em; } | |
.subtitle { text-align: center; | |
font-size: medium; | |
font-weight: bold; | |
margin-top:0; } | |
.todo { font-family: monospace; color: red; } | |
.done { font-family: monospace; color: green; } | |
.priority { font-family: monospace; color: orange; } | |
.tag { background-color: #eee; font-family: monospace; | |
padding: 2px; font-size: 80%; font-weight: normal; } | |
.timestamp { color: #bebebe; } | |
.timestamp-kwd { color: #5f9ea0; } | |
.org-right { margin-left: auto; margin-right: 0px; text-align: right; } | |
.org-left { margin-left: 0px; margin-right: auto; text-align: left; } | |
.org-center { margin-left: auto; margin-right: auto; text-align: center; } | |
.underline { text-decoration: underline; } | |
#postamble p, #preamble p { font-size: 90%; margin: .2em; } | |
p.verse { margin-left: 3%; } | |
pre { | |
border: 1px solid #ccc; | |
box-shadow: 3px 3px 3px #eee; | |
padding: 8pt; | |
font-family: monospace; | |
overflow: auto; | |
margin: 1.2em; | |
} | |
pre.src { | |
position: relative; | |
overflow: visible; | |
padding-top: 1.2em; | |
} | |
pre.src:before { | |
display: none; | |
position: absolute; | |
background-color: white; | |
top: -10px; | |
right: 10px; | |
padding: 3px; | |
border: 1px solid black; | |
} | |
pre.src:hover:before { display: inline;} | |
/* Languages per Org manual */ | |
pre.src-asymptote:before { content: 'Asymptote'; } | |
pre.src-awk:before { content: 'Awk'; } | |
pre.src-C:before { content: 'C'; } | |
/* pre.src-C++ doesn't work in CSS */ | |
pre.src-clojure:before { content: 'Clojure'; } | |
pre.src-css:before { content: 'CSS'; } | |
pre.src-D:before { content: 'D'; } | |
pre.src-ditaa:before { content: 'ditaa'; } | |
pre.src-dot:before { content: 'Graphviz'; } | |
pre.src-calc:before { content: 'Emacs Calc'; } | |
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; } | |
pre.src-fortran:before { content: 'Fortran'; } | |
pre.src-gnuplot:before { content: 'gnuplot'; } | |
pre.src-haskell:before { content: 'Haskell'; } | |
pre.src-hledger:before { content: 'hledger'; } | |
pre.src-java:before { content: 'Java'; } | |
pre.src-js:before { content: 'Javascript'; } | |
pre.src-latex:before { content: 'LaTeX'; } | |
pre.src-ledger:before { content: 'Ledger'; } | |
pre.src-lisp:before { content: 'Lisp'; } | |
pre.src-lilypond:before { content: 'Lilypond'; } | |
pre.src-lua:before { content: 'Lua'; } | |
pre.src-matlab:before { content: 'MATLAB'; } | |
pre.src-mscgen:before { content: 'Mscgen'; } | |
pre.src-ocaml:before { content: 'Objective Caml'; } | |
pre.src-octave:before { content: 'Octave'; } | |
pre.src-org:before { content: 'Org mode'; } | |
pre.src-oz:before { content: 'OZ'; } | |
pre.src-plantuml:before { content: 'Plantuml'; } | |
pre.src-processing:before { content: 'Processing.js'; } | |
pre.src-python:before { content: 'Python'; } | |
pre.src-R:before { content: 'R'; } | |
pre.src-ruby:before { content: 'Ruby'; } | |
pre.src-sass:before { content: 'Sass'; } | |
pre.src-scheme:before { content: 'Scheme'; } | |
pre.src-screen:before { content: 'Gnu Screen'; } | |
pre.src-sed:before { content: 'Sed'; } | |
pre.src-sh:before { content: 'shell'; } | |
pre.src-sql:before { content: 'SQL'; } | |
pre.src-sqlite:before { content: 'SQLite'; } | |
/* additional languages in org.el's org-babel-load-languages alist */ | |
pre.src-forth:before { content: 'Forth'; } | |
pre.src-io:before { content: 'IO'; } | |
pre.src-J:before { content: 'J'; } | |
pre.src-makefile:before { content: 'Makefile'; } | |
pre.src-maxima:before { content: 'Maxima'; } | |
pre.src-perl:before { content: 'Perl'; } | |
pre.src-picolisp:before { content: 'Pico Lisp'; } | |
pre.src-scala:before { content: 'Scala'; } | |
pre.src-shell:before { content: 'Shell Script'; } | |
pre.src-ebnf2ps:before { content: 'ebfn2ps'; } | |
/* additional language identifiers per "defun org-babel-execute" | |
in ob-*.el */ | |
pre.src-cpp:before { content: 'C++'; } | |
pre.src-abc:before { content: 'ABC'; } | |
pre.src-coq:before { content: 'Coq'; } | |
pre.src-groovy:before { content: 'Groovy'; } | |
/* additional language identifiers from org-babel-shell-names in | |
ob-shell.el: ob-shell is the only babel language using a lambda to put | |
the execution function name together. */ | |
pre.src-bash:before { content: 'bash'; } | |
pre.src-csh:before { content: 'csh'; } | |
pre.src-ash:before { content: 'ash'; } | |
pre.src-dash:before { content: 'dash'; } | |
pre.src-ksh:before { content: 'ksh'; } | |
pre.src-mksh:before { content: 'mksh'; } | |
pre.src-posh:before { content: 'posh'; } | |
/* Additional Emacs modes also supported by the LaTeX listings package */ | |
pre.src-ada:before { content: 'Ada'; } | |
pre.src-asm:before { content: 'Assembler'; } | |
pre.src-caml:before { content: 'Caml'; } | |
pre.src-delphi:before { content: 'Delphi'; } | |
pre.src-html:before { content: 'HTML'; } | |
pre.src-idl:before { content: 'IDL'; } | |
pre.src-mercury:before { content: 'Mercury'; } | |
pre.src-metapost:before { content: 'MetaPost'; } | |
pre.src-modula-2:before { content: 'Modula-2'; } | |
pre.src-pascal:before { content: 'Pascal'; } | |
pre.src-ps:before { content: 'PostScript'; } | |
pre.src-prolog:before { content: 'Prolog'; } | |
pre.src-simula:before { content: 'Simula'; } | |
pre.src-tcl:before { content: 'tcl'; } | |
pre.src-tex:before { content: 'TeX'; } | |
pre.src-plain-tex:before { content: 'Plain TeX'; } | |
pre.src-verilog:before { content: 'Verilog'; } | |
pre.src-vhdl:before { content: 'VHDL'; } | |
pre.src-xml:before { content: 'XML'; } | |
pre.src-nxml:before { content: 'XML'; } | |
/* add a generic configuration mode; LaTeX export needs an additional | |
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */ | |
pre.src-conf:before { content: 'Configuration File'; } | |
table { border-collapse:collapse; } | |
caption.t-above { caption-side: top; } | |
caption.t-bottom { caption-side: bottom; } | |
td, th { vertical-align:top; } | |
th.org-right { text-align: center; } | |
th.org-left { text-align: center; } | |
th.org-center { text-align: center; } | |
td.org-right { text-align: right; } | |
td.org-left { text-align: left; } | |
td.org-center { text-align: center; } | |
dt { font-weight: bold; } | |
.footpara { display: inline; } | |
.footdef { margin-bottom: 1em; } | |
.figure { padding: 1em; } | |
.figure p { text-align: center; } | |
.inlinetask { | |
padding: 10px; | |
border: 2px solid gray; | |
margin: 10px; | |
background: #ffffcc; | |
} | |
#org-div-home-and-up | |
{ text-align: right; font-size: 70%; white-space: nowrap; } | |
textarea { overflow-x: auto; } | |
.linenr { font-size: smaller } | |
.code-highlighted { background-color: #ffff00; } | |
.org-info-js_info-navigation { border-style: none; } | |
#org-info-js_console-label | |
{ font-size: 10px; font-weight: bold; white-space: nowrap; } | |
.org-info-js_search-highlight | |
{ background-color: #ffff00; color: #000000; font-weight: bold; } | |
.org-svg { width: 90%; } | |
/*]]>*/--> | |
</style> | |
<script type="text/javascript"> | |
/* | |
@licstart The following is the entire license notice for the | |
JavaScript code in this tag. | |
Copyright (C) 2012-2018 Free Software Foundation, Inc. | |
The JavaScript code in this tag is free software: you can | |
redistribute it and/or modify it under the terms of the GNU | |
General Public License (GNU GPL) as published by the Free Software | |
Foundation, either version 3 of the License, or (at your option) | |
any later version. The code is distributed WITHOUT ANY WARRANTY; | |
without even the implied warranty of MERCHANTABILITY or FITNESS | |
FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. | |
As additional permission under GNU GPL version 3 section 7, you | |
may distribute non-source (e.g., minimized or compacted) forms of | |
that code without the copy of the GNU GPL normally required by | |
section 4, provided you include this license notice and a URL | |
through which recipients can access the Corresponding Source. | |
@licend The above is the entire license notice | |
for the JavaScript code in this tag. | |
*/ | |
<!--/*--><![CDATA[/*><!--*/ | |
function CodeHighlightOn(elem, id) | |
{ | |
var target = document.getElementById(id); | |
if(null != target) { | |
elem.cacheClassElem = elem.className; | |
elem.cacheClassTarget = target.className; | |
target.className = "code-highlighted"; | |
elem.className = "code-highlighted"; | |
} | |
} | |
function CodeHighlightOff(elem, id) | |
{ | |
var target = document.getElementById(id); | |
if(elem.cacheClassElem) | |
elem.className = elem.cacheClassElem; | |
if(elem.cacheClassTarget) | |
target.className = elem.cacheClassTarget; | |
} | |
/*]]>*///--> | |
</script> | |
</head> | |
<body> | |
<div id="content"> | |
<div id="table-of-contents"> | |
<h2>Table of Contents</h2> | |
<div id="text-table-of-contents"> | |
<ul> | |
<li><a href="#org9610dd0">1. Greatest Common Divisor of Strings</a> | |
<ul> | |
<li><a href="#org86c1d76">1.1. Visulaize moving thorugh <code>examples[1]</code></a></li> | |
<li><a href="#org1b8699c">1.2. Visualize moving through <code>examples[2]</code></a></li> | |
</ul> | |
</li> | |
<li><a href="#orgc7e5e8e">2. Back to the solution</a></li> | |
</ul> | |
</div> | |
</div> | |
<div id="outline-container-org9610dd0" class="outline-2"> | |
<h2 id="org9610dd0"><span class="section-number-2">1</span> Greatest Common Divisor of Strings</h2> | |
<div class="outline-text-2" id="text-1"> | |
<p> | |
From the <a href="https://operation-code.slack.com/archives/C7JMZ5LAV/p1571058063006200">Operation Code Slack</a> | |
</p> | |
<p> | |
Problem statement: | |
</p> | |
<div class="org-src-container"> | |
<pre class="src src-markdown">For strings S and T, we say “T divides S” if and only if S = T + ... + T (T concatenated with itself 1 or more times) | |
Return the largest string X such that X divides str1 and X divides str2. | |
<span style="color: #b3b3b3;">```</span> | |
<span style="color: #8470ff; font-weight: bold;">Input: str1 = "ABCABC", str2 = "ABC"</span> | |
<span style="color: #8470ff; font-weight: bold;">Output: "ABC"</span> | |
<span style="color: #8470ff; font-weight: bold;">Input: str1 = "ABABAB", str2 = "ABAB"</span> | |
<span style="color: #8470ff; font-weight: bold;">Output: "AB"</span> | |
<span style="color: #8470ff; font-weight: bold;">Input: str1 = "LEET", str2 = "CODE"</span> | |
<span style="color: #8470ff; font-weight: bold;">Output: ""</span> | |
<span style="color: #b3b3b3;">```</span> | |
Note: | |
• 1 <= str1.length <= 1000 | |
• 1 <= str2.length <= 1000 | |
• str1[i] and str2[i] are English uppercase letters. | |
</pre> | |
</div> | |
<table id="orgfe3f583" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"> | |
<colgroup> | |
<col class="org-left" /> | |
<col class="org-left" /> | |
<col class="org-left" /> | |
</colgroup> | |
<thead> | |
<tr> | |
<th scope="col" class="org-left">str1</th> | |
<th scope="col" class="org-left">str2</th> | |
<th scope="col" class="org-left">output</th> | |
</tr> | |
</thead> | |
<tbody> | |
<tr> | |
<td class="org-left">ABCABC</td> | |
<td class="org-left">ABC</td> | |
<td class="org-left">ABC</td> | |
</tr> | |
<tr> | |
<td class="org-left">ABABAB</td> | |
<td class="org-left">ABAB</td> | |
<td class="org-left">AB</td> | |
</tr> | |
<tr> | |
<td class="org-left">ABABABB</td> | |
<td class="org-left">ABAB</td> | |
<td class="org-left"> </td> | |
</tr> | |
<tr> | |
<td class="org-left">LEET</td> | |
<td class="org-left">CODE</td> | |
<td class="org-left"> </td> | |
</tr> | |
</tbody> | |
</table> | |
<p> | |
So lets enumerate conditions where you <b>do</b> get a match. | |
</p> | |
<p> | |
Firstly, we are always comparing the shorter string to the longer one. So lets make sure we know which is which | |
</p> | |
<p> | |
Then the most starightforward one is <code>examples[0]</code> where the shorter string is a proper subset of the longer one | |
</p> | |
<p> | |
There is also the situation on <code>examples[1]</code> where the full shorter string doesn't fit into the the longer one an even amount of times but a shorter substring does. | |
</p> | |
<p> | |
It would seem that anything else would not be a match | |
</p> | |
<div class="org-src-container"> | |
<pre class="src src-python"><span style="color: #00ffff;">def</span> <span style="color: #00fa9a; font-size: 110%; font-weight: bold;">get_string_gcd</span><span style="color: #8c8c8c;">(</span>shorter, longer<span style="color: #8c8c8c;">)</span>: | |
<span style="color: #00ffff;">if</span> <span style="color: #00ffff;">not</span> shorter: | |
<span style="color: #00ffff;">return</span> <span style="color: #8470ff; font-weight: bold;">None</span> | |
<span style="color: #00ffff;">if</span> <span style="color: #b0c4de;">len</span><span style="color: #8c8c8c;">(</span>shorter<span style="color: #8c8c8c;">)</span> > <span style="color: #b0c4de;">len</span><span style="color: #8c8c8c;">(</span>longer<span style="color: #8c8c8c;">)</span>: | |
<span style="color: #00ffff;">return</span> get_string_gcd<span style="color: #8c8c8c;">(</span>longer, shorter<span style="color: #8c8c8c;">)</span> | |
</pre> | |
</div> | |
</div> | |
<div id="outline-container-org86c1d76" class="outline-3"> | |
<h3 id="org86c1d76"><span class="section-number-3">1.1</span> Visulaize moving thorugh <code>examples[1]</code></h3> | |
<div class="outline-text-3" id="text-1-1"> | |
<p> | |
Lets visualize things physically. We will consider <code>examples[1]</code>. We move through each char one by one, cycling back (starred below) on the short string if need be. | |
</p> | |
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"> | |
<colgroup> | |
<col class="org-left" /> | |
<col class="org-left" /> | |
</colgroup> | |
<thead> | |
<tr> | |
<th scope="col" class="org-left">longer</th> | |
<th scope="col" class="org-left">shorter</th> | |
</tr> | |
</thead> | |
<tbody> | |
<tr> | |
<td class="org-left">A</td> | |
<td class="org-left">A</td> | |
</tr> | |
<tr> | |
<td class="org-left">B</td> | |
<td class="org-left">B</td> | |
</tr> | |
<tr> | |
<td class="org-left">A</td> | |
<td class="org-left">A</td> | |
</tr> | |
<tr> | |
<td class="org-left">B</td> | |
<td class="org-left">B</td> | |
</tr> | |
<tr> | |
<td class="org-left">A</td> | |
<td class="org-left">*A</td> | |
</tr> | |
<tr> | |
<td class="org-left">B</td> | |
<td class="org-left">B</td> | |
</tr> | |
</tbody> | |
</table> | |
<p> | |
If we reach the end of the longer string then we have a match of the substring since last starred | |
</p> | |
</div> | |
</div> | |
<div id="outline-container-org1b8699c" class="outline-3"> | |
<h3 id="org1b8699c"><span class="section-number-3">1.2</span> Visualize moving through <code>examples[2]</code></h3> | |
<div class="outline-text-3" id="text-1-2"> | |
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"> | |
<colgroup> | |
<col class="org-left" /> | |
<col class="org-left" /> | |
</colgroup> | |
<thead> | |
<tr> | |
<th scope="col" class="org-left">longer</th> | |
<th scope="col" class="org-left">shorter</th> | |
</tr> | |
</thead> | |
<tbody> | |
<tr> | |
<td class="org-left">A</td> | |
<td class="org-left">A</td> | |
</tr> | |
<tr> | |
<td class="org-left">B</td> | |
<td class="org-left">B</td> | |
</tr> | |
<tr> | |
<td class="org-left">A</td> | |
<td class="org-left">A</td> | |
</tr> | |
<tr> | |
<td class="org-left">B</td> | |
<td class="org-left">B</td> | |
</tr> | |
<tr> | |
<td class="org-left">A</td> | |
<td class="org-left">*A</td> | |
</tr> | |
<tr> | |
<td class="org-left">B</td> | |
<td class="org-left">B</td> | |
</tr> | |
<tr> | |
<td class="org-left">B</td> | |
<td class="org-left">A!</td> | |
</tr> | |
</tbody> | |
</table> | |
<p> | |
Uh oh, we hit a situation where the next step on the left has no match on the right. This means there is no match | |
</p> | |
</div> | |
</div> | |
</div> | |
<div id="outline-container-orgc7e5e8e" class="outline-2"> | |
<h2 id="orgc7e5e8e"><span class="section-number-2">2</span> Back to the solution</h2> | |
<div class="outline-text-2" id="text-2"> | |
<p> | |
Sounds like what we need to do is move through each string one by one cycling the shorter one but also noting what the most recent cycle is. <code>itertools</code> already has a <code>cycle</code> function but we want more than that. we don't just want the <b>next</b> returned each time but the next <b>and all within this current cycle</b>. So lets implement that | |
</p> | |
<div class="org-src-container"> | |
<pre class="src src-python"><span style="color: #00ffff;">def</span> <span style="color: #00fa9a; font-size: 110%; font-weight: bold;">tracked_cycle</span><span style="color: #8c8c8c;">(</span>iterable<span style="color: #8c8c8c;">)</span>: | |
<span style="color: #00ffff;">while</span> <span style="color: #8470ff; font-weight: bold;">True</span>: | |
<span style="color: #7fffd4;">current_cycle</span> = <span style="color: #8c8c8c;">[]</span> | |
<span style="color: #00ffff;">for</span> x <span style="color: #00ffff;">in</span> iterable: | |
current_cycle.append<span style="color: #8c8c8c;">(</span>x<span style="color: #8c8c8c;">)</span> | |
<span style="color: #00ffff;">yield</span> <span style="color: #8c8c8c;">(</span>x, <span style="color: #b0c4de;">list</span><span style="color: #93a8c6;">(</span>current_cycle<span style="color: #93a8c6;">)</span><span style="color: #8c8c8c;">)</span> <span style="color: #fa8072;">#</span><span style="color: #ff7f24; font-style: italic;">list needed since </span> | |
</pre> | |
</div> | |
<p> | |
Ok, lets test that | |
</p> | |
<div class="org-src-container"> | |
<pre class="src src-python"><span style="color: #00ffff;">from</span> itertools <span style="color: #00ffff;">import</span> islice | |
<span style="color: #00ffff;">for</span> <span style="color: #8c8c8c;">(</span>_, s, _<span style="color: #8c8c8c;">)</span> <span style="color: #00ffff;">in</span> examples: | |
<span style="color: #00ffff;">print</span><span style="color: #8c8c8c;">(</span> | |
<span style="color: #b0c4de;">list</span><span style="color: #93a8c6;">(</span>islice<span style="color: #b0b1a3;">(</span>tracked_cycle<span style="color: #97b098;">(</span>s<span style="color: #97b098;">)</span>, <span style="color: #8470ff; font-weight: bold;">0</span>, <span style="color: #8470ff; font-weight: bold;">8</span><span style="color: #b0b1a3;">)</span><span style="color: #93a8c6;">)</span> | |
<span style="color: #8c8c8c;">)</span> | |
</pre> | |
</div> | |
<pre class="example"> | |
[('A', ['A']), ('B', ['A', 'B']), ('C', ['A', 'B', 'C']), ('A', ['A']), ('B', ['A', 'B']), ('C', ['A', 'B', 'C']), ('A', ['A']), ('B', ['A', 'B'])] | |
[('A', ['A']), ('B', ['A', 'B']), ('A', ['A', 'B', 'A']), ('B', ['A', 'B', 'A', 'B']), ('A', ['A']), ('B', ['A', 'B']), ('A', ['A', 'B', 'A']), ('B', ['A', 'B', 'A', 'B'])] | |
[('A', ['A']), ('B', ['A', 'B']), ('A', ['A', 'B', 'A']), ('B', ['A', 'B', 'A', 'B']), ('A', ['A']), ('B', ['A', 'B']), ('A', ['A', 'B', 'A']), ('B', ['A', 'B', 'A', 'B'])] | |
[('C', ['C']), ('O', ['C', 'O']), ('D', ['C', 'O', 'D']), ('E', ['C', 'O', 'D', 'E']), ('C', ['C']), ('O', ['C', 'O']), ('D', ['C', 'O', 'D']), ('E', ['C', 'O', 'D', 'E'])] | |
</pre> | |
<p> | |
Ok, seems to work well. Also, hey! That's a cool way of testing things isn't it? | |
</p> | |
<p> | |
Alright, so now that we've got the above working its really a fairly straightforward matter of moving through each one at a time and testing the business logic | |
</p> | |
<div class="org-src-container"> | |
<pre class="src src-python"><span style="color: #00ffff;">def</span> <span style="color: #00fa9a; font-size: 110%; font-weight: bold;">get_string_gcd</span><span style="color: #8c8c8c;">(</span>shorter, longer<span style="color: #8c8c8c;">)</span>: | |
<span style="color: #00ffff;">if</span> <span style="color: #00ffff;">not</span> shorter: | |
<span style="color: #00ffff;">return</span> <span style="color: #8470ff; font-weight: bold;">None</span> | |
<span style="color: #00ffff;">if</span> <span style="color: #b0c4de;">len</span><span style="color: #8c8c8c;">(</span>shorter<span style="color: #8c8c8c;">)</span> > <span style="color: #b0c4de;">len</span><span style="color: #8c8c8c;">(</span>longer<span style="color: #8c8c8c;">)</span>: | |
<span style="color: #00ffff;">return</span> get_string_gcd<span style="color: #8c8c8c;">(</span>longer, shorter<span style="color: #8c8c8c;">)</span> | |
<span style="color: #7fffd4;">current_cycle</span> = <span style="color: #8c8c8c;">[]</span> | |
<span style="color: #00ffff;">for</span> <span style="color: #8c8c8c;">(</span><span style="color: #93a8c6;">(</span>s, current_cycle<span style="color: #93a8c6;">)</span>, l<span style="color: #8c8c8c;">)</span> <span style="color: #00ffff;">in</span> <span style="color: #b0c4de;">zip</span><span style="color: #8c8c8c;">(</span>tracked_cycle<span style="color: #93a8c6;">(</span>shorter<span style="color: #93a8c6;">)</span>, longer<span style="color: #8c8c8c;">)</span>: | |
<span style="color: #00ffff;">if</span> s != l: | |
<span style="color: #00ffff;">return</span> <span style="color: #8470ff; font-weight: bold;">None</span> | |
<span style="color: #00ffff;">return</span> <span style="color: #ffc1c1;">''</span>.join<span style="color: #8c8c8c;">(</span>current_cycle<span style="color: #8c8c8c;">)</span> | |
<span style="color: #00ffff;">for</span> <span style="color: #8c8c8c;">(</span>longer, shorter, desired<span style="color: #8c8c8c;">)</span> <span style="color: #00ffff;">in</span> examples: | |
<span style="color: #7fffd4;">desired</span> = desired <span style="color: #00ffff;">or</span> <span style="color: #8470ff; font-weight: bold;">None</span> | |
<span style="color: #7fffd4;">gcd</span> = get_string_gcd<span style="color: #8c8c8c;">(</span>shorter, longer<span style="color: #8c8c8c;">)</span> | |
<span style="color: #00ffff;">print</span><span style="color: #8c8c8c;">(</span>f<span style="color: #ffc1c1;">'gcd({shorter}, {longer}) = {gcd}'</span><span style="color: #8c8c8c;">)</span> | |
<span style="color: #00ffff;">if</span> gcd != desired: | |
<span style="color: #00ffff;">print</span><span style="color: #8c8c8c;">(</span>f<span style="color: #ffc1c1;">'FAILBOY! it should be {desired}\n'</span><span style="color: #8c8c8c;">)</span> | |
</pre> | |
</div> | |
<pre class="example"> | |
gcd(ABC, ABCABC) = ABC | |
gcd(ABAB, ABABAB) = AB | |
gcd(ABAB, ABABABB) = None | |
gcd(CODE, LEET) = None | |
</pre> | |
</div> | |
</div> | |
</div> | |
<div id="postamble" class="status"> | |
<p class="author">Author: George Mauer</p> | |
<p class="date">Created: 2019-10-14 Mon 12:29</p> | |
<p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p> | |
</div> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment