202. Sum of squares
Calculate the sum of squares s of data, an array of floating point values.
Calculate the sum of squares
package main
import (
"math"
)
func main(a) {
data := []float64{0.06.0.82.0.01.0.34.0.55}
var s float64
for _, d := range data {
s += math.Pow(d, 2)}println(s)
}
Copy the code
+ 1.094200 e+000
fn main() {
let data: Vec<f32> = vec![2.0.3.5.4.0];
let s = data.iter().map(|x| x.powi(2)).sum::<f32> ();println!("{}", s);
}
Copy the code
32.25
205. Get an environment variable
Read an environment variable with the name “FOO” and assign it to the string variable foo. If it does not exist or if the system does not support environment variables, assign a value of “none”.
Getting environment variables
package main
import (
"fmt"
"os"
)
func main(a) {
foo, ok := os.LookupEnv("FOO")
if! ok { foo ="none"
}
fmt.Println(foo)
}
Copy the code
none
or
package main
import (
"fmt"
"os"
)
func main(a) {
foo := os.Getenv("FOO")
if foo == "" {
foo = "none"
}
fmt.Println(foo)
}
Copy the code
none
use std::env;
fn main() {
let foo;
match env::var("FOO") {
Ok(val) => foo = val,
Err(_e) => foo = "none".to_string(),
}
println!("{}", foo);
let user;
match env::var("USER") {
Ok(val) => user = val,
Err(_e) => user = "none".to_string(),
}
println!("{}", user);
}
Copy the code
none
playground
Copy the code
or
use std::env;
fn main() {
let foo = env::var("FOO").unwrap_or("none".to_string());
println!("{}", foo);
let user = env::var("USER").unwrap_or("none".to_string());
println!("{}", user);
}
Copy the code
none
playground
Copy the code
or
use std::env;
fn main() {
let foo = match env::var("FOO") {
Ok(val) => val,
Err(_e) => "none".to_string(),
};
println!("{}", foo);
let user = match env::var("USER") {
Ok(val) => val,
Err(_e) => "none".to_string(),
};
println!("{}", user);
}
Copy the code
none
playground
Copy the code
or
use std::env;
if let Ok(tnt_root) = env::var("TNT_ROOT") {
//
}
Copy the code
206. Switch statement with strings
Execute different procedures foo, bar, baz and barfl if the string str contains the name of the respective procedure. Do it in a way natural to the language.
A switch statement
package main
import (
"fmt"
)
func main(a) {
str := "baz"
switch str {
case "foo":
foo()
case "bar":
bar()
case "baz":
baz()
case "barfl":
barfl()
}
}
func foo(a) {
fmt.Println("Called foo")}func bar(a) {
fmt.Println("Called bar")}func baz(a) {
fmt.Println("Called baz")}func barfl(a) {
fmt.Println("Called barfl")}Copy the code
Called baz
fn main() {
fn foo() {}
fn bar() {}
fn baz() {}
fn barfl() {}
let str_ = "x";
match str_ {
"foo" => foo(),
"bar" => bar(),
"baz" => baz(),
"barfl" => barfl(),
_ => {}
}
}
Copy the code
207. Allocate a list that is automatically deallocated
Allocate a list a containing n elements (n assumed to be too large for a stack) that is automatically deallocated when the program exits the scope it is declared in.
Assign a list of automatically unassigned items
package main
import (
"fmt"
)
type T byte
func main(a) {
n := 10_000_000
a := make([]T, n)
fmt.Println(len(a))
}
Copy the code
Elements have type T. a is garbage-collected after the program exits its scope, unless we let it “escape” by taking its reference. The runtime decides if a lives in the stack on in the heap.
10000000
let a = vec![0; n];
Copy the code
Heap allocations are deallocated when the variable goes out of scope.
208. Formula with arrays
Given the arrays a,b,c,d of equal length and the scalar e, calculate a = e*(a+b*c+cos(d)).
Store the results in a.
Performs operations on array elements
package main
import (
"fmt"
"math"
)
func applyFormula(a, b, c, d []float64, e float64) {
for i, v := range a {
a[i] = e * (v + b[i] + c[i] + math.Cos(d[i]))
}
}
func main(a) {
a := []float64{1.2.3.4}
b := []float64{5.5.6.6.7.7.8.8}
c := []float64{9.10.11.12}
d := []float64{13.14.15.16}
e := 42.0
fmt.Println("a is ", a)
applyFormula(a, b, c, d, e)
fmt.Println("a is now", a)
}
Copy the code
a is [1 2 3 4]
a is now [689.1127648209083 786.9429631647291 879.4931076599294 1001.3783018264178]
Copy the code
fn main() {
let mut a: [f32; 5] = [5.2.8.9.0.5]; // we want it to be mutable
let b: [f32; 5] = [7.9.8.0.965.0.98];
let c: [f32; 5] = [0.0.8.789456.123456.0.0003];
let d: [f32; 5] = [332.0.1.8.9874.0.3];
const e: f32 = 85.;
for i in 0..a.len() {
a[i] = e * (a[i] + b[i] * c[i] + d[i].cos());
}
println!("{:? }", a); //Don't have any idea about the output
}
Copy the code
[470.29297, 866.57544, 536830750.0, 10127158.0, 123.7286]
209. Type with automatic deep deallocation
Declare a type t which contains a string s and an integer array n with variable size, and allocate a variable v of type t. Allocate v.s and v.n and set them to the values “Hello, world!” Locating V, Automatically deallocating V.s and V.n (no memory leaks).
Type of automatic depth-unassigning
package main
func main(a) {
f()
}
func f(a) {
type t struct {
s string
n []int
}
v := t{
s: "Hello, world!",
n: []int{1.4.9.16.25}},// Pretend to use v (otherwise this is a compile error)
_ = v
// When f exits, v and all its fields are garbage-collected, recursively
}
Copy the code
After v goes out of scope, v and all its fields will be garbage-collected, recursively
struct T {
s: String,
n: Vec<usize>,}fn main() {
let v = T {
s: "Hello, world!".into(),
n: vec![1.4.9.16.25]}; }Copy the code
When a variable goes out of scope, all member variables are deallocated recursively.
211. Create folder
Create the folder at path on the filesystem
Creating a folder
package main
import (
"fmt"
"os"
)
func main(a) {
path := "foo"_, err := os.Stat(path) b := ! os.IsNotExist(err) fmt.Println(path,"exists:", b)
err = os.Mkdir(path, os.ModeDir)
iferr ! =nil {
panic(err) } info, err2 := os.Stat(path) b = ! os.IsNotExist(err2) fmt.Println(path,"exists:", b)
fmt.Println(path, "is a directory:", info.IsDir())
}
Copy the code
foo exists: false
foo exists: true
foo is a directory: true
Copy the code
or
package main
import (
"fmt"
"os"
)
func main(a) {
path := "foo/bar"_, err := os.Stat(path) b := ! os.IsNotExist(err) fmt.Println(path,"exists:", b)
err = os.Mkdir(path, os.ModeDir)
iferr ! =nil {
fmt.Println("Could not create", path, "with os.Mkdir") } info, err2 := os.Stat(path) b = ! os.IsNotExist(err2) fmt.Println(path,"exists:", b)
err = os.MkdirAll(path, os.ModeDir)
iferr ! =nil {
fmt.Println("Could not create", path, "with os.MkdirAll") } info, err2 = os.Stat(path) b = ! os.IsNotExist(err2) fmt.Println(path,"exists:", b)
fmt.Println(path, "is a directory:", info.IsDir())
}
Copy the code
foo/bar exists: false
Could not create foo/bar with os.Mkdir
foo/bar exists: false
foo/bar exists: true
foo/bar is a directory: true
Copy the code
use std::fs;
use std::path::Path;
fn main() {
let path = "/tmp/goofy";
let b: bool = Path::new(path).is_dir();
println!("{} exists: {}", path, b);
let r = fs::create_dir(path);
match r {
Err(e) => {
println!("error creating {}: {}", path, e);
std::process::exit(1);
}
Ok(_) = >println!("created {}: OK", path),
}
let b: bool = Path::new(path).is_dir();
println!("{} exists: {}", path, b);
}
Copy the code
/tmp/goofy exists: false
created /tmp/goofy: OK
/tmp/goofy exists: true
Copy the code
or
use std::fs;
use std::path::Path;
fn main() {
let path = "/tmp/friends/goofy";
let b: bool = Path::new(path).is_dir();
println!("{} exists: {}", path, b);
// fs::create_dir can't create parent folders
let r = fs::create_dir(path);
match r {
Err(e) => println!("error creating {}: {}", path, e),
Ok(_) = >println!("created {}: OK", path),
}
let b: bool = Path::new(path).is_dir();
println!("{} exists: {}", path, b);
// fs::create_dir_all does create parent folders
let r = fs::create_dir_all(path);
match r {
Err(e) => println!("error creating {}: {}", path, e),
Ok(_) = >println!("created {}: OK", path),
}
let b: bool = Path::new(path).is_dir();
println!("{} exists: {}", path, b);
}
Copy the code
/tmp/friends/goofy exists: false
error creating /tmp/friends/goofy: No such file or directory (os error 2)
/tmp/friends/goofy exists: false
created /tmp/friends/goofy: OK
/tmp/friends/goofy exists: true
Copy the code
212. Check if folder exists
Set boolean b to true if path exists on the filesystem and is a directory; false otherwise.
Check whether the folder exists
package main
import (
"fmt"
"os"
)
func main(a) {
path := "foo"info, err := os.Stat(path) b := ! os.IsNotExist(err) && info.IsDir() fmt.Println(path,"is a directory:", b)
err = os.Mkdir(path, os.ModeDir)
iferr ! =nil {
panic(err) } info, err = os.Stat(path) b = ! os.IsNotExist(err) && info.IsDir() fmt.Println(path,"is a directory:", b)
}
Copy the code
foo is a directory: false
foo is a directory: true
Copy the code
use std::path::Path;
fn main() {
let path = "/etc";
let b: bool = Path::new(path).is_dir();
println!("{}: {}", path, b);
let path = "/goofy";
let b: bool = Path::new(path).is_dir();
println!("{}: {}", path, b);
}
Copy the code
/etc: true
/goofy: false
Copy the code
215. Pad string on the left
Prepend extra character c at the beginning of string s to make sure its length is at least m.
The length is the number of characters, not the number of bytes.
Left completion string
package main
import (
"fmt"
"strings"
"unicode/utf8"
)
func main(a) {
m := 3
c := "-"
for _, s := range []string{
""."a"."ab"."abc"."abcd"."é",} {if n := utf8.RuneCountInString(s); n < m {
s = strings.Repeat(c, m-n) + s
}
fmt.Println(s)
}
}
Copy the code
--- -- a-ab ABC abcd -- eCopy the code
use unicode_width::{UnicodeWidthChar, UnicodeWidthStr};
if let Some(columns_short) = m.checked_sub(s.width()) {
let padding_width = c
.width()
.filter(|n| *n > 0)
.expect("padding character should be visible");
// Saturate the columns_short
let padding_needed = columns_short + padding_width - 1 / padding_width;
let mut t = String::with_capacity(s.len() + padding_needed);
t.extend((0..padding_needed).map(|_| c)
t.push_str(&s);
s = t;
}
Copy the code
*This uses the Unicode display width to determine the padding needed. This will be appropriate for most uses of monospaced text.
It assumes that m won’t combine with other characters to form a grapheme.*
217. Create a Zip archive
Create a zip-file with filename name and add the files listed in list to that zip-file.
Creating a compressed file
package main
import (
"archive/zip"
"bytes"
"io"
"io/ioutil"
"log"
"os"
)
func main(a) {
list := []string{
"readme.txt"."gopher.txt"."todo.txt",
}
name := "archive.zip"
err := makeZip(list, name)
iferr ! =nil {
log.Fatal(err)
}
}
func makeZip(list []string, name string) error {
// Create a buffer to write our archive to.
buf := new(bytes.Buffer)
// Create a new zip archive.
w := zip.NewWriter(buf)
// Add some files to the archive.
for _, filename := range list {
// Open file for reading
input, err := os.Open(filename)
iferr ! =nil {
return err
}
// Create ZIP entry for writing
output, err := w.Create(filename)
iferr ! =nil {
return err
}
_, err = io.Copy(output, input)
iferr ! =nil {
return err
}
}
// Make sure to check the error on Close.
err := w.Close()
iferr ! =nil {
return err
}
N := buf.Len()
err = ioutil.WriteFile(name, buf.Bytes(), 0777)
iferr ! =nil {
return err
}
log.Println("Written a ZIP file of", N, "bytes")
return nil
}
func init(a) {
// Create some files in the filesystem.
var files = []struct {
Name, Body string
}{
{"readme.txt"."This archive contains some text files."},
{"gopher.txt"."Gopher names:\nGeorge\nGeoffrey\nGonzo"},
{"todo.txt"."Get animal handling licence.\nWrite more examples."}},for _, file := range files {
err := ioutil.WriteFile(file.Name, []byte(file.Body), 0777)
iferr ! =nil {
log.Fatal(err)
}
}
}
Copy the code
list contains filenames of files existing in the filesystem. In this example, the zip data is buffered in memory before writing to the filesystem.
2009/11/10 23:00:00 Written a ZIP file of 492 bytes
use zip::write::FileOptions;
let path = std::path::Path::new(_name);
let file = std::fs::File::create(&path).unwrap();
let mut zip = zip::ZipWriter::new(file); zip.start_file("readme.txt", FileOptions::default())? ; zip.write_all(b"Hello, World! \n")? ; zip.finish()? ;Copy the code
or
use zip::write::FileOptions;
fn zip(_name: &str, _list: VecThe < &str>) -> zip::result::ZipResult<()>
{
let path = std::path::Path::new(_name);
let file = std::fs::File::create(&path).unwrap();
let mut zip = zip::ZipWriter::new(file);
for i in _list.iter() {
zip.start_file(i as &str, FileOptions::default())? ; } zip.finish()? ;Ok(())}Copy the code
218. List intersection
Create list c containing all unique elements that are contained in both lists a and b.
c should not contain any duplicates, even if a and b do. The order of c doesn’t matter.
Intersection of lists
package main
import (
"fmt"
)
type T int
func main(a) {
a := []T{4.5.6.7.8.9.10}
b := []T{1.3.9.5.7.9.7.7}
// Convert to sets
seta := make(map[T]bool.len(a))
for _, x := range a {
seta[x] = true
}
setb := make(map[T]bool.len(a))
for _, y := range b {
setb[y] = true
}
// Iterate in one pass
var c []T
for x := range seta {
if setb[x] {
c = append(c, x)
}
}
fmt.Println(c)
}
Copy the code
[5 July 9]
use std::collections::HashSet;
fn main() {
let a = vec![1.2.3.4];
let b = vec![2.4.6.8.2.2];
let unique_a = a.iter().collect::<HashSet<_>>();
let unique_b = b.iter().collect::<HashSet<_>>();
let c = unique_a.intersection(&unique_b).collect::<VecThe < _ > > ();println!("c: {:? }", c);
}
Copy the code
c: [2, 4]
or
use std::collections::HashSet;
fn main() {
let a = vec![1.2.3.4];
let b = vec![2.4.6.8.2.2];
let set_a: HashSet<_> = a.into_iter().collect();
let set_b: HashSet<_> = b.into_iter().collect();
let c = set_a.intersection(&set_b);
println!("c: {:? }", c);
}
Copy the code
c: [2, 4]
219. Replace multiple spaces with single space
Create string t from the value of string s with each sequence of spaces replaced by a single space.
Explain if only the space characters will be replaced, or the other whitespaces as well: tabs, newlines.
Replace multiple Spaces with a single space
package main
import (
"fmt"
"regexp"
)
// regexp created only once, and then reused
var whitespaces = regexp.MustCompile(`\s+`)
func main(a) {
s := ` one two three `
t := whitespaces.ReplaceAllString(s, "")
fmt.Printf("t=%q", t)
}
Copy the code
t=" one two three "
use regex::Regex;
fn main() {
let s = " one two three ";
let re = Regex::new(r"\s+").unwrap();
let t = re.replace_all(s, "");
println!("{}", t);
}
Copy the code
one two three
220. Create a tuple value
Create t consisting of 3 values having different types.
Explain if the elements of t are strongly typed or not.
Create the tuple value a
t := []interface{} {2.5."hello".make(chan int),}Copy the code
A slice of empty interface may hold any values (not strongly typed).
fn main() {
let mut t = (2.5."hello", -1);
t.2- =4;
println!("{:? }", t);
}
Copy the code
(2.5, "hello", 5)