Lucky and even lucky numbers: Difference between revisions
Content added Content deleted
(Added an example for D) |
(Added Go) |
||
Line 195: | Line 195: | ||
.\lucky_and_even_lucky_numbers.exe -j=10000 --evenLucky |
.\lucky_and_even_lucky_numbers.exe -j=10000 --evenLucky |
||
[111842]</pre> |
[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}}== |
=={{header|Haskell}}== |