Jump to content

Lucky and even lucky numbers: Difference between revisions

Added Go
(Added an example for D)
(Added Go)
Line 195:
.\lucky_and_even_lucky_numbers.exe -j=10000 --evenLucky
[111842]</pre>
 
=={{header|Go}}==
{{trans|Kotlin}}
<lang go>package main
 
import (
"fmt"
"os"
"strconv"
"strings"
)
 
const luckySize = 60000
 
var luckyOdd = make([]int, luckySize)
var luckyEven = make([]int, luckySize)
 
func init() {
for i := 0; i < luckySize; i++ {
luckyOdd[i] = i*2 + 1
luckyEven[i] = i*2 + 2
}
}
 
func filterLuckyOdd() {
for n := 2; n < len(luckyOdd); n++ {
m := luckyOdd[n-1]
end := (len(luckyOdd)/m)*m - 1
for j := end; j >= m-1; j -= m {
copy(luckyOdd[j:], luckyOdd[j+1:])
luckyOdd = luckyOdd[:len(luckyOdd)-1]
}
}
}
 
func filterLuckyEven() {
for n := 2; n < len(luckyEven); n++ {
m := luckyEven[n-1]
end := (len(luckyEven)/m)*m - 1
for j := end; j >= m-1; j -= m {
copy(luckyEven[j:], luckyEven[j+1:])
luckyEven = luckyEven[:len(luckyEven)-1]
}
}
}
 
func printSingle(j int, odd bool) {
if odd {
if j >= len(luckyOdd) {
panic("Argument is too big")
}
fmt.Println("Lucky number", j, "=", luckyOdd[j-1])
} else {
if j >= len(luckyEven) {
panic("Argument is too big")
}
fmt.Println("Lucky even number", j, "=", luckyEven[j-1])
}
}
 
func printRange(j, k int, odd bool) {
if odd {
if k >= len(luckyOdd) {
panic("Argument is too big")
}
fmt.Println("Lucky numbers", j, "to", k, "are:")
fmt.Println(luckyOdd[j-1 : k])
} else {
if k >= len(luckyEven) {
panic("Argument is too big")
}
fmt.Println("Lucky even numbers", j, "to", k, "are:")
fmt.Println(luckyEven[j-1 : k])
}
}
 
func printBetween(j, k int, odd bool) {
var r []int
if odd {
max := luckyOdd[len(luckyOdd)-1]
if j > max || k > max {
panic("At least one argument is too big")
}
for _, num := range luckyOdd {
if num < j {
continue
}
if num > k {
break
}
r = append(r, num)
}
fmt.Println("Lucky numbers between", j, "and", k, "are:")
fmt.Println(r)
} else {
max := luckyEven[len(luckyEven)-1]
if j > max || k > max {
panic("At least one argument is too big")
}
for _, num := range luckyEven {
if num < j {
continue
}
if num > k {
break
}
r = append(r, num)
}
fmt.Println("Lucky even numbers between", j, "and", k, "are:")
fmt.Println(r)
}
}
 
func main() {
nargs := len(os.Args)
if nargs < 2 || nargs > 4 {
panic("There must be between 1 and 3 command line arguments")
}
filterLuckyOdd()
filterLuckyEven()
j, err := strconv.Atoi(os.Args[1])
if err != nil || j < 1 {
panic("First argument must be a positive integer")
}
if nargs == 2 {
printSingle(j, true)
return
}
 
if nargs == 3 {
k, err := strconv.Atoi(os.Args[2])
if err != nil {
panic("Second argument must be an integer")
}
if k >= 0 {
if j > k {
panic("Second argument can't be less than first")
}
printRange(j, k, true)
} else {
l := -k
if j > l {
panic("The second argument can't be less in absolute value than first")
}
printBetween(j, l, true)
}
return
}
 
var odd bool
switch lucky := strings.ToLower(os.Args[3]); lucky {
case "lucky":
odd = true
case "evenlucky":
odd = false
default:
panic("Third argument is invalid")
}
if os.Args[2] == "," {
printSingle(j, odd)
return
}
 
k, err := strconv.Atoi(os.Args[2])
if err != nil {
panic("Second argument must be an integer or a comma")
}
if k >= 0 {
if j > k {
panic("Second argument can't be less than first")
}
printRange(j, k, odd)
} else {
l := -k
if j > l {
panic("The second argument can't be less in absolute value than first")
}
printBetween(j, l, odd)
}
}</lang>
 
{{out}}
<pre>
$ ./lucky 1 20
Lucky numbers 1 to 20 are:
[1 3 7 9 13 15 21 25 31 33 37 43 49 51 63 67 69 73 75 79]
 
$ ./lucky 1 20 evenLucky
Lucky even numbers 1 to 20 are:
[2 4 6 10 12 18 20 22 26 34 36 42 44 50 52 54 58 68 70 76]
 
$ ./lucky 6000 -6100
Lucky numbers between 6000 and 6100 are:
[6009 6019 6031 6049 6055 6061 6079 6093]
 
$ ./lucky 6000 -6100 evenLucky
Lucky even numbers between 6000 and 6100 are:
[6018 6020 6022 6026 6036 6038 6050 6058 6074 6090 6092]
 
$ ./lucky 10000 , lucky
Lucky number 10000 = 115591
 
$ ./lucky 10000 , evenLucky
Lucky even number 10000 = 111842
</pre>
 
=={{header|Haskell}}==
9,488

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.