Skip to content

Instantly share code, notes, and snippets.

@stefanluptak
Last active May 27, 2019 15:04
Show Gist options
  • Save stefanluptak/85ada1a8b530c3b964cf533f6cd8d5a4 to your computer and use it in GitHub Desktop.
Save stefanluptak/85ada1a8b530c3b964cf533f6cd8d5a4 to your computer and use it in GitHub Desktop.
#! /usr/bin/env elixir
ExUnit.start()
defmodule Ranges do
def run(indexes, length) do
ranges(indexes, length, nil, [])
end
# private
# prazdne vstupy
defp ranges([], 0, _, []), do: []
defp ranges([], length, _, []), do: [[false, length]]
# zaciatok, index hned na zaciatku
defp ranges([0 | indexes], length, _last_index, []),
do: ranges(indexes, length, 0, [[true, 1]])
# zaciatok, index nie je na zaciatku
defp ranges([index | indexes], length, _last_index, []),
do: ranges(indexes, length, index, [[true, 1], [false, index]])
# stred, indexy hned po sebe
defp ranges([index | indexes], length, last_index, [[true, l] | tail])
when index - 1 == last_index,
do: ranges(indexes, length, index, [[true, l + 1] | tail])
# stred, medzera
defp ranges([index | indexes], length, last_index, ranges),
do: ranges(indexes, length, index, [[true, 1], [false, index - last_index - 1] | ranges])
# koniec, index na konci
defp ranges([], length, last_index, ranges)
when last_index == length - 1,
do: Enum.reverse(ranges)
# koniec, medzera na konci
defp ranges([], length, last_index, ranges),
do: Enum.reverse([[false, length - last_index - 1] | ranges])
end
defmodule RangesTest do
use ExUnit.Case
test "ranges" do
assert Ranges.run([], 0) == []
assert Ranges.run([], 3) == [[false, 3]]
assert Ranges.run([0], 1) == [[true, 1]]
assert Ranges.run([1], 2) == [[false, 1], [true, 1]]
assert Ranges.run([1, 2], 4) == [[false, 1], [true, 2], [false, 1]]
assert Ranges.run([1, 3], 5) == [[false, 1], [true, 1], [false, 1], [true, 1], [false, 1]]
assert Ranges.run([1, 3], 4) == [[false, 1], [true, 1], [false, 1], [true, 1]]
end
end

Intro

Milan si plánuje výlet a potrebuje si do batohu vhodne usporiadať oblečenie podľa toho, ako sa podmienky budú meniť v čase. K dispozícii má len 2 údaje.

  • dĺžku (D) jeho cesty
  • zoznam (Z) súradníc (S), na ktorých sa cestou nachádzajú stromy

Formát vstupov

Dĺžka D je kladné celé číslo. Súradnica S je kladné celé číslo, ktoré udáva, vo vzdialenosti koľkých metrov od štartu sa nachádza strom. S < D, S >= 0.

V zozname Z sa žiadna súradnica neopakuje viac ako 1-krát, taktiež count(Z) <= D.

Príklady vstupov

Čiže ak sú vstupy D = 3, Z = [0, 1, 2], tak to znamená, že na celej ceste sú stromy. Ak sú vstupy D = 3, Z = [], tak to znamená, že nikde na ceste nie sú stromy. Ak sú vstupy D = 3, Z = [0], tak to znamená, že hneď na začiatku je strom a potom už nič.

Zadanie

Vytvor funkciu, ktorej vstupy budú D a Z a jej výsledkom bude zoznam úsekov, ktoré bude Milan počas svojej cesty prechádzať. Jeden úsek bude mať formát [boolean, integer] kde prvý prvok bude udávať, či na danom úseku je aspoň jeden strom a druhý bude udávať jeho dĺžku.

Ukážky volania funkcie

useky(3, []) -> [[false, 3]]
useky(3, [1]) -> [[false, 1], [true, 1], [false, 1]]
useky(3, [0, 1, 2]) -> [[true, 3]]
useky(4, [2, 3]) -> [[false, 2], [true, 2]]

Pokyny

Funkciu vypracujte v ľubovoľnom programovacom jazyku resp. v pochopiteľnom pseudo kóde. Riešenie odovzdajte ako fork tohto gistu ideálne aj s testami. Cieľom nie je len vytvoriť funkčné ale aj elegantné riešenie. Veľa šťastia.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment