Lucky and even lucky numbers: Difference between revisions

Content added Content deleted
(Added Go)
(→‎{{header|Go}}: More idiomatic error handling.)
Line 202: Line 202:
import (
import (
"fmt"
"fmt"
"log"
"os"
"os"
"strconv"
"strconv"
Line 241: Line 242:
}
}


func printSingle(j int, odd bool) {
func printSingle(j int, odd bool) error {
if odd {
if odd {
if j >= len(luckyOdd) {
if j >= len(luckyOdd) {
panic("Argument is too big")
return fmt.Errorf("the argument, %d, is too big", j)
}
}
fmt.Println("Lucky number", j, "=", luckyOdd[j-1])
fmt.Println("Lucky number", j, "=", luckyOdd[j-1])
} else {
} else {
if j >= len(luckyEven) {
if j >= len(luckyEven) {
panic("Argument is too big")
return fmt.Errorf("the argument, %d, is too big", j)
}
}
fmt.Println("Lucky even number", j, "=", luckyEven[j-1])
fmt.Println("Lucky even number", j, "=", luckyEven[j-1])
}
}
return nil
}
}


func printRange(j, k int, odd bool) {
func printRange(j, k int, odd bool) error {
if odd {
if odd {
if k >= len(luckyOdd) {
if k >= len(luckyOdd) {
panic("Argument is too big")
return fmt.Errorf("the argument, %d, is too big", k)
}
}
fmt.Println("Lucky numbers", j, "to", k, "are:")
fmt.Println("Lucky numbers", j, "to", k, "are:")
Line 264: Line 266:
} else {
} else {
if k >= len(luckyEven) {
if k >= len(luckyEven) {
panic("Argument is too big")
return fmt.Errorf("the argument, %d, is too big", k)
}
}
fmt.Println("Lucky even numbers", j, "to", k, "are:")
fmt.Println("Lucky even numbers", j, "to", k, "are:")
fmt.Println(luckyEven[j-1 : k])
fmt.Println(luckyEven[j-1 : k])
}
}
return nil
}
}


func printBetween(j, k int, odd bool) {
func printBetween(j, k int, odd bool) error {
var r []int
var r []int
if odd {
if odd {
max := luckyOdd[len(luckyOdd)-1]
max := luckyOdd[len(luckyOdd)-1]
if j > max || k > max {
if j > max || k > max {
panic("At least one argument is too big")
return fmt.Errorf("at least one argument, %d or %d, is too big", j, k)
}
}
for _, num := range luckyOdd {
for _, num := range luckyOdd {
Line 292: Line 295:
max := luckyEven[len(luckyEven)-1]
max := luckyEven[len(luckyEven)-1]
if j > max || k > max {
if j > max || k > max {
panic("At least one argument is too big")
return fmt.Errorf("at least one argument, %d or %d, is too big", j, k)
}
}
for _, num := range luckyEven {
for _, num := range luckyEven {
Line 306: Line 309:
fmt.Println(r)
fmt.Println(r)
}
}
return nil
}
}


Line 311: Line 315:
nargs := len(os.Args)
nargs := len(os.Args)
if nargs < 2 || nargs > 4 {
if nargs < 2 || nargs > 4 {
panic("There must be between 1 and 3 command line arguments")
log.Fatal("there must be between 1 and 3 command line arguments")
}
}
filterLuckyOdd()
filterLuckyOdd()
Line 317: Line 321:
j, err := strconv.Atoi(os.Args[1])
j, err := strconv.Atoi(os.Args[1])
if err != nil || j < 1 {
if err != nil || j < 1 {
panic("First argument must be a positive integer")
log.Fatalf("first argument, %s, must be a positive integer", os.Args[1])
}
}
if nargs == 2 {
if nargs == 2 {
printSingle(j, true)
if err := printSingle(j, true); err != nil {
log.Fatal(err)
}
return
return
}
}
Line 327: Line 333:
k, err := strconv.Atoi(os.Args[2])
k, err := strconv.Atoi(os.Args[2])
if err != nil {
if err != nil {
panic("Second argument must be an integer")
log.Fatalf("second argument, %s, must be an integer", os.Args[2])
}
}
if k >= 0 {
if k >= 0 {
if j > k {
if j > k {
panic("Second argument can't be less than first")
log.Fatalf("second argument, %d, can't be less than first, %d", k, j)
}
if err := printRange(j, k, true); err != nil {
log.Fatal(err)
}
}
printRange(j, k, true)
} else {
} else {
l := -k
l := -k
if j > l {
if j > l {
panic("The second argument can't be less in absolute value than first")
log.Fatalf("second argument, %d, can't be less in absolute value than first, %d", k, j)
}
if err := printBetween(j, l, true); err != nil {
log.Fatal(err)
}
}
printBetween(j, l, true)
}
}
return
return
Line 351: Line 361:
odd = false
odd = false
default:
default:
panic("Third argument is invalid")
log.Fatalf("third argument, %s, is invalid", os.Args[3])
}
}
if os.Args[2] == "," {
if os.Args[2] == "," {
printSingle(j, odd)
if err := printSingle(j, odd); err != nil {
log.Fatal(err)
}
return
return
}
}
Line 360: Line 372:
k, err := strconv.Atoi(os.Args[2])
k, err := strconv.Atoi(os.Args[2])
if err != nil {
if err != nil {
panic("Second argument must be an integer or a comma")
log.Fatal("second argument must be an integer or a comma")
}
}
if k >= 0 {
if k >= 0 {
if j > k {
if j > k {
panic("Second argument can't be less than first")
log.Fatalf("second argument, %d, can't be less than first, %d", k, j)
}
if err := printRange(j, k, odd); err != nil {
log.Fatal(err)
}
}
printRange(j, k, odd)
} else {
} else {
l := -k
l := -k
if j > l {
if j > l {
panic("The second argument can't be less in absolute value than first")
log.Fatalf("second argument, %d, can't be less in absolute value than first, %d", k, j)
}
if err := printBetween(j, l, odd); err != nil {
log.Fatal(err)
}
}
printBetween(j, l, odd)
}
}
}</lang>
}</lang>