Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
#! /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
You can’t perform that action at this time.