add: map exercises and quiz

This commit is contained in:
Inanc Gumus
2019-05-05 00:41:44 +03:00
parent 03c753fe56
commit c6ec3af17e
8 changed files with 390 additions and 3 deletions

View File

@ -0,0 +1,38 @@
package main
// ---------------------------------------------------------
// EXERCISE: Warm-up
//
// Create and print the following maps.
//
// 1. Phone numbers by last name
// 2. Product availability by Product ID
// 3. Multiple phone numbers by last name
// 4. Shopping basket by Customer ID
//
// Each item in the shopping basket has a Product ID and
// quantity. Through the map, you can tell:
// "Mr. X has bought Y bananas"
//
// ---------------------------------------------------------
func main() {
// Hint: Store phone numbers as text
// #1
// Key : Last name
// Element : Last name
// #2
// Key : Product ID
// Element : Available / Unavailable
// #3
// Key : Last name
// Element : Phone numbers
// #4
// Key : Customer ID
// Element Key:
// Key: Product ID Element: Quantity
}

View File

@ -0,0 +1,36 @@
// For more tutorials: https://blog.learngoprogramming.com
//
// Copyright © 2018 Inanc Gumus
// Learn Go Programming Course
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/
//
package main
import "fmt"
func main() {
var (
phones map[string]string
// Key : Last name
// Element : Last name
// Key : Product ID
// Element : Available / Unavailable
products map[int]bool
multiPhones map[string][]string
// Key : Last name
// Element : Phone numbers
basket map[int]map[int]int
// Key : Customer ID
// Element Key:
// Key: Product ID Element: Quantity
)
fmt.Printf("phones : %#v\n", phones)
fmt.Printf("products : %#v\n", products)
fmt.Printf("multiPhones: %#v\n", multiPhones)
fmt.Printf("basket : %#v\n", basket)
}

View File

@ -0,0 +1,65 @@
package main
// ---------------------------------------------------------
// EXERCISE: Populate and Lookup
//
// Add elements to the maps that you've declared in the
// first exercise, and try them by looking up for the keys.
//
// Use map literals.
//
// After completing the exercise, remove the data and check
// that your program still works.
//
//
// 1. Phone numbers by last name
// --------------------------
// bowen 202-555-0179
// dulin 03.37.77.63.06
// greco 03489940240
//
// Print the dulin's phone number.
//
//
// 2. Product availability by Product ID
// ----------------
// 617841573 true
// 879401371 false
// 576872813 true
//
// Is Product ID 879401371 available?
//
//
// 3. Multiple phone numbers by last name
// ------------------------------------------------------
// bowen [202-555-0179]
// dulin [03.37.77.63.06 03.37.70.50.05 02.20.40.10.04]
// greco [03489940240 03489900120]
//
// What is Greco's second phone number?
//
//
// 4. Shopping basket by Customer ID
// -------------------------------
// 100 [617841573:4 576872813:2]
// 101 [576872813:5 657473833:20]
// 102 []
//
// How many of 576872813 the customer 101 is going to buy?
// (Product ID) (Customer ID)
//
//
// EXPECTED OUTPUT
//
// 1. Run the solution to see the output
// 2. Here is the output with empty maps:
//
// dulin's phone number: N/A
// Product ID #879401371 is not available
// greco's 2nd phone number: N/A
// Customer #101 is going to buy 0 from Product ID #576872813.
//
// ---------------------------------------------------------
func main() {
}

View File

@ -0,0 +1,63 @@
// For more tutorials: https://blog.learngoprogramming.com
//
// Copyright © 2018 Inanc Gumus
// Learn Go Programming Course
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/
//
package main
import "fmt"
func main() {
phones := map[string]string{
"bowen": "202-555-0179",
"dulin": "03.37.77.63.06",
"greco": "03489940240",
}
products := map[int]bool{
617841573: true,
879401371: false,
576872813: true,
}
multiPhones := map[string][]string{
"bowen": []string{"202-555-0179"},
"dulin": []string{
"03.37.77.63.06", "03.37.70.50.05", "02.20.40.10.04",
},
"greco": []string{"03489940240", "03489900120"},
}
basket := map[int]map[int]int{
100: {617841573: 4, 576872813: 2},
101: {576872813: 5, 657473833: 20},
102: {},
}
// Print dulin's phone number.
who, phone := "dulin", "N/A"
if v, ok := phones[who]; ok {
phone = v
}
fmt.Printf("%s's phone number: %s\n", who, phone)
// Is Product ID 879401371 available?
id, status := 879401371, "available"
if !products[id] {
status = "not " + status
}
fmt.Printf("Product ID #%d is %s\n", id, status)
// What is Greco's second phone number?
who, phone = "greco", "N/A"
if phones := multiPhones[who]; len(phones) >= 2 {
phone = phones[1]
}
fmt.Printf("%s's 2nd phone number: %s\n", who, phone)
// How many of 576872813 the customer 101 is going to buy?
cid, pid := 101, 576872813
fmt.Printf("Customer #%d is going to buy %d from Product ID #%d.\n", cid, basket[cid][pid], pid)
}

View File

@ -0,0 +1,68 @@
package main
// ---------------------------------------------------------
// EXERCISE: Students
//
// Create a program that returns the students by the given
// Hogwarts house name (see the data below).
//
// Print the students sorted by name.
//
// "bobo" doesn't belong to Hogwarts, remove it by using
// the delete function.
//
//
// RESTRICTIONS
//
// + Add the following data to your map as is.
// Do not sort it manually and do not modify it.
//
// + Slices in the map shouldn't be sorted (changed).
// HINT: Copy them.
//
//
// EXPECTED OUTPUT
//
// go run main.go
//
// Please type a Hogwarts house name.
//
//
// go run main.go bobo
//
// Sorry. I don't know anything about "bobo".
//
//
// go run main.go hufflepuf
//
// ~~~ hufflepuf students ~~~
//
// + diggory
// + helga
// + scamander
// + wenlock
//
// ---------------------------------------------------------
func main() {
// House Student Name
// ---------------------------
// gryffindor weasley
// gryffindor hagrid
// gryffindor dumbledore
// gryffindor lupin
// hufflepuf wenlock
// hufflepuf scamander
// hufflepuf helga
// hufflepuf diggory
// ravenclaw flitwick
// ravenclaw bagnold
// ravenclaw wildsmith
// ravenclaw montmorency
// slytherin horace
// slytherin nigellus
// slytherin higgs
// slytherin scorpius
// bobo wizardry
// bobo unwanted
}

View File

@ -0,0 +1,48 @@
// For more tutorials: https://blog.learngoprogramming.com
//
// Copyright © 2018 Inanc Gumus
// Learn Go Programming Course
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/
//
package main
import (
"fmt"
"os"
"sort"
)
func main() {
houses := map[string][]string{
"gryffindor": {"weasley", "hagrid", "dumbledore", "lupin"},
"hufflepuf": {"wenlock", "scamander", "helga", "diggory", "bobo"},
"ravenclaw": {"flitwick", "bagnold", "wildsmith", "montmorency"},
"slytherin": {"horace", "nigellus", "higgs", "bobo", "scorpius"},
"bobo": {"wizardry", "unwanted"},
}
// remove "bobo" house
delete(houses, "bobo")
args := os.Args[1:]
if len(args) < 1 {
fmt.Println("Please type a Hogwarts house name.")
return
}
house, students := args[0], houses[args[0]]
if students == nil {
fmt.Printf("Sorry. I don't know anything about %q.\n", house)
return
}
// only sort the clone
clone := append([]string(nil), students...)
sort.Strings(clone)
fmt.Printf("~~~ %s students ~~~\n\n", house)
for _, student := range clone {
fmt.Printf("\t+ %s\n", student)
}
}

View File

@ -1,5 +1,15 @@
# IDEAS
# Header
* Retrieve sorted map keys
What you will learn?
* Roman literals
1. **[Warm Up](https://github.com/inancgumus/learngo/tree/master/22-maps/exercises/01-warm-up)**
Create and print the maps.
2. **[Populate and Lookup](https://github.com/inancgumus/learngo/tree/master/22-maps/exercises/02-populate)**
Add elements to the maps that you've declared in the first exercise, and try them by looking up for the keys.
3. **[Hogwarts Students](https://github.com/inancgumus/learngo/tree/master/22-maps/exercises/03-students)**
Create a program that returns the students by the given Hogwarts house name.

View File

@ -0,0 +1,59 @@
## Why are maps used?
For example, here is a program that uses a slice to find an element among millions of elements.
```go
millions := []int{/* millions of elements */}
for _, v := range millions {
if v == userQuery {
// do something
}
}
```
1. Maps allow fast-lookup for map keys in O(1) time *CORRECT*
2. Maps allow fast-lookup for map keys in O(n) time
3. Maps allow fast-traversal on map keys in O(1) time
> **1:** That's right. Maps work in O(1) in average for fast-lookup.
>
> **2:** Map doesn't work in O(n) time for key lookup.
>
## When shouldn't you use a map?
1. To find an element through a key
2. To loop over the map keys *CORRECT*
3. To add structured data to your program
> **1:** That is when you use a map.
>
> **2:** Right! Looping over map keys happen in O(n) time. So, maps are the worst data structures for key traversing.
>
> **3:** Maps don't allow you to add structured data to your program.
## Which type below cannot be a map key?
1. map[string]int
2. []string
3. []int
4. []bool
5. All of them *CORRECT*
> **5:** Slices, maps, and function values are not comparable. So, they cannot be map keys.
>
## Which are the following map's key and element types?
```go
map[string]map[int]bool
```
1. Key: string Element: bool
2. Key: string Element: int
3. Key: string Element: map[int]
4. Key: string Element: map[int]string *CORRECT*
> **4:** The map contains other maps. The element type of a map can be of any type.
>
## What is a map behind the scenes?
1. A map header
2. A pointer to a map header *CORRECT*
3. Tiny data structure with 3 fields: Pointer, Length and Capacity
> **2**: That's right. Maps are complex data structures. However, each map value is only a pointer to a map header (which is a more complex data structure).