PeterCcT

PeterCcT

Roman number conversion challenge question

Hi guys!

I’m super new to Elixir, and my English can be a little bad, so I’m sorry about that.

Well, I’m here to get some advice on my code, it works well, but I don’t know if there’s anything I can do to make it more like the “Elixir way of things”. So if anyone can rate it and give me some tips :slight_smile:

Ps: The challenge is only for numbers up to 3000

Here’s the code

defmodule Converter do

  @one "I"
  @five "V"
  @ten "X"
  @fifty "L"
  @onehundread "C"
  @fivehundread "D"
  @onethousand "M"

  def to_roman_number(number,roman_number \\ "",n \\ 3)

  def to_roman_number(number,roman_number,_n) when number == 4,do: roman_number<>@one<>@five

  def to_roman_number(number,roman_number,_n) when div(number,10) == 4 do
    roman_conversion  = roman_number<>@ten<>@fifty
    rest = rem(number,10)
    to_roman_number(rest,roman_conversion,0)
  end
  def to_roman_number(number,roman_number,_n) when div(number,100) == 4 do
    roman_conversion  = roman_number<>@onehundread<>@fivehundread
    rest = rem(number,100)
    to_roman_number(rest,roman_conversion,1)
  end

  def to_roman_number(number,roman_number,_n) when number == 5, do: roman_number<>@five

  def to_roman_number(number,roman_number,_n) when div(number,10) == 5 do
    roman_conversion  = roman_number<>@fifty
    rest = rem(number,10)
    to_roman_number(rest,roman_conversion,0)
  end
  def to_roman_number(number,roman_number,_n) when div(number,100) == 5 do
    roman_conversion  = roman_number<>@fivehundread
    rest = rem(number,100)
    to_roman_number(rest,roman_conversion,1)
  end

  def to_roman_number(number,roman_number,_n) when number == 9,do: roman_number<>@one<>@ten

  def to_roman_number(number,roman_number,_n) when div(number,10) == 9 do
    roman_conversion  = roman_number<>@ten<>@onehundread
    rest = rem(number,10)
    to_roman_number(rest,roman_conversion,0)
  end
  def to_roman_number(number,roman_number,_n) when div(number,100) == 9 do
    roman_conversion  = roman_number<>@onehundread<>@onethousand
    rest = rem(number,100)
    to_roman_number(rest,roman_conversion,1)
  end


  def to_roman_number(number,roman_number,n) do
    base = trunc(:math.pow(10,n))
    quotient = div(number,base)
    rest = rem(number,base)
    cond do
      n == 3 ->
        roman_conversion = roman_number<>String.duplicate(@onethousand,quotient)
        to_roman_number(rest,roman_conversion,n-1)
      n == 2 ->
        roman_conversion = roman_number<>String.duplicate(@onehundread,quotient)
        to_roman_number(rest,roman_conversion,n-1)
      n == 1 ->
        roman_conversion = roman_number<>String.duplicate(@ten,quotient)
        to_roman_number(rest,roman_conversion,n-1)
      n == 0 ->
        roman_conversion = roman_number<>String.duplicate(@one,quotient)
        IO.puts "The converted number is "<>roman_conversion
    end
  end
end


Most Liked

hauleth

hauleth

It is repeating topic there, as I believe this is task in Exercism or other project like that. So check out if any other topic on that task helps you.

yreuvekamp

yreuvekamp

Since this is Exercism, I suggest requesting a mentor there to look at your code for some tips. That’s why they’re there :wink: Besides that, take a look at the most upvoted solutions for some inspiration. That really helped me think differently.

Edit: having said that, your code could definitely be more concise. Make use of the fact that you know all the possible mappings.

Last Post!

PeterCcT

PeterCcT

Sorry for the delay in responding too my brother

Thank you very much for the tip, the solution is a bit verbose, I’ll try to improve it!

Where Next?

Popular in Challenges Top

bjorng
Note: This topic is to talk about Day 4 of the Advent of Code 2019. There is a private leaderboard for elixirforum members. You can join...
New
dominicletz
This topic is about Day 8 of the Advent of Code 2020 . Thanks to @egze, we have a private leaderboard: https://adventofcode.com/2020/le...
New
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
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
Aetherus
The second part of today’s puzzle is very misleading. FYI, each of the ghosts has only one possible position that ends with a "Z" on its...
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
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

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
Darmani72
If I have a post route which an argument: post /my_post_route/:my_param1, MyController.my_post_handler How would get the post params ...
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New
albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
sergio
Kind of like when jquery came out, it was super necessary. Existing drag and drop libraries have a bunch of baggage to support old browse...
New

We're in Beta

About us Mission Statement