Spaces:
Running
Running
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head> | |
<meta charset="utf-8"> | |
<meta name="generator" content="quarto-1.3.433"> | |
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"> | |
<title>Codewars Challenge 2024 Menggunakan R dan RStudio - 14 Grasshopper - Summation</title> | |
<style> | |
code{white-space: pre-wrap;} | |
span.smallcaps{font-variant: small-caps;} | |
div.columns{display: flex; gap: min(4vw, 1.5em);} | |
div.column{flex: auto; overflow-x: auto;} | |
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;} | |
ul.task-list{list-style: none;} | |
ul.task-list li input[type="checkbox"] { | |
width: 0.8em; | |
margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */ | |
vertical-align: middle; | |
} | |
/* CSS for syntax highlighting */ | |
pre > code.sourceCode { white-space: pre; position: relative; } | |
pre > code.sourceCode > span { display: inline-block; line-height: 1.25; } | |
pre > code.sourceCode > span:empty { height: 1.2em; } | |
.sourceCode { overflow: visible; } | |
code.sourceCode > span { color: inherit; text-decoration: inherit; } | |
div.sourceCode { margin: 1em 0; } | |
pre.sourceCode { margin: 0; } | |
@media screen { | |
div.sourceCode { overflow: auto; } | |
} | |
@media print { | |
pre > code.sourceCode { white-space: pre-wrap; } | |
pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; } | |
} | |
pre.numberSource code | |
{ counter-reset: source-line 0; } | |
pre.numberSource code > span | |
{ position: relative; left: -4em; counter-increment: source-line; } | |
pre.numberSource code > span > a:first-child::before | |
{ content: counter(source-line); | |
position: relative; left: -1em; text-align: right; vertical-align: baseline; | |
border: none; display: inline-block; | |
-webkit-touch-callout: none; -webkit-user-select: none; | |
-khtml-user-select: none; -moz-user-select: none; | |
-ms-user-select: none; user-select: none; | |
padding: 0 4px; width: 4em; | |
} | |
pre.numberSource { margin-left: 3em; padding-left: 4px; } | |
div.sourceCode | |
{ } | |
@media screen { | |
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; } | |
} | |
</style> | |
<script src="site_libs/quarto-nav/quarto-nav.js"></script> | |
<script src="site_libs/quarto-nav/headroom.min.js"></script> | |
<script src="site_libs/clipboard/clipboard.min.js"></script> | |
<script src="site_libs/quarto-search/autocomplete.umd.js"></script> | |
<script src="site_libs/quarto-search/fuse.min.js"></script> | |
<script src="site_libs/quarto-search/quarto-search.js"></script> | |
<meta name="quarto:offset" content="./"> | |
<link href="./cw015no_spaces.html" rel="next"> | |
<link href="./cw013repeat_string.html" rel="prev"> | |
<link href="./logo.png" rel="icon" type="image/png"> | |
<script src="site_libs/quarto-html/quarto.js"></script> | |
<script src="site_libs/quarto-html/popper.min.js"></script> | |
<script src="site_libs/quarto-html/tippy.umd.min.js"></script> | |
<script src="site_libs/quarto-html/anchor.min.js"></script> | |
<link href="site_libs/quarto-html/tippy.css" rel="stylesheet"> | |
<link href="site_libs/quarto-html/quarto-syntax-highlighting.css" rel="stylesheet" id="quarto-text-highlighting-styles"> | |
<script src="site_libs/bootstrap/bootstrap.min.js"></script> | |
<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet"> | |
<link href="site_libs/bootstrap/bootstrap.min.css" rel="stylesheet" id="quarto-bootstrap" data-mode="light"> | |
<link href="site_libs/quarto-contrib/badge/badge.css" rel="stylesheet"> | |
<script id="quarto-search-options" type="application/json">{ | |
"location": "sidebar", | |
"copy-button": false, | |
"collapse-after": 3, | |
"panel-placement": "start", | |
"type": "textbox", | |
"limit": 20, | |
"language": { | |
"search-no-results-text": "No results", | |
"search-matching-documents-text": "matching documents", | |
"search-copy-link-title": "Copy link to search", | |
"search-hide-matches-text": "Hide additional matches", | |
"search-more-match-text": "more match in this document", | |
"search-more-matches-text": "more matches in this document", | |
"search-clear-button-title": "Clear", | |
"search-detached-cancel-button-title": "Cancel", | |
"search-submit-button-title": "Submit", | |
"search-label": "Search" | |
} | |
}</script> | |
<meta name="twitter:title" content="Codewars Challenge 2024 Menggunakan R dan RStudio - 14 Grasshopper - Summation"> | |
<meta name="twitter:description" content=""> | |
<meta name="twitter:image" content="https://huggingface.co/spaces/aephidayatuloh/codewars2024/new_starcore_logo.png"> | |
<meta name="twitter:image-height" content="434"> | |
<meta name="twitter:image-width" content="1946"> | |
<meta name="twitter:card" content="summary_large_image"> | |
</head> | |
<body class="nav-sidebar floating"> | |
<div id="quarto-search-results"></div> | |
<header id="quarto-header" class="headroom fixed-top"> | |
<nav class="quarto-secondary-nav"> | |
<div class="container-fluid d-flex"> | |
<button type="button" class="quarto-btn-toggle btn" data-bs-toggle="collapse" data-bs-target="#quarto-sidebar,#quarto-sidebar-glass" aria-controls="quarto-sidebar" aria-expanded="false" aria-label="Toggle sidebar navigation" onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }"> | |
<i class="bi bi-layout-text-sidebar-reverse"></i> | |
</button> | |
<nav class="quarto-page-breadcrumbs" aria-label="breadcrumb"><ol class="breadcrumb"><li class="breadcrumb-item"><a href="./cw001evenodd.html">Februari</a></li><li class="breadcrumb-item"><a href="./cw014summation.html"><span class="chapter-number">14</span> <span class="chapter-title">Grasshopper - Summation</span></a></li></ol></nav> | |
<a class="flex-grow-1" role="button" data-bs-toggle="collapse" data-bs-target="#quarto-sidebar,#quarto-sidebar-glass" aria-controls="quarto-sidebar" aria-expanded="false" aria-label="Toggle sidebar navigation" onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }"> | |
</a> | |
<button type="button" class="btn quarto-search-button" aria-label="" onclick="window.quartoOpenSearch();"> | |
<i class="bi bi-search"></i> | |
</button> | |
</div> | |
</nav> | |
</header> | |
<!-- content --> | |
<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article"> | |
<!-- sidebar --> | |
<nav id="quarto-sidebar" class="sidebar collapse collapse-horizontal sidebar-navigation floating overflow-auto"> | |
<div class="pt-lg-2 mt-2 text-left sidebar-header"> | |
<div class="sidebar-title mb-0 py-0"> | |
<a href="./">Codewars Challenge 2024 Menggunakan R dan RStudio</a> | |
<div class="sidebar-tools-main"> | |
<a href="https://huggingface.co/spaces/aephidayatuloh/codewars2024/tree/main" rel="" title="Source Code" class="quarto-navigation-tool px-1" aria-label="Source Code"><i class="bi bi-git"></i></a> | |
</div> | |
</div> | |
</div> | |
<div class="mt-2 flex-shrink-0 align-items-center"> | |
<div class="sidebar-search"> | |
<div id="quarto-search" class="" title="Search"></div> | |
</div> | |
</div> | |
<div class="sidebar-menu-container"> | |
<ul class="list-unstyled mt-1"> | |
<li class="sidebar-item"> | |
<div class="sidebar-item-container"> | |
<a href="./index.html" class="sidebar-item-text sidebar-link"> | |
<span class="menu-text">Pengantar</span></a> | |
</div> | |
</li> | |
<li class="sidebar-item sidebar-item-section"> | |
<div class="sidebar-item-container"> | |
<a class="sidebar-item-text sidebar-link text-start" data-bs-toggle="collapse" data-bs-target="#quarto-sidebar-section-1" aria-expanded="true"> | |
<span class="menu-text">Februari</span></a> | |
<a class="sidebar-item-toggle text-start" data-bs-toggle="collapse" data-bs-target="#quarto-sidebar-section-1" aria-expanded="true" aria-label="Toggle section"> | |
<i class="bi bi-chevron-right ms-2"></i> | |
</a> | |
</div> | |
<ul id="quarto-sidebar-section-1" class="collapse list-unstyled sidebar-section depth1 show"> | |
<li class="sidebar-item"> | |
<div class="sidebar-item-container"> | |
<a href="./cw001evenodd.html" class="sidebar-item-text sidebar-link"> | |
<span class="menu-text"><span class="chapter-number">1</span> <span class="chapter-title">Even or Odd</span></span></a> | |
</div> | |
</li> | |
<li class="sidebar-item"> | |
<div class="sidebar-item-container"> | |
<a href="./cw002multiply.html" class="sidebar-item-text sidebar-link"> | |
<span class="menu-text"><span class="chapter-number">2</span> <span class="chapter-title">Multiply</span></span></a> | |
</div> | |
</li> | |
<li class="sidebar-item"> | |
<div class="sidebar-item-container"> | |
<a href="./cw003countsheep.html" class="sidebar-item-text sidebar-link"> | |
<span class="menu-text"><span class="chapter-number">3</span> <span class="chapter-title">If you can’t sleep, just count sheep!!</span></span></a> | |
</div> | |
</li> | |
<li class="sidebar-item"> | |
<div class="sidebar-item-container"> | |
<a href="./cw004reducegrow.html" class="sidebar-item-text sidebar-link"> | |
<span class="menu-text"><span class="chapter-number">4</span> <span class="chapter-title">Beginner - Reduce but Grow</span></span></a> | |
</div> | |
</li> | |
<li class="sidebar-item"> | |
<div class="sidebar-item-container"> | |
<a href="./cw005make_negative.html" class="sidebar-item-text sidebar-link"> | |
<span class="menu-text"><span class="chapter-number">5</span> <span class="chapter-title">Return Negative</span></span></a> | |
</div> | |
</li> | |
<li class="sidebar-item"> | |
<div class="sidebar-item-container"> | |
<a href="./cw006positive_sum.html" class="sidebar-item-text sidebar-link"> | |
<span class="menu-text"><span class="chapter-number">6</span> <span class="chapter-title">Sum of positive</span></span></a> | |
</div> | |
</li> | |
<li class="sidebar-item"> | |
<div class="sidebar-item-container"> | |
<a href="./cw007reversedstrings.html" class="sidebar-item-text sidebar-link"> | |
<span class="menu-text"><span class="chapter-number">7</span> <span class="chapter-title">Reversed Strings</span></span></a> | |
</div> | |
</li> | |
<li class="sidebar-item"> | |
<div class="sidebar-item-container"> | |
<a href="./cw008bool_to_word.html" class="sidebar-item-text sidebar-link"> | |
<span class="menu-text"><span class="chapter-number">8</span> <span class="chapter-title">Convert boolean values to strings ‘Yes’ or ‘No’</span></span></a> | |
</div> | |
</li> | |
<li class="sidebar-item"> | |
<div class="sidebar-item-container"> | |
<a href="./cw009number_to_string.html" class="sidebar-item-text sidebar-link"> | |
<span class="menu-text"><span class="chapter-number">9</span> <span class="chapter-title">Convert a Number to a String!</span></span></a> | |
</div> | |
</li> | |
<li class="sidebar-item"> | |
<div class="sidebar-item-container"> | |
<a href="./cw010opposite.html" class="sidebar-item-text sidebar-link"> | |
<span class="menu-text"><span class="chapter-number">10</span> <span class="chapter-title">Opposite number</span></span></a> | |
</div> | |
</li> | |
<li class="sidebar-item"> | |
<div class="sidebar-item-container"> | |
<a href="./cw011removeChar.html" class="sidebar-item-text sidebar-link"> | |
<span class="menu-text"><span class="chapter-number">11</span> <span class="chapter-title">Remove First and Last Character</span></span></a> | |
</div> | |
</li> | |
<li class="sidebar-item"> | |
<div class="sidebar-item-container"> | |
<a href="./cw012square_sum.html" class="sidebar-item-text sidebar-link"> | |
<span class="menu-text"><span class="chapter-number">12</span> <span class="chapter-title">Square(n) Sum</span></span></a> | |
</div> | |
</li> | |
<li class="sidebar-item"> | |
<div class="sidebar-item-container"> | |
<a href="./cw013repeat_string.html" class="sidebar-item-text sidebar-link"> | |
<span class="menu-text"><span class="chapter-number">13</span> <span class="chapter-title">String repeat</span></span></a> | |
</div> | |
</li> | |
<li class="sidebar-item"> | |
<div class="sidebar-item-container"> | |
<a href="./cw014summation.html" class="sidebar-item-text sidebar-link active"> | |
<span class="menu-text"><span class="chapter-number">14</span> <span class="chapter-title">Grasshopper - Summation</span></span></a> | |
</div> | |
</li> | |
<li class="sidebar-item"> | |
<div class="sidebar-item-container"> | |
<a href="./cw015no_spaces.html" class="sidebar-item-text sidebar-link"> | |
<span class="menu-text"><span class="chapter-number">15</span> <span class="chapter-title">Remove String Spaces</span></span></a> | |
</div> | |
</li> | |
<li class="sidebar-item"> | |
<div class="sidebar-item-container"> | |
<a href="./cw016findSmallestInt.html" class="sidebar-item-text sidebar-link"> | |
<span class="menu-text"><span class="chapter-number">16</span> <span class="chapter-title">Find the smallest integer in the array</span></span></a> | |
</div> | |
</li> | |
<li class="sidebar-item"> | |
<div class="sidebar-item-container"> | |
<a href="./cw017basic_op.html" class="sidebar-item-text sidebar-link"> | |
<span class="menu-text"><span class="chapter-number">17</span> <span class="chapter-title">Basic Mathematical Operations</span></span></a> | |
</div> | |
</li> | |
</ul> | |
</li> | |
</ul> | |
</div> | |
</nav> | |
<div id="quarto-sidebar-glass" data-bs-toggle="collapse" data-bs-target="#quarto-sidebar,#quarto-sidebar-glass"></div> | |
<!-- margin-sidebar --> | |
<div id="quarto-margin-sidebar" class="sidebar margin-sidebar"> | |
<nav id="TOC" role="doc-toc" class="toc-active"> | |
<h2 id="toc-title">Table of contents</h2> | |
<ul> | |
<li><a href="#instruction" id="toc-instruction" class="nav-link active" data-scroll-target="#instruction"><span class="header-section-number">14.1</span> Instruction</a></li> | |
<li><a href="#youtube-video" id="toc-youtube-video" class="nav-link" data-scroll-target="#youtube-video"><span class="header-section-number">14.2</span> YouTube Video</a></li> | |
<li><a href="#solution-code" id="toc-solution-code" class="nav-link" data-scroll-target="#solution-code"><span class="header-section-number">14.3</span> Solution Code</a></li> | |
<li><a href="#test" id="toc-test" class="nav-link" data-scroll-target="#test"><span class="header-section-number">14.4</span> Test</a></li> | |
<li><a href="#supported-by" id="toc-supported-by" class="nav-link" data-scroll-target="#supported-by"><span class="header-section-number">14.5</span> Supported by</a></li> | |
</ul> | |
</nav> | |
</div> | |
<!-- main --> | |
<main class="content" id="quarto-document-content"> | |
<header id="title-block-header" class="quarto-title-block default"> | |
<div class="quarto-title"> | |
<h1 class="title"><span class="chapter-number">14</span> <span class="chapter-title">Grasshopper - Summation</span></h1> | |
</div> | |
<div class="quarto-title-meta"> | |
</div> | |
</header> | |
<p><span class="badge rounded-pill quarto-badge " style="background-color: grey;">8kyu</span> Tantangan #14/366 - 28 Feb 2024</p> | |
<p><a href="https://www.codewars.com/kata/55d24f55d7dd296eb9000030" class="uri">https://www.codewars.com/kata/55d24f55d7dd296eb9000030</a></p> | |
<section id="instruction" class="level2" data-number="14.1"> | |
<h2 data-number="14.1" class="anchored" data-anchor-id="instruction"><span class="header-section-number">14.1</span> Instruction</h2> | |
<p>Write a program that finds the summation of every number from 1 to num. The number will always be a positive integer greater than 0. Your function only needs to return the result, what is shown between parentheses in the example below is how you reach that result and it’s not part of it, see the sample tests.</p> | |
<p><strong>Examples (input -> output)</strong></p> | |
<div class="cell"> | |
<div class="sourceCode cell-code" id="cb1"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="dv">2</span> <span class="ot">-></span> <span class="dv">3</span> (<span class="dv">1</span> <span class="sc">+</span> <span class="dv">2</span>)</span> | |
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a><span class="dv">8</span> <span class="ot">-></span> <span class="dv">36</span> (<span class="dv">1</span> <span class="sc">+</span> <span class="dv">2</span> <span class="sc">+</span> <span class="dv">3</span> <span class="sc">+</span> <span class="dv">4</span> <span class="sc">+</span> <span class="dv">5</span> <span class="sc">+</span> <span class="dv">6</span> <span class="sc">+</span> <span class="dv">7</span> <span class="sc">+</span> <span class="dv">8</span>)</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div> | |
</div> | |
</section> | |
<section id="youtube-video" class="level2" data-number="14.2"> | |
<h2 data-number="14.2" class="anchored" data-anchor-id="youtube-video"><span class="header-section-number">14.2</span> YouTube Video</h2> | |
<div class="quarto-video ratio ratio-16x9"><iframe data-external="1" src="https://www.youtube.com/embed/L8aczEhqymk?si=DSx84acpNvbkucrK" title="" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div> | |
</section> | |
<section id="solution-code" class="level2" data-number="14.3"> | |
<h2 data-number="14.3" class="anchored" data-anchor-id="solution-code"><span class="header-section-number">14.3</span> Solution Code</h2> | |
<div class="cell"> | |
<div class="sourceCode cell-code" id="cb2"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a>summation <span class="ot"><-</span> <span class="cf">function</span>(n) {</span> | |
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a> <span class="fu">sum</span>(<span class="dv">1</span><span class="sc">:</span>n)</span> | |
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a>}</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div> | |
</div> | |
<div class="cell"> | |
<div class="sourceCode cell-code" id="cb3"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a>summation <span class="ot"><-</span> <span class="cf">function</span>(n) <span class="fu">sum</span>(<span class="dv">1</span><span class="sc">:</span>n)</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div> | |
</div> | |
</section> | |
<section id="test" class="level2" data-number="14.4"> | |
<h2 data-number="14.4" class="anchored" data-anchor-id="test"><span class="header-section-number">14.4</span> Test</h2> | |
<div class="cell"> | |
<div class="sourceCode cell-code" id="cb4"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a><span class="fu">library</span>(testthat)</span> | |
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a></span> | |
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a><span class="fu">test_that</span>(<span class="st">'basic tests'</span>, {</span> | |
<span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a> <span class="fu">expect_equal</span>(<span class="fu">summation</span>(<span class="dv">1</span>), <span class="dv">1</span>)</span> | |
<span id="cb4-5"><a href="#cb4-5" aria-hidden="true" tabindex="-1"></a> <span class="fu">expect_equal</span>(<span class="fu">summation</span>(<span class="dv">8</span>), <span class="dv">36</span>)</span> | |
<span id="cb4-6"><a href="#cb4-6" aria-hidden="true" tabindex="-1"></a> <span class="fu">expect_equal</span>(<span class="fu">summation</span>(<span class="dv">22</span>), <span class="dv">253</span>)</span> | |
<span id="cb4-7"><a href="#cb4-7" aria-hidden="true" tabindex="-1"></a> <span class="fu">expect_equal</span>(<span class="fu">summation</span>(<span class="dv">100</span>), <span class="dv">5050</span>)</span> | |
<span id="cb4-8"><a href="#cb4-8" aria-hidden="true" tabindex="-1"></a> <span class="fu">expect_equal</span>(<span class="fu">summation</span>(<span class="dv">213</span>), <span class="dv">22791</span>)</span> | |
<span id="cb4-9"><a href="#cb4-9" aria-hidden="true" tabindex="-1"></a>})</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div> | |
<div class="cell-output cell-output-stdout"> | |
<pre><code>Test passed 🥇</code></pre> | |
</div> | |
</div> | |
</section> | |
<section id="supported-by" class="level2" data-number="14.5"> | |
<h2 data-number="14.5" class="anchored" data-anchor-id="supported-by"><span class="header-section-number">14.5</span> Supported by</h2> | |
<div class="quarto-figure quarto-figure-center"> | |
<figure class="figure"> | |
<p><a href="https://www.starcore.co"><img src="new_starcore_logo.png" class="img-fluid figure-img"></a></p> | |
<figcaption class="figure-caption">StarCore Analytics</figcaption> | |
</figure> | |
</div> | |
</section> | |
</main> <!-- /main --> | |
<script id="quarto-html-after-body" type="application/javascript"> | |
window.document.addEventListener("DOMContentLoaded", function (event) { | |
const toggleBodyColorMode = (bsSheetEl) => { | |
const mode = bsSheetEl.getAttribute("data-mode"); | |
const bodyEl = window.document.querySelector("body"); | |
if (mode === "dark") { | |
bodyEl.classList.add("quarto-dark"); | |
bodyEl.classList.remove("quarto-light"); | |
} else { | |
bodyEl.classList.add("quarto-light"); | |
bodyEl.classList.remove("quarto-dark"); | |
} | |
} | |
const toggleBodyColorPrimary = () => { | |
const bsSheetEl = window.document.querySelector("link#quarto-bootstrap"); | |
if (bsSheetEl) { | |
toggleBodyColorMode(bsSheetEl); | |
} | |
} | |
toggleBodyColorPrimary(); | |
const icon = ""; | |
const anchorJS = new window.AnchorJS(); | |
anchorJS.options = { | |
placement: 'right', | |
icon: icon | |
}; | |
anchorJS.add('.anchored'); | |
const isCodeAnnotation = (el) => { | |
for (const clz of el.classList) { | |
if (clz.startsWith('code-annotation-')) { | |
return true; | |
} | |
} | |
return false; | |
} | |
const clipboard = new window.ClipboardJS('.code-copy-button', { | |
text: function(trigger) { | |
const codeEl = trigger.previousElementSibling.cloneNode(true); | |
for (const childEl of codeEl.children) { | |
if (isCodeAnnotation(childEl)) { | |
childEl.remove(); | |
} | |
} | |
return codeEl.innerText; | |
} | |
}); | |
clipboard.on('success', function(e) { | |
// button target | |
const button = e.trigger; | |
// don't keep focus | |
button.blur(); | |
// flash "checked" | |
button.classList.add('code-copy-button-checked'); | |
var currentTitle = button.getAttribute("title"); | |
button.setAttribute("title", "Copied!"); | |
let tooltip; | |
if (window.bootstrap) { | |
button.setAttribute("data-bs-toggle", "tooltip"); | |
button.setAttribute("data-bs-placement", "left"); | |
button.setAttribute("data-bs-title", "Copied!"); | |
tooltip = new bootstrap.Tooltip(button, | |
{ trigger: "manual", | |
customClass: "code-copy-button-tooltip", | |
offset: [0, -8]}); | |
tooltip.show(); | |
} | |
setTimeout(function() { | |
if (tooltip) { | |
tooltip.hide(); | |
button.removeAttribute("data-bs-title"); | |
button.removeAttribute("data-bs-toggle"); | |
button.removeAttribute("data-bs-placement"); | |
} | |
button.setAttribute("title", currentTitle); | |
button.classList.remove('code-copy-button-checked'); | |
}, 1000); | |
// clear code selection | |
e.clearSelection(); | |
}); | |
function tippyHover(el, contentFn) { | |
const config = { | |
allowHTML: true, | |
content: contentFn, | |
maxWidth: 500, | |
delay: 100, | |
arrow: false, | |
appendTo: function(el) { | |
return el.parentElement; | |
}, | |
interactive: true, | |
interactiveBorder: 10, | |
theme: 'quarto', | |
placement: 'bottom-start' | |
}; | |
window.tippy(el, config); | |
} | |
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]'); | |
for (var i=0; i<noterefs.length; i++) { | |
const ref = noterefs[i]; | |
tippyHover(ref, function() { | |
// use id or data attribute instead here | |
let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href'); | |
try { href = new URL(href).hash; } catch {} | |
const id = href.replace(/^#\/?/, ""); | |
const note = window.document.getElementById(id); | |
return note.innerHTML; | |
}); | |
} | |
let selectedAnnoteEl; | |
const selectorForAnnotation = ( cell, annotation) => { | |
let cellAttr = 'data-code-cell="' + cell + '"'; | |
let lineAttr = 'data-code-annotation="' + annotation + '"'; | |
const selector = 'span[' + cellAttr + '][' + lineAttr + ']'; | |
return selector; | |
} | |
const selectCodeLines = (annoteEl) => { | |
const doc = window.document; | |
const targetCell = annoteEl.getAttribute("data-target-cell"); | |
const targetAnnotation = annoteEl.getAttribute("data-target-annotation"); | |
const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation)); | |
const lines = annoteSpan.getAttribute("data-code-lines").split(","); | |
const lineIds = lines.map((line) => { | |
return targetCell + "-" + line; | |
}) | |
let top = null; | |
let height = null; | |
let parent = null; | |
if (lineIds.length > 0) { | |
//compute the position of the single el (top and bottom and make a div) | |
const el = window.document.getElementById(lineIds[0]); | |
top = el.offsetTop; | |
height = el.offsetHeight; | |
parent = el.parentElement.parentElement; | |
if (lineIds.length > 1) { | |
const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]); | |
const bottom = lastEl.offsetTop + lastEl.offsetHeight; | |
height = bottom - top; | |
} | |
if (top !== null && height !== null && parent !== null) { | |
// cook up a div (if necessary) and position it | |
let div = window.document.getElementById("code-annotation-line-highlight"); | |
if (div === null) { | |
div = window.document.createElement("div"); | |
div.setAttribute("id", "code-annotation-line-highlight"); | |
div.style.position = 'absolute'; | |
parent.appendChild(div); | |
} | |
div.style.top = top - 2 + "px"; | |
div.style.height = height + 4 + "px"; | |
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter"); | |
if (gutterDiv === null) { | |
gutterDiv = window.document.createElement("div"); | |
gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter"); | |
gutterDiv.style.position = 'absolute'; | |
const codeCell = window.document.getElementById(targetCell); | |
const gutter = codeCell.querySelector('.code-annotation-gutter'); | |
gutter.appendChild(gutterDiv); | |
} | |
gutterDiv.style.top = top - 2 + "px"; | |
gutterDiv.style.height = height + 4 + "px"; | |
} | |
selectedAnnoteEl = annoteEl; | |
} | |
}; | |
const unselectCodeLines = () => { | |
const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"]; | |
elementsIds.forEach((elId) => { | |
const div = window.document.getElementById(elId); | |
if (div) { | |
div.remove(); | |
} | |
}); | |
selectedAnnoteEl = undefined; | |
}; | |
// Attach click handler to the DT | |
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]'); | |
for (const annoteDlNode of annoteDls) { | |
annoteDlNode.addEventListener('click', (event) => { | |
const clickedEl = event.target; | |
if (clickedEl !== selectedAnnoteEl) { | |
unselectCodeLines(); | |
const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active'); | |
if (activeEl) { | |
activeEl.classList.remove('code-annotation-active'); | |
} | |
selectCodeLines(clickedEl); | |
clickedEl.classList.add('code-annotation-active'); | |
} else { | |
// Unselect the line | |
unselectCodeLines(); | |
clickedEl.classList.remove('code-annotation-active'); | |
} | |
}); | |
} | |
const findCites = (el) => { | |
const parentEl = el.parentElement; | |
if (parentEl) { | |
const cites = parentEl.dataset.cites; | |
if (cites) { | |
return { | |
el, | |
cites: cites.split(' ') | |
}; | |
} else { | |
return findCites(el.parentElement) | |
} | |
} else { | |
return undefined; | |
} | |
}; | |
var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]'); | |
for (var i=0; i<bibliorefs.length; i++) { | |
const ref = bibliorefs[i]; | |
const citeInfo = findCites(ref); | |
if (citeInfo) { | |
tippyHover(citeInfo.el, function() { | |
var popup = window.document.createElement('div'); | |
citeInfo.cites.forEach(function(cite) { | |
var citeDiv = window.document.createElement('div'); | |
citeDiv.classList.add('hanging-indent'); | |
citeDiv.classList.add('csl-entry'); | |
var biblioDiv = window.document.getElementById('ref-' + cite); | |
if (biblioDiv) { | |
citeDiv.innerHTML = biblioDiv.innerHTML; | |
} | |
popup.appendChild(citeDiv); | |
}); | |
return popup.innerHTML; | |
}); | |
} | |
} | |
}); | |
</script> | |
<nav class="page-navigation"> | |
<div class="nav-page nav-page-previous"> | |
<a href="./cw013repeat_string.html" class="pagination-link"> | |
<i class="bi bi-arrow-left-short"></i> <span class="nav-page-text"><span class="chapter-number">13</span> <span class="chapter-title">String repeat</span></span> | |
</a> | |
</div> | |
<div class="nav-page nav-page-next"> | |
<a href="./cw015no_spaces.html" class="pagination-link"> | |
<span class="nav-page-text"><span class="chapter-number">15</span> <span class="chapter-title">Remove String Spaces</span></span> <i class="bi bi-arrow-right-short"></i> | |
</a> | |
</div> | |
</nav> | |
</div> <!-- /content --> | |
</body></html> |