gangstead

gangstead

Advent of Code livebook setup

This is my second year doing AoC in Elixir and my first year doing it with Livebook.

When I was doing just plain Elixir I usually set up each day as an exs script and ran it with elixir 2021-day1.exs 2021-1input.txt That way I could save the example input from the problem setup, and the user-specific input and switch back and forth.

@josevalim did it in livebook last year and I was looking at his code where he used Kino inputs (example) and copy/pasted the AoC input and ran it. This works great, but your input is not persisted across sessions.

I’ve tried reading a file from the Livebook, putting it in the same directory as my .livemd file and reading the file as file1.txt and ./file1.txt, but that’s not right. The file is not found. I’m guessing the path is relative to the livebook process, which might be different depending on how you’re running livebook (escript, livebook.app, or hosting it on a webserver).

Are there any other tips for reading a file from within a livebook? Whether it’s on the livebook server or from the browser with Kino, a smart cell, something else?

Marked As Solved

stevensonmt

stevensonmt

maybe try using "#{__DIR__}/file1.txt" as the file path?

Also Liked

gangstead

gangstead

That works!

I’m still interested if there’s any way to do a file upload into a livebook. Maybe that’s a smart cell or something I could develop?

bmitc

bmitc

I am also using Livebook, and you can find my 2022 notebook here: advent-of-code/2022/elixir/advent_of_code_2022.livemd at main · bmitc/advent-of-code · GitHub

Warning: Solutions are there for days 1 and 2.

In particular, I am using a Utilities module to provide the data input file reading:

defmodule Utilities do
  @moduledoc """
  Provides utility functions to be used across days
  """

  @doc """
  Reads the given day's data file of "day_<zero padded day number>_input.txt" as
  a stream
  """
  @spec readDataStream(integer()) :: Stream.t()
  def readDataStream(day) do
    day_as_string =
      day
      |> Integer.to_string()
      |> String.pad_leading(2, "0")

    Path.join(__DIR__, "../data/day_#{day_as_string}_input.txt")
    |> Path.expand()
    |> File.stream!()
    |> Stream.map(&String.trim/1)
  end
end

I download all of the input files and name them as day_<number>_input.txt. For example, day_01_input.txt. I put them in a data folder up a level from the notebook because the intention is to potentially support several languages but keep the input files in a single location for a given year.

I also have tests setup to help in refactoring after I have solved a puzzle.

ExUnit.start(autorun: false)

defmodule AdventOfCode.Tests do
  use ExUnit.Case, async: true

  test "Day 1" do
    assert Day1.part_one() == # redacted
    assert Day1.part_two() == # redacted
  end

  test "Day 2" do
    assert Day2.PartOne.solution() == # redacted
    assert Day2.PartTwo.solution() == # redacted
  end
end

ExUnit.run()
mruoss

mruoss

I’m using kino_aoc. A very handy tool imo.

https://github.com/mruoss/advent_of_code/blob/main/2022/day04.livemd

Last Post!

netto

netto

Hey.

I use this SmartCell that fetches the puzzle and the input to a Livebook.

https://github.com/nettinho/smaoc

Hope it can be helpful.

Where Next?

Popular in Challenges Top

bjorng
This topic is about Day 14 of the Advent of Code 2020 . Thanks to @egze, we have a private leaderboard: https://adventofcode.com/2020/l...
New
Aetherus
This topic is about Day 15 of the Advent of Code 2020 . Thanks to @egze, we have a private leaderboard: https://adventofcode.com/2020/l...
New
code-shoily
Just did part 1. Part 2 seems to be demanding too much of my reading time so will get to that after I am done with some chores. Oh here ...
New
bjorng
This topic is about Day 9 of the Advent of Code 2021 . We have a private leaderboard (shared with users of Erlang Forums): https://adve...
New
Aetherus
Today’s challenge is quite interesting. I ended up using Zipper to solve this problem. Maybe I overengineered quite a bit. The data stru...
New
christhekeele
Setting this down for the night, as after a quick naive solve for quick part 1 I realize that part 2 is by design computationally expensi...
New
bjorng
Here is my solution for day 2 of Advent of Code: https://github.com/bjorng/advent-of-code/blob/main/2024/day02/lib/day02.ex
New

Other popular topics Top

JakeBecker
TL;DR: I’ve just released an implementation of Microsoft’s IDE-independent Language Server Protocol for Elixir. It adds language support ...
1144 54921 245
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New
axelson
This post is a wiki (feel free to hit the edit button near the bottom right of this post to add your own changes!) This post collects co...
239 49084 226
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID&lt;0.412.0&gt; terminating ** (Postgrex.Error) FATAL...
New
jason.o
In the code below, if the create action is not set to accept “extra_key” as an input, it errors out with a message shown above. Is there ...
New
AstonJ
Posting this to see if we can make things easier for people to get into Neovim. If you use Neovim and have a favourite distro please let ...
New

We're in Beta

About us Mission Statement