## Converting Celsius to Fahrenheit round-up

### July 22, 20240 commentsGo, Node, Python, Bun, Ruby, Rust, JavaScript

In the last couple of days, I've created variations of a simple algorithm to demonstrate how Celcius and Fahrenheit seem to relate to each other if you "mirror the number".
It wasn't supposed to be about the programming language. Still, I used Python in the first one and I noticed that since the code is simple, it could be fun to write variants of it in other languages.

It was a fun exercise.

And speaking of fun, I couldn't help but to throw in a benchmark using `hyperfine` that measures, essentially, how fast these CLIs can start up. The results look like this:

``````
Summary
./conversion-rs ran
1.31 ± 1.30 times faster than ./conversion-go
1.88 ± 1.33 times faster than ./conversion-cr
7.15 ± 4.64 times faster than bun run conversion.ts
14.27 ± 9.48 times faster than python3.12 conversion.py
18.10 ± 12.35 times faster than node conversion.js
67.75 ± 43.80 times faster than ruby conversion.rb
``````

It doesn't prove much, that you didn't expect. But it's fun to see how fast Python 3.12 has become at starting up.

Head on over to https://github.com/peterbe/temperature-conversion to play along. Perhaps you can see some easy optimizations (speed and style).

## Converting Celsius to Fahrenheit with Crystal

Previously in this series:

Crystal?

Crystal is a general-purpose, object-oriented programming language. With syntax inspired by Ruby, it's a compiled language with static type-checking.

``````
def c2f(c)
c * 9.0 / 5 + 32;
end

def is_mirror(a, b)
massage(a).reverse == massage(b)
end

def massage(n)
if n < 10
"0#{n}"
elsif n >= 100
massage(n - 100)
else
n.to_s
end
end

def print_conv(c, f)
puts "#{c}°C ~= #{f}°F"
end

(4...100).step(12).each do |c|
f = c2f(c)
if is_mirror(c, f.ceil.to_i)
print_conv(c, f.ceil.to_i)
elsif is_mirror(c, f.floor.to_i)
print_conv(c, f.floor.to_i)
else
break
end
end
``````

And this is its diff with the Ruby version:

``````
<     if is_mirror(c, f.ceil)
<         print_conv(c, f.ceil)
<     elsif is_mirror(c, f.floor)
<         print_conv(c, f.floor)
---
>     if is_mirror(c, f.ceil.to_i)
>         print_conv(c, f.ceil.to_i)
>     elsif is_mirror(c, f.floor.to_i)
>         print_conv(c, f.floor.to_i)
``````

Run it like this:

``````
crystal conversion.cr
``````

or build and run:

``````
crystal build -o conversion-cr conversion.cr
./conversion-cr
``````

and the output becomes:

```4°C ~= 40°F
16°C ~= 61°F
28°C ~= 82°F
40°C ~= 104°F
52°C ~= 125°F```

## Converting Celsius to Fahrenheit with Ruby

This is a continuation of Converting Celsius to Fahrenheit with Python, and TypeScript, and Go but in Ruby:

``````
def c2f(c)
c * 9.0 / 5 + 32;
end

def is_mirror(a, b)
def massage(n)
if n < 10
"0#{n}"
elsif n >= 100
massage(n - 100)
else
n.to_s
end
end
massage(a).reverse == massage(b)
end

def print_conv(c, f)
puts "#{c}°C ~= #{f}°F"
end

(4...100).step(12).each do |c|
f = c2f(c)
if is_mirror(c, f.ceil)
print_conv(c, f.ceil)
elsif is_mirror(c, f.floor)
print_conv(c, f.floor)
else
break
end
end
``````

Run it like this:

``````
ruby conversion.rb
``````

and the output becomes:

```4°C ~= 40°F
16°C ~= 61°F
28°C ~= 82°F
40°C ~= 104°F
52°C ~= 125°F```
Previous page
Next page