<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Hexo</title>
  
  
  <link href="http://43.138.155.79/atom.xml" rel="self"/>
  
  <link href="http://43.138.155.79/"/>
  <updated>2025-04-14T12:50:01.261Z</updated>
  <id>http://43.138.155.79/</id>
  
  <author>
    <name>John Doe</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>关于git大文件的上传</title>
    <link href="http://43.138.155.79/2025/04/06/git%20%E5%A4%A7%E6%96%87%E4%BB%B6%E7%9A%84%E4%B8%8A%E4%BC%A0/"/>
    <id>http://43.138.155.79/2025/04/06/git%20%E5%A4%A7%E6%96%87%E4%BB%B6%E7%9A%84%E4%B8%8A%E4%BC%A0/</id>
    <published>2025-04-06T04:54:14.000Z</published>
    <updated>2025-04-14T12:50:01.261Z</updated>
    
    <content type="html"><![CDATA[<p>最近工作中的时候遇到了这样一个问题，出于一些原因我们需要部署一个flux模型，我使用huggingface pipeline将这个模型跑通之后，在公司内网搭建了一套简易的api供其他项目的一些模块调用，之后要上传gitlab的时候 ，我发现存在一个很大的问题，由于工作场景中需要将模型完全上传，但是这个模型本体整个文件有50GB以上，尽管我们的gitlab是转门调整过上传文件的尺寸上限的，可以传几个GB的文件，但对于flux模型还是不太够用，于是我开始调查相关的解决方案。</p><p>LLM告诉我一般的方法是使用LFS，这个功能我很快通过LLM学习并运用到当前项目上， 尽管有一些warning，但是实测是能正常上传和下载大文件的。我称之为第一版，将其部署在一台机器上并提供了服务。</p><p>之后我面临另一个问题， 项目中用到的是flux-fill的模型，但是随着项目发展，后面越来越多的需要用到flux-dev的模型来进行文生图，按理说只要将flux-dev也加到项目中就好了，但是实际测试中显示，flux-fill模型和flux-dev的使用会互相冲突，一个模型使用时，换用另一个模型需要加载很长时间，因此不得不考虑两个模型拆开来放到两个独立的项目中分开部署到两台不同的机器上。但是这让我感觉很不爽，毕竟他们本来应该是一个项目中的类似的功能。因此考虑许久后结合GPT4o的建议，我又将项目做了重构，不再用LFS上传模型，而是采用使用时下载模型的设计方式，这样在一个项目内就可以根据配置文件选择可以提供何种api，并在初次调用的时候下载模型，不会有无意义的空间占用。这个版本我称之为第二版。</p><p>好景不长，第二版刚刚提交之后，项目就遭到了质疑，我的导师认为这样的设计会导致每次部署都要向huggingface那个不可靠的服务器去下载模型，会影响项目的可用性，这点我自己也深受其害，所以也能理解。于是我不得不放弃这个思路，重新回退到第一版，将其重命名为pro分支。回退后flux-dev的接口无法使用了，但是之后flux-dev的需求依然存在，必须想办法把相关的api重新提供出来。这时我又投向了开始时考虑过的另一种解决方法，就是把两个模型作为git的两个分支，使用哪个模型就下载对应的分支，这样还是在同一个项目内，也不用下载多余文件。</p><p>按照这一思路，我又从第一版的pro分支上做了改造，之后分出来两个新的分支fill和txt2img，并且合并了第二版的main分支，使其看起来相对简洁，且每个分支都很直观。这个可以称为第三版。</p><p>我想这大概是目前能提供的最好的解决方法，为了实现优雅而简洁的开发和部署，投入了非常多的精力。尽管还有一些问题，比如说，我在我的电脑上开发的时候不需要使用模型文件，那么整个项目应该在clone时避免下载lfs文件，这个操作可以通过设置来实现，可是model虽然没有下载，但是当前的.git文件达到了惊人的30GB，这应该是某个环节中有错误的上传操作，但是由于此前的操作过多，很难搞清楚是哪一步的问题，还要想办法将这部分的历史记录清除，这样才能达到最终的状态。</p><h4 id="后日谈："><a href="#后日谈：" class="headerlink" title="后日谈："></a>后日谈：</h4><p>又过一周后，我抽空开始调查.git的压缩方法，因为GPT-4o告诉我这部分并不是必须的，于是我将fill分支的<code>.git/object</code>的文件删除后提交到远程，但是当我重新拉取项目，.git又变成了30GB，GPT的说法是lfs还存在于历史中，之后我又按照它的指示将lfs从历史中排除，重写了历史，历史因此将fill独立成一条全新的分支路线，之前的提交都被复制了一份，在graph里看着非常难受，但这还好说，当我再次拉取项目时，lfs完全没有了（这是自然），于是我再次问了grok和claude-sonnet，它们的意见和GPT-4o难得的出现了冲突，想要下载lfs文件，就必须有庞大的.git，但是本机不需要的话可以删除<code>.git/object</code>，也不影响正常使用，情况大致就是这样。最后我还是找到txt2img分支，强制覆盖了远程仓库，好在只有我在上面工作。之后将本机的项目也删除后重新拉取，删除掉<code>.git/object</code>，一切正常了,真是实践出真知。当前阶段的项目功能都完善了，AI绘画要放一放了，短时间内也不会回来，以后有问题再说吧。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近工作中的时候遇到了这样一个问题，出于一些原因我们需要部署一个flux模型，我使用huggingface pipeline将这个模型跑通之后，在公司内网搭建了一套简易的api供其他项目的一些模块调用，之后要上传gitlab的时候 ，我发现存在一个很大的问题，由于工作场景中</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>收束</title>
    <link href="http://43.138.155.79/2025/04/04/%E6%94%B6%E6%9D%9F/"/>
    <id>http://43.138.155.79/2025/04/04/%E6%94%B6%E6%9D%9F/</id>
    <published>2025-04-04T13:21:14.000Z</published>
    <updated>2025-04-06T03:55:56.896Z</updated>
    
    <content type="html"><![CDATA[<p>时间来到年后不到两个月，在工作方面，项目的第一阶段开发算是完成了，我手头主要负责任务量并不多，一度作为游走人员来到处支援，接其他人的任务来做，还参加了没什么卵用但也算是一种体验的周六加班和上线前加班，下周开始下一阶段。</p><p>身体方面，年后到现在经历了一段非常离奇的治疗过程，一方面我把治疗疾病作为最主要的目标，但另一方面，在诸多的复杂变量的影响下，我也逐渐丧失了对最关键要素的感知能力，使得病情经历了两次急转直下，但是诸多措施又都不见效果，最后进入了病急乱投医的混乱状态中，同时进行了严格的禁食，直到上周在三医院重新建立了有效的治疗措施，在两天内有了大幅的改观，到现在已经算得上是卓有成效了。值得反思的东西有很多，没有第一时间抓住主要的矛盾，同时走了错误的诊疗路线是最大的问题。</p><p>游戏方面，暂时游戏荒，一直在等AOE2 DE的东亚DLC，一方面也确实没什么精力去玩太多。</p><p>为了优先治病，暂时放弃了本就比较悬的学习计划。</p><p>没有安排过远的活动，只在能力范围内随便走了走，赶上了楼下公园的花期，充分观赏了，之后再考虑到市内去看看。</p><p>动画方面，看完了金牌得主，底子很强，值得一看。此外看了老版的全职猎人，开始没觉得有什么特别，看多了还是能感受到作者很多的妖孽的想法，确实是能让人打开思路，有点上头，快看完了。</p><p>这一个多月里一直有种念头，就是展开和收回，所谓展开是指将生活中的很多领域重新审视、复习、提取到大脑内存中，收回是指将这个原本乱糟糟的东西整理一下，再存回硬盘中，方便后续调用。通过这样的作法，来确认对这些内容的掌控程度。所幸也没有什么挖的很深的领域，存档过程也还算是跟的上。考虑到精力有限，因此要在很多领域采取守势，减少不必要的观察和念头，将有限的生活过好，积累信心，再考虑向外拓展。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;时间来到年后不到两个月，在工作方面，项目的第一阶段开发算是完成了，我手头主要负责任务量并不多，一度作为游走人员来到处支援，接其他人的任务来做，还参加了没什么卵用但也算是一种体验的周六加班和上线前加班，下周开始下一阶段。&lt;/p&gt;
&lt;p&gt;身体方面，年后到现在经历了一段非常离奇的</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>解决版本问题</title>
    <link href="http://43.138.155.79/2024/12/20/%E8%A7%A3%E5%86%B3pip%E5%8C%85%E7%89%88%E6%9C%AC%E9%97%AE%E9%A2%98/"/>
    <id>http://43.138.155.79/2024/12/20/%E8%A7%A3%E5%86%B3pip%E5%8C%85%E7%89%88%E6%9C%AC%E9%97%AE%E9%A2%98/</id>
    <published>2024-12-20T06:43:14.000Z</published>
    <updated>2025-04-06T04:43:37.167Z</updated>
    
    <content type="html"><![CDATA[<p>又今天尝试使用代码运行black-forest-labs发布了有一段时间的<a class="link"   href="https://huggingface.co/black-forest-labs/FLUX.1-Fill-dev" > FLUX.1-Fill-dev<i class="fas fa-external-link-alt"></i></a>模型，来生成一些图片。官方的huggingface页面也有代码的使用说明，说是先安装最新的diffusers即可使用：</p><p>​    <img                       lazyload                     alt="image"                     data-src="/2024/12/20/%E8%A7%A3%E5%86%B3pip%E5%8C%85%E7%89%88%E6%9C%AC%E9%97%AE%E9%A2%98/image-20241220144629600.png"                      class="1"                ></p><p>按其所说的更新了diffusers，然后运行下载的示例代码flux_fill.py，报错说是</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ImportError: cannot import name <span class="string">&#x27;FluxFillPipeline&#x27;</span> from <span class="string">&#x27;diffusers&#x27;</span> (~/miniconda3/envs/flux/lib/python3.10/site-packages/diffusers/__init__.py)</span><br></pre></td></tr></table></figure><p>经过查询发现，FluxFillPipeline好像是2024年11月23日加上的，而pypi那里最新的包0.31.0还是10月的，于是就出现了这个问题，想使用最新的FluxFillPipeline就得自己手动安装一下开发版本的卸载diffusers，解决方法如下：</p><ol><li>进入所需的conda环境，卸载diffusers<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip uninstall diffusers</span><br></pre></td></tr></table></figure></li><li>克隆diffusers仓库：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/huggingface/diffusers.git</span><br></pre></td></tr></table></figure></li><li>进入diffusers目录：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> diffusers</span><br></pre></td></tr></table></figure></li><li>使用以下命令通过setup.py安装diffusers：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install .</span><br></pre></td></tr></table></figure></li></ol><p>这样就可以安装开发中的版本。再回去运行flux_fill.py，一切正常了。这怎么看都是black-forest-labs官方的问题，其教程要过些日子才能正常使用。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;又今天尝试使用代码运行black-forest-labs发布了有一段时间的&lt;a class=&quot;link&quot;   href=&quot;https://huggingface.co/black-forest-labs/FLUX.1-Fill-dev&quot; &gt; FLUX.1-Fill-dev&lt;</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>整备！一下</title>
    <link href="http://43.138.155.79/2024/10/14/%E6%95%B4%E5%A4%87/"/>
    <id>http://43.138.155.79/2024/10/14/%E6%95%B4%E5%A4%87/</id>
    <published>2024-10-14T11:40:14.000Z</published>
    <updated>2025-04-06T04:43:31.560Z</updated>
    
    <content type="html"><![CDATA[<p>国庆假期结束已过去一周了，再来记录一下。</p><p>国庆后四天的福建之旅算得上是安排紧凑，按照“轻松愉快“的指导思想去安排了全部的活动，整个过程算不上特别惬意，由于天气原因，没有看到什么特别亮眼的景色，身体原因也不敢强行安排太多的活动，强度被限制在一个易于接受的范围内，但是在锻炼心理的层面上称得上卓有成效。</p><p>​    <img                       lazyload                     alt="image"                     data-src="/2024/10/14/%E6%95%B4%E5%A4%87/IMG_20241003_093823_Burst01.jpg"                      class="1"                ></p><p>上次提到的整备活动正在按预期执行，旅行前更换手机电池使得旅途中少了很多不必要的麻烦和负重。上周末由于眼镜腿断裂而不得不去配的眼镜也将长久以来的问题解决。之后按计划还有很多需要更新。</p><p>在工作方面，商品图的模块在节前基本完成，主要的功能基本上都齐全了，后续要做各个模块的升级，考虑到comfyui已经被美工广泛地使用，也许下一阶段会接触一些新的东西。</p><p>游戏方面，还是继续推进黑神话，目前到达第五章的后半段，之后应该不会花太久。</p><p>动画上面，十月似乎没有太多可看的内容，目前估计会跟进观看《乱马》，而《物语系列 外传季&amp;怪物季》还有最后一集，周末才能看到。</p><p>运动方面，由于高强度的旅行和其他的实践活动，没有再安排什么锻炼。</p><p>居家生活方面，买了空气炸锅和一袋小米，周末可以用更轻松的方式来做饭吃，目前几次基本上是一个肉菜+小米粥+凉拌蔬菜的模式。小米确实是令人怀念和格外安心的食物，之后考虑来自己做一些面食来吃。此外还购入了一个升降台，用来解决室内办公的问题，目前还不太适应，似乎桌面还是有点低，导致打字的感觉不佳。</p><p>国庆假期结束已过去一周了，天气转凉，可能由于这个原因，状态竟然开始趋于好转，似乎去年也有类似的状态，应该是从9月中旬到10月，也许我们的行为真的是在被气温所主导。这周以来每天起的都比之前要早一些，心理状态也更加斩钉截铁，完成手头的任务走向下一个目标的决心十分强烈。遥远的地方那些不怎么好的风景、可去可不去的场所以及麻烦的任务，会耗费很多脑力和体力，但并不是不值得的，陌生的事物确实能带来全新的经验，经验带给人们新的自由度。所以，实践还要不断继续下去。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;国庆假期结束已过去一周了，再来记录一下。&lt;/p&gt;
&lt;p&gt;国庆后四天的福建之旅算得上是安排紧凑，按照“轻松愉快“的指导思想去安排了全部的活动，整个过程算不上特别惬意，由于天气原因，没有看到什么特别亮眼的景色，身体原因也不敢强行安排太多的活动，强度被限制在一个易于接受的范围内，</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>国庆前</title>
    <link href="http://43.138.155.79/2024/10/01/2024%E5%9B%BD%E5%BA%86/"/>
    <id>http://43.138.155.79/2024/10/01/2024%E5%9B%BD%E5%BA%86/</id>
    <published>2024-10-01T13:21:14.000Z</published>
    <updated>2025-04-05T05:43:19.718Z</updated>
    
    <content type="html"><![CDATA[<p>国庆假期伊始，抽空写一期常规blog</p><p>工作方面，继上次之后基本完成了拖拖拉拉了好久的商品图的功能，方案几经调整，确实非常折磨，节后应该会推出；另一方面由于技术的快速迭代也面临着推出即落后的窘境，后续还得加强这方面的学习。本计划假期搞一下，但现在看来是没时间了。</p><p>身体方面，精力还是比较萎靡，夏天以来几乎没有了锻炼的行为，每天的流汗只限于早晨通勤阶段，目前的状况用湿疹的指标来看算得上是岌岌可危，随时会崩。要开始加强锻炼和保证休息。</p><p>游戏方面，也基本上在第一时间购入和游玩《黑神话》，但是由于身体和精力状况不佳，导致整体速度较慢，中间还故意中断了两周来使生活节奏恢复，目前刚进入第五章。</p><p>由于上述所说，导致我久违地开始审视当前的物质环境，并提出了一系列的整备计划，解决各方面的落后的现状，优化生活条件。目前已经解决了泡脚困难、手机续航差的问题，还留下没法站立办公、眼镜老化等问题需要进一步解决。</p><p>假期安排了去厦门的单人旅行，这本来是由于假期难得，但是在计划做好之后产生了巨大的动摇，不止一次考虑把计划推翻或删减。最后还是决定要去，只不过要照顾身体状况，必须限制活动的强度，为此决定带上箱子。把背包的重量始终压缩到一个比较小的范围，即便如此，还是有诸多风险，可能关键是在于要有一个闲适的心情吧，这我太缺了。</p><p>动画方面，看完了《败犬女主太多了！》，制作精良，非常好看，为此还买了动画之后的下一卷小说来看。</p><p>假期说长也长，说短也短，各人有各人的过法，我得找到适合自己的过法、适合自己的旅游法，总之要以自己为标尺，慢慢来吧。也祝大家都获得幸福。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;国庆假期伊始，抽空写一期常规blog&lt;/p&gt;
&lt;p&gt;工作方面，继上次之后基本完成了拖拖拉拉了好久的商品图的功能，方案几经调整，确实非常折磨，节后应该会推出；另一方面由于技术的快速迭代也面临着推出即落后的窘境，后续还得加强这方面的学习。本计划假期搞一下，但现在看来是没时间了。</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>时间节点</title>
    <link href="http://43.138.155.79/2024/08/22/%E6%97%B6%E9%97%B4%E8%8A%82%E7%82%B9/"/>
    <id>http://43.138.155.79/2024/08/22/%E6%97%B6%E9%97%B4%E8%8A%82%E7%82%B9/</id>
    <published>2024-08-22T12:23:14.000Z</published>
    <updated>2025-04-05T05:43:19.769Z</updated>
    
    <content type="html"><![CDATA[<p>不知不觉到了处暑，天气逐渐凉快，中间的两个月主要忙于一些琐事和ai大赛，今天大赛终于闭幕，也可以调整下重心，找新的研究学习的方向。在这其中夹杂了7月23和8月14两个重要的时间节点，往前回溯3年和10年，都是意义非凡的重要转折，在工作之后也只能作为普通一天平稳度过。</p><p>工作上的东西还在稳步推进，新技术的出现又开始动摇前面工作的基础，导致新功能举棋不定，来回拉扯了一月，做得有点拖沓。</p><p>7月19比赛截止，8月7号答辩，ai大赛的项目完成的出乎意料的好，甚至具备了一定的实用价值，而搜索引擎也还ok，还可以继续优化。虽然看起来还是有点过于小儿科，但是折腾的多了，至少flask还是日渐熟练起来。</p><p>7月安排了几场出游，寻访了南头古城（7.6）和大梅沙（7.14），完成了一些早该做的旅行。之后参加两个批次的观影会，7.20和7.27，算得上比较充实。之后8月初体检，没什么大问题，8月11找老舍友吃饭，随后一周的博物馆之行因大雨未能成行。各周末基本都有事情做。</p><p>这段时间运动严重不足，每天只有晚上散步和中午爬楼的活动，导致一直没什么精神。</p><p>七月番还挺好看，没什么太大的话题度，但足以填补我的空缺了。</p><p>接下来可能要在周末去逛cpgz，回来要试试打黑神话，再把搜索引擎做完善，多学习下相关领域的知识，准备下内部培训，之后要做的事情还有很多。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;不知不觉到了处暑，天气逐渐凉快，中间的两个月主要忙于一些琐事和ai大赛，今天大赛终于闭幕，也可以调整下重心，找新的研究学习的方向。在这其中夹杂了7月23和8月14两个重要的时间节点，往前回溯3年和10年，都是意义非凡的重要转折，在工作之后也只能作为普通一天平稳度过。&lt;/p&gt;</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>基于语义向量的图像搜索</title>
    <link href="http://43.138.155.79/2024/06/18/%E5%9F%BA%E4%BA%8E%E8%AF%AD%E4%B9%89%E5%90%91%E9%87%8F%E7%9A%84%E5%9B%BE%E5%83%8F%E6%90%9C%E7%B4%A2/"/>
    <id>http://43.138.155.79/2024/06/18/%E5%9F%BA%E4%BA%8E%E8%AF%AD%E4%B9%89%E5%90%91%E9%87%8F%E7%9A%84%E5%9B%BE%E5%83%8F%E6%90%9C%E7%B4%A2/</id>
    <published>2024-06-18T12:16:14.000Z</published>
    <updated>2024-06-29T13:16:45.089Z</updated>
    
    <content type="html"><![CDATA[<p>最近前一段时间学习了一些关于gpt原理的知识，虽然没有完全理解核心概念，但是对于把语义转换成潜空间向量的想法记忆深刻，之后我在偶然间看到了这样一篇令人”印象深刻“的blog：<a href="https://harper.blog/2024/04/12/i-accidentally-built-a-meme-search-engine/"><em>i-accidentally-built-a-meme-search-engine</em></a>，，其中提到了一种使用矢量编码图像搭建的图片搜索引擎，并称其为”出乎意料的简单“。这个项目看上去非常有意思，我原本计划做一个类似的东西来完成即将开始的比赛，不过一段时间后选题被定为另一个更为实际的选题，而我又不愿意放弃这个有趣的点子，决心继续把它完成。</p><p>我于是开始尝试围绕这篇blog进行学习， 我设想的搭建过程分为以下几个步骤，</p><ul><li><p>第一步，找一个开源项目运行起来</p></li><li><p>第二步，然后阅读源代码来学习如何搭建，</p></li><li><p>第三步，搭建自己的图片搜索引擎</p></li></ul><p>这个计划在第一步就遇到巨大困难，blog的对应项目使用到imac的芯片，我没法使用，之后在github上找到的一系列项目各有千秋，但是共同的特点是没法在我的pc上运行，其中的制约因素包括但不限于需要搭建python环境、需要从huggingface下载模型，数据库连接不上去等等，手头的四个项目卡在不同阶段，当一个卡住，我就重新搭建环境尝试另一个，如此往复，进度最佳的一个已经在公司电脑上成功读取文件夹并将图片向量传到数据库，但此项目在本机上无法从huggingface下载任何模型，大概在这样的泥潭中折腾了一个月之后的月一个晚上，我终于意识到，整个计划从第一步开始就不是必要的。</p><p>整个引擎只有两个步骤，读取图片上传到数据库、在数据库中查询，我只要完成这两步就好了</p><p>向量数据库有很多家，但我直接选了最早接触到的pinecone</p><p>我打开gpt，向其询问把图片转换成向量的方式，测试运行，通过。</p><p>之后，我登录pinecone的官网，按照教程新建了index，并获取了官方提供的存储及搜索的代码，完成了将向量上传和搜索的环节</p><p>最后添加了一个用于获取单张图向量的函数</p><p>这样经过非常简单的步骤之后，搜索引擎的核心功能就完成了，花费了一个多小时，只有几十行代码。我可以将本地的图片对应的上传到数据库，然后，拿一张图片进行搜索，获取相似度最高的前n张图片名称，根据这些名称找到本地的对应图片。这个操作在你本地有大量各个类型图片的情况下会非常有趣，假如你只有少量图片。那就没什么意思，很可能没太多有关联的内容。</p><p>不难看出这个玩具的核心在于clip模型，它决定了图片到向量的对应关系，这个模型的效果越好，对图片做语义识别的能力就越强，体现出的图片的搜索效果就越智能。</p><p><a class="link"   href="https://github.com/Easterlings/clip-img-search" >项目地址<i class="fas fa-external-link-alt"></i></a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近前一段时间学习了一些关于gpt原理的知识，虽然没有完全理解核心概念，但是对于把语义转换成潜空间向量的想法记忆深刻，之后我在偶然间看到了这样一篇令人”印象深刻“的blog：&lt;a href=&quot;https://harper.blog/2024/04/12/i-accident</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>5-6月中期汇报</title>
    <link href="http://43.138.155.79/2024/06/16/summer%20for%20him/"/>
    <id>http://43.138.155.79/2024/06/16/summer%20for%20him/</id>
    <published>2024-06-16T13:21:14.000Z</published>
    <updated>2024-06-16T14:08:54.566Z</updated>
    
    <content type="html"><![CDATA[<p>软考结束了，由于准备不足，只考了上午的两科，下午的直接放弃，这次的备考确实是一团糟，没有做好准备。考试之后生活节奏逐步缓和下来，深圳天气多变。每逢周末必要下雨，基本上隔绝了外出的念头。</p><p>工作方面，在5月下旬到6月上半期间都相对比较缓和，主要做功能方面的优化，研究用一些新的开源模型来解决现有的效果不佳的问题。</p><p>自己做的项目上取得了一些突破，虽然事后想来没有什么难度，但还是有点意思，详情见之后的文章。</p><p>在游戏方面，过去三周主要在打《动物井》，确实是震撼人心的好游戏，但也确实累人，打通真结局后将其永久性搁置。感觉松了一口气。之后可以慢慢打休闲一点的游戏。</p><p>动画上面这周追完了《迷宫饭》，京吹等搁置了几周，有待补完，上周看起了《攻壳机动队》，这周又转向《旋风管家》，也确实没闲着。四月番恐怕总共不会超过两部。</p><p>运动方面，天气渐热，身体的问题开始加重，感冒的阴云还没有散去，希望能增加一些肌肉来增强体质，应对现在的光吃不消耗的局面。走路的锻炼方式又很难增加什么肌肉，并且逐渐受气温影响难以继续，因此打算开始进行室内的更高强度的锻炼，让gpt给了一份计划， 比较有操作性，可以先试试。</p><p>居家生活方面，六一炖了牛肉，感觉不错，端午节收到家里寄来的羊肉，于是又炖了一锅。这周末虽然没有炖肉，却把为炖肉准备的葱拿来做了葱油来拌面吃。</p><p>时间过得真快，好些同学研究生毕业，开始四处毕业旅行。一些工作的同学也四处游玩，让人好奇他们是哪来的空闲。我好像已经没有旅行的欲望了，倒是期待能去广州看<strong>未来有你</strong>的演唱会。</p><p>书已经没有在看了。</p><p>但愿能各项事务能尽快走上正轨。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;软考结束了，由于准备不足，只考了上午的两科，下午的直接放弃，这次的备考确实是一团糟，没有做好准备。考试之后生活节奏逐步缓和下来，深圳天气多变。每逢周末必要下雨，基本上隔绝了外出的念头。&lt;/p&gt;
&lt;p&gt;工作方面，在5月下旬到6月上半期间都相对比较缓和，主要做功能方面的优化，研</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>两种颜色去除算法的对比</title>
    <link href="http://43.138.155.79/2024/05/22/%E4%B8%A4%E7%A7%8D%E9%A2%9C%E8%89%B2%E5%8E%BB%E9%99%A4%E7%AE%97%E6%B3%95%E7%9A%84%E5%AF%B9%E6%AF%94/"/>
    <id>http://43.138.155.79/2024/05/22/%E4%B8%A4%E7%A7%8D%E9%A2%9C%E8%89%B2%E5%8E%BB%E9%99%A4%E7%AE%97%E6%B3%95%E7%9A%84%E5%AF%B9%E6%AF%94/</id>
    <published>2024-05-22T08:16:14.000Z</published>
    <updated>2024-05-26T01:38:08.704Z</updated>
    
    <content type="html"><![CDATA[<p>最近在工作中遇到需要删除图片中某一颜色及其类似颜色的功能，函数接受颜色、颜色范围两个主要参数，我按照gpt的指引写出了下列算法：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">remove_color_range</span>(<span class="params">image_path:<span class="built_in">str</span>, color:<span class="built_in">list</span>, width:<span class="built_in">int</span></span>):</span><br><span class="line">    lower_bound = np.array([<span class="built_in">max</span>(x - width,<span class="number">0</span>) <span class="keyword">for</span> x <span class="keyword">in</span> color])  <span class="comment"># 需要去除的颜色的下界</span></span><br><span class="line">    upper_bound = np.array([<span class="built_in">min</span>(x + width,<span class="number">255</span>) <span class="keyword">for</span> x <span class="keyword">in</span> color])  <span class="comment"># 需要去除的颜色的上界</span></span><br><span class="line"></span><br><span class="line">    img = Image.<span class="built_in">open</span>(image_path).convert(<span class="string">&#x27;RGBA&#x27;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 将图片转换为NumPy数组</span></span><br><span class="line">    img_array = np.array(img)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 创建一个布尔数组，标记需要去除的像素</span></span><br><span class="line">    mask = np.<span class="built_in">all</span>((img_array &gt;= lower_bound) &amp; (img_array &lt;= upper_bound), axis=-<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 将需要去除的像素设置为白色（或其他你想要的颜色）</span></span><br><span class="line">    img_array[mask] = [<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>]</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 将NumPy数组转换回PIL图像</span></span><br><span class="line">    new_img = Image.fromarray(img_array)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> new_img</span><br></pre></td></tr></table></figure><p>而导师给了我另一种实现：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">color_within_tolerance</span>(<span class="params">color, target, tolerance</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;检查颜色是否在目标颜色的容差范围内&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">all</span>(<span class="built_in">abs</span>(c - t) &lt;= tolerance <span class="keyword">for</span> c, t <span class="keyword">in</span> <span class="built_in">zip</span>(color, target))</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">remove_color</span>(<span class="params">input_image_path, output_image_path, target_color, tolerance</span>):</span><br><span class="line">    image = Image.<span class="built_in">open</span>(input_image_path).convert(<span class="string">&quot;RGBA&quot;</span>)</span><br><span class="line">    datas = image.getdata()</span><br><span class="line">    </span><br><span class="line">    new_data = []</span><br><span class="line">    <span class="keyword">for</span> item <span class="keyword">in</span> datas:</span><br><span class="line">        <span class="comment"># 检查当前像素是否在容差范围内</span></span><br><span class="line">        <span class="keyword">if</span> color_within_tolerance(item[:<span class="number">3</span>], target_color, tolerance):</span><br><span class="line">            <span class="comment"># 将匹配的颜色替换为透明</span></span><br><span class="line">            new_data.append((<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0</span>))</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            new_data.append(item)</span><br><span class="line">    </span><br><span class="line">    image.putdata(new_data)</span><br><span class="line">    image.save(output_image_path, <span class="string">&quot;PNG&quot;</span>)</span><br></pre></td></tr></table></figure><p>导师的代码额外加入了输出，我使用同一张图片进行测试，两者的效果完全一致。</p><p>那么两者的效率是否相同呢，我在我的函数中也加上保存图片的环节进行测试得出的时间之比为： <em><strong>0.496： 3.702</strong></em>，换另一张图测试，时间比为 <em><strong>0.958：10.208</strong></em>，看来我这边确实更快，</p><p>原理看上去也比较简单，后者是通过逐个对比像素来确定是否要替换对应点的，而前者是通过np包将图片转成矩阵后使用np.all(函数进行处理，<code>np.all()</code> 是 NumPy 中的一个非常有用的函数,它用于检查数组中所有元素是否都为 True。而当 <code>axis=-1</code> 时,表示沿着最后一个轴(即宽度轴)进行操作，(理解起来可能有点困难，可以看作对矩阵降维，两行三列的数组，降维的方式有两种，一种是横向取与，一种是纵向取与，得到的分别是一行两列和一行三列的bool数组，数组中的值表示这一行或这一列是否都符合条件)，也就是img_array判断矩阵的最小维度是否符合条件，对比的是[229 229 229 255]是否不大于[249 249 249 255]中的每一个对应元素，[229 229 229 255]是否不小于[209 209 209 235]中的每一个对应元素，如均符合，则此像素置为true，np.all最终得到的是一个布尔数组，再经过img_array[mask] &#x3D; [0, 0, 0, 0]将原图的对应像素置为透明即可。</p><p>借助于numpy，其中的筛选和修改似乎都是并行计算，因此效率高得多。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近在工作中遇到需要删除图片中某一颜色及其类似颜色的功能，函数接受颜色、颜色范围两个主要参数，我按照gpt的指引写出了下列算法：&lt;/p&gt;
&lt;figure class=&quot;highlight python&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>任务汇报</title>
    <link href="http://43.138.155.79/2024/04/14/spring%20ends/"/>
    <id>http://43.138.155.79/2024/04/14/spring%20ends/</id>
    <published>2024-04-14T13:21:14.000Z</published>
    <updated>2024-04-21T02:38:47.114Z</updated>
    
    <content type="html"><![CDATA[<p>​        天气热起来了，短暂的春天应该是要结束了，上次blog里提到的几项活动在两周内陆续圆满完成，接下来的周末观光项目要将优先级下调，直到考试结束。</p><p>​        31号带着弟弟逛了下广州中心，我制作了三套返程方案后按计划快去快回，下午三点过去晚上10点多回来，总还是没影响到工作。最大的感想是花费少量时间进行区间旅行完全是可行的。</p><p>​        之后的清明假期（4.4-4.6）只安排了逛cpsp的活动，为此我们提前一天去了广州，次日早上前往琶洲，cpsp的场面之大是之前没有见过的，内容上也要丰富很多，一时上头买了不少的本子，狠狠投资了同人文化。一部分周边也在后来一周寄给友人。</p><p>​        这周看了《你想活出怎样的人生》，本来想看看这次会烂到什么程度，看了感觉还不错，并不是一部糟心的电影，只是一个老头和你讲你理解不了的话罢了，而且也没有令人反感的桥段，不至于如此不推荐，想必大家还是报了过高的期待来看，虽然很多人的感觉上像是用宫崎骏的电影训练了一个ai模型后拍出来的，但是这个终究不是ai，可以肯定作者有用心思。看的时候前半段老是想到《刺杀骑士团长》，此外很多元素都能串到之前的一些电影中，老旧的大宅是《龙猫》、会追踪的箭和哇啦哇啦是《幽灵公主》，通往不同世界的门和狂风吹拂的水边草丛是《哈尔的移动城堡》，父亲的工厂是《起风了》，苍鹭里的大鼻子老头是《千与千寻》，爬塔的时候一度很像《天空之城》。全程都在关注这些要素导致观影的流程也变得非常有趣。</p><p>​        可能是最近的活动太多了，总有种休息不好的的感觉，心情急躁，走路也很不悠闲，不是好的生活方式，需要改正。</p><p>​        </p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;​        天气热起来了，短暂的春天应该是要结束了，上次blog里提到的几项活动在两周内陆续圆满完成，接下来的周末观光项目要将优先级下调，直到考试结束。&lt;/p&gt;
&lt;p&gt;​        31号带着弟弟逛了下广州中心，我制作了三套返程方案后按计划快去快回，下午三点过去晚</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>welcome to the spring</title>
    <link href="http://43.138.155.79/2024/03/27/welcome%20to%20the%20spring/"/>
    <id>http://43.138.155.79/2024/03/27/welcome%20to%20the%20spring/</id>
    <published>2024-03-27T12:33:14.000Z</published>
    <updated>2024-04-14T13:19:42.701Z</updated>
    
    <content type="html"><![CDATA[<p>​        上次写完没多久，原本良好的势头就被二阳打断了，伴随着回南天的连绵阴雨，我在公寓里度过了艰难的两周，病毒不仅危害健康，也磨损信心。好在两周后身体主要机能逐渐恢复，也不用再担心洗澡造成无法控制的严重晕眩，我也开始计划在夏天到来前要干些什么。不过，到这周一，未来三个周末基本上都已经有了明确的方向，30号31号，要去广州看望前来赶考的弟弟，次周是清明假期，要去赶广州的cpsp，今天也”幸运地”抢到了票，唯一的问题是两张不能退的实名票没法让我和同伴一起进场。再过一周是少歌群和高达群联合举办的上映会，放映宫崎骏的新作《你想活出怎样的人生》。之后可能要备考软考，还是有很多事情要做的。</p><p>​        这几周在工作上比较繁忙，刚刚肝完了换背景方案，写的昏天黑地，又参加准备了晋级考试和答辩。今天刚刚转为常规状态，但是方案还有诸多bug要改，今天领导又急着使用新的方案，预计还有大改。希望能尽快掌握laravel，加快对各种功能调整和bug的响应速度。</p><p>​        这周起天气开始变得炎热，短袖首次登场，并且在可以遇见的未来将一直服役到11月份以后。有必要迈出关键一步去买些像样的衣服。</p><p>​        由于工作繁忙，这周开始早睡，体验不错，也不是完全做不到嘛。</p><p>​        病中的感觉今年体会的够多了，不想继续下去了。</p><p>​        </p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;​        上次写完没多久，原本良好的势头就被二阳打断了，伴随着回南天的连绵阴雨，我在公寓里度过了艰难的两周，病毒不仅危害健康，也磨损信心。好在两周后身体主要机能逐渐恢复，也不用再担心洗澡造成无法控制的严重晕眩，我也开始计划在夏天到来前要干些什么。不过，到这周一，未来</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>整理一下</title>
    <link href="http://43.138.155.79/2024/03/03/%E6%95%B4%E7%90%86%E4%B8%80%E4%B8%8B/"/>
    <id>http://43.138.155.79/2024/03/03/%E6%95%B4%E7%90%86%E4%B8%80%E4%B8%8B/</id>
    <published>2024-03-03T13:55:14.000Z</published>
    <updated>2025-04-06T04:43:24.690Z</updated>
    
    <content type="html"><![CDATA[<p>开工已经两周了，花了好几天才进入状态，上周找时间对这个blog做了一些整理，保证其能正常跑到今年12月，在那之后就不好说了，服务器续费的价格过于高昂了，需要考虑迁移的问题。🤔</p><p>在工作方面，年后继续沿着图像处理的方向前进，完成了一些图片叠加和内容审查之类的工作，其中涉及了很多对项目本身的修改工作，还是有些许收获的。但是全部是python的工作，没机会参与php的工作。🤨</p><p>第一周疯狂看电影，陆续看完了《坠落的审判》、《俄罗斯方块》、《怪物》、《年会不能停》，回过头想想都不知道这时间是怎么挤出来的。😑</p><p>游戏方面，值得一提的是这两个周末在玩的《圣兽之王》demo，这个游戏比之前预想的还是好玩许多，在今天打通了试玩版剧情，并下单了实体版本，春季应该会全力推这个，但是剧情的发展看上去过于平淡了，内容长了之后可能会有问题。此外用剩下的一张任亏券换了《密特罗德生存恐惧》，防止之后忘记。😊</p><p>动画上面一月番只看了《芙莉莲》、《迷宫饭》和《我心危第二季》，迷宫饭这两周观感非常好，更多的讲了人物过往的经历，比起前几周有意思多了，整体上还算是比较充实。😊</p><p>​    <img                       lazyload                     alt="image"                     data-src="/2024/03/03/%E6%95%B4%E7%90%86%E4%B8%80%E4%B8%8B/395378_3EgIO.jpg"                      class="1"                ></p><p>运动方面，跑步的习惯还是没完全搞起来，第二次跑的时候出了些问题，气管至今也没完全恢复。由于作息时间没做调整的缘故，这些日子还是非常困。🥱</p><p>居家生活方面，回来深圳第二天就下单了几个收纳的箱子，把药品和厨具收纳一下，这周末则下单了用于收纳衣服的抽屉式的箱子，希望能提升家里整体的观感。👌</p><p>家里带来的真空包装的熟肉也吃了大半了，在家的时候感觉状态良好，一方面是由于大量和人社交，另一方面想来与那几天吃得格外好也有关系。🍖</p><p>​    <img                       lazyload                     alt="image"                     data-src="/2024/03/03/%E6%95%B4%E7%90%86%E4%B8%80%E4%B8%8B/IMG_20240224_190328.jpg"                      class="1"                ></p><p>两个周末都以居家为主，天气也比较阴冷，不宜外出游玩，上周抽空去了下周边的城中村附近的商场，这周逛了下楼下的公园，又看到了去年相似的山花烂漫的场景。🌸</p><p>年后的总结大致就是这样了，还有许多东西百废待兴，希望尽快把事项推进起来。💪</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;开工已经两周了，花了好几天才进入状态，上周找时间对这个blog做了一些整理，保证其能正常跑到今年12月，在那之后就不好说了，服务器续费的价格过于高昂了，需要考虑迁移的问题。🤔&lt;/p&gt;
&lt;p&gt;在工作方面，年后继续沿着图像处理的方向前进，完成了一些图片叠加和内容审查之类的工作</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>CS61A Project 2</title>
    <link href="http://43.138.155.79/2023/11/15/CS61A%20Project%202/"/>
    <id>http://43.138.155.79/2023/11/15/CS61A%20Project%202/</id>
    <published>2023-11-15T13:55:15.000Z</published>
    <updated>2024-03-04T13:12:50.171Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Project-2-CS-61A-Autocorrected-Typing-Software-cats-zip"><a href="#Project-2-CS-61A-Autocorrected-Typing-Software-cats-zip" class="headerlink" title="Project 2: CS 61A Autocorrected Typing Software cats.zip"></a>Project 2: CS 61A Autocorrected Typing Software <a class="link"   href="https://inst.eecs.berkeley.edu/~cs61a/fa22/proj/cats/cats.zip" >cats.zip<i class="fas fa-external-link-alt"></i></a></h1><p><img                       lazyload                     alt="image"                     data-src="https://inst.eecs.berkeley.edu/~cs61a/fa22/proj/cats/images/cats_typing_still.gif"                      alt="img"                ></p><blockquote><p>Programmers dream of<br>Abstraction, recursion, and<br>Typing really fast.</p></blockquote><h2 id="Introduction"><a href="#Introduction" class="headerlink" title="Introduction"></a>Introduction</h2><blockquote><p><strong>Important submission note:</strong> For full credit:</p><ul><li>Submit with Phase 1 complete by <strong>Tuesday, September 27</strong>, worth 1 pt.</li><li>Submit with all phases complete by <strong>Friday, September 30</strong>.</li></ul><p>Try to attempt the problems in order, as some later problems will depend on earlier problems in their implementation and therefore also when running <code>ok</code> tests.</p><p>The entire project can be completed with a partner.</p><p>You can get 1 bonus point by submitting the entire project by <strong>Thursday, September 29</strong>.</p></blockquote><p>In this project, you will write a program that measures typing speed. Additionally, you will implement typing autocorrect, which is a feature that attempts to correct the spelling of a word after a user types it. This project is inspired by <a class="link"   href="https://play.typeracer.com/" >typeracer<i class="fas fa-external-link-alt"></i></a>.</p><blockquote><p>When students in the past have tried to implement the functions without thoroughly reading the problem description, they’ve often run into issues. 😱 <strong>Read each description thoroughly before starting to code.</strong></p></blockquote><h2 id="Final-Product"><a href="#Final-Product" class="headerlink" title="Final Product"></a>Final Product</h2><p>Our staff solution to the project can be interacted with at <a class="link"   href="https://cats.cs61a.org/" >cats.cs61a.org<i class="fas fa-external-link-alt"></i></a>. If you’d like, feel free to try it out now. When you finish the project, you’ll have implemented a significant part of this match yourself!</p><h1 id="Phase-1-Typing"><a href="#Phase-1-Typing" class="headerlink" title="Phase 1: Typing"></a>Phase 1: Typing</h1><blockquote><p>When students in the past have tried to implement the functions without thoroughly reading the problem description, they’ve often run into issues. 😱 <strong>Read each description thoroughly before starting to code.</strong></p></blockquote><h3 id="Problem-1-1-pt"><a href="#Problem-1-1-pt" class="headerlink" title="Problem 1 (1 pt)"></a>Problem 1 (1 pt)</h3><p>Throughout the project, we will be making changes to functions in <code>cats.py</code>.</p><p>Implement <code>pick</code>. This function selects which paragraph the user will type. It takes three parameters:</p><ul><li>a list of <code>paragraphs</code> (strings)</li><li>a <code>select</code> function, which returns <code>True</code> for paragraphs that can be selected</li><li>a non-negative index <code>k</code></li></ul><p>The <code>pick</code> function returns the <code>k</code>th paragraph for which <code>select</code> returns <code>True</code>. If no such paragraph exists (because <code>k</code> is too large), then <code>pick</code> returns the empty string.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">pick</span>(<span class="params">paragraphs, select, k</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Return the Kth paragraph from PARAGRAPHS for which SELECT called on the</span></span><br><span class="line"><span class="string">    paragraph returns True. If there are fewer than K such paragraphs, return</span></span><br><span class="line"><span class="string">    the empty string.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    Arguments:</span></span><br><span class="line"><span class="string">        paragraphs: a list of strings</span></span><br><span class="line"><span class="string">        select: a function that returns True for paragraphs that can be selected</span></span><br><span class="line"><span class="string">        k: an integer</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; ps = [&#x27;hi&#x27;, &#x27;how are you&#x27;, &#x27;fine&#x27;]</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; s = lambda p: len(p) &lt;= 4</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; pick(ps, s, 0)</span></span><br><span class="line"><span class="string">    &#x27;hi&#x27;</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; pick(ps, s, 1)</span></span><br><span class="line"><span class="string">    &#x27;fine&#x27;</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; pick(ps, s, 2)</span></span><br><span class="line"><span class="string">    &#x27;&#x27;</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># BEGIN PROBLEM 1</span></span><br><span class="line">    paragraphs = [i <span class="keyword">for</span> i <span class="keyword">in</span> paragraphs <span class="keyword">if</span> select(i)]</span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(paragraphs)&gt;k:</span><br><span class="line">        <span class="keyword">return</span> paragraphs[k]</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&#x27;&#x27;</span></span><br><span class="line">    <span class="comment"># END PROBLEM 1</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="Problem-2-1-pt"><a href="#Problem-2-1-pt" class="headerlink" title="Problem 2 (1 pt)"></a>Problem 2 (1 pt)</h3><p>Implement <code>about</code>, which takes a list of <code>topic</code> words. It returns a function which takes a paragraph and returns a boolean indicating whether that paragraph contains any of the words in <code>topic</code>.</p><p>Once we’ve implemented <code>about</code>, we’ll be able to pass the returned function to <code>pick</code> as the <code>select</code> argument, which will be useful as we continue to implement our typing test.</p><p>To be able to make this comparison accurately, you will need to ignore case (that is, assume that uppercase and lowercase letters don’t change what word it is) and punctuation in the paragraph. Additionally, only check for exact matches of the words in topic in the paragraph, not substrings. For example, “dogs” is not a match for the word “dog”.</p><blockquote><p><strong>Hint</strong>: You may use the string utility functions in <code>utils.py</code>. You can reference the docstrings of the utility functions to see how they are being used.</p></blockquote><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">about</span>(<span class="params">topic</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Return a select function that returns whether</span></span><br><span class="line"><span class="string">    a paragraph contains one of the words in TOPIC.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    Arguments:</span></span><br><span class="line"><span class="string">        topic: a list of words related to a subject</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; about_dogs = about([&#x27;dog&#x27;, &#x27;dogs&#x27;, &#x27;pup&#x27;, &#x27;puppy&#x27;])</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; pick([&#x27;Cute Dog!&#x27;, &#x27;That is a cat.&#x27;, &#x27;Nice pup!&#x27;], about_dogs, 0)</span></span><br><span class="line"><span class="string">    &#x27;Cute Dog!&#x27;</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; pick([&#x27;Cute Dog!&#x27;, &#x27;That is a cat.&#x27;, &#x27;Nice pup.&#x27;], about_dogs, 1)</span></span><br><span class="line"><span class="string">    &#x27;Nice pup.&#x27;</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">assert</span> <span class="built_in">all</span>([lower(x) == x <span class="keyword">for</span> x <span class="keyword">in</span> topic]), <span class="string">&#x27;topics should be lowercase.&#x27;</span></span><br><span class="line">    <span class="comment"># BEGIN PROBLEM 2</span></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">uu</span>(<span class="params">somewords</span>):</span><br><span class="line">      <span class="built_in">list</span>=split(somewords)</span><br><span class="line">      <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">list</span>:</span><br><span class="line">        <span class="keyword">if</span> lower(remove_punctuation(i)) <span class="keyword">in</span> topic:</span><br><span class="line">          <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">      <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">    <span class="keyword">return</span> uu</span><br><span class="line">    <span class="comment"># END PROBLEM 2</span></span><br></pre></td></tr></table></figure><h3 id="Problem-3-2-pts"><a href="#Problem-3-2-pts" class="headerlink" title="Problem 3 (2 pts)"></a>Problem 3 (2 pts)</h3><p>Implement <code>accuracy</code>, which takes a <code>typed</code> paragraph and a <code>source</code> paragraph. It returns the percentage of words in <code>typed</code> that exactly match the corresponding words in <code>source</code>. Case and punctuation must match as well. “Corresponding” here means that two words must occur at the same indices in <code>typed</code> and <code>source</code>—the first words of both must match, the second words of both must match, and so on.</p><p>A <em>word</em> in this context is any sequence of characters separated from other words by whitespace, so treat “dog;” as a single word.</p><p>If <code>typed</code> is longer than <code>source</code>, then the extra words in <code>typed</code> that have no corresponding word in <code>source</code> are all incorrect.</p><p>If both <code>typed</code> and <code>source</code> are empty, then the accuracy is 100.0. If <code>typed</code> is empty but <code>source</code> is not empty, then the accuracy is zero. If <code>typed</code> is not empty but <code>source</code> is empty, then the accuracy is zero.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">accuracy</span>(<span class="params">typed, source</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Return the accuracy (percentage of words typed correctly) of TYPED</span></span><br><span class="line"><span class="string">    when compared to the prefix of SOURCE that was typed.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    Arguments:</span></span><br><span class="line"><span class="string">        typed: a string that may contain typos</span></span><br><span class="line"><span class="string">        source: a string without errors</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; accuracy(&#x27;Cute Dog!&#x27;, &#x27;Cute Dog.&#x27;)</span></span><br><span class="line"><span class="string">    50.0</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; accuracy(&#x27;A Cute Dog!&#x27;, &#x27;Cute Dog.&#x27;)</span></span><br><span class="line"><span class="string">    0.0</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; accuracy(&#x27;cute Dog.&#x27;, &#x27;Cute Dog.&#x27;)</span></span><br><span class="line"><span class="string">    50.0</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; accuracy(&#x27;Cute Dog. I say!&#x27;, &#x27;Cute Dog.&#x27;)</span></span><br><span class="line"><span class="string">    50.0</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; accuracy(&#x27;Cute&#x27;, &#x27;Cute Dog.&#x27;)</span></span><br><span class="line"><span class="string">    100.0</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; accuracy(&#x27;&#x27;, &#x27;Cute Dog.&#x27;)</span></span><br><span class="line"><span class="string">    0.0</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; accuracy(&#x27;&#x27;, &#x27;&#x27;)</span></span><br><span class="line"><span class="string">    100.0</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># BEGIN PROBLEM 3</span></span><br><span class="line">    typed_words = split(typed)</span><br><span class="line">    source_words = split(source)</span><br><span class="line">    len1 = <span class="built_in">len</span>(typed_words)</span><br><span class="line">    len2 = <span class="built_in">len</span>(source_words)</span><br><span class="line">    i=<span class="number">0</span></span><br><span class="line">    count = <span class="number">0</span></span><br><span class="line">    <span class="keyword">if</span> len1 ==<span class="number">0</span> <span class="keyword">and</span> len2 ==<span class="number">0</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="number">100.0</span></span><br><span class="line">    <span class="keyword">elif</span> len1 ==<span class="number">0</span> <span class="keyword">or</span> len2 ==<span class="number">0</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="number">0.0</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        min_len = <span class="built_in">min</span>(len1,len2)</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(min_len):</span><br><span class="line">            <span class="keyword">if</span> source_words[i] == typed_words[i]:</span><br><span class="line">                count += <span class="number">1</span></span><br><span class="line">        <span class="keyword">return</span> <span class="number">100.0</span>*count/len1</span><br><span class="line">    <span class="comment"># END PROBLEM 3</span></span><br></pre></td></tr></table></figure><h3 id="Problem-4-1-pt"><a href="#Problem-4-1-pt" class="headerlink" title="Problem 4 (1 pt)"></a>Problem 4 (1 pt)</h3><p>Implement <code>wpm</code>, which computes the <em>words per minute</em>, a measure of typing speed, given a string <code>typed</code> and the amount of <code>elapsed</code> time in <strong>seconds.</strong> Despite its name, <em>words per minute</em> is not based on the number of words typed, but instead the number of groups of 5 characters, so that a typing test is not biased by the length of words. The formula for <em>words per minute</em> is the ratio of the number of characters (including spaces) typed divided by 5 (a typical word length) to the elapsed time in <strong>minutes.</strong></p><p>For example, the string <code>&quot;I am glad!&quot;</code> contains three words and ten characters (not including the quotation marks). The words per minute calculation uses 2 as the number of words typed (because 10 &#x2F; 5 &#x3D; 2). If someone typed this string in 30 seconds (half a minute), their speed would be 4 words per minute.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">wpm</span>(<span class="params">typed, elapsed</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Return the words-per-minute (WPM) of the TYPED string.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    Arguments:</span></span><br><span class="line"><span class="string">        typed: an entered string</span></span><br><span class="line"><span class="string">        elapsed: an amount of time in seconds</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; wpm(&#x27;hello friend hello buddy hello&#x27;, 15)</span></span><br><span class="line"><span class="string">    24.0</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; wpm(&#x27;0123456789&#x27;,60)</span></span><br><span class="line"><span class="string">    2.0</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">assert</span> elapsed &gt; <span class="number">0</span>, <span class="string">&#x27;Elapsed time must be positive&#x27;</span></span><br><span class="line">    <span class="comment"># BEGIN PROBLEM 4</span></span><br><span class="line">    <span class="keyword">return</span> (<span class="built_in">len</span>(typed)/<span class="number">5</span>)/(elapsed/<span class="number">60</span>)</span><br><span class="line">    <span class="comment"># END PROBLEM 4</span></span><br></pre></td></tr></table></figure><h1 id="Phase-2-Autocorrect"><a href="#Phase-2-Autocorrect" class="headerlink" title="Phase 2: Autocorrect"></a>Phase 2: Autocorrect</h1><blockquote><p>When students in the past have tried to implement the functions without thoroughly reading the problem description, they’ve often run into issues. 😱 <strong>Read each description thoroughly before starting to code.</strong></p></blockquote><p>In the web-based GUI, there is an autocorrect button, but right now it doesn’t do anything. Let’s implement automatic correction of typos. Whenever the user presses the space bar, if the last word they typed doesn’t match a word in the dictionary but is close to one, then that similar word will be substituted for what they typed.</p><h3 id="Problem-5-2-pts"><a href="#Problem-5-2-pts" class="headerlink" title="Problem 5 (2 pts)"></a>Problem 5 (2 pts)</h3><p>Implement <code>autocorrect</code>, which takes a <code>typed_word</code>, a <code>word_list</code>, a <code>diff_function</code>, and a <code>limit</code>.</p><p>If the <code>typed_word</code> is contained inside the <code>word_list</code>, <code>autocorrect</code> returns that word.</p><p><em>Otherwise</em>, <code>autocorrect</code> returns the word from <code>word_list</code> that has the lowest difference from the provided <code>typed_word</code> based on the <code>diff_function</code>. However, if the lowest difference between <code>typed_word</code> and any of the words in <code>word_list</code> is greater than <code>limit</code>, then <code>typed_word</code> is returned instead.</p><blockquote><p><strong>Important</strong>: If <code>typed_word</code> is not contained inside <code>word_list</code>, and multiple strings have the same lowest difference from <code>typed_word</code> according to the <code>diff_function</code>, <code>autocorrect</code> should return the string that appears first in <code>word_list</code>.</p></blockquote><p>A diff function takes in three arguments. The first is the <code>typed_word</code>, the second is the source word (in this case, a word from <code>word_list</code>), and the third argument is the <code>limit</code>. The output of the diff function, which is a number, represents the amount of difference between the two strings.</p><blockquote><p><strong>Note</strong>: Some diff functions may be asymmetric (meaning flipping the first two parameters may yield a different output), so make sure to pass in the arguments to <code>diff_function</code> in the correct order. We will see an example of an asymmetric diff function in problem 7.</p></blockquote><p>Here is an example of a diff function that computes the minimum of <code>1 + limit</code> and the difference in length between the two input strings:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">def</span> <span class="title function_">length_diff</span>(<span class="params">w1, w2, limit</span>):</span><br><span class="line"><span class="meta">... </span>    <span class="keyword">return</span> <span class="built_in">min</span>(limit + <span class="number">1</span>, <span class="built_in">abs</span>(<span class="built_in">len</span>(w2) - <span class="built_in">len</span>(w1)))</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>length_diff(<span class="string">&#x27;mellow&#x27;</span>, <span class="string">&#x27;cello&#x27;</span>, <span class="number">10</span>)</span><br><span class="line"><span class="number">1</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>length_diff(<span class="string">&#x27;hippo&#x27;</span>, <span class="string">&#x27;hippopotamus&#x27;</span>, <span class="number">5</span>)</span><br><span class="line"><span class="number">6</span></span><br></pre></td></tr></table></figure><p>Assume that <code>typed_word</code> and all elements of <code>word_list</code> are lowercase and have no punctuation.</p><blockquote><p><strong>Hint</strong>: Try using <code>max</code> or <code>min</code> with the optional <code>key</code> argument.</p></blockquote><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">autocorrect</span>(<span class="params">typed_word, word_list, diff_function, limit</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Returns the element of WORD_LIST that has the smallest difference</span></span><br><span class="line"><span class="string">    from TYPED_WORD. Instead returns TYPED_WORD if that difference is greater</span></span><br><span class="line"><span class="string">    than LIMIT.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    Arguments:</span></span><br><span class="line"><span class="string">        typed_word: a string representing a word that may contain typos</span></span><br><span class="line"><span class="string">        word_list: a list of strings representing source words</span></span><br><span class="line"><span class="string">        diff_function: a function quantifying the difference between two words</span></span><br><span class="line"><span class="string">        limit: a number</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; ten_diff = lambda w1, w2, limit: 10 # Always returns 10</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; autocorrect(&quot;hwllo&quot;, [&quot;butter&quot;, &quot;hello&quot;, &quot;potato&quot;], ten_diff, 20)</span></span><br><span class="line"><span class="string">    &#x27;butter&#x27;</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; first_diff = lambda w1, w2, limit: (1 if w1[0] != w2[0] else 0) # Checks for matching first char</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; autocorrect(&quot;tosting&quot;, [&quot;testing&quot;, &quot;asking&quot;, &quot;fasting&quot;], first_diff, 10)</span></span><br><span class="line"><span class="string">    &#x27;testing&#x27;</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># BEGIN PROBLEM 5</span></span><br><span class="line">    theword=typed_word</span><br><span class="line">    <span class="built_in">min</span> = limit</span><br><span class="line">    <span class="keyword">if</span> typed_word <span class="keyword">in</span> word_list:</span><br><span class="line">        <span class="keyword">return</span> typed_word</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">for</span> word <span class="keyword">in</span> word_list:</span><br><span class="line">            distence = diff_function(typed_word,word,limit)</span><br><span class="line">            <span class="keyword">if</span> distence &lt;= <span class="built_in">min</span>:</span><br><span class="line">                <span class="keyword">if</span> theword == typed_word <span class="keyword">or</span> distence &lt; <span class="built_in">min</span>:</span><br><span class="line">                    <span class="built_in">min</span> = distence</span><br><span class="line">                    theword = word</span><br><span class="line">        <span class="keyword">return</span> theword </span><br><span class="line">    <span class="comment"># END PROBLEM 5</span></span><br></pre></td></tr></table></figure><h3 id="Problem-6-3-pts"><a href="#Problem-6-3-pts" class="headerlink" title="Problem 6 (3 pts)"></a>Problem 6 (3 pts)</h3><p>Implement <code>feline_fixes</code>, which is a diff function that takes two strings. It returns the minimum number of characters that must be changed in the <code>typed</code> word in order to transform it into the <code>source</code> word. If the strings are not of equal length, the difference in lengths is added to the total.</p><blockquote><p><strong>Important</strong>: You may not use <code>while</code>, <code>for</code>, or list comprehensions in your implementation. Use recursion.</p></blockquote><p>Here are some examples:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">&gt;&gt;&gt; big_limit = 10</span><br><span class="line">&gt;&gt;&gt; feline_fixes(&quot;nice&quot;, &quot;rice&quot;, big_limit)    # Substitute: n -&gt; r</span><br><span class="line">1</span><br><span class="line">&gt;&gt;&gt; feline_fixes(&quot;range&quot;, &quot;rungs&quot;, big_limit)  # Substitute: a -&gt; u, e -&gt; s</span><br><span class="line">2</span><br><span class="line">&gt;&gt;&gt; feline_fixes(&quot;pill&quot;, &quot;pillage&quot;, big_limit) # Don&#x27;t substitute anything, length difference of 3.</span><br><span class="line">3</span><br><span class="line">&gt;&gt;&gt; feline_fixes(&quot;roses&quot;, &quot;arose&quot;, big_limit)  # Substitute: r -&gt; a, o -&gt; r, s -&gt; o, e -&gt; s, s -&gt; e</span><br><span class="line">5</span><br><span class="line">&gt;&gt;&gt; feline_fixes(&quot;rose&quot;, &quot;hello&quot;, big_limit)   # Substitute: r-&gt;h, o-&gt;e, s-&gt;l, e-&gt;l, length difference of 1.</span><br><span class="line">5</span><br></pre></td></tr></table></figure><blockquote><p><strong>Important:</strong> If the number of characters that must change is greater than <code>limit</code>, then <code>feline_fixes</code> should return any number larger than <code>limit</code> and should minimize the amount of computation needed to do so.</p><p>These two calls to <code>feline_fixes</code> should take about the same amount of time to evaluate:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&gt;&gt;&gt; limit = 4</span><br><span class="line">&gt;&gt;&gt; feline_fixes(&quot;roses&quot;, &quot;arose&quot;, limit) &gt; limit</span><br><span class="line">True</span><br><span class="line">&gt;&gt;&gt; feline_fixes(&quot;rosesabcdefghijklm&quot;, &quot;arosenopqrstuvwxyz&quot;, limit) &gt; limit</span><br><span class="line">True</span><br></pre></td></tr></table></figure></blockquote><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">feline_fixes</span>(<span class="params">typed, source, limit</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;A diff function for autocorrect that determines how many letters</span></span><br><span class="line"><span class="string">    in TYPED need to be substituted to create SOURCE, then adds the difference in</span></span><br><span class="line"><span class="string">    their lengths and returns the result.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    Arguments:</span></span><br><span class="line"><span class="string">        typed: a starting word</span></span><br><span class="line"><span class="string">        source: a string representing a desired goal word</span></span><br><span class="line"><span class="string">        limit: a number representing an upper bound on the number of chars that must change</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; big_limit = 10</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; feline_fixes(&quot;nice&quot;, &quot;rice&quot;, big_limit)    # Substitute: n -&gt; r</span></span><br><span class="line"><span class="string">    1</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; feline_fixes(&quot;range&quot;, &quot;rungs&quot;, big_limit)  # Substitute: a -&gt; u, e -&gt; s</span></span><br><span class="line"><span class="string">    2</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; feline_fixes(&quot;pill&quot;, &quot;pillage&quot;, big_limit) # Don&#x27;t substitute anything, length difference of 3.</span></span><br><span class="line"><span class="string">    3</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; feline_fixes(&quot;roses&quot;, &quot;arose&quot;, big_limit)  # Substitute: r -&gt; a, o -&gt; r, s -&gt; o, e -&gt; s, s -&gt; e</span></span><br><span class="line"><span class="string">    5</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; feline_fixes(&quot;rose&quot;, &quot;hello&quot;, big_limit)   # Substitute: r-&gt;h, o-&gt;e, s-&gt;l, e-&gt;l, length difference of 1.</span></span><br><span class="line"><span class="string">    5</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># BEGIN PROBLEM 6</span></span><br><span class="line">    <span class="keyword">if</span> limit&lt;<span class="number">0</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="number">1</span></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(typed) == <span class="number">0</span> <span class="keyword">or</span> <span class="built_in">len</span>(source) == <span class="number">0</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">max</span>(<span class="built_in">len</span>(source),<span class="built_in">len</span>(typed))</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">if</span> source[<span class="number">0</span>] != typed[<span class="number">0</span>]:</span><br><span class="line">            <span class="keyword">return</span> feline_fixes(typed[<span class="number">1</span>:], source[<span class="number">1</span>:], limit-<span class="number">1</span>)+<span class="number">1</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">return</span> feline_fixes(typed[<span class="number">1</span>:], source[<span class="number">1</span>:], limit)</span><br><span class="line">    <span class="comment"># END PROBLEM 6</span></span><br></pre></td></tr></table></figure><h3 id="Problem-7-3-pts"><a href="#Problem-7-3-pts" class="headerlink" title="Problem 7 (3 pts)"></a>Problem 7 (3 pts)</h3><p>Implement <code>minimum_mewtations</code>, which is a diff function that returns the minimum number of edit operations needed to transform the <code>start</code> word into the <code>goal</code> word.</p><p>There are three kinds of edit operations, with some examples:</p><ol><li>Add a letter to <code>start</code>.<ul><li>Adding <code>&quot;k&quot;</code> to <code>&quot;itten&quot;</code> gives us <code>&quot;kitten&quot;</code>.</li></ul></li><li>Remove a letter from <code>start</code>.<ul><li>Removing <code>&quot;s&quot;</code> from <code>&quot;scat&quot;</code> givs us <code>&quot;cat&quot;</code>.</li></ul></li><li>Substitute a letter in <code>start</code> for another.<ul><li>Substituting <code>&quot;z&quot;</code> with <code>&quot;j&quot;</code> in <code>&quot;zaguar&quot;</code> gives us <code>&quot;jaguar&quot;</code>.</li></ul></li></ol><p>Each edit operation contributes 1 to the difference between two words.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">&gt;&gt;&gt; big_limit = 10</span><br><span class="line">&gt;&gt;&gt; minimum_mewtations(&quot;cats&quot;, &quot;scat&quot;, big_limit)       # cats -&gt; scats -&gt; scat</span><br><span class="line">2</span><br><span class="line">&gt;&gt;&gt; minimum_mewtations(&quot;purng&quot;, &quot;purring&quot;, big_limit)   # purng -&gt; purrng -&gt; purring</span><br><span class="line">2</span><br><span class="line">&gt;&gt;&gt; minimum_mewtations(&quot;ckiteus&quot;, &quot;kittens&quot;, big_limit) # ckiteus -&gt; kiteus -&gt; kitteus -&gt; kittens</span><br><span class="line">3</span><br></pre></td></tr></table></figure><p>We have provided a template of an implementation in <code>cats.py</code>.</p><blockquote><p><strong>Hint:</strong> This is a recursive function with three recursive calls. One of these recursive calls will be similar to the recursive call in <code>feline_fixes</code>.</p></blockquote><p>You may modify the template however you want or delete it entirely.</p><blockquote><p><strong>Important:</strong> If the number of edits required is greater than <code>limit</code>, then <code>minimum_mewtations</code> should return any number larger than <code>limit</code> and should minimize the amount of computation needed to do so.</p><p>These two calls to <code>minimum_mewtations</code> should take about the same amount of time to evaluate:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&gt;&gt;&gt; limit = 2</span><br><span class="line">&gt;&gt;&gt; minimum_mewtations(&quot;ckiteus&quot;, &quot;kittens&quot;, limit) &gt; limit</span><br><span class="line">True</span><br><span class="line">&gt;&gt;&gt; minimum_mewtations(&quot;ckiteusabcdefghijklm&quot;, &quot;kittensnopqrstuvwxyz&quot;, limit) &gt; limit</span><br><span class="line">True</span><br></pre></td></tr></table></figure></blockquote><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 ok -q 07✂️</span><br></pre></td></tr></table></figure><h3 id="Optional-Extension-final-diff-0pt"><a href="#Optional-Extension-final-diff-0pt" class="headerlink" title="(Optional) Extension: final diff (0pt)"></a>(Optional) Extension: final diff (0pt)</h3><p>You may optionally design your own diff function called <code>final_diff</code>. Here are some ideas for making even more accurate corrections:</p><ul><li>Take into account which additions and deletions are more likely than others. For example, it’s much more likely that you’ll accidentally leave out a letter if it appears twice in a row.</li><li>Treat two adjacent letters that have swapped positions as one change, not two.</li><li>Try to incorporate common misspellings.</li></ul><p>You can also set the limit you’d like your diff function to use by changing the value of the variable <code>FINAL_DIFF_LIMIT</code> in <code>cats.py</code>.</p><p>You can check your <code>final_diff</code>‘s success rate by running:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 score.py</span><br></pre></td></tr></table></figure><p>If you don’t know where to start, try copy-pasting your code for <code>feline_fixes</code> and <code>minimum_mewtations</code> into <code>final_diff</code> and scoring them. Looking at the typos they accidentally fixed might give you some ideas!</p><h1 id="Phase-3-Multiplayer"><a href="#Phase-3-Multiplayer" class="headerlink" title="Phase 3: Multiplayer"></a>Phase 3: Multiplayer</h1><blockquote><p>When students in the past have tried to implement the functions without thoroughly reading the problem description, they’ve often run into issues. 😱 <strong>Read each description thoroughly before starting to code.</strong></p></blockquote><p>Typing is more fun with friends! You’ll now implement multiplayer functionality, so that when you run <code>cats_gui.py</code> on your computer, it connects to the course server at <a class="link"   href="https://cats.cs61a.org/" >cats.cs61a.org<i class="fas fa-external-link-alt"></i></a> and looks for someone else to race against.</p><p>To race against a friend, 5 different programs will be running:</p><ul><li>Your GUI, which is a program that handles all the text coloring and display in your web browser.</li><li>Your <code>cats_gui.py</code>, which is a web server that communicates with your GUI using the code you wrote in <code>cats.py</code>.</li><li>Your opponent’s <code>cats_gui.py</code>.</li><li>Your opponent’s GUI.</li><li>The CS 61A multiplayer server, which matches players together and passes messages around.</li></ul><p>When you type, your GUI uploads what you have typed to your <code>cats_gui.py</code> server, which computes how much progress you have made and returns a progress update. It also uploads a progress update to the multiplayer server, so that your opponent’s GUI can display it.</p><p>Meanwhile, your GUI display is always trying to keep current by asking for progress updates from <code>cats_gui.py</code>, which in turn requests that info from the multiplayer server.</p><p>Each player has an <code>id</code> number that is used by the server to track typing progress.</p><h3 id="Problem-8-2-pts"><a href="#Problem-8-2-pts" class="headerlink" title="Problem 8 (2 pts)"></a>Problem 8 (2 pts)</h3><p>Implement <code>report_progress</code>, which is called every time the user finishes typing a word. It takes a list of the words <code>typed</code>, a list of the words in the <code>prompt</code>, the user’s <code>user_id</code>, and a <code>upload</code> function that is used to upload a progress report to the multiplayer server. There will never be more words in <code>typed</code> than in <code>prompt</code>.</p><p>Your progress is a ratio of the words in the <code>prompt</code> that you have typed correctly, up to the first incorrect word, divided by the number of <code>prompt</code> words. For example, this example has a progress of <code>0.25</code>:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">report_progress([&quot;Hello&quot;, &quot;ths&quot;, &quot;is&quot;], [&quot;Hello&quot;, &quot;this&quot;, &quot;is&quot;, &quot;wrong&quot;], ...)</span><br></pre></td></tr></table></figure><p>Your <code>report_progress</code> function should do two things: upload a message to the multiplayer server and return the progress of the player with <code>user_id</code>.</p><p>You can upload a message to the multiplayer server by calling the <code>upload</code> function on a two-element dictionary containing the keys <code>&#39;id&#39;</code> and <code>&#39;progress&#39;</code>. You should then return the player’s progress, which is the ratio of words you computed.</p><blockquote><p><strong>Hint:</strong> See the dictionary below for an example of a potential input into the <code>upload</code> function. This dictionary represents a player with <code>user_id</code> 1 and <code>progress</code> 0.6.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;&#x27;id&#x27;: 1, &#x27;progress&#x27;: 0.6&#125;</span><br></pre></td></tr></table></figure></blockquote><p>Before writing any code, unlock the tests to verify your understanding of the question:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 ok -q 08 -u✂️</span><br></pre></td></tr></table></figure><p>Once you are done unlocking, begin implementing your solution. You can check your correctness with:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 ok -q 08✂️</span><br></pre></td></tr></table></figure><h3 id="Problem-9-2-pts"><a href="#Problem-9-2-pts" class="headerlink" title="Problem 9 (2 pts)"></a>Problem 9 (2 pts)</h3><p>Implement <code>time_per_word</code>, which takes in a list <code>words</code> and <code>times_per_player</code>, a list of lists for each player with timestamps indicating when each player finished typing every individual word in <code>words</code>. It returns a <code>match</code> with the given information.</p><p>A <code>match</code> is a dictionary that stores <code>words</code> and <code>times</code>. The <code>times</code> are stored as a list of lists of how long it took each player to type every word in <code>words</code>. Specifically, <code>times[i][j]</code> indicates how long it took player <code>i</code> to type <code>words[j]</code>.</p><p>For example, say <code>words = [&#39;Hello&#39;, &#39;world&#39;]</code> and <code>times = [[5, 1], [4, 2]]</code>, then <code>[5, 1]</code> corresponds to the list of times for player 0, and <code>[4, 2]</code> corresponds to the list of times for player 1. Thus, player 0 took <code>5</code> units of time to write the word <code>&#39;Hello&#39;</code>.</p><blockquote><p><strong>Important</strong>: Be sure to use the <code>match</code> constructor when returning a <code>match</code>. The tests will check that you are using the <code>match</code> dictionary rather than assuming a particular data format.</p><p>Read the definitions for the <code>match</code> constructor in <code>cats.py</code> to learn more about how the dictionary is implemented.</p></blockquote><p>Timestamps are cumulative and always increasing, while the values in <code>times</code> are <strong>differences between consecutive timestamps for each player</strong>.</p><p>Here’s an example: If <code>times_per_player = [[1, 3, 5], [2, 5, 6]]</code>, the corresponding <code>times</code> attribute of the <code>match</code> would be <code>[[2,2], [3, 1]]</code>. This is because the differences in timestamps are <code>(3-1)</code>, <code>(5-3)</code> for the first player and <code>(5-2)</code>, <code>(6-5)</code> for the second player. The first value of each list within <code>times_per_player</code> represents the initial starting time for each player.</p><p>Before writing any code, unlock the tests to verify your understanding of the question:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 ok -q 09 -u✂️</span><br></pre></td></tr></table></figure><p>Once you are done unlocking, begin implementing your solution. You can check your correctness with:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 ok -q 09✂️</span><br></pre></td></tr></table></figure><p>👩🏽‍💻👨🏿‍💻 <a class="link"   href="https://inst.eecs.berkeley.edu/~cs61a/fa22/articles/pair-programming" >Pair programming?<i class="fas fa-external-link-alt"></i></a> We suggest switching roles now, if you haven’t recently. Almost done!</p><h3 id="Problem-10-2-pts"><a href="#Problem-10-2-pts" class="headerlink" title="Problem 10 (2 pts)"></a>Problem 10 (2 pts)</h3><p>Implement <code>fastest_words</code>, which returns which words each player typed fastest. This function is called once both players have finished typing. It takes in a <code>match</code>.</p><p>Specifically, the <code>fastest_words</code> function returns a list of lists of words, one list for each player, and within each list the words they typed the fastest (against all the other players). In the case of a tie, consider the earliest player in the list (the smallest player index) to be the one who typed it the fastest.</p><p>For example consider the following match with the words ‘Just’, ‘have’, and ‘fun’. Player 0 typed ‘fun’ the fastest (3 seconds), Player 1 typed ‘Just’ the fastest (4 seconds), and they tied on the word ‘have’ (both took 1 second) so we consider to Player 0 to be the fastest, because they are the earliest player in the list.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">&gt;&gt;&gt; player_0 = [5, 1, 3]</span><br><span class="line">&gt;&gt;&gt; player_1 = [4, 1, 6]</span><br><span class="line">&gt;&gt;&gt; fastest_words(match([&#x27;Just&#x27;, &#x27;have&#x27;, &#x27;fun&#x27;], [player_0, player_1]))</span><br><span class="line">[[&#x27;have&#x27;, &#x27;fun&#x27;], [&#x27;Just&#x27;]]</span><br></pre></td></tr></table></figure><p>The <code>match</code> argument is a <code>match</code> dictionary, like the one returned in Problem 9. You can access words in the <code>match</code> with the selector <code>get_word</code>, which takes in a <code>match</code> and the <code>word_index</code> (an integer). With <code>get_word</code> you can access the time it took any player to type any word using <code>time</code>.</p><blockquote><p><strong>Important</strong>: Be sure to use the <code>match</code> constructor when returning a <code>match</code>. The tests will check that you are using the <code>match</code> dictionary rather than assuming a particular data format.</p><p>Make sure your implementation does not mutate the given player input lists. For the example above, calling <code>fastest_words</code> on <code>[player_0, player_1]</code> should <strong>not</strong> mutate <code>player_0</code> or <code>player_1</code>.</p></blockquote><p>Before writing any code, unlock the tests to verify your understanding of the question:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 ok -q 10 -u✂️</span><br></pre></td></tr></table></figure><p>Once you are done unlocking, begin implementing your solution. You can check your correctness with:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 ok -q 10✂️</span><br></pre></td></tr></table></figure><p>Congratulations! Now you can play against other students in the course. Set <code>enable_multiplayer</code> to <code>True</code> near the bottom of <code>cats.py</code> and type swiftly!</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 cats_gui.py</span><br></pre></td></tr></table></figure><p>At this point, run the entire autograder to see if there are any tests that don’t pass.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 ok</span><br></pre></td></tr></table></figure><p>Once you are satisfied, submit to Ok to complete the project.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 ok --submit</span><br></pre></td></tr></table></figure><p>If you have a partner, make sure to add them to the submission on <a class="link"   href="https://okpy.org/" >okpy<i class="fas fa-external-link-alt"></i></a>.</p><p>Check to make sure that you did all the problems by running:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 ok --score</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Project-2-CS-61A-Autocorrected-Typing-Software-cats-zip&quot;&gt;&lt;a href=&quot;#Project-2-CS-61A-Autocorrected-Typing-Software-cats-zip&quot; class=&quot;h</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>CS61A Project 1</title>
    <link href="http://43.138.155.79/2023/11/15/CS61A%20Project%201/"/>
    <id>http://43.138.155.79/2023/11/15/CS61A%20Project%201/</id>
    <published>2023-11-15T13:55:14.000Z</published>
    <updated>2024-03-04T13:12:42.363Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Project-1-The-Game-of-Hog-hog-zip"><a href="#Project-1-The-Game-of-Hog-hog-zip" class="headerlink" title="Project 1: The Game of Hog hog.zip"></a>Project 1: The Game of Hog <a class="link"   href="https://inst.eecs.berkeley.edu/~cs61a/fa22/proj/hog/hog.zip" >hog.zip<i class="fas fa-external-link-alt"></i></a></h1><blockquote><p><img                       lazyload                     alt="image"                     data-src="https://inst.eecs.berkeley.edu/~cs61a/fa22/proj/hog/assets/icon.gif"                      alt="5-sided die"                ></p><p>I know! I’ll use my<br>Higher-order functions to<br>Order higher rolls.</p></blockquote><h2 id="Introduction"><a href="#Introduction" class="headerlink" title="Introduction"></a>Introduction</h2><blockquote><p><strong>Important submission note:</strong> For full credit:</p><ul><li>Submit with Phase 1 complete by <strong>Tuesday, Sept 6</strong>, worth 1 pt.</li><li>Submit the complete project by <strong>Friday, Sept 9</strong>.</li></ul><p>Try to attempt the problems in order, as some later problems will depend on earlier problems in their implementation and therefore also when running <code>ok</code> tests.</p><p>You may complete the project with a partner.</p><p>You can get 1 bonus point by submitting the entire project by <strong>Thursday, Sept 8</strong> You can receive extensions on the project deadline and checkpoint deadline, but not on the early deadline, unless you’re a DSP student with an accommodation for assignment extensions.</p></blockquote><p>In this project, you will develop a simulator and multiple strategies for the dice game Hog. You will need to use <em>control statements</em> and <em>higher-order functions</em> together, as described in Sections 1.2 through 1.6 of <a class="link"   href="http://composingprograms.com/" >Composing Programs<i class="fas fa-external-link-alt"></i></a>, the online textbook.</p><blockquote><p>When students in the past have tried to implement the functions without thoroughly reading the problem description, they’ve often run into issues. 😱 <strong>Read each description thoroughly before starting to code.</strong></p></blockquote><h3 id="Rules"><a href="#Rules" class="headerlink" title="Rules"></a>Rules</h3><p>In Hog, two players alternate turns trying to be the first to end a turn with at least <code>GOAL</code> total points, where <code>GOAL</code> defaults to 100. On each turn, the current player chooses some number of dice to roll, up to 10. That player’s score for the turn is the sum of the dice outcomes. However, a player who rolls too many dice risks:</p><ul><li><strong>Sow Sad</strong>. If any of the dice outcomes is a 1, the current player’s score for the turn is <code>1</code>.</li></ul><p>In a normal game of Hog, those are all the rules. To spice up the game, we’ll include some special rules:</p><ul><li><p><strong>Pig Tail</strong>. A player who chooses to roll zero dice scores <code>2 * abs(tens - ones) + 1</code> points; where <code>tens</code>, <code>ones</code> are the tens and ones digits of the opponent’s score. The ones digit refers to the rightmost digit and the tens digit refers to the second-rightmost digit.</p></li><li><p><strong>Square Swine</strong>. After a player gains points for their turn, if the resulting score is a perfect square, then increase their score to the next higher perfect square. A perfect square is any integer <code>n</code> where <code>n = d * d</code> for some integer <code>d</code>.</p></li></ul><h2 id="Phase-1-Rules-of-the-Game"><a href="#Phase-1-Rules-of-the-Game" class="headerlink" title="Phase 1: Rules of the Game"></a>Phase 1: Rules of the Game</h2><p>In the first phase, you will develop a simulator for the game of Hog.</p><h3 id="Problem-1-2-pt"><a href="#Problem-1-2-pt" class="headerlink" title="Problem 1 (2 pt)"></a>Problem 1 (2 pt)</h3><p>Implement the <code>roll_dice</code> function in <code>hog.py</code>. It takes two arguments: a positive integer called <code>num_rolls</code> giving the number of dice to roll and a <code>dice</code> function. It returns the number of points scored by rolling the dice that number of times in a turn: either the sum of the outcomes or 1 <em>(Sow Sad)</em>.</p><ul><li><strong>Sow Sad</strong>. If any of the dice outcomes is a 1, the current player’s score for the turn is <code>1</code>.</li></ul><p>Examples</p><p>To obtain a single outcome of a dice roll, call <code>dice()</code>. You should call <code>dice()</code> <strong>exactly <code>num_rolls</code> times</strong> in the body of <code>roll_dice</code>.</p><p>Remember to call <code>dice()</code> exactly <code>num_rolls</code> times <strong>even if Sow Sad happens in the middle of rolling</strong>. By doing so, you will correctly simulate rolling all the dice together (and the user interface will work correctly).</p><blockquote><p><strong>Note:</strong> The <code>roll_dice</code> function, and many other functions throughout the project, makes use of <em>default argument values</em>—you can see this in the function heading:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">def roll_dice(num_rolls, dice=six_sided): ...</span><br></pre></td></tr></table></figure><p>The argument <code>dice=six_sided</code> means that when <code>roll_dice</code> is called, the <code>dice</code> argument is <strong>optional</strong>. If no value for <code>dice</code> is provided, then <code>six_sided</code> is used by default.</p><p>For example, calling <code>roll_dice(3, four_sided)</code>, or equivalently <code>roll_dice(3, dice=four_sided)</code>, simulates rolling 3 four-sided dice, while calling <code>roll_dice(3)</code> simulates rolling 3 six-sided dice.</p></blockquote><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">roll_dice</span>(<span class="params">num_rolls, dice=six_sided</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Simulate rolling the DICE exactly NUM_ROLLS &gt; 0 times. Return the sum of</span></span><br><span class="line"><span class="string">    the outcomes unless any of the outcomes is 1. In that case, return 1.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    num_rolls:  The number of dice rolls that will be made.</span></span><br><span class="line"><span class="string">    dice:       A function that simulates a single dice roll outcome.</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># These assert statements ensure that num_rolls is a positive integer.</span></span><br><span class="line">    <span class="keyword">assert</span> <span class="built_in">type</span>(num_rolls) == <span class="built_in">int</span>, <span class="string">&#x27;num_rolls must be an integer.&#x27;</span></span><br><span class="line">    <span class="keyword">assert</span> num_rolls &gt; <span class="number">0</span>, <span class="string">&#x27;Must roll at least once.&#x27;</span></span><br><span class="line">    <span class="comment"># BEGIN PROBLEM 1</span></span><br><span class="line">    count = <span class="number">0</span></span><br><span class="line">    one = <span class="number">0</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(num_rolls):</span><br><span class="line">        dice_thistime = dice()</span><br><span class="line">        <span class="keyword">if</span> dice_thistime == <span class="number">1</span>:</span><br><span class="line">            one = <span class="number">1</span></span><br><span class="line">        count = count + dice_thistime</span><br><span class="line">    res = (<span class="number">1</span> <span class="keyword">if</span> one == <span class="number">1</span> <span class="keyword">else</span> count)</span><br><span class="line">    <span class="keyword">return</span> res</span><br><span class="line">    <span class="comment"># END PROBLEM 1</span></span><br></pre></td></tr></table></figure><h3 id="Problem-2-2-pt"><a href="#Problem-2-2-pt" class="headerlink" title="Problem 2 (2 pt)"></a>Problem 2 (2 pt)</h3><p>Implement <code>tail_points</code>, which takes the player’s opponent’s current score <code>opponent_score</code>, and returns the number of points scored by Pig Tail when the player rolls 0 dice.</p><ul><li><strong>Pig Tail</strong>. A player who chooses to roll zero dice scores <code>2 * abs(tens - ones) + 1</code> points; where <code>tens</code>, <code>ones</code> are the tens and ones digits of the opponent’s score. The ones digit refers to the rightmost digit and the tens digit refers to the second-rightmost digit.</li></ul><p>Examples</p><blockquote><p>Don’t assume that scores are below 100. Write your <code>tail_points</code> function so that it works correctly for any non-negative score.</p></blockquote><blockquote><p><strong>Important:</strong> Your implementation should <strong>not</strong> use <code>str</code>, lists, or contain square brackets <code>[</code> <code>]</code>. The test cases will check if those have been used.</p></blockquote><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">tail_points</span>(<span class="params">opponent_score</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Return the points scored by rolling 0 dice according to Pig Tail.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    opponent_score:   The total score of the other player.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># BEGIN PROBLEM 2</span></span><br><span class="line">    ones = opponent_score%<span class="number">10</span></span><br><span class="line">    tens = opponent_score%<span class="number">100</span>//<span class="number">10</span></span><br><span class="line">    <span class="keyword">return</span> <span class="number">2</span>*<span class="built_in">abs</span>(tens-ones)+<span class="number">1</span></span><br><span class="line">    <span class="comment"># END PROBLEM 2</span></span><br></pre></td></tr></table></figure><p>You can also test <code>tail_points</code> interactively by running <code>python3 -i hog.py</code> from the terminal and calling <code>tail_points</code> on various inputs.</p><h3 id="Problem-3-2-pt"><a href="#Problem-3-2-pt" class="headerlink" title="Problem 3 (2 pt)"></a>Problem 3 (2 pt)</h3><p>Implement the <code>take_turn</code> function, which returns the number of points scored for a turn by rolling the given <code>dice</code> <code>num_rolls</code> times.</p><p>Your implementation of <code>take_turn</code> should call both <code>roll_dice</code> and <code>tail_points</code> rather than repeating their implementations.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">take_turn</span>(<span class="params">num_rolls, opponent_score, dice=six_sided</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Return the points scored on a turn rolling NUM_ROLLS dice when the</span></span><br><span class="line"><span class="string">    opponent has OPPONENT_SCORE points.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    num_rolls:       The number of dice rolls that will be made.</span></span><br><span class="line"><span class="string">    opponent_score:  The total score of the other player.</span></span><br><span class="line"><span class="string">    dice:            A function that simulates a single dice roll outcome.</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># Leave these assert statements here; they help check for errors.</span></span><br><span class="line">    <span class="keyword">assert</span> <span class="built_in">type</span>(num_rolls) == <span class="built_in">int</span>, <span class="string">&#x27;num_rolls must be an integer.&#x27;</span></span><br><span class="line">    <span class="keyword">assert</span> num_rolls &gt;= <span class="number">0</span>, <span class="string">&#x27;Cannot roll a negative number of dice in take_turn.&#x27;</span></span><br><span class="line">    <span class="keyword">assert</span> num_rolls &lt;= <span class="number">10</span>, <span class="string">&#x27;Cannot roll more than 10 dice.&#x27;</span></span><br><span class="line">    <span class="comment"># BEGIN PROBLEM 3</span></span><br><span class="line">    <span class="keyword">if</span> num_rolls==<span class="number">0</span>:</span><br><span class="line">        <span class="keyword">return</span> tail_points(opponent_score)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">return</span> roll_dice(num_rolls,dice)</span><br><span class="line">    <span class="comment"># END PROBLEM 3</span></span><br></pre></td></tr></table></figure><h3 id="Problem-4-1-pt"><a href="#Problem-4-1-pt" class="headerlink" title="Problem 4 (1 pt)"></a>Problem 4 (1 pt)</h3><p>Add functions <code>perfect_square</code> and <code>next_perfect_square</code> so that <code>square_update</code> returns a player’s total score after they roll <code>num_rolls</code>. You do not need to edit the body of <code>square_update</code>.</p><ul><li><strong>Square Swine</strong>. After a player gains points for their turn, if the resulting score is a perfect square, then increase their score to the next higher perfect square. A perfect square is any integer <code>n</code> where <code>n = d * d</code> for some integer <code>d</code>.</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># BEGIN PROBLEM 4</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">perfect_square</span>(<span class="params">score</span>):</span><br><span class="line">    <span class="keyword">return</span> score ** <span class="number">0.5</span> % <span class="number">1</span> == <span class="number">0</span></span><br><span class="line"> </span><br><span class="line"><span class="keyword">def</span> <span class="title function_">next_perfect_square</span>(<span class="params">score</span>):</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">int</span>((score ** <span class="number">0.5</span> + <span class="number">1</span>)**<span class="number">2</span>)</span><br><span class="line"><span class="comment"># END PROBLEM 4</span></span><br></pre></td></tr></table></figure><h3 id="Problem-5-5-pt"><a href="#Problem-5-5-pt" class="headerlink" title="Problem 5 (5 pt)"></a>Problem 5 (5 pt)</h3><p>Implement the <code>play</code> function, which simulates a full game of Hog. Players take turns rolling dice until one of the players reaches the <code>goal</code> score, and the final scores of both players are returned by the function.</p><p>To determine how many dice are rolled each turn, call the current player’s strategy function (Player 0 uses <code>strategy0</code> and Player 1 uses <code>strategy1</code>). A <em>strategy</em> is a function that, given a player’s score and their opponent’s score, returns the number of dice that the current player will roll in the turn. An example strategy is <code>always_roll_5</code> which appears above <code>play</code>.</p><p>To determine the updated score for a player after they take a turn, call the <code>update</code> function. An <code>update</code> function takes the number of dice to roll, the current player’s score, the opponent’s score, and the dice function used to simulate rolling dice. It returns the updated score of the current player after they take their turn. Two examples of <code>update</code> functions are <code>simple_update</code> and<code>square_update</code>.</p><p>If a player achieves the goal score by the end of their turn, i.e. after all applicable rules have been applied, the game ends. <code>play</code> will then return the final total scores of both players, with Player 0’s score first and Player 1’s score second.</p><p>Some example calls to <code>play</code> are:</p><ul><li><code>play(always_roll_5, always_roll_5, simple_update)</code> simulates two players that both always roll 5 dice each turn, playing with just the Sow Sad and Pig Tail rules.</li><li><code>play(always_roll_5, always_roll_5, square_update)</code> simulates two players that both always roll 5 dice each turn, playing with the Square Swine rule in addition to the Sow Sad and Pig Tail rules (i.e. all the rules).</li></ul><blockquote><p><strong>Important:</strong> For the user interface to work, a strategy function should be called only once per turn. Only call <code>strategy0</code> when it is Player 0’s turn and only call <code>strategy1</code> when it is Player 1’s turn.</p><p><strong>Hints</strong>:</p><ul><li>If <code>who</code> is the current player, the next player is <code>1 - who</code>.</li><li>To call <code>play(always_roll_5, always_roll_5, square_update)</code> and print out what happens each turn, run <code>python3 hog_ui.py</code> from the terminal.</li></ul></blockquote><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">play</span>(<span class="params">strategy0, strategy1, update,</span></span><br><span class="line"><span class="params">         score0=<span class="number">0</span>, score1=<span class="number">0</span>, dice=six_sided, goal=GOAL</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Simulate a game and return the final scores of both players, with</span></span><br><span class="line"><span class="string">    Player 0&#x27;s score first and Player 1&#x27;s score second.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    E.g., play(always_roll_5, always_roll_5, square_update) simulates a game in</span></span><br><span class="line"><span class="string">    which both players always choose to roll 5 dice on every turn and the Square</span></span><br><span class="line"><span class="string">    Swine rule is in effect.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    A strategy function, such as always_roll_5, takes the current player&#x27;s</span></span><br><span class="line"><span class="string">    score and their opponent&#x27;s score and returns the number of dice the current</span></span><br><span class="line"><span class="string">    player chooses to roll.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    An update function, such as square_update or simple_update, takes the number</span></span><br><span class="line"><span class="string">    of dice to roll, the current player&#x27;s score, the opponent&#x27;s score, and the</span></span><br><span class="line"><span class="string">    dice function used to simulate rolling dice. It returns the updated score</span></span><br><span class="line"><span class="string">    of the current player after they take their turn.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    strategy0: The strategy for player0.</span></span><br><span class="line"><span class="string">    strategy1: The strategy for player1.</span></span><br><span class="line"><span class="string">    update:    The update function (used for both players).</span></span><br><span class="line"><span class="string">    score0:    Starting score for Player 0</span></span><br><span class="line"><span class="string">    score1:    Starting score for Player 1</span></span><br><span class="line"><span class="string">    dice:      A function of zero arguments that simulates a dice roll.</span></span><br><span class="line"><span class="string">    goal:      The game ends and someone wins when this score is reached.</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    who = <span class="number">0</span>  <span class="comment"># Who is about to take a turn, 0 (first) or 1 (second)</span></span><br><span class="line">    <span class="comment"># BEGIN PROBLEM 5</span></span><br><span class="line">    <span class="keyword">while</span> score0 &lt; goal <span class="keyword">and</span> score1 &lt; goal:</span><br><span class="line">        <span class="keyword">if</span> who == <span class="number">0</span>:</span><br><span class="line">            score0 = update(strategy0(score0, score1), score0, score1, dice)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            score1 = update(strategy1(score1, score0), score1, score0, dice)</span><br><span class="line">        who = <span class="number">1</span> - who</span><br><span class="line">    <span class="comment"># END PROBLEM 5</span></span><br><span class="line">    <span class="keyword">return</span> score0, score1</span><br></pre></td></tr></table></figure><h2 id="Phase-2-Strategies"><a href="#Phase-2-Strategies" class="headerlink" title="Phase 2: Strategies"></a>Phase 2: Strategies</h2><p>In this phase, you will experiment with ways to improve upon the basic strategy of always rolling five dice. A <em>strategy</em> is a function that takes two arguments: the current player’s score and their opponent’s score. It returns the number of dice the player will roll, which can be from 0 to 10 (inclusive).</p><h3 id="Problem-6-2-pt"><a href="#Problem-6-2-pt" class="headerlink" title="Problem 6 (2 pt)"></a>Problem 6 (2 pt)</h3><p>Implement <code>always_roll</code>, a higher-order function that takes a number of dice <code>n</code> and returns a strategy that always rolls <code>n</code> dice. Thus, <code>always_roll(5)</code> would be equivalent to <code>always_roll_5</code>.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">always_roll</span>(<span class="params">n</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Return a player strategy that always rolls N dice.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    A player strategy is a function that takes two total scores as arguments</span></span><br><span class="line"><span class="string">    (the current player&#x27;s score, and the opponent&#x27;s score), and returns a</span></span><br><span class="line"><span class="string">    number of dice that the current player will roll this turn.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; strategy = always_roll(3)</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; strategy(0, 0)</span></span><br><span class="line"><span class="string">    3</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; strategy(99, 99)</span></span><br><span class="line"><span class="string">    3</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">assert</span> n &gt;= <span class="number">0</span> <span class="keyword">and</span> n &lt;= <span class="number">10</span></span><br><span class="line">    <span class="comment"># BEGIN PROBLEM 6</span></span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">lambda</span> score, opponent_score : n</span><br><span class="line">    <span class="comment"># END PROBLEM 6</span></span><br></pre></td></tr></table></figure><h3 id="Problem-7-2-pt"><a href="#Problem-7-2-pt" class="headerlink" title="Problem 7 (2 pt)"></a>Problem 7 (2 pt)</h3><p>A strategy only has a fixed number of possible argument values. In a game to 100, there are 100 possible <code>score</code> values (0-99) and 100 possible <code>opponent_score</code> values (0-99), giving 10,000 possible argument combinations.</p><p>Implement <code>is_always_roll</code>, which takes a strategy and returns whether that strategy always rolls the same number of dice for every possible argument combination.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">is_always_roll</span>(<span class="params">strategy, goal=GOAL</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Return whether strategy always chooses the same number of dice to roll.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; is_always_roll(always_roll_5)</span></span><br><span class="line"><span class="string">    True</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; is_always_roll(always_roll(3))</span></span><br><span class="line"><span class="string">    True</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; is_always_roll(catch_up)</span></span><br><span class="line"><span class="string">    False</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># BEGIN PROBLEM 7</span></span><br><span class="line">    start = strategy(<span class="number">0</span>,<span class="number">0</span>)</span><br><span class="line">    <span class="keyword">for</span> m <span class="keyword">in</span> <span class="built_in">range</span>(goal):</span><br><span class="line">        <span class="keyword">for</span> n <span class="keyword">in</span> <span class="built_in">range</span>(goal):</span><br><span class="line">            <span class="keyword">if</span> strategy(m,n)!=start:</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">    <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">    <span class="comment"># END PROBLEM 7</span></span><br></pre></td></tr></table></figure><h3 id="Problem-8-2-pt"><a href="#Problem-8-2-pt" class="headerlink" title="Problem 8 (2 pt)"></a>Problem 8 (2 pt)</h3><p>Implement <code>make_averaged</code>, which is a higher-order function that takes a function <code>original_function</code> as an argument.</p><p>The return value of <code>make_averaged</code> is a function that takes in the same number of arguments as <code>original_function</code>. When we call this returned function on the arguments, it will return the average value of repeatedly calling <code>original_function</code> on the arguments passed in.</p><p>Specifically, this function should call <code>original_function</code> a total of <code>total_samples</code> times and return the average of the results of these calls.</p><blockquote><p><strong>Important:</strong> To implement this function, you will need to use a new piece of Python syntax. We would like to write a function that accepts an arbitrary number of arguments, and then calls another function using exactly those arguments. Here’s how it works.</p><p>Instead of listing formal parameters for a function, you can write <code>*args</code>, which represents all of the <strong>arg</strong>ument<strong>s</strong> that get passed into the function. We can then call another function with these same arguments by passing these <code>*args</code> into this other function. For example:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">&gt;&gt;&gt; def printed(f):</span><br><span class="line">...     def print_and_return(*args):</span><br><span class="line">...         result = f(*args)</span><br><span class="line">...         print(&#x27;Result:&#x27;, result)</span><br><span class="line">...         return result</span><br><span class="line">...     return print_and_return</span><br><span class="line">&gt;&gt;&gt; printed_pow = printed(pow)</span><br><span class="line">&gt;&gt;&gt; printed_pow(2, 8)</span><br><span class="line">Result: 256</span><br><span class="line">256</span><br><span class="line">&gt;&gt;&gt; printed_abs = printed(abs)</span><br><span class="line">&gt;&gt;&gt; printed_abs(-10)</span><br><span class="line">Result: 10</span><br><span class="line">10</span><br></pre></td></tr></table></figure><p>Here, we can pass any number of arguments into <code>print_and_return</code> via the <code>*args</code> syntax. We can also use <code>*args</code> inside our <code>print_and_return</code> function to make another function call with the same arguments.</p></blockquote><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">make_averaged</span>(<span class="params">original_function, total_samples=<span class="number">1000</span></span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Return a function that returns the average value of ORIGINAL_FUNCTION</span></span><br><span class="line"><span class="string">    called TOTAL_SAMPLES times.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    To implement this function, you will have to use *args syntax.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; dice = make_test_dice(4, 2, 5, 1)</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; averaged_dice = make_averaged(roll_dice, 40)</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; averaged_dice(1, dice)  # The avg of 10 4&#x27;s, 10 2&#x27;s, 10 5&#x27;s, and 10 1&#x27;s</span></span><br><span class="line"><span class="string">    3.0</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># BEGIN PROBLEM 8</span></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">new_function</span>(<span class="params">*args</span>):</span><br><span class="line">        count = <span class="number">0</span></span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(total_samples):</span><br><span class="line">            count += original_function(*args)</span><br><span class="line">        <span class="keyword">return</span> count/total_samples</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> new_function</span><br><span class="line">    <span class="comment"># END PROBLEM 8</span></span><br></pre></td></tr></table></figure><h3 id="Problem-9-2-pt"><a href="#Problem-9-2-pt" class="headerlink" title="Problem 9 (2 pt)"></a>Problem 9 (2 pt)</h3><p>Implement <code>max_scoring_num_rolls</code>, which runs an experiment to determine the number of rolls (from 1 to 10) that gives the maximum average score for a turn. Your implementation should use <code>make_averaged</code> and <code>roll_dice</code>.</p><p>If two numbers of rolls are tied for the maximum average score, return the lower number. For example, if both 3 and 6 achieve a maximum average score, return 3.</p><p>You might find it useful to read the doctest and the example shown in the doctest for this problem before doing the unlocking test.</p><blockquote><p><strong>Important:</strong> In order to pass all of our tests, please make sure that you are testing dice rolls starting from 1 going up to 10, rather than from 10 to 1.</p></blockquote><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">max_scoring_num_rolls</span>(<span class="params">dice=six_sided, total_samples=<span class="number">1000</span></span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Return the number of dice (1 to 10) that gives the highest average turn score</span></span><br><span class="line"><span class="string">    by calling roll_dice with the provided DICE a total of TOTAL_SAMPLES times.</span></span><br><span class="line"><span class="string">    Assume that the dice always return positive outcomes.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; dice = make_test_dice(1, 6)</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; max_scoring_num_rolls(dice)</span></span><br><span class="line"><span class="string">    1</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># BEGIN PROBLEM 9</span></span><br><span class="line">    max_score = <span class="number">0</span></span><br><span class="line">    bestnum=<span class="number">0</span></span><br><span class="line">    averaged_dice = make_averaged(roll_dice, total_samples)</span><br><span class="line">    the_dice = dice</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span> (<span class="number">1</span>,<span class="number">11</span>):</span><br><span class="line">        score = averaged_dice(i, the_dice)</span><br><span class="line">        <span class="keyword">if</span> score &gt; max_score:</span><br><span class="line">            bestnum = i</span><br><span class="line">            max_score = score</span><br><span class="line">    <span class="keyword">return</span> bestnum</span><br><span class="line">    <span class="comment"># END PROBLEM 9</span></span><br></pre></td></tr></table></figure><h3 id="Problem-10-2-pt"><a href="#Problem-10-2-pt" class="headerlink" title="Problem 10 (2 pt)"></a>Problem 10 (2 pt)</h3><p>A strategy can try to take advantage of the <em>Pig Tail</em> rule by rolling 0 when it is most beneficial to do so. Implement <code>tail_strategy</code>, which returns 0 whenever rolling 0 would give <strong>at least</strong> <code>threshold</code> points and returns <code>num_rolls</code> otherwise. This strategy should <strong>not</strong> also take into account the Square Swine rule.</p><blockquote><p><strong>Hint</strong>: You can use the <code>tail_points</code> function you defined in Problem 2.</p></blockquote><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">tail_strategy</span>(<span class="params">score, opponent_score, threshold=<span class="number">12</span>, num_rolls=<span class="number">6</span></span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;This strategy returns 0 dice if Pig Tail gives at least THRESHOLD</span></span><br><span class="line"><span class="string">    points, and returns NUM_ROLLS otherwise. Ignore score and Square Swine.</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># BEGIN PROBLEM 10</span></span><br><span class="line">    <span class="keyword">if</span> tail_points(opponent_score)&gt;=threshold:</span><br><span class="line">        <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line">    <span class="keyword">return</span> num_rolls  <span class="comment"># Remove this line once implemented.</span></span><br><span class="line">    <span class="comment"># END PROBLEM 10</span></span><br></pre></td></tr></table></figure><h3 id="Problem-11-2-pt"><a href="#Problem-11-2-pt" class="headerlink" title="Problem 11 (2 pt)"></a>Problem 11 (2 pt)</h3><p>A better strategy will take advantage of both <em>Pig Tail</em> and <em>Square Swine</em> in combination. Even a small number of pig tail points can lead to large gains. For example, if a player has 31 points and their opponent has 42, rolling 0 would bring them to 36 which is a perfect square, and so they would end the turn with 49 points: a gain of 49 - 31 &#x3D; 18!</p><p>The <code>square_strategy</code> returns 0 whenever rolling 0 would result in a score that is <strong>at least</strong> <code>threshold</code> points more than the player’s score at the start of turn.</p><blockquote><p><strong>Hint</strong>: You can use the <code>square_update</code> function.</p></blockquote><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">square_strategy</span>(<span class="params">score, opponent_score, threshold=<span class="number">12</span>, num_rolls=<span class="number">6</span></span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;This strategy returns 0 dice when your score would increase by at least threshold.&quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># BEGIN PROBLEM 11</span></span><br><span class="line">    <span class="keyword">if</span> square_update(<span class="number">0</span>, score, opponent_score)-score &gt;= threshold:</span><br><span class="line">        <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line">    <span class="keyword">return</span> num_rolls  <span class="comment"># Remove this line once implemented.</span></span><br><span class="line">    <span class="comment"># END PROBLEM 11</span></span><br></pre></td></tr></table></figure><p>You should find that running <code>python3 hog.py -r</code> now shows a win rate for <code>square_strategy</code> close to 62%.</p><h3 id="Optional-Problem-12-0-pt"><a href="#Optional-Problem-12-0-pt" class="headerlink" title="Optional: Problem 12 (0 pt)"></a>Optional: Problem 12 (0 pt)</h3><p>Implement <code>final_strategy</code>, which combines these ideas and any other ideas you have to achieve a high win rate against the baseline strategy. Some suggestions:</p><ul><li>If you know the goal score (by default it is 100), there’s no benefit to scoring more than the goal. Check whether you can win by rolling 0, 1 or 2 dice. If you are in the lead, you might decide to take fewer risks.</li><li>Instead of using a threshold, roll 0 whenever it would give you more points on average than rolling 6.</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">final_strategy</span>(<span class="params">score, opponent_score</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Write a brief description of your final strategy.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    *** YOUR DESCRIPTION HERE ***</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># BEGIN PROBLEM 12</span></span><br><span class="line">    averaged_dice = make_averaged(roll_dice, <span class="number">100</span>)</span><br><span class="line">    <span class="keyword">if</span> square_update(<span class="number">0</span>, score, opponent_score)-score &gt;= averaged_dice(<span class="number">6</span>):</span><br><span class="line">        <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line">    <span class="keyword">elif</span> <span class="number">100</span> - score &lt; averaged_dice(<span class="number">1</span>):</span><br><span class="line">        <span class="keyword">return</span> <span class="number">1</span></span><br><span class="line">    <span class="keyword">elif</span> <span class="number">100</span> - score &lt; averaged_dice(<span class="number">2</span>):</span><br><span class="line">        <span class="keyword">return</span> <span class="number">2</span></span><br><span class="line">    <span class="keyword">elif</span> <span class="number">100</span> - score &lt; averaged_dice(<span class="number">3</span>):</span><br><span class="line">        <span class="keyword">return</span> <span class="number">3</span></span><br><span class="line">    <span class="keyword">elif</span> <span class="number">100</span> - score &lt; averaged_dice(<span class="number">4</span>):</span><br><span class="line">        <span class="keyword">return</span> <span class="number">4</span></span><br><span class="line">    <span class="keyword">elif</span> <span class="number">100</span> - score &lt; averaged_dice(<span class="number">5</span>):</span><br><span class="line">        <span class="keyword">return</span> <span class="number">5</span></span><br><span class="line">    <span class="keyword">else</span> :</span><br><span class="line">        <span class="keyword">return</span> <span class="number">6</span></span><br><span class="line">    <span class="comment"># END PROBLEM 12</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Project-1-The-Game-of-Hog-hog-zip&quot;&gt;&lt;a href=&quot;#Project-1-The-Game-of-Hog-hog-zip&quot; class=&quot;headerlink&quot; title=&quot;Project 1: The Game of Hog</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>CS61A Homework 2</title>
    <link href="http://43.138.155.79/2023/11/14/CS61A%20Homework%202/"/>
    <id>http://43.138.155.79/2023/11/14/CS61A%20Homework%202/</id>
    <published>2023-11-14T13:55:14.000Z</published>
    <updated>2024-03-04T13:13:20.869Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Homework-2-Higher-Order-Functions-hw02-zip"><a href="#Homework-2-Higher-Order-Functions-hw02-zip" class="headerlink" title="Homework 2: Higher Order Functions hw02.zip"></a>Homework 2: Higher Order Functions <a class="link"   href="https://inst.eecs.berkeley.edu/~cs61a/fa22/hw/hw02/hw02.zip" >hw02.zip<i class="fas fa-external-link-alt"></i></a></h1><p><em>Due by 11:59pm on Thursday, September 8</em></p><h1 id="Required-questions"><a href="#Required-questions" class="headerlink" title="Required questions"></a>Required questions</h1><p>Several doctests refer to these functions:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> operator <span class="keyword">import</span> add, mul</span><br><span class="line"></span><br><span class="line">square = <span class="keyword">lambda</span> x: x * x</span><br><span class="line"></span><br><span class="line">identity = <span class="keyword">lambda</span> x: x</span><br><span class="line"></span><br><span class="line">triple = <span class="keyword">lambda</span> x: <span class="number">3</span> * x</span><br><span class="line"></span><br><span class="line">increment = <span class="keyword">lambda</span> x: x + <span class="number">1</span></span><br></pre></td></tr></table></figure><h3 id="Q1-Product"><a href="#Q1-Product" class="headerlink" title="Q1: Product"></a>Q1: Product</h3><p>Write a function called <code>product</code> that returns <code>term(1) * ... * term(n)</code>.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">product</span>(<span class="params">n, term</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Return the product of the first n terms in a sequence.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    n: a positive integer</span></span><br><span class="line"><span class="string">    term:  a function that takes one argument to produce the term</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; product(3, identity)  # 1 * 2 * 3</span></span><br><span class="line"><span class="string">    6</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; product(5, identity)  # 1 * 2 * 3 * 4 * 5</span></span><br><span class="line"><span class="string">    120</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; product(3, square)    # 1^2 * 2^2 * 3^2</span></span><br><span class="line"><span class="string">    36</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; product(5, square)    # 1^2 * 2^2 * 3^2 * 4^2 * 5^2</span></span><br><span class="line"><span class="string">    14400</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; product(3, increment) # (1+1) * (2+1) * (3+1)</span></span><br><span class="line"><span class="string">    24</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; product(3, triple)    # 1*3 * 2*3 * 3*3</span></span><br><span class="line"><span class="string">    162</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="built_in">sum</span>=term(<span class="number">1</span>)</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(n-<span class="number">1</span>):</span><br><span class="line">        <span class="built_in">sum</span>*=term((i+<span class="number">2</span>))</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">sum</span></span><br></pre></td></tr></table></figure><h3 id="Q2-Accumulate"><a href="#Q2-Accumulate" class="headerlink" title="Q2: Accumulate"></a>Q2: Accumulate</h3><p>Let’s take a look at how <code>product</code> is an instance of a more general function called <code>accumulate</code>, which we would like to implement:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">accumulate</span>(<span class="params">merger, start, n, term</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Return the result of merging the first n terms in a sequence and start.</span></span><br><span class="line"><span class="string">    The terms to be merged are term(1), term(2), ..., term(n). merger is a</span></span><br><span class="line"><span class="string">    two-argument commutative function.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; accumulate(add, 0, 5, identity)  # 0 + 1 + 2 + 3 + 4 + 5</span></span><br><span class="line"><span class="string">    15</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; accumulate(add, 11, 5, identity) # 11 + 1 + 2 + 3 + 4 + 5</span></span><br><span class="line"><span class="string">    26</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; accumulate(add, 11, 0, identity) # 11</span></span><br><span class="line"><span class="string">    11</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; accumulate(add, 11, 3, square)   # 11 + 1^2 + 2^2 + 3^2</span></span><br><span class="line"><span class="string">    25</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; accumulate(mul, 2, 3, square)    # 2 * 1^2 * 2^2 * 3^2</span></span><br><span class="line"><span class="string">    72</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; # 2 + (1^2 + 1) + (2^2 + 1) + (3^2 + 1)</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; accumulate(lambda x, y: x + y + 1, 2, 3, square)</span></span><br><span class="line"><span class="string">    19</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; # ((2 * 1^2 * 2) * 2^2 * 2) * 3^2 * 2</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; accumulate(lambda x, y: 2 * x * y, 2, 3, square)</span></span><br><span class="line"><span class="string">    576</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; accumulate(lambda x, y: (x + y) % 17, 19, 20, square)</span></span><br><span class="line"><span class="string">    16</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="string">&quot;*** YOUR CODE HERE ***&quot;</span></span><br><span class="line">    <span class="built_in">sum</span> = start</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(n):</span><br><span class="line">        <span class="built_in">sum</span> = merger(<span class="built_in">sum</span>,term(i+<span class="number">1</span>))</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">sum</span></span><br></pre></td></tr></table></figure><p><code>accumulate</code> has the following parameters:</p><ul><li><code>term</code> and <code>n</code>: the same parameters as in <code>product</code></li><li><code>merger</code>: a two-argument function that specifies how the current term is merged with the previously accumulated terms.</li><li><code>start</code>: value at which to start the accumulation.</li></ul><p>For example, the result of <code>accumulate(add, 11, 3, square)</code> is</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">11</span> + square(<span class="number">1</span>) + square(<span class="number">2</span>) + square(<span class="number">3</span>) = <span class="number">25</span></span><br></pre></td></tr></table></figure><blockquote><p><strong>Note:</strong> You may assume that <code>merger</code> is commutative. That is, <code>merger(a, b) == merger(b, a)</code> for all <code>a</code> and <code>b</code>. However, you may not assume <code>merger</code> is chosen from a fixed function set and hard-code the solution.</p></blockquote><p>After implementing <code>accumulate</code>, show how <code>summation</code> and <code>product</code> can both be defined as function calls to <code>accumulate</code>.</p><p><strong>Important:</strong> You should have a single line of code (which should be a <code>return</code> statement) in each of your implementations for <code>summation_using_accumulate</code> and <code>product_using_accumulate</code>, which the syntax check will check for.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">summation_using_accumulate</span>(<span class="params">n, term</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Returns the sum: term(0) + ... + term(n), using accumulate.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; summation_using_accumulate(5, square)</span></span><br><span class="line"><span class="string">    55</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; summation_using_accumulate(5, triple)</span></span><br><span class="line"><span class="string">    45</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; # You aren&#x27;t expected to understand the code of this test.</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; # Check that the bodies of the functions are just return statements.</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; # If this errors, make sure you have removed the &quot;***YOUR CODE HERE***&quot;.</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; import inspect, ast</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; [type(x).__name__ for x in ast.parse(inspect.getsource(summation_using_accumulate)).body[0].body]</span></span><br><span class="line"><span class="string">    [&#x27;Expr&#x27;, &#x27;Return&#x27;]</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">return</span> accumulate(add, term(<span class="number">0</span>), n, term)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">product_using_accumulate</span>(<span class="params">n, term</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Returns the product: term(1) * ... * term(n), using accumulate.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; product_using_accumulate(4, square)</span></span><br><span class="line"><span class="string">    576</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; product_using_accumulate(6, triple)</span></span><br><span class="line"><span class="string">    524880</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; # You aren&#x27;t expected to understand the code of this test.</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; # Check that the bodies of the functions are just return statements.</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; # If this errors, make sure you have removed the &quot;***YOUR CODE HERE***&quot;.</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; import inspect, ast</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; [type(x).__name__ for x in ast.parse(inspect.getsource(product_using_accumulate)).body[0].body]</span></span><br><span class="line"><span class="string">    [&#x27;Expr&#x27;, &#x27;Return&#x27;]</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">return</span> accumulate(mul, <span class="number">1</span>, n, term)</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Homework-2-Higher-Order-Functions-hw02-zip&quot;&gt;&lt;a href=&quot;#Homework-2-Higher-Order-Functions-hw02-zip&quot; class=&quot;headerlink&quot; title=&quot;Homework</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>CS61A Homework 4</title>
    <link href="http://43.138.155.79/2023/09/05/CS61A%20Homework%204/"/>
    <id>http://43.138.155.79/2023/09/05/CS61A%20Homework%204/</id>
    <published>2023-09-05T13:55:14.000Z</published>
    <updated>2024-03-04T13:08:58.776Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Homework-4-Sequences-Trees-hw04-zip"><a href="#Homework-4-Sequences-Trees-hw04-zip" class="headerlink" title="Homework 4: Sequences, Trees hw04.zip"></a>Homework 4: Sequences, Trees <a class="link"   href="https://inst.eecs.berkeley.edu/~cs61a/fa22/hw/hw04/hw04.zip" >hw04.zip<i class="fas fa-external-link-alt"></i></a></h1><h1 id="Required-questions"><a href="#Required-questions" class="headerlink" title="Required questions"></a>Required questions</h1><h2 id="Arms-length-recursion"><a href="#Arms-length-recursion" class="headerlink" title="Arms-length recursion"></a>Arms-length recursion</h2><p>Before we get started, a quick comment on recursion with tree data structures. Consider the following function.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">def min_depth(t):</span><br><span class="line">    &quot;&quot;&quot;A simple function to return the distance between t&#x27;s root and its closest leaf&quot;&quot;&quot;</span><br><span class="line">    if is_leaf(t):</span><br><span class="line">        return 0 # Base case---the distance between a node and itself is zero</span><br><span class="line">    h = float(&#x27;inf&#x27;) # Python&#x27;s version of infinity</span><br><span class="line">    for b in branches(t):</span><br><span class="line">        if is_leaf(b): return 1 # !!!</span><br><span class="line">        h = min(h, 1 + min_depth(b))</span><br><span class="line">    return h</span><br></pre></td></tr></table></figure><p>The line flagged with <code>!!!</code> is an “arms-length” recursion violation. Although our code works correctly when it is present, by performing this check we are doing work that should be done by the next level of recursion—we already have an if-statement that handles any inputs to <code>min_depth</code> that are leaves, so we should not include this line to eliminate redundancy in our code.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">min_depth</span>(<span class="params">t</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;A simple function to return the distance between t&#x27;s root and its closest leaf&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">if</span> is_leaf(t):</span><br><span class="line">        <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line">    h = <span class="built_in">float</span>(<span class="string">&#x27;inf&#x27;</span>)</span><br><span class="line">    <span class="keyword">for</span> b <span class="keyword">in</span> branches(t):</span><br><span class="line">        <span class="comment"># Still works fine!</span></span><br><span class="line">        h = <span class="built_in">min</span>(h, <span class="number">1</span> + min_depth(b))</span><br><span class="line">    <span class="keyword">return</span> h</span><br></pre></td></tr></table></figure><p>Arms-length recursion is not only redundant but often complicates our code and obscures the functionality of recursive functions, making writing recursive functions much more difficult. We always want our recursive case to be handling one and only one recursive level. We may or may not be checking your code periodically for things like this.</p><h2 id="Mobiles"><a href="#Mobiles" class="headerlink" title="Mobiles"></a>Mobiles</h2><p><strong>Acknowledgements</strong> This mobile example is based on a classic problem from MIT Structure and Interpretation of Computer Programs, <a class="link"   href="https://mitp-content-server.mit.edu/books/content/sectbyfn/books_pres_0/6515/sicp.zip/full-text/book/book-Z-H-15.html#%_sec_2.2.2" >Section 2.2.2<i class="fas fa-external-link-alt"></i></a>.</p><p><img                       lazyload                     alt="image"                     data-src="https://inst.eecs.berkeley.edu/~cs61a/fa22/hw/hw04/assets/mobile-planet.png"                      alt="Mobile example"                ></p><p>We are making a planetarium mobile. A <a class="link"   href="https://www.northwestnatureshop.com/wp-content/uploads/2015/04/AMSolarSystem.jpg" >mobile<i class="fas fa-external-link-alt"></i></a> is a type of hanging sculpture. A binary mobile consists of two arms. Each arm is a rod of a certain length, from which hangs either a planet or another mobile. For example, the below diagram shows the left and right arms of Mobile A, and what hangs at the ends of each of those arms.</p><p><img                       lazyload                     alt="image"                     data-src="https://inst.eecs.berkeley.edu/~cs61a/fa22/hw/hw04/assets/mobile-planet-labeled.png"                      alt="Labeled Mobile example"                ></p><p>We will represent a binary mobile using the data abstractions below.</p><ul><li>A <code>mobile</code> must have both a left <code>arm</code> and a right <code>arm</code>.</li><li>An <code>arm</code> has a positive length and must have something hanging at the end, either a <code>mobile</code> or <code>planet</code>.</li><li>A <code>planet</code> has a positive mass, and nothing hanging from it.</li></ul><h3 id="Q2-Weights"><a href="#Q2-Weights" class="headerlink" title="Q2: Weights"></a>Q2: Weights</h3><p>Below are the implementations of the various data abstractions used in mobiles. The <code>mobile</code> and <code>arm</code> data abstractions have been completed for you.</p><p>Your job is to implement the <code>planet</code> data abstraction by completing the <code>planet</code> constructor and the <code>mass</code> selector so that a planet is represented using a two-element list where the first element is the string <code>&#39;planet&#39;</code> and the second element is its mass.</p><p><em>Implementation of the Mobile Data Abstraction</em> (<strong>for your reference, no need to do anything here</strong>):</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">mobile</span>(<span class="params">left, right</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Construct a mobile from a left arm and a right arm.&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">assert</span> is_arm(left), <span class="string">&quot;left must be a arm&quot;</span></span><br><span class="line">    <span class="keyword">assert</span> is_arm(right), <span class="string">&quot;right must be a arm&quot;</span></span><br><span class="line">    <span class="keyword">return</span> [<span class="string">&#x27;mobile&#x27;</span>, left, right]</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">is_mobile</span>(<span class="params">m</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Return whether m is a mobile.&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">type</span>(m) == <span class="built_in">list</span> <span class="keyword">and</span> <span class="built_in">len</span>(m) == <span class="number">3</span> <span class="keyword">and</span> m[<span class="number">0</span>] == <span class="string">&#x27;mobile&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">left</span>(<span class="params">m</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Select the left arm of a mobile.&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">assert</span> is_mobile(m), <span class="string">&quot;must call left on a mobile&quot;</span></span><br><span class="line">    <span class="keyword">return</span> m[<span class="number">1</span>]</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">right</span>(<span class="params">m</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Select the right arm of a mobile.&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">assert</span> is_mobile(m), <span class="string">&quot;must call right on a mobile&quot;</span></span><br><span class="line">    <span class="keyword">return</span> m[<span class="number">2</span>]</span><br></pre></td></tr></table></figure><p><em>Implementation of the Arm Data Abstraction</em> (<strong>for your reference, no need to do anything here</strong>):</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">arm</span>(<span class="params">length, mobile_or_planet</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Construct a arm: a length of rod with a mobile or planet at the end.&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">assert</span> is_mobile(mobile_or_planet) <span class="keyword">or</span> is_planet(mobile_or_planet)</span><br><span class="line">    <span class="keyword">return</span> [<span class="string">&#x27;arm&#x27;</span>, length, mobile_or_planet]</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">is_arm</span>(<span class="params">s</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Return whether s is a arm.&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">type</span>(s) == <span class="built_in">list</span> <span class="keyword">and</span> <span class="built_in">len</span>(s) == <span class="number">3</span> <span class="keyword">and</span> s[<span class="number">0</span>] == <span class="string">&#x27;arm&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">length</span>(<span class="params">s</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Select the length of a arm.&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">assert</span> is_arm(s), <span class="string">&quot;must call length on a arm&quot;</span></span><br><span class="line">    <span class="keyword">return</span> s[<span class="number">1</span>]</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">end</span>(<span class="params">s</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Select the mobile or planet hanging at the end of a arm.&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">assert</span> is_arm(s), <span class="string">&quot;must call end on a arm&quot;</span></span><br><span class="line">    <span class="keyword">return</span> s[<span class="number">2</span>]</span><br></pre></td></tr></table></figure><p>(<strong>Your turn!</strong>) <em>Fill out the implementation of the Planet Data Abstraction!</em></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">planet</span>(<span class="params">mass</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Construct a planet of some mass.&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">assert</span> mass &gt; <span class="number">0</span></span><br><span class="line">    <span class="keyword">return</span> [<span class="string">&quot;planet&quot;</span>,mass]</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">mass</span>(<span class="params">w</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Select the mass of a planet.&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">assert</span> is_planet(w), <span class="string">&#x27;must call mass on a planet&#x27;</span></span><br><span class="line">    <span class="keyword">return</span> w[<span class="number">1</span>]</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">is_planet</span>(<span class="params">w</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Whether w is a planet.&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">type</span>(w) == <span class="built_in">list</span> <span class="keyword">and</span> <span class="built_in">len</span>(w) == <span class="number">2</span> <span class="keyword">and</span> w[<span class="number">0</span>] == <span class="string">&#x27;planet&#x27;</span></span><br></pre></td></tr></table></figure><p><em>Total Weight implementation</em> (<strong>for your reference and understanding, no need to do anything here</strong>):</p><p>The <code>total_weight</code> example is provided to demonstrate use of the mobile, arm, and planet abstractions for your reference. You do not need to implement anything here. <strong>You may use the <code>total_weight</code> function in questions 3 and 4.</strong></p><p>The <code>examples</code> function builds and returns three mobiles. These mobiles are used in the doctest examples for <code>total_weight</code>, a function that takes in either a mobile or a planet and returns its total weight. The total weight of a planet is just its mass. The total weight of a mobile is the sum of the masses of all the planets hanging from the mobile.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">examples</span>():</span><br><span class="line">    t = mobile(arm(<span class="number">1</span>, planet(<span class="number">2</span>)),</span><br><span class="line">               arm(<span class="number">2</span>, planet(<span class="number">1</span>)))</span><br><span class="line">    u = mobile(arm(<span class="number">5</span>, planet(<span class="number">1</span>)),</span><br><span class="line">               arm(<span class="number">1</span>, mobile(arm(<span class="number">2</span>, planet(<span class="number">3</span>)),</span><br><span class="line">                              arm(<span class="number">3</span>, planet(<span class="number">2</span>)))))</span><br><span class="line">    v = mobile(arm(<span class="number">4</span>, t), arm(<span class="number">2</span>, u))</span><br><span class="line">    <span class="keyword">return</span> (t, u, v)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">total_weight</span>(<span class="params">m</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Return the total weight of m, a planet or mobile.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; t, u, v = examples()</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; total_weight(t)</span></span><br><span class="line"><span class="string">    3</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; total_weight(u)</span></span><br><span class="line"><span class="string">    6</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; total_weight(v)</span></span><br><span class="line"><span class="string">    9</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; from construct_check import check</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; # checking for abstraction barrier violations by banning indexing</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; check(HW_SOURCE_FILE, &#x27;total_weight&#x27;, [&#x27;Index&#x27;])</span></span><br><span class="line"><span class="string">    True</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">if</span> is_planet(m):</span><br><span class="line">        <span class="keyword">return</span> mass(m)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">assert</span> is_mobile(m), <span class="string">&quot;must get total weight of a mobile or a planet&quot;</span></span><br><span class="line">        <span class="keyword">return</span> total_weight(end(left(m))) + total_weight(end(right(m)))</span><br></pre></td></tr></table></figure><p>Use Ok to test your code:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 ok -q total_weight✂️</span><br></pre></td></tr></table></figure><h3 id="Q3-Balanced"><a href="#Q3-Balanced" class="headerlink" title="Q3: Balanced"></a>Q3: Balanced</h3><p>Implement the <code>balanced</code> function, which returns whether <code>m</code> is a balanced mobile. A mobile is balanced if both of the following conditions are met:</p><ol><li>The torque applied by its left arm is equal to that applied by its right arm. The torque of the left arm is the length of the left rod multiplied by the total weight hanging from that rod. Likewise for the right. For example, if the left arm has a length of <code>5</code>, and there is a <code>mobile</code> hanging at the end of the left arm of total weight <code>10</code>, the torque on the left side of our mobile is <code>50</code>.</li><li>Each of the mobiles hanging at the end of its arms is itself balanced.</li></ol><p>Planets themselves are balanced, as there is nothing hanging off of them.</p><blockquote><p><strong>Reminder:</strong> You may use the <code>total_weight</code> function defined for you in Question 2 (as well as any of the other functions defined in Question 2).</p></blockquote><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">balanced</span>(<span class="params">m</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Return whether m is balanced.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; t, u, v = examples()</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; balanced(t)</span></span><br><span class="line"><span class="string">    True</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; balanced(v)</span></span><br><span class="line"><span class="string">    True</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; w = mobile(arm(3, t), arm(2, u))</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; balanced(w)</span></span><br><span class="line"><span class="string">    False</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; balanced(mobile(arm(1, v), arm(1, w)))</span></span><br><span class="line"><span class="string">    False</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; balanced(mobile(arm(1, w), arm(1, v)))</span></span><br><span class="line"><span class="string">    False</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; from construct_check import check</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; # checking for abstraction barrier violations by banning indexing</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; check(HW_SOURCE_FILE, &#x27;balanced&#x27;, [&#x27;Index&#x27;])</span></span><br><span class="line"><span class="string">    True</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">if</span> is_mobile(m):</span><br><span class="line">        <span class="keyword">if</span> total_weight(end(left(m)))*length(left(m)) != total_weight(end(right(m)))*length(right(m)):</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> balanced(end(left(m))) <span class="keyword">or</span> <span class="keyword">not</span> balanced(end(right(m))):</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">    <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>Use Ok to test your code:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 ok -q balanced✂️</span><br></pre></td></tr></table></figure><h3 id="Q4-Totals"><a href="#Q4-Totals" class="headerlink" title="Q4: Totals"></a>Q4: Totals</h3><p>Implement <code>totals_tree</code>, which takes in a <code>mobile</code> or <code>planet</code> and returns a <code>tree</code> whose root is the total weight of the input. For a <code>planet</code>, <code>totals_tree</code> should return a leaf. For a <code>mobile</code>, <code>totals_tree</code> should return a tree whose label is that <code>mobile</code>‘s total weight, and whose branches are <code>totals_tree</code>s for the ends of its arms. As a reminder, the description of the tree data abstraction can be found <a class="link"   href="http://composingprograms.com/pages/23-sequences.html#trees" >here<i class="fas fa-external-link-alt"></i></a>.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">totals_tree</span>(<span class="params">m</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Return a tree representing the mobile with its total weight at the root.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; t, u, v = examples()</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; print_tree(totals_tree(t))</span></span><br><span class="line"><span class="string">    3</span></span><br><span class="line"><span class="string">      2</span></span><br><span class="line"><span class="string">      1</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; print_tree(totals_tree(u))</span></span><br><span class="line"><span class="string">    6</span></span><br><span class="line"><span class="string">      1</span></span><br><span class="line"><span class="string">      5</span></span><br><span class="line"><span class="string">        3</span></span><br><span class="line"><span class="string">        2</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; print_tree(totals_tree(v))</span></span><br><span class="line"><span class="string">    9</span></span><br><span class="line"><span class="string">      3</span></span><br><span class="line"><span class="string">        2</span></span><br><span class="line"><span class="string">        1</span></span><br><span class="line"><span class="string">      6</span></span><br><span class="line"><span class="string">        1</span></span><br><span class="line"><span class="string">        5</span></span><br><span class="line"><span class="string">          3</span></span><br><span class="line"><span class="string">          2</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; from construct_check import check</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; # checking for abstraction barrier violations by banning indexing</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; check(HW_SOURCE_FILE, &#x27;totals_tree&#x27;, [&#x27;Index&#x27;])</span></span><br><span class="line"><span class="string">    True</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">if</span> is_planet(m):</span><br><span class="line">        <span class="keyword">return</span> [total_weight(m)]</span><br><span class="line">    <span class="keyword">elif</span> is_mobile(m):</span><br><span class="line">        branches = []</span><br><span class="line">        branches.append(totals_tree(end(left(m))))</span><br><span class="line">        branches.append(totals_tree(end(right(m))))</span><br><span class="line">        res = tree(total_weight(m), branches)</span><br><span class="line">        <span class="keyword">return</span> res</span><br></pre></td></tr></table></figure><p>Use Ok to test your code:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 ok -q totals_tree✂️</span><br></pre></td></tr></table></figure><h2 id="More-Trees"><a href="#More-Trees" class="headerlink" title="More Trees"></a>More Trees</h2><h3 id="Q5-Replace-Loki-at-Leaf"><a href="#Q5-Replace-Loki-at-Leaf" class="headerlink" title="Q5: Replace Loki at Leaf"></a>Q5: Replace Loki at Leaf</h3><p>Define <code>replace_loki_at_leaf</code>, which takes a tree <code>t</code> and a value <code>lokis_replacement</code>. <code>replace_loki_at_leaf</code> returns a new tree that’s the same as <code>t</code> except that every leaf label equal to <code>&quot;loki&quot;</code> has been replaced with <code>lokis_replacement</code>.</p><p>If you want to learn about the Norse mythology referenced in this problem, you can read about it <a class="link"   href="https://en.wikipedia.org/wiki/Yggdrasil" >here<i class="fas fa-external-link-alt"></i></a>.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">replace_loki_at_leaf</span>(<span class="params">t, lokis_replacement</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Returns a new tree where every leaf value equal to &quot;loki&quot; has</span></span><br><span class="line"><span class="string">    been replaced with lokis_replacement.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; yggdrasil = tree(&#x27;odin&#x27;,</span></span><br><span class="line"><span class="string">    ...                  [tree(&#x27;balder&#x27;,</span></span><br><span class="line"><span class="string">    ...                        [tree(&#x27;loki&#x27;),</span></span><br><span class="line"><span class="string">    ...                         tree(&#x27;freya&#x27;)]),</span></span><br><span class="line"><span class="string">    ...                   tree(&#x27;frigg&#x27;,</span></span><br><span class="line"><span class="string">    ...                        [tree(&#x27;loki&#x27;)]),</span></span><br><span class="line"><span class="string">    ...                   tree(&#x27;loki&#x27;,</span></span><br><span class="line"><span class="string">    ...                        [tree(&#x27;sif&#x27;),</span></span><br><span class="line"><span class="string">    ...                         tree(&#x27;loki&#x27;)]),</span></span><br><span class="line"><span class="string">    ...                   tree(&#x27;loki&#x27;)])</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; laerad = copy_tree(yggdrasil) # copy yggdrasil for testing purposes</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; print_tree(replace_loki_at_leaf(yggdrasil, &#x27;freya&#x27;))</span></span><br><span class="line"><span class="string">    odin</span></span><br><span class="line"><span class="string">      balder</span></span><br><span class="line"><span class="string">        freya</span></span><br><span class="line"><span class="string">        freya</span></span><br><span class="line"><span class="string">      frigg</span></span><br><span class="line"><span class="string">        freya</span></span><br><span class="line"><span class="string">      loki</span></span><br><span class="line"><span class="string">        sif</span></span><br><span class="line"><span class="string">        freya</span></span><br><span class="line"><span class="string">      freya</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; laerad == yggdrasil # Make sure original tree is unmodified</span></span><br><span class="line"><span class="string">    True</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">if</span> is_leaf(t):</span><br><span class="line">        <span class="keyword">if</span> label(t)==<span class="string">&quot;loki&quot;</span>:</span><br><span class="line">            <span class="keyword">return</span> tree(lokis_replacement)</span><br><span class="line">    <span class="keyword">return</span> tree(label(t),[replace_loki_at_leaf(x, lokis_replacement) <span class="keyword">for</span> x <span class="keyword">in</span> branches(t)])</span><br></pre></td></tr></table></figure><p>Use Ok to test your code:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 ok -q replace_loki_at_leaf✂️</span><br></pre></td></tr></table></figure><h3 id="Q6-Has-Path"><a href="#Q6-Has-Path" class="headerlink" title="Q6: Has Path"></a>Q6: Has Path</h3><p>Write a function <code>has_path</code> that takes in a tree <code>t</code> and a string <code>word</code>. It returns <code>True</code> if there is a path that starts from the root where the entries along the path spell out the <code>word</code>, and <code>False</code> otherwise. (This data structure is called a trie, and it has a lot of cool applications, such as autocomplete). You may assume that every node’s <code>label</code> is exactly one character.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">has_path</span>(<span class="params">t, word</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Return whether there is a path in a tree where the entries along the path</span></span><br><span class="line"><span class="string">    spell out a particular word.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; greetings = tree(&#x27;h&#x27;, [tree(&#x27;i&#x27;),</span></span><br><span class="line"><span class="string">    ...                        tree(&#x27;e&#x27;, [tree(&#x27;l&#x27;, [tree(&#x27;l&#x27;, [tree(&#x27;o&#x27;)])]),</span></span><br><span class="line"><span class="string">    ...                                   tree(&#x27;y&#x27;)])])</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; print_tree(greetings)</span></span><br><span class="line"><span class="string">    h</span></span><br><span class="line"><span class="string">      i</span></span><br><span class="line"><span class="string">      e</span></span><br><span class="line"><span class="string">        l</span></span><br><span class="line"><span class="string">          l</span></span><br><span class="line"><span class="string">            o</span></span><br><span class="line"><span class="string">        y</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; has_path(greetings, &#x27;h&#x27;)</span></span><br><span class="line"><span class="string">    True</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; has_path(greetings, &#x27;i&#x27;)</span></span><br><span class="line"><span class="string">    False</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; has_path(greetings, &#x27;hi&#x27;)</span></span><br><span class="line"><span class="string">    True</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; has_path(greetings, &#x27;hello&#x27;)</span></span><br><span class="line"><span class="string">    True</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; has_path(greetings, &#x27;hey&#x27;)</span></span><br><span class="line"><span class="string">    True</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; has_path(greetings, &#x27;bye&#x27;)</span></span><br><span class="line"><span class="string">    False</span></span><br><span class="line"><span class="string">    &gt;&gt;&gt; has_path(greetings, &#x27;hint&#x27;)</span></span><br><span class="line"><span class="string">    False</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">assert</span> <span class="built_in">len</span>(word) &gt; <span class="number">0</span>, <span class="string">&#x27;no path for empty word.&#x27;</span></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(word) == <span class="number">1</span>:</span><br><span class="line">        <span class="keyword">if</span>(label(t)==word[<span class="number">0</span>]):</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">if</span>(label(t)==word[<span class="number">0</span>]):</span><br><span class="line">            <span class="keyword">for</span> i <span class="keyword">in</span> branches(t):</span><br><span class="line">                <span class="keyword">if</span> has_path(i, word[<span class="number">1</span>:]):</span><br><span class="line">                    <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">            <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">False</span></span><br></pre></td></tr></table></figure><p>Use Ok to test your code:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 ok -q has_path✂️</span><br></pre></td></tr></table></figure><h1 id="Optional-Questions"><a href="#Optional-Questions" class="headerlink" title="Optional Questions"></a>Optional Questions</h1><h2 id="Data-Abstraction"><a href="#Data-Abstraction" class="headerlink" title="Data Abstraction"></a>Data Abstraction</h2><blockquote><p>Feel free to reference <a class="link"   href="http://composingprograms.com/pages/22-data-abstraction.html" >Section 2.2<i class="fas fa-external-link-alt"></i></a> for more information on data abstraction.</p></blockquote><p><strong>Acknowledgements.</strong> This interval arithmetic example is based on a classic problem from Structure and Interpretation of Computer Programs, <a class="link"   href="https://sarabander.github.io/sicp/html/2_002e1.xhtml#g_t2_002e1_002e4" >Section 2.1.4<i class="fas fa-external-link-alt"></i></a>.</p><p><strong>Introduction.</strong> Alyssa P. Hacker is designing a system to help people solve engineering problems. One feature she wants to provide in her system is the ability to manipulate inexact quantities (such as measurements from physical devices) with known precision, so that when computations are done with such approximate quantities the results will be numbers of known precision. For example, if a measured quantity x lies between two numbers a and b, Alyssa would like her system to use this range in computations involving x.</p><p>Alyssa’s idea is to implement interval arithmetic as a set of arithmetic operations for combining “intervals” (objects that represent the range of possible values of an inexact quantity). The result of adding, subracting, multiplying, or dividing two intervals is also an interval, one that represents the range of the result.</p><p>Alyssa suggests the existence of an abstraction called an “interval” that has two endpoints: a lower bound and an upper bound. She also presumes that, given the endpoints of an interval, she can create the interval using data abstraction. Using this constructor and the appropriate selectors, she defines the following operations:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">str_interval</span>(<span class="params">x</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Return a string representation of interval x.&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">return</span> <span class="string">&#x27;&#123;0&#125; to &#123;1&#125;&#x27;</span>.<span class="built_in">format</span>(lower_bound(x), upper_bound(x))</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">add_interval</span>(<span class="params">x, y</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Return an interval that contains the sum of any value in interval x and</span></span><br><span class="line"><span class="string">    any value in interval y.&quot;&quot;&quot;</span></span><br><span class="line">    lower = lower_bound(x) + lower_bound(y)</span><br><span class="line">    upper = upper_bound(x) + upper_bound(y)</span><br><span class="line">    <span class="keyword">return</span> interval(lower, upper)</span><br></pre></td></tr></table></figure><h3 id="Q7-Interval-Abstraction"><a href="#Q7-Interval-Abstraction" class="headerlink" title="Q7: Interval Abstraction"></a>Q7: Interval Abstraction</h3><p>Alyssa’s program is incomplete because she has not specified the implementation of the interval abstraction. She has implemented the constructor for you; fill in the implementation of the selectors.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">interval</span>(<span class="params">a, b</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Construct an interval from a to b.&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">assert</span> a &lt;= b, <span class="string">&#x27;Lower bound cannot be greater than upper bound&#x27;</span></span><br><span class="line">    <span class="keyword">return</span> [a, b]</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">lower_bound</span>(<span class="params">x</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Return the lower bound of interval x.&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">return</span> x[<span class="number">0</span>]</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">upper_bound</span>(<span class="params">x</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Return the upper bound of interval x.&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">return</span> x[<span class="number">1</span>]</span><br></pre></td></tr></table></figure><p>Use Ok to unlock and test your code:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">python3 ok -q interval -u</span><br><span class="line">python3 ok -q interval✂️</span><br></pre></td></tr></table></figure><h3 id="Q8-Interval-Arithmetic"><a href="#Q8-Interval-Arithmetic" class="headerlink" title="Q8: Interval Arithmetic"></a>Q8: Interval Arithmetic</h3><p>After implementing the abstraction, Alyssa decided to implement a few interval arithmetic functions.</p><p>This is her current implementation for <strong>interval multiplication</strong>. Unfortunately there are some data abstraction violations, so your task is to fix this code before <a class="link"   href="https://youtu.be/7zu30DhJLKU?t=444" >someone sets it on fire<i class="fas fa-external-link-alt"></i></a>.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">def mul_interval(x, y):</span><br><span class="line">    &quot;&quot;&quot;Return the interval that contains the product of any value in x and any</span><br><span class="line">    value in y.&quot;&quot;&quot;</span><br><span class="line">    p1 = x[0] * y[0]</span><br><span class="line">    p2 = x[0] * y[1]</span><br><span class="line">    p3 = x[1] * y[0]</span><br><span class="line">    p4 = x[1] * y[1]</span><br><span class="line">    return [min(p1, p2, p3, p4), max(p1, p2, p3, p4)]</span><br></pre></td></tr></table></figure><p>Use Ok to unlock and test your code:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">python3 ok -q mul_interval -u</span><br><span class="line">python3 ok -q mul_interval✂️</span><br></pre></td></tr></table></figure><p><strong>Interval Subtraction</strong></p><p>Using a similar approach as <code>mul_interval</code> and <code>add_interval</code>, define a subtraction function for intervals. If you find yourself repeating code, see if you can reuse functions that have already been implemented.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">sub_interval</span>(<span class="params">x, y</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Return the interval that contains the difference between any value in x</span></span><br><span class="line"><span class="string">    and any value in y.&quot;&quot;&quot;</span></span><br><span class="line">    lower = lower_bound(x) - upper_bound(y)</span><br><span class="line">    upper = upper_bound(x) - lower_bound(y)</span><br><span class="line">    <span class="keyword">return</span> interval(lower, upper)</span><br></pre></td></tr></table></figure><p>Use Ok to unlock and test your code:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">python3 ok -q sub_interval -u</span><br><span class="line">python3 ok -q sub_interval✂️</span><br></pre></td></tr></table></figure><p><strong>Interval Division</strong></p><p>Alyssa implements division below by multiplying by the reciprocal of <code>y</code>. A systems programmer looks over Alyssa’s shoulder and comments that it is not clear what it means to divide by an interval that spans zero. Add an <code>assert</code> statement to Alyssa’s code to ensure that no such interval is used as a divisor:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">div_interval</span>(<span class="params">x, y</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Return the interval that contains the quotient of any value in x divided by</span></span><br><span class="line"><span class="string">    any value in y. Division is implemented as the multiplication of x by the</span></span><br><span class="line"><span class="string">    reciprocal of y.&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">assert</span> lower_bound(y)&gt;<span class="number">0</span> <span class="keyword">or</span> upper_bound(y)&lt;<span class="number">0</span></span><br><span class="line">    reciprocal_y = interval(<span class="number">1</span> / upper_bound(y), <span class="number">1</span> / lower_bound(y))</span><br><span class="line">    <span class="keyword">return</span> mul_interval(x, reciprocal_y)</span><br></pre></td></tr></table></figure><p>Use Ok to unlock and test your code:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">python3 ok -q div_interval -u</span><br><span class="line">python3 ok -q div_interval✂️</span><br></pre></td></tr></table></figure><h3 id="Q9-Par-Diff"><a href="#Q9-Par-Diff" class="headerlink" title="Q9: Par Diff"></a>Q9: Par Diff</h3><p>After considerable work, Alyssa P. Hacker delivers her finished system. Several years later, after she has forgotten all about it, she gets a frenzied call from an irate user, Lem E. Tweakit. It seems that Lem has noticed that the <a class="link"   href="https://en.wikipedia.org/wiki/Series_and_parallel_circuits#Resistors_2" >formula for parallel resistors<i class="fas fa-external-link-alt"></i></a> can be written in two algebraically equivalent ways:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">par1(r1, r2) = (r1 * r2) / (r1 + r2)</span><br></pre></td></tr></table></figure><p>or</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">par2(r1, r2) = 1 / (1/r1 + 1/r2)</span><br></pre></td></tr></table></figure><p>He has written the following two programs, each of which computes the <code>parallel_resistors</code> formula differently:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">def par1(r1, r2):</span><br><span class="line">    return div_interval(mul_interval(r1, r2), add_interval(r1, r2))</span><br><span class="line"></span><br><span class="line">def par2(r1, r2):</span><br><span class="line">    one = interval(1, 1)</span><br><span class="line">    rep_r1 = div_interval(one, r1)</span><br><span class="line">    rep_r2 = div_interval(one, r2)</span><br><span class="line">    return div_interval(one, add_interval(rep_r1, rep_r2))</span><br></pre></td></tr></table></figure><p>Lem points out that Alyssa’s program gives different answers for the two ways of computing. Find two intervals <code>r1</code> and <code>r2</code> that demonstrate the difference in behavior between <code>par1</code> and <code>par2</code> when passed into each of the two functions.</p><p>Demonstrate that Lem is right. Investigate the behavior of the system on a variety of arithmetic expressions. Make some intervals <code>r1</code> and <code>r2</code>, and show that <code>par1</code> and <code>par2</code> can give different results.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">def check_par():</span><br><span class="line">    &quot;&quot;&quot;Return two intervals that give different results for parallel resistors.</span><br><span class="line"></span><br><span class="line">    &gt;&gt;&gt; r1, r2 = check_par()</span><br><span class="line">    &gt;&gt;&gt; x = par1(r1, r2)</span><br><span class="line">    &gt;&gt;&gt; y = par2(r1, r2)</span><br><span class="line">    &gt;&gt;&gt; lower_bound(x) != lower_bound(y) or upper_bound(x) != upper_bound(y)</span><br><span class="line">    True</span><br><span class="line">    &quot;&quot;&quot;</span><br><span class="line">    r1 = interval(7, 123)  # Replace this line!</span><br><span class="line">    r2 = interval(3, 44)  # Replace this line!</span><br><span class="line">    return r1, r2</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Homework-4-Sequences-Trees-hw04-zip&quot;&gt;&lt;a href=&quot;#Homework-4-Sequences-Trees-hw04-zip&quot; class=&quot;headerlink&quot; title=&quot;Homework 4: Sequences,</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>CS61A Homework 1</title>
    <link href="http://43.138.155.79/2023/06/15/CS61A%20Homework%201/"/>
    <id>http://43.138.155.79/2023/06/15/CS61A%20Homework%201/</id>
    <published>2023-06-15T13:55:14.000Z</published>
    <updated>2024-03-04T13:09:57.769Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Homework-1-Functions-Control-hw01-zip"><a href="#Homework-1-Functions-Control-hw01-zip" class="headerlink" title="Homework 1: Functions, Control hw01.zip"></a>Homework 1: Functions, Control <a class="link"   href="https://inst.eecs.berkeley.edu/~cs61a/fa22/hw/hw01/hw01.zip" >hw01.zip<i class="fas fa-external-link-alt"></i></a></h1><p><em>Due by 11:59pm on Thursday, September 1</em></p><h1 id="Required-Questions"><a href="#Required-Questions" class="headerlink" title="Required Questions"></a>Required Questions</h1><h3 id="Q1-A-Plus-Abs-B"><a href="#Q1-A-Plus-Abs-B" class="headerlink" title="Q1: A Plus Abs B"></a>Q1: A Plus Abs B</h3><p>Python’s <code>operator</code> module defines <em>binary functions</em> for Python’s intrinsic arithmetic operators. For example, calling <code>operator.add(2,3)</code> is equivalent to calling the expression <code>2 + 3</code>; both will return <code>5</code>.</p><blockquote><p>Note that when the <code>operator</code> module is imported into the namespace, like at the top of <code>hw01.py</code>, you can just call <code>add(2,3)</code> instead of <code>operator.add(2,3)</code>.</p></blockquote><p>Fill in the blanks in the following function for adding <code>a</code> to the absolute value of <code>b</code>, without calling <code>abs</code>. You may <strong>not</strong> modify any of the provided code other than the two blanks.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">def a_plus_abs_b(a, b):</span><br><span class="line">    &quot;&quot;&quot;Return a+abs(b), but without calling abs.</span><br><span class="line"></span><br><span class="line">    &gt;&gt;&gt; a_plus_abs_b(2, 3)</span><br><span class="line">    5</span><br><span class="line">    &gt;&gt;&gt; a_plus_abs_b(2, -3)</span><br><span class="line">    5</span><br><span class="line">    &gt;&gt;&gt; a_plus_abs_b(-1, 4)</span><br><span class="line">    3</span><br><span class="line">    &gt;&gt;&gt; a_plus_abs_b(-1, -4)</span><br><span class="line">    3</span><br><span class="line">    &quot;&quot;&quot;</span><br><span class="line">    if b &lt; 0:</span><br><span class="line">        f = lambda x,y:x-y</span><br><span class="line">    else:</span><br><span class="line">        f = lambda x,y:x+y</span><br><span class="line">    return f(a, b)</span><br></pre></td></tr></table></figure><h3 id="Q2-Two-of-Three"><a href="#Q2-Two-of-Three" class="headerlink" title="Q2: Two of Three"></a>Q2: Two of Three</h3><p>Write a function that takes three <em>positive</em> numbers as arguments and returns the sum of the squares of the two smallest numbers. <strong>Use only a single line for the body of the function.</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">def two_of_three(i, j, k):</span><br><span class="line">    &quot;&quot;&quot;Return m*m + n*n, where m and n are the two smallest members of the</span><br><span class="line">    positive numbers i, j, and k.</span><br><span class="line"></span><br><span class="line">    &gt;&gt;&gt; two_of_three(1, 2, 3)</span><br><span class="line">    5</span><br><span class="line">    &gt;&gt;&gt; two_of_three(5, 3, 1)</span><br><span class="line">    10</span><br><span class="line">    &gt;&gt;&gt; two_of_three(10, 2, 8)</span><br><span class="line">    68</span><br><span class="line">    &gt;&gt;&gt; two_of_three(5, 5, 5)</span><br><span class="line">    50</span><br><span class="line">    &quot;&quot;&quot;</span><br><span class="line">    return i * i + j * j + k * k-max(i, j, k)*max(i, j, k)</span><br></pre></td></tr></table></figure><h3 id="Q3-Largest-Factor"><a href="#Q3-Largest-Factor" class="headerlink" title="Q3: Largest Factor"></a>Q3: Largest Factor</h3><p>Write a function that takes an integer <code>n</code> that is <strong>greater than 1</strong> and returns the largest integer that is smaller than <code>n</code> and evenly divides <code>n</code>.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">def largest_factor(n):</span><br><span class="line">    &quot;&quot;&quot;Return the largest factor of n that is smaller than n.</span><br><span class="line"></span><br><span class="line">    &gt;&gt;&gt; largest_factor(15) # factors are 1, 3, 5</span><br><span class="line">    5</span><br><span class="line">    &gt;&gt;&gt; largest_factor(80) # factors are 1, 2, 4, 5, 8, 10, 16, 20, 40</span><br><span class="line">    40</span><br><span class="line">    &gt;&gt;&gt; largest_factor(13) # factor is 1 since 13 is prime</span><br><span class="line">    1</span><br><span class="line">    &quot;&quot;&quot;</span><br><span class="line">    &quot;*** YOUR CODE HERE ***&quot;</span><br><span class="line">    factor = n-1</span><br><span class="line">    while factor&gt;0:</span><br><span class="line">        if n%factor==0:</span><br><span class="line">            return factor</span><br><span class="line">        factor-=1</span><br></pre></td></tr></table></figure><h3 id="Q4-Hailstone"><a href="#Q4-Hailstone" class="headerlink" title="Q4: Hailstone"></a>Q4: Hailstone</h3><p>Douglas Hofstadter’s Pulitzer-prize-winning book, <em>Gödel, Escher, Bach</em>, poses the following mathematical puzzle.</p><ol><li>Pick a positive integer <code>n</code> as the start.</li><li>If <code>n</code> is even, divide it by 2.</li><li>If <code>n</code> is odd, multiply it by 3 and add 1.</li><li>Continue this process until <code>n</code> is 1.</li></ol><p>The number <code>n</code> will travel up and down but eventually end at 1 (at least for all numbers that have ever been tried – nobody has ever proved that the sequence will terminate). Analogously, a hailstone travels up and down in the atmosphere before eventually landing on earth.</p><p>This sequence of values of <code>n</code> is often called a Hailstone sequence. Write a function that takes a single argument with formal parameter name <code>n</code>, prints out the hailstone sequence starting at <code>n</code>, and returns the number of steps in the sequence:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">def hailstone(n):</span><br><span class="line">    &quot;&quot;&quot;Print the hailstone sequence starting at n and return its</span><br><span class="line">    length.</span><br><span class="line"></span><br><span class="line">    &gt;&gt;&gt; a = hailstone(10)</span><br><span class="line">    10</span><br><span class="line">    5</span><br><span class="line">    16</span><br><span class="line">    8</span><br><span class="line">    4</span><br><span class="line">    2</span><br><span class="line">    1</span><br><span class="line">    &gt;&gt;&gt; a</span><br><span class="line">    7</span><br><span class="line">    &gt;&gt;&gt; b = hailstone(1)</span><br><span class="line">    1</span><br><span class="line">    &gt;&gt;&gt; b</span><br><span class="line">    1</span><br><span class="line">    &quot;&quot;&quot;</span><br><span class="line">    &quot;*** YOUR CODE HERE ***&quot;</span><br><span class="line">    count = 1</span><br><span class="line">    print(n)</span><br><span class="line">    while n&gt;1:</span><br><span class="line">        if n%2==0:</span><br><span class="line">            n//=2</span><br><span class="line">        else:</span><br><span class="line">            n=n*3+1</span><br><span class="line">        print(n)</span><br><span class="line">        count+=1</span><br><span class="line">    return count</span><br></pre></td></tr></table></figure><img                       lazyload                     alt="image"                     data-src="/2023/06/15/CS61A%20Homework%201/3f900a2f9e4f740.png"                      class="1"                >]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Homework-1-Functions-Control-hw01-zip&quot;&gt;&lt;a href=&quot;#Homework-1-Functions-Control-hw01-zip&quot; class=&quot;headerlink&quot; title=&quot;Homework 1: Functi</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>test</title>
    <link href="http://43.138.155.79/2023/06/12/test/"/>
    <id>http://43.138.155.79/2023/06/12/test/</id>
    <published>2023-06-12T13:20:24.000Z</published>
    <updated>2024-03-03T05:12:39.735Z</updated>
    
    
    
    
    
  </entry>
  
  <entry>
    <title>CS61A Lab 1</title>
    <link href="http://43.138.155.79/2023/06/08/CS61A%20Lab%201/"/>
    <id>http://43.138.155.79/2023/06/08/CS61A%20Lab%201/</id>
    <published>2023-06-08T13:55:14.000Z</published>
    <updated>2024-03-04T13:08:22.828Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Lab-1-Functions-Control-lab01-zip"><a href="#Lab-1-Functions-Control-lab01-zip" class="headerlink" title="Lab 1: Functions, Control lab01.zip"></a>Lab 1: Functions, Control <a class="link"   href="https://inst.eecs.berkeley.edu/~cs61a/fa22/lab/lab01/lab01.zip" >lab01.zip<i class="fas fa-external-link-alt"></i></a></h1><p><em>Due by 11:59pm on Wednesday, August 31.</em></p><h2 id="Syllabus-Quiz"><a href="#Syllabus-Quiz" class="headerlink" title="Syllabus Quiz"></a>Syllabus Quiz</h2><h3 id="Q1-Syllabus-Quiz"><a href="#Q1-Syllabus-Quiz" class="headerlink" title="Q1: Syllabus Quiz"></a>Q1: Syllabus Quiz</h3><p>Please fill out the <a class="link"   href="https://forms.gle/HQcUhDwKjFufonaWA" >Syllabus Quiz<i class="fas fa-external-link-alt"></i></a>, which is based off of our policies found on the course <a class="link"   href="https://cs61a.org/articles/about/" >syllabus<i class="fas fa-external-link-alt"></i></a>.</p><h2 id="What-Would-Python-Display-WWPD"><a href="#What-Would-Python-Display-WWPD" class="headerlink" title="What Would Python Display? (WWPD)"></a>What Would Python Display? (WWPD)</h2><h3 id="Q2-WWPD-Control"><a href="#Q2-WWPD-Control" class="headerlink" title="Q2: WWPD: Control"></a>Q2: WWPD: Control</h3><blockquote><p>Use Ok to test your knowledge with the following “What Would Python Display?” questions:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 ok -q control -u✂️</span><br></pre></td></tr></table></figure></blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line">&gt;&gt;&gt; def xk(c, d):</span><br><span class="line">...     if c == 4:</span><br><span class="line">...         return 6</span><br><span class="line">...     elif d &gt;= 4:</span><br><span class="line">...         return 6 + 7 + c</span><br><span class="line">...     else:</span><br><span class="line">...         return 25</span><br><span class="line">&gt;&gt;&gt; xk(10, 10)</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; xk(10, 6)</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; xk(4, 6)</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; xk(0, 0)</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; def how_big(x):</span><br><span class="line">...     if x &gt; 10:</span><br><span class="line">...         print(&#x27;huge&#x27;)</span><br><span class="line">...     elif x &gt; 5:</span><br><span class="line">...         return &#x27;big&#x27;</span><br><span class="line">...     elif x &gt; 0:</span><br><span class="line">...         print(&#x27;small&#x27;)</span><br><span class="line">...     else:</span><br><span class="line">...         print(&quot;nothing&quot;)</span><br><span class="line">&gt;&gt;&gt; how_big(7)</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; how_big(12)</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; how_big(1)</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; how_big(-1)</span><br><span class="line">______</span><br></pre></td></tr></table></figure><blockquote><p><strong>Hint</strong>: Make sure your <code>while</code> loop conditions eventually evaluate to a false value, or they’ll never stop! Typing <code>Ctrl-C</code> will stop infinite loops in the interpreter.</p></blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">&gt;&gt;&gt; n = 3</span><br><span class="line">&gt;&gt;&gt; while n &gt;= 0:</span><br><span class="line">...     n -= 1</span><br><span class="line">...     print(n)</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; positive = 28</span><br><span class="line">&gt;&gt;&gt; while positive:</span><br><span class="line">...    print(&quot;positive?&quot;)</span><br><span class="line">...    positive -= 3</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; positive = -9</span><br><span class="line">&gt;&gt;&gt; negative = -12</span><br><span class="line">&gt;&gt;&gt; while negative:</span><br><span class="line">...    if positive:</span><br><span class="line">...        print(negative)</span><br><span class="line">...    positive += 3</span><br><span class="line">...    negative += 3</span><br><span class="line">______</span><br></pre></td></tr></table></figure><h3 id="Q3-WWPD-Veritasiness"><a href="#Q3-WWPD-Veritasiness" class="headerlink" title="Q3: WWPD: Veritasiness"></a>Q3: WWPD: Veritasiness</h3><blockquote><p>Use Ok to test your knowledge with the following “What Would Python Display?” questions:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 ok -q short-circuit -u✂️</span><br></pre></td></tr></table></figure></blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">&gt;&gt;&gt; True and 13</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; False or 0</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; not 10</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; not None</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; True and 1 / 0 and False</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; True or 1 / 0 or False</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; True and 0</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; False or 1</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; 1 and 3 and 6 and 10 and 15</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; -1 and 1 &gt; 0</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; 0 or False or 2 or 1 / 0</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; not 0</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; (1 + 1) and 1</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; 1/0 or True</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; (True or False) and False</span><br><span class="line">______</span><br></pre></td></tr></table></figure><h3 id="Q4-Debugging-Quiz"><a href="#Q4-Debugging-Quiz" class="headerlink" title="Q4: Debugging Quiz"></a>Q4: Debugging Quiz</h3><p>The following is a quick quiz on different debugging techniques that will be helpful for you to use in this class. You can refer to the <a class="link"   href="https://inst.eecs.berkeley.edu/~cs61a/fa22/articles/debugging/" >debugging article<i class="fas fa-external-link-alt"></i></a> to answer the questions.</p><h2 id="Code-Writing-Questions"><a href="#Code-Writing-Questions" class="headerlink" title="Code Writing Questions"></a>Code Writing Questions</h2><h3 id="Q5-Falling-Factorial"><a href="#Q5-Falling-Factorial" class="headerlink" title="Q5: Falling Factorial"></a>Q5: Falling Factorial</h3><p>Let’s write a function <code>falling</code>, which is a “falling” factorial that takes two arguments, <code>n</code> and <code>k</code>, and returns the product of <code>k</code> consecutive numbers, starting from <code>n</code> and working downwards. When <code>k</code> is 0, the function should return 1.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">def falling(n, k):</span><br><span class="line">    &quot;&quot;&quot;Compute the falling factorial of n to depth k.</span><br><span class="line"></span><br><span class="line">    &gt;&gt;&gt; falling(6, 3)  # 6 * 5 * 4</span><br><span class="line">    120</span><br><span class="line">    &gt;&gt;&gt; falling(4, 3)  # 4 * 3 * 2</span><br><span class="line">    24</span><br><span class="line">    &gt;&gt;&gt; falling(4, 1)  # 4</span><br><span class="line">    4</span><br><span class="line">    &gt;&gt;&gt; falling(4, 0)</span><br><span class="line">    1</span><br><span class="line">    &quot;&quot;&quot;</span><br><span class="line">    &quot;*** YOUR CODE HERE ***&quot;</span><br><span class="line">    i = 0</span><br><span class="line">    res = 1</span><br><span class="line">    while i &lt; k:</span><br><span class="line">        res *= (n-i)</span><br><span class="line">        i += 1</span><br><span class="line">    return res</span><br></pre></td></tr></table></figure><h3 id="Q6-Sum-Digits"><a href="#Q6-Sum-Digits" class="headerlink" title="Q6: Sum Digits"></a>Q6: Sum Digits</h3><p>Write a function that takes in a nonnegative integer and sums its digits. (Using floor division and modulo might be helpful here!)</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">def sum_digits(y):</span><br><span class="line">    &quot;&quot;&quot;Sum all the digits of y.</span><br><span class="line"></span><br><span class="line">    &gt;&gt;&gt; sum_digits(10) # 1 + 0 = 1</span><br><span class="line">    1</span><br><span class="line">    &gt;&gt;&gt; sum_digits(4224) # 4 + 2 + 2 + 4 = 12</span><br><span class="line">    12</span><br><span class="line">    &gt;&gt;&gt; sum_digits(1234567890)</span><br><span class="line">    45</span><br><span class="line">    &gt;&gt;&gt; a = sum_digits(123) # make sure that you are using return rather than print</span><br><span class="line">    &gt;&gt;&gt; a</span><br><span class="line">    6</span><br><span class="line">    &quot;&quot;&quot;</span><br><span class="line">    &quot;*** YOUR CODE HERE ***&quot;</span><br><span class="line">    count = 0</span><br><span class="line">    while y &gt; 0:</span><br><span class="line">        count += y % 10</span><br><span class="line">        y = y//10</span><br><span class="line">    return count</span><br></pre></td></tr></table></figure><h1 id="Extra-Practice"><a href="#Extra-Practice" class="headerlink" title="Extra Practice"></a>Extra Practice</h1><blockquote><p>These questions are optional and will not affect your score on this assignment. However, they are <strong>great practice</strong> for future assignments, projects, and exams. Attempting these questions can be valuable in helping cement your knowledge of course concepts.</p></blockquote><h3 id="Q7-WWPD-What-If"><a href="#Q7-WWPD-What-If" class="headerlink" title="Q7: WWPD: What If?"></a>Q7: WWPD: What If?</h3><blockquote><p>Use Ok to test your knowledge with the following “What Would Python Display?” questions:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 ok -q if-statements -u✂️</span><br></pre></td></tr></table></figure><p><strong>Hint</strong>: <code>print</code> (unlike <code>return</code>) does <em>not</em> cause the function to exit.</p></blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">&gt;&gt;&gt; def ab(c, d):</span><br><span class="line">...     if c &gt; 5:</span><br><span class="line">...         print(c)</span><br><span class="line">...     elif c &gt; 7:</span><br><span class="line">...         print(d)</span><br><span class="line">...     print(&#x27;foo&#x27;)</span><br><span class="line">&gt;&gt;&gt; ab(10, 20)</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; def bake(cake, make):</span><br><span class="line">...     if cake == 0:</span><br><span class="line">...         cake = cake + 1</span><br><span class="line">...         print(cake)</span><br><span class="line">...     if cake == 1:</span><br><span class="line">...         print(make)</span><br><span class="line">...     else:</span><br><span class="line">...         return cake</span><br><span class="line">...     return make</span><br><span class="line">&gt;&gt;&gt; bake(0, 29)</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; bake(1, &quot;mashed potatoes&quot;)</span><br><span class="line">______</span><br></pre></td></tr></table></figure><h3 id="Q8-Double-Eights"><a href="#Q8-Double-Eights" class="headerlink" title="Q8: Double Eights"></a>Q8: Double Eights</h3><p>Write a function that takes in a number and determines if the digits contain two adjacent 8s.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">def double_eights(n):</span><br><span class="line">    &quot;&quot;&quot;Return true if n has two eights in a row.</span><br><span class="line">    &gt;&gt;&gt; double_eights(8)</span><br><span class="line">    False</span><br><span class="line">    &gt;&gt;&gt; double_eights(88)</span><br><span class="line">    True</span><br><span class="line">    &gt;&gt;&gt; double_eights(2882)</span><br><span class="line">    True</span><br><span class="line">    &gt;&gt;&gt; double_eights(880088)</span><br><span class="line">    True</span><br><span class="line">    &gt;&gt;&gt; double_eights(12345)</span><br><span class="line">    False</span><br><span class="line">    &gt;&gt;&gt; double_eights(80808080)</span><br><span class="line">    False</span><br><span class="line">    &quot;&quot;&quot;</span><br><span class="line">    &quot;*** YOUR CODE HERE ***&quot;</span><br><span class="line">    count = 0</span><br><span class="line">    while n &gt; 0:</span><br><span class="line">        if n % 10==8:</span><br><span class="line">            count += 1</span><br><span class="line">        n = n//10</span><br><span class="line">    return count==2</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Lab-1-Functions-Control-lab01-zip&quot;&gt;&lt;a href=&quot;#Lab-1-Functions-Control-lab01-zip&quot; class=&quot;headerlink&quot; title=&quot;Lab 1: Functions, Control </summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>CS61A Lab 2</title>
    <link href="http://43.138.155.79/2023/06/08/CS61A%20Lab%202/"/>
    <id>http://43.138.155.79/2023/06/08/CS61A%20Lab%202/</id>
    <published>2023-06-08T13:55:14.000Z</published>
    <updated>2024-03-04T13:08:17.650Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Lab-2-Higher-Order-Functions-Lambda-Expressions-lab02-zip"><a href="#Lab-2-Higher-Order-Functions-Lambda-Expressions-lab02-zip" class="headerlink" title="Lab 2: Higher-Order Functions, Lambda Expressions lab02.zip"></a>Lab 2: Higher-Order Functions, Lambda Expressions <a class="link"   href="https://inst.eecs.berkeley.edu/~cs61a/fa22/lab/lab02/lab02.zip" >lab02.zip<i class="fas fa-external-link-alt"></i></a></h1><p><em>Due by 11:59pm on Wednesday, September 7.</em></p><h3 id="Q1-WWPD-Lambda-the-Free"><a href="#Q1-WWPD-Lambda-the-Free" class="headerlink" title="Q1: WWPD: Lambda the Free"></a>Q1: WWPD: Lambda the Free</h3><blockquote><p>Use Ok to test your knowledge with the following “What Would Python Display?” questions:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 ok -q lambda -u✂️</span><br></pre></td></tr></table></figure><p>As a reminder, the following two lines of code will not display anything in the Python interpreter when executed:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">&gt;&gt;&gt; x = None</span><br><span class="line">&gt;&gt;&gt; x</span><br></pre></td></tr></table></figure></blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line">&gt;&gt;&gt; lambda x: x  # A lambda expression with one parameter x</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; a = lambda x: x  # Assigning the lambda function to the name a</span><br><span class="line">&gt;&gt;&gt; a(5)</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; (lambda: 3)()  # Using a lambda expression as an operator in a call exp.</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; b = lambda x: lambda: x  # Lambdas can return other lambdas!</span><br><span class="line">&gt;&gt;&gt; c = b(88)</span><br><span class="line">&gt;&gt;&gt; c</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; c()</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; d = lambda f: f(4)  # They can have functions as arguments as well.</span><br><span class="line">&gt;&gt;&gt; def square(x):</span><br><span class="line">...     return x * x</span><br><span class="line">&gt;&gt;&gt; d(square)</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; z = 3</span><br><span class="line">&gt;&gt;&gt; e = lambda x: lambda y: lambda: x + y + z</span><br><span class="line">&gt;&gt;&gt; e(0)(1)()</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; f = lambda z: x + z</span><br><span class="line">&gt;&gt;&gt; f(3)</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; x = None # remember to review the rules of WWPD given above!</span><br><span class="line">&gt;&gt;&gt; x</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; higher_order_lambda = lambda f: lambda x: f(x)</span><br><span class="line">&gt;&gt;&gt; g = lambda x: x * x</span><br><span class="line">&gt;&gt;&gt; higher_order_lambda(2)(g)  # Which argument belongs to which function call?</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; higher_order_lambda(g)(2)</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; call_thrice = lambda f: lambda x: f(f(f(x)))</span><br><span class="line">&gt;&gt;&gt; call_thrice(lambda y: y + 1)(0)</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; print_lambda = lambda z: print(z)  # When is the return expression of a lambda expression executed?</span><br><span class="line">&gt;&gt;&gt; print_lambda</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; one_thousand = print_lambda(1000)</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; one_thousand # What did the call to print_lambda return?</span><br><span class="line">______</span><br></pre></td></tr></table></figure><h3 id="Q2-WWPD-Higher-Order-Functions"><a href="#Q2-WWPD-Higher-Order-Functions" class="headerlink" title="Q2: WWPD: Higher Order Functions"></a>Q2: WWPD: Higher Order Functions</h3><blockquote><p>Use Ok to test your knowledge with the following “What Would Python Display?” questions:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 ok -q hof-wwpd -u✂️</span><br></pre></td></tr></table></figure></blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line">&gt;&gt;&gt; def even(f):</span><br><span class="line">...     def odd(x):</span><br><span class="line">...         if x &lt; 0:</span><br><span class="line">...             return f(-x)</span><br><span class="line">...         return f(x)</span><br><span class="line">...     return odd</span><br><span class="line">&gt;&gt;&gt; steven = lambda x: x</span><br><span class="line">&gt;&gt;&gt; stewart = even(steven)</span><br><span class="line">&gt;&gt;&gt; stewart</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; stewart(61)</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; stewart(-4)</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; def cake():</span><br><span class="line">...    print(&#x27;beets&#x27;)</span><br><span class="line">...    def pie():</span><br><span class="line">...        print(&#x27;sweets&#x27;)</span><br><span class="line">...        return &#x27;cake&#x27;</span><br><span class="line">...    return pie</span><br><span class="line">&gt;&gt;&gt; chocolate = cake()</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; chocolate</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; chocolate()</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; more_chocolate, more_cake = chocolate(), cake</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; more_chocolate</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; def snake(x, y):</span><br><span class="line">...    if cake == more_cake:</span><br><span class="line">...        return chocolate</span><br><span class="line">...    else:</span><br><span class="line">...        return x + y</span><br><span class="line">&gt;&gt;&gt; snake(10, 20)</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; snake(10, 20)()</span><br><span class="line">______</span><br><span class="line">&gt;&gt;&gt; cake = &#x27;cake&#x27;</span><br><span class="line">&gt;&gt;&gt; snake(10, 20)</span><br><span class="line">______</span><br></pre></td></tr></table></figure><h2 id="Coding-Practice"><a href="#Coding-Practice" class="headerlink" title="Coding Practice"></a>Coding Practice</h2><h3 id="Q3-Lambdas-and-Currying"><a href="#Q3-Lambdas-and-Currying" class="headerlink" title="Q3: Lambdas and Currying"></a>Q3: Lambdas and Currying</h3><p>Write a function <code>lambda_curry2</code> that will curry any two argument function using lambdas.</p><p><strong>Your solution to this problem should only be one line.</strong> You can try first writing a solution without the restriction, and then rewriting it into one line after.</p><blockquote><p><strong>If the syntax check isn’t passing:</strong> Make sure you’ve removed the line containing <code>&quot;***YOUR CODE HERE***&quot;</code> so that it doesn’t get treated as part of the function for the syntax check.</p></blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">def lambda_curry2(func):</span><br><span class="line">    &quot;&quot;&quot;</span><br><span class="line">    Returns a Curried version of a two-argument function FUNC.</span><br><span class="line">    &gt;&gt;&gt; from operator import add, mul, mod</span><br><span class="line">    &gt;&gt;&gt; curried_add = lambda_curry2(add)</span><br><span class="line">    &gt;&gt;&gt; add_three = curried_add(3)</span><br><span class="line">    &gt;&gt;&gt; add_three(5)</span><br><span class="line">    8</span><br><span class="line">    &gt;&gt;&gt; curried_mul = lambda_curry2(mul)</span><br><span class="line">    &gt;&gt;&gt; mul_5 = curried_mul(5)</span><br><span class="line">    &gt;&gt;&gt; mul_5(42)</span><br><span class="line">    210</span><br><span class="line">    &gt;&gt;&gt; lambda_curry2(mod)(123)(10)</span><br><span class="line">    3</span><br><span class="line">    &quot;&quot;&quot;</span><br><span class="line">    &quot;*** YOUR CODE HERE ***&quot;</span><br><span class="line">    return lambda x:lambda y :func(x,y)</span><br></pre></td></tr></table></figure><h3 id="Q4-Count-van-Count"><a href="#Q4-Count-van-Count" class="headerlink" title="Q4: Count van Count"></a>Q4: Count van Count</h3><p>Consider the following implementations of <code>count_factors</code> and <code>count_primes</code>:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line">def count_factors(n):</span><br><span class="line">    &quot;&quot;&quot;Return the number of positive factors that n has.</span><br><span class="line">    &gt;&gt;&gt; count_factors(6)</span><br><span class="line">    4   # 1, 2, 3, 6</span><br><span class="line">    &gt;&gt;&gt; count_factors(4)</span><br><span class="line">    3   # 1, 2, 4</span><br><span class="line">    &quot;&quot;&quot;</span><br><span class="line">    i = 1</span><br><span class="line">    count = 0</span><br><span class="line">    while i &lt;= n:</span><br><span class="line">        if n % i == 0:</span><br><span class="line">            count += 1</span><br><span class="line">        i += 1</span><br><span class="line">    return count</span><br><span class="line"></span><br><span class="line">def count_primes(n):</span><br><span class="line">    &quot;&quot;&quot;Return the number of prime numbers up to and including n.</span><br><span class="line">    &gt;&gt;&gt; count_primes(6)</span><br><span class="line">    3   # 2, 3, 5</span><br><span class="line">    &gt;&gt;&gt; count_primes(13)</span><br><span class="line">    6   # 2, 3, 5, 7, 11, 13</span><br><span class="line">    &quot;&quot;&quot;</span><br><span class="line">    i = 1</span><br><span class="line">    count = 0</span><br><span class="line">    while i &lt;= n:</span><br><span class="line">        if is_prime(i):</span><br><span class="line">            count += 1</span><br><span class="line">        i += 1</span><br><span class="line">    return count</span><br><span class="line"></span><br><span class="line">def is_prime(n):</span><br><span class="line">    return count_factors(n) == 2 # only factors are 1 and n</span><br></pre></td></tr></table></figure><p>The implementations look quite similar! Generalize this logic by writing a function <code>count_cond</code>, which takes in a two-argument predicate function <code>condition(n, i)</code>. <code>count_cond</code> returns a one-argument function that takes in <code>n</code>, which counts all the numbers from 1 to <code>n</code> that satisfy <code>condition</code> when called.</p><blockquote><p><strong>Note:</strong> When we say <code>condition</code> is a predicate function, we mean that it is a function that will return <code>True</code> or <code>False</code> based on some specified condition in its body.</p></blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line">def count_cond(condition):</span><br><span class="line">    &quot;&quot;&quot;Returns a function with one parameter N that counts all the numbers from</span><br><span class="line">    1 to N that satisfy the two-argument predicate function Condition, where</span><br><span class="line">    the first argument for Condition is N and the second argument is the</span><br><span class="line">    number from 1 to N.</span><br><span class="line"></span><br><span class="line">    &gt;&gt;&gt; count_factors = count_cond(lambda n, i: n % i == 0)</span><br><span class="line">    &gt;&gt;&gt; count_factors(2)   # 1, 2</span><br><span class="line">    2</span><br><span class="line">    &gt;&gt;&gt; count_factors(4)   # 1, 2, 4</span><br><span class="line">    3</span><br><span class="line">    &gt;&gt;&gt; count_factors(12)  # 1, 2, 3, 4, 6, 12</span><br><span class="line">    6</span><br><span class="line"></span><br><span class="line">    &gt;&gt;&gt; is_prime = lambda n, i: count_factors(i) == 2</span><br><span class="line">    &gt;&gt;&gt; count_primes = count_cond(is_prime)</span><br><span class="line">    &gt;&gt;&gt; count_primes(2)    # 2</span><br><span class="line">    1</span><br><span class="line">    &gt;&gt;&gt; count_primes(3)    # 2, 3</span><br><span class="line">    2</span><br><span class="line">    &gt;&gt;&gt; count_primes(4)    # 2, 3</span><br><span class="line">    2</span><br><span class="line">    &gt;&gt;&gt; count_primes(5)    # 2, 3, 5</span><br><span class="line">    3</span><br><span class="line">    &gt;&gt;&gt; count_primes(20)   # 2, 3, 5, 7, 11, 13, 17, 19</span><br><span class="line">    8</span><br><span class="line">    &quot;&quot;&quot;</span><br><span class="line">    &quot;*** YOUR CODE HERE ***&quot;</span><br><span class="line">    def dd(n):</span><br><span class="line">        i=1</span><br><span class="line">        count=0</span><br><span class="line">        while i&lt;=n:</span><br><span class="line">            if condition(n,i):</span><br><span class="line">                count+=1</span><br><span class="line">            i += 1</span><br><span class="line">        return count</span><br><span class="line">    return lambda n: dd(n)</span><br></pre></td></tr></table></figure><h1 id="Environment-Diagram-Practice"><a href="#Environment-Diagram-Practice" class="headerlink" title="Environment Diagram Practice"></a>Environment Diagram Practice</h1><p><strong>There is no Ok submission for this component.</strong></p><p>However, we still encourage you to do this problem on paper to develop familiarity with Environment Diagrams, which might appear in an alternate form on the exam. To check your work, you can try putting the code into PythonTutor.</p><h3 id="Q5-HOF-Diagram-Practice"><a href="#Q5-HOF-Diagram-Practice" class="headerlink" title="Q5: HOF Diagram Practice"></a>Q5: HOF Diagram Practice</h3><p>Draw the environment diagram that results from executing the code below.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">n = 7</span><br><span class="line"></span><br><span class="line">def f(x):</span><br><span class="line">    n = 8</span><br><span class="line">    return x + 1</span><br><span class="line"></span><br><span class="line">def g(x):</span><br><span class="line">    n = 9</span><br><span class="line">    def h():</span><br><span class="line">        return x + 1</span><br><span class="line">    return h</span><br><span class="line"></span><br><span class="line">def f(f, x):</span><br><span class="line">    return f(x + n)</span><br><span class="line"></span><br><span class="line">f = f(g, n)</span><br><span class="line">g = (lambda y: y())(f)</span><br></pre></td></tr></table></figure><h1 id="Optional-Questions"><a href="#Optional-Questions" class="headerlink" title="Optional Questions"></a>Optional Questions</h1><h3 id="Q6-Composite-Identity-Function"><a href="#Q6-Composite-Identity-Function" class="headerlink" title="Q6: Composite Identity Function"></a>Q6: Composite Identity Function</h3><p>Write a function that takes in two single-argument functions, <code>f</code> and <code>g</code>, and returns another <strong>function</strong> that has a single parameter <code>x</code>. The returned function should return <code>True</code> if <code>f(g(x))</code> is equal to <code>g(f(x))</code>. You can assume the output of <code>g(x)</code> is a valid input for <code>f</code> and vice versa. Try to use the <code>composer</code> function defined below for more HOF practice.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line">def composer(f, g):</span><br><span class="line">    &quot;&quot;&quot;Return the composition function which given x, computes f(g(x)).</span><br><span class="line"></span><br><span class="line">    &gt;&gt;&gt; add_one = lambda x: x + 1        # adds one to x</span><br><span class="line">    &gt;&gt;&gt; square = lambda x: x**2</span><br><span class="line">    &gt;&gt;&gt; a1 = composer(square, add_one)   # (x + 1)^2</span><br><span class="line">    &gt;&gt;&gt; a1(4)</span><br><span class="line">    25</span><br><span class="line">    &gt;&gt;&gt; mul_three = lambda x: x * 3      # multiplies 3 to x</span><br><span class="line">    &gt;&gt;&gt; a2 = composer(mul_three, a1)    # ((x + 1)^2) * 3</span><br><span class="line">    &gt;&gt;&gt; a2(4)</span><br><span class="line">    75</span><br><span class="line">    &gt;&gt;&gt; a2(5)</span><br><span class="line">    108</span><br><span class="line">    &quot;&quot;&quot;</span><br><span class="line">    return lambda x: f(g(x))</span><br><span class="line"></span><br><span class="line">def composite_identity(f, g):</span><br><span class="line">    &quot;&quot;&quot;</span><br><span class="line">    Return a function with one parameter x that returns True if f(g(x)) is</span><br><span class="line">    equal to g(f(x)). You can assume the result of g(x) is a valid input for f</span><br><span class="line">    and vice versa.</span><br><span class="line"></span><br><span class="line">    &gt;&gt;&gt; add_one = lambda x: x + 1        # adds one to x</span><br><span class="line">    &gt;&gt;&gt; square = lambda x: x**2</span><br><span class="line">    &gt;&gt;&gt; b1 = composite_identity(square, add_one)</span><br><span class="line">    &gt;&gt;&gt; b1(0)                            # (0 + 1)^2 == 0^2 + 1</span><br><span class="line">    True</span><br><span class="line">    &gt;&gt;&gt; b1(4)                            # (4 + 1)^2 != 4^2 + 1</span><br><span class="line">    False</span><br><span class="line">    &quot;&quot;&quot;</span><br><span class="line">    &quot;*** YOUR CODE HERE ***&quot;</span><br><span class="line">    return lambda x:composer(f, g)(x) == composer(g, f)(x)</span><br></pre></td></tr></table></figure><h3 id="Q7-I-Heard-You-Liked-Functions…"><a href="#Q7-I-Heard-You-Liked-Functions…" class="headerlink" title="Q7: I Heard You Liked Functions…"></a>Q7: I Heard You Liked Functions…</h3><p>Define a function <code>cycle</code> that takes in three functions <code>f1</code>, <code>f2</code>, <code>f3</code>, as arguments. <code>cycle</code> will return another function that should take in an integer argument <code>n</code> and return another function. That final function should take in an argument <code>x</code> and cycle through applying <code>f1</code>, <code>f2</code>, and <code>f3</code> to <code>x</code>, depending on what <code>n</code> was. Here’s what the final function should do to <code>x</code> for a few values of <code>n</code>:</p><ul><li><code>n = 0</code>, return <code>x</code></li><li><code>n = 1</code>, apply <code>f1</code> to <code>x</code>, or return <code>f1(x)</code></li><li><code>n = 2</code>, apply <code>f1</code> to <code>x</code> and then <code>f2</code> to the result of that, or return <code>f2(f1(x))</code></li><li><code>n = 3</code>, apply <code>f1</code> to <code>x</code>, <code>f2</code> to the result of applying <code>f1</code>, and then <code>f3</code> to the result of applying <code>f2</code>, or <code>f3(f2(f1(x)))</code></li><li><code>n = 4</code>, start the cycle again applying <code>f1</code>, then <code>f2</code>, then <code>f3</code>, then <code>f1</code> again, or <code>f1(f3(f2(f1(x))))</code></li><li>And so forth.</li></ul><p><em>Hint</em>: most of the work goes inside the most nested function.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line">def cycle(f1, f2, f3):</span><br><span class="line">    &quot;&quot;&quot;Returns a function that is itself a higher-order function.</span><br><span class="line"></span><br><span class="line">    &gt;&gt;&gt; def add1(x):</span><br><span class="line">    ...     return x + 1</span><br><span class="line">    &gt;&gt;&gt; def times2(x):</span><br><span class="line">    ...     return x * 2</span><br><span class="line">    &gt;&gt;&gt; def add3(x):</span><br><span class="line">    ...     return x + 3</span><br><span class="line">    &gt;&gt;&gt; my_cycle = cycle(add1, times2, add3)</span><br><span class="line">    &gt;&gt;&gt; identity = my_cycle(0)</span><br><span class="line">    &gt;&gt;&gt; identity(5)</span><br><span class="line">    5</span><br><span class="line">    &gt;&gt;&gt; add_one_then_double = my_cycle(2)</span><br><span class="line">    &gt;&gt;&gt; add_one_then_double(1)</span><br><span class="line">    4</span><br><span class="line">    &gt;&gt;&gt; do_all_functions = my_cycle(3)</span><br><span class="line">    &gt;&gt;&gt; do_all_functions(2)</span><br><span class="line">    9</span><br><span class="line">    &gt;&gt;&gt; do_more_than_a_cycle = my_cycle(4)</span><br><span class="line">    &gt;&gt;&gt; do_more_than_a_cycle(2)</span><br><span class="line">    10</span><br><span class="line">    &gt;&gt;&gt; do_two_cycles = my_cycle(6)</span><br><span class="line">    &gt;&gt;&gt; do_two_cycles(1)</span><br><span class="line">    19</span><br><span class="line">    &quot;&quot;&quot;</span><br><span class="line">    &quot;*** YOUR CODE HERE ***&quot;</span><br><span class="line">    def dd(n,x):</span><br><span class="line"></span><br><span class="line">        if(n==0):</span><br><span class="line">            return x</span><br><span class="line">        if(n%3==0):</span><br><span class="line">            return f3(f2(f1(dd(n-3,x))))</span><br><span class="line">        if(n%3==2):</span><br><span class="line">            return f2(f1(dd(n-2,x)))</span><br><span class="line">        if(n%3==1):</span><br><span class="line">            return f1(dd(n-1,x))</span><br><span class="line">        </span><br><span class="line">    return lambda n: lambda x: dd(n,x)</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Lab-2-Higher-Order-Functions-Lambda-Expressions-lab02-zip&quot;&gt;&lt;a href=&quot;#Lab-2-Higher-Order-Functions-Lambda-Expressions-lab02-zip&quot; clas</summary>
      
    
    
    
    
  </entry>
  
</feed>
