przemyxe0p

przemyxe0p

What do you do if you can not comprehend solution?

What do you do if you’ve done an exercise, it works, it’s not very inefficient and seems concise, then you go to the community solutions, sort by highest-rated user and see this?

defmodule Sublist do
  @doc """
  Returns whether the first list is a sublist or a superlist of the second list
  and if not whether it is equal or unequal to the second list.
  """
  def compare(a, b) when is_list(a) and is_list(b) do
    case {contains?(a, b), contains?(b,a)} do
      {true, true} -> :equal
      {true, false} -> :superlist
      {false, true} -> :sublist
      {false, false} -> :unequal
    end
  end

  # determines if list a contains list b. restore_a is needed to restore
  # already "eaten" members of a, when b couldn't be matched completely
  defp contains?(a, b, current_b \\ :initial, restore_a \\ nil)
  defp contains?(a, b, :initial, nil), do: contains?(a, b, b, nil)
  defp contains?(_, _, [], _), do: true
  defp contains?([], _, _, _), do: false
  defp contains?([x | a], b, [x | c], nil), do: contains?(a, b, c, a)
  defp contains?([x | a], b, [x | c], restore_a), do: contains?(a, b, c, restore_a)
  defp contains?([_ | a], b, _, nil), do: contains?(a, b, b, nil)
  defp contains?(_, b, _, restore_a), do: contains?(restore_a, b, b, nil)
end

To clarify I enjoy creating solutions, and having to think, and play, but there is border.

Marked As Solved

mudasobwa

mudasobwa

Creator of Cure

Create your own wrapper my_contains?/4 which would print the intermediate results and run it for several different inputs.

  def compare(a, b) when is_list(a) and is_list(b) do
    case {my_contains?(a, b), my_contains?(b,a)} do
      {true, true} -> :equal
      {true, false} -> :superlist
      {false, true} -> :sublist
      {false, false} -> :unequal
    end
  end

  defp my_contains?(a, b, current_b \\ :initial, restore_a \\ nil) do
    IO.inspect(a: a, b: b, current_b: current_b, restore_a: restore_a)
    contains?(a, b, current_b, restore_a)
  end

  defp contains?(a, b, current_b \\ :initial, restore_a \\ nil)
  defp contains?(a, b, :initial, nil), do: my_contains?(a, b, b, nil)
  defp contains?(_, _, [], _), do: true
  defp contains?([], _, _, _), do: false
  defp contains?([x | a], b, [x | c], nil), do: my_contains?(a, b, c, a)
  defp contains?([x | a], b, [x | c], restore_a), do: my_contains?(a, b, c, restore_a)
  defp contains?([_ | a], b, _, nil), do: my_contains?(a, b, b, nil)
  defp contains?(_, b, _, restore_a), do: my_contains?(restore_a, b, b, nil)```

Also Liked

derek-zhou

derek-zhou

The code you cited seems fine to me, pretty clever use of tail recursion. I am not sure what do you mean. do you mean:

  • You don’t like this code. Of course you can have a opinion and choose to use your own code. or:
  • You like this code but wish some one to explain to you in digestible pieces. Then you did not say which part you do not understand. Or:
  • You don’t care about this code at all, all you care is to win the competition to provide the best solution. Then it is a matter of skill issue, right?
derek-zhou

derek-zhou

The correct reading order is from the top to bottom. If you want to improve your skill on tail recursion, write with it. Can you implement the enumerating functions in Enum, starting with Enum.reverse/1, with tail recursion? If you can write comfortably in tail recursion, it will click for you.

przemyxe0p

przemyxe0p

  @spec flatten(list) :: list
  def flatten(list), do: fl(list) |> Enum.reverse()

  defp fl(list, acc \\ [])

  defp fl([], acc), do: acc

  defp fl([[_|_] = el | tail], acc), do: fl(el, acc) |> then(&fl(tail, &1))
  defp fl([nil | tail], acc), do: fl(tail, acc)
  defp fl([el | tail], acc),do: fl(tail, [el | acc])

I guess we should reverse at the end, not on intermediate states, and your suggestion would not work (I tested it).

How to tell if my above solution is proper tail-call recursion?

Where Next?

Popular in Challenges Top

Qqwy
Note by the Moderators: This topic is to talk about Day 6 of the Advent of Code. For general discussion about the Advent of Code 2018 an...
New
stevensonmt
Trying to get more facility with dynamic programming concepts on Leetcode and having an issue I can’t find a way around. It’s a chutes an...
New
Aetherus
This topic is about the Advent of Code 2021 - Day 4. Thanks to @bjorng , we now have a new Private Leaderboard. The entry code is: 370...
New
Aetherus
Don’t know why the regex ~r/[\W && [^\.]]/x does not work in Elixir. It works pretty well in Ruby. Anyway, here is my solution:
New
New
bjorng
Note: This topic is to talk about Day 23 of the Advent of Code. For general discussion about the Advent of Code 2018 and links to topics...
New
bjorng
This topic is about Day 1 of the Advent of Code 2021. We have a private leaderboard (shared with users of Erlang Forums): https://adven...
New
cblavier
Hey there :wave: No magic or algorithmic finesse today, I just finished the challenge and I my code is quite slow (1sec for part1, 3se...
New
bjorng
Note: This topic is to talk about Day 18 of the Advent of Code 2019. There is a private leaderboard for elixirforum members. You can joi...
New
bjorng
Here is my solution for day 1 of Advent of Code: defmodule Day01 do def part1(input) do all = parse(input) {first, second} = E...
New

Other popular topics Top

freewebwithme
Using vs code and installed ElixirLS: support and debugger. And I got an error popped up on start up says Failed to run ‘elixir’ comma...
New
minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
yawaramin
In the Dialyzer docs ( http://erlang.org/doc/man/dialyzer.html#requesting-or-suppressing-warnings-in-source-files ), there is a way to tu...
New
openscript
Hello! Sorry for this astonishing simple question, but I’m really stuck. I try to set up the intellij-elixir plugin, but I don’t know ho...
New
sacepums
Hey guys. I'm new to elixir and im really stocked about it. But I ran into a bit of problem - I need to convert a date sting, for examp...
New
nsuchy
Hi. I’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
qwerescape
Is there a way to get the call stack or stack trace at any point in the code? Not from exceptions, but an expression that returns how the...
New
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New

We're in Beta

About us Mission Statement