Category talk:Go-rcu: Difference between revisions

From Rosetta Code
Content added Content deleted
(Added source code for new 'Go-rcu' package.)
 
(→‎Source code: Added commatize option to PrintTable function.)
Line 161: Line 161:


// Prints a slice of ints in tabular form with a given row and column size.
// Prints a slice of ints in tabular form with a given row and column size.
func PrintTable(s []int, rowSize, colSize int) {
func PrintTable(s []int, rowSize, colSize int, commas bool) {
for i := 0; i < len(s); i++ {
for i := 0; i < len(s); i++ {
fmt.Printf("%*d ", colSize, s[i])
if !commas {
fmt.Printf("%*d ", colSize, s[i])
} else {
fmt.Printf("%*s ", colSize, Commatize(s[i]))
}
if (i+1)%rowSize == 0 {
if (i+1)%rowSize == 0 {
fmt.Println()
fmt.Println()

Revision as of 20:39, 13 April 2021

Source code

<lang go>package rcu

import "fmt"

// Returns the larger of two ints. func Max(x, y int) int {

   if x > y {
       return x
   }
   return y

}

// Returns the smaller of two ints. func Min(x, y int) int {

   if x < y {
       return x
   }
   return y

}

// Returns the absolute value of an int. func Abs(x int) int {

   if x < 0 {
       return -x
   }
   return x

}

// Returns the greatest common divisor of two ints. func Gcd(x, y int) int {

   for y != 0 {
       x, y = y, x%y
   }
   return x

}

// Returns the least common multiple of two ints. func Lcm(x, y int) int { return Abs(x*y) / Gcd(x, y) }

// Returns whether or not an int is prime. func IsPrime(n int) bool {

   switch {
   case n < 2:
       return false
   case n%2 == 0:
       return n == 2
   case n%3 == 0:
       return n == 3
   default:
       d := 5
       for d*d <= n {
           if n%d == 0 {
               return false
           }
           d += 2
           if n%d == 0 {
               return false
           }
           d += 4
       }
       return true
   }

}

// Sieves for primes up to and including 'limit'. // Returns a bool slice 'c' of size (limit + 1) where: // c[i] is false if 'i' is prime or true if 'i' is composite. // Optionally processes even numbers >= 4. func PrimeSieve(limit int, processEven bool) []bool {

   limit++
   // True denotes composite, false denotes prime.
   c := make([]bool, limit) // all false by default
   c[0] = true
   c[1] = true
   if processEven {
       for i := 4; i < limit; i += 2 {
           c[i] = true
       }
   }
   p := 3 // Start from 3.
   for {
       p2 := p * p
       if p2 >= limit {
           break
       }
       for i := p2; i < limit; i += 2 * p {
           c[i] = true
       }
       for {
           p += 2
           if !c[p] {
               break
           }
       }
   }
   return c

}

// Returns a slice of all primes up to and including 'limit'. func Primes(limit int) []int {

   c := PrimeSieve(limit, false)
   if limit < 2 {
       return []int{}
   }
   primes := []int{2}
   for i := 3; i < len(c); i += 2 {
       if !c[i] {
           primes = append(primes, i)
       }
   }
   return primes

}

// Reverses a slice of ints in place. func ReverseInts(s []int) {

   for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
       s[i], s[j] = s[j], s[i]
   }

}

// Returns a slice of an int's digits in base b. func Digits(n, b int) []int {

   if n == 0 {
       return []int{0}
   }
   var digits []int
   for n > 0 {
       digits = append(digits, n%b)
       n /= b
   }
   ReverseInts(digits)
   return digits

}

// Returns the sum of an int's digits in base b. func DigitSum(n, b int) int {

   sum := 0
   for n > 0 {
       sum += n % b
       n /= b
   }
   return sum

}

// Adds thousand separators to an int. func Commatize(n int) string {

   s := fmt.Sprintf("%d", n)
   if n < 0 {
       s = s[1:]
   }
   le := len(s)
   for i := le - 3; i >= 1; i -= 3 {
       s = s[0:i] + "," + s[i:]
   }
   if n >= 0 {
       return s
   }
   return "-" + s

}

// Prints a slice of ints in tabular form with a given row and column size. func PrintTable(s []int, rowSize, colSize int, commas bool) {

   for i := 0; i < len(s); i++ {
       if !commas {
           fmt.Printf("%*d ", colSize, s[i])
       } else {
           fmt.Printf("%*s ", colSize, Commatize(s[i]))
       }
       if (i+1)%rowSize == 0 {
           fmt.Println()
       }
   }
   if len(s)%rowSize != 0 {
       fmt.Println()
   }

}</lang>