RosettaCodeData/Task/Periodic-table/V-(Vlang)/periodic-table.v
2023-07-01 13:44:08 -04:00

30 lines
923 B
V

import log
const limits = [[3, 10], [11, 18], [19, 36], [37, 54], [55, 86], [87, 118]]
fn main() {
for n in [1, 2, 29, 42, 57, 58, 59, 71, 72, 89, 90, 103, 113] {
row, col := periodic_table(n)
println("Atomic number ${n} -> ${row}, ${col}")
}
}
fn periodic_table(n int) (int, int) {
mut logged := log.Log{}
mut limit := []int{}
mut row, mut start, mut end := 0, 0, 0
if n < 1 || n > 118 {logged.fatal("Atomic number is out of range.")}
if n == 1 {return 1, 1}
if n == 2 {return 1, 18}
if n >= 57 && n <= 71 {return 8, n - 53}
if n >= 89 && n <= 103 {return 9, n - 85}
for i := 0; i < limits.len; i++ {
limit = limits[i]
if n >= limit[0] && n <= limit[1] {
row, start, end = i + 2, limit[0], limit[1]
break
}
}
if n < start + 2 || row == 4 || row == 5 {return row, n - start + 1}
return row, n - end + 18
}