abeinstein

abeinstein

Can ChatGPT help with writing more idiomatic Elixir?

I’m using Advent of Code to learn Elixir. I wrote a solution to Day 1 that worked but looked a bit ugly. I asked ChatGPT to rewrite it more idiomatic Elixir:

Prompt:
can you rewrite this to be more idiomatic Elixir?

  def part_1(input) do
    input
    |> String.split("\n\n")
    |> Enum.map(fn s ->
      s
      |> String.split("\n")
      |> Enum.map(fn t ->
        t
        |> String.trim()
        |> String.to_integer()
      end)
      |> Enum.sum()
    end)
    |> Enum.max()
  end

Here’s how it answered:

Here is a possible way to rewrite the part_1/1 function in a more idiomatic Elixir style:

def part_1(input) do
  input
  |> String.split("\n\n")
  |> Enum.map(fn s ->
    s
    |> String.split("\n")
    |> Enum.map(&String.trim/1)
    |> Enum.map(&String.to_integer/1)
    |> Enum.sum()
  end)
  |> Enum.max()
end

This rewrite uses the & operator to convert the String.trim/1 and String.to_integer/1 functions into anonymous functions, which allows them to be passed directly to the Enum.map/2 function. This is a more concise and idiomatic way to write the code, and it can make it easier to read and understand.

I hope this helps! Let me know if you have any other questions.

Pretty amazing!!

Most Liked

adamu

adamu

ChatGPT hasn’t discovered credo yet then.

seb3s

seb3s

Hello,
You really should take into account that each call to Enum in the final code implies a full walk through the entire list. So this can be ok for small lists but I for myself consider this as bad style.
The Enum module is full of functions that really should be studied in-depth as to find the appropriate one for the desired behavior.
In your case, I would use reduce that does all in one pass: traverse the list, do the proper conversion you need as in your first function and calc the sum in the accumulator, all in one pass.

So I would write it like this:

def part_1(input) do
    input
    |> String.split("\n\n")
    |> Enum.map(fn s ->
      s
      |> String.split("\n")
      |> Enum.reduce(0, fn t, acc ->
        t |> String.trim() |> String.to_integer() |> Kernel.+(acc)
      end)
    end)
    |> Enum.max()
  end

Cheers,
Sébastien.

seb3s

seb3s

Yes and that’s good to see the various tries to the challenge.
But my main point was to alert on the stacking of Enum.map calls that is easy with the pipe operator but that comes with an associated cost. The initial post conclude that the AI was pretty amazing, I don’t share this feeling (plus the fact that a recent submission we did at work result in a not so bad looking implementation for the problem we submit to it, but the result was totally false and the AI was bluffing… Maybe it could be good at poker !)

Where Next?

Popular in Discussions Top

matthias_toepp
I’d love to hear what people think about Wisp, the new Gleam web framework started by Gleam’s primary creator Louis Pilfold. Gleam, alon...
New
PragTob
Hello everyone, I know we had quite some threads (read through lots of them) about background job processing but it remains a hotly deba...
New
WolfDan
After doing a port from a c++ library to my project in phoenix I’ve seen that I need a faster way to run this algorithm and I found this ...
New
pillaiindu
I want to convert a Phoenix LiveView CRUD website to a CRUD mobile app. What do you think is the easiest way to do so?
New
lucaong
Hello Elixir and Nerves community, I have been working for a while on an open-source embedded key-value database for Elixir, that I call...
230 14049 124
New
crabonature
I’m still quite new to Elixir. As I understand we got in Elixir “multi guards” as convention to simplify one large guard with or’s?: de...
New
nunobernardes99
Hi there Elixir friends :vulcan_salute: In a recent task I was on, I needed to check in two dates which of them is the maximum and which...
New
AlexMcConnell
The reason that Rails is as popular as it is is because it’s very easy for relatively inexperienced developers to get a lot of work done....
588 19675 166
New
klo
Got a question about when to concat vs. prepending items to list then reversing to achieve appending. So i know lists boil down to [1 | ...
New
kostonstyle
Hi all How can I compare haskell with elixir, included tools, webservices, ect. Thanks
New

Other popular topics Top

mcarvalho
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
New
greenz1
I have a phoenix application from which a user can download multiple(5-6) files of size 1MB. I couldn’t find anything related to sending ...
New
johnnyicon
Hi all, I’ve just started learning Elixir and Phoenix Framework, so please pardon my n00bness at this stage. I’m trying to use Postgres...
New
aalberti333
As the title describes, I’m trying to run Enum.map() over a list of key/value pairs, where the value is a map. My data looks like this: ...
New
grych
Hi folks, Few months ago I have announced the proof-of-concept of the library to manipulate the browsers DOM objects directly from Elixi...
639 52774 488
New
dblack
I’ve got an issue with an app and I’ve no idea of how to troubleshoot it. I’m hoping someone here might have seen something similar. I p...
New
shijith.k
I am trying to start a new phoenix project with elixir 1.9, but mix phx.new does not work. It says that ** (Mix) The task "phx.new" could...
New
joaquinalcerro
Hi there, I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 records...
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
vegabook
I’m brand new to Phoenix and I have stripped one of the demo applications to the bone. I just want to get an svg up on the screen. Here i...
New

We're in Beta

About us Mission Statement