refactor: slices 22th exercise

This commit is contained in:
Inanc Gumus
2019-08-18 14:56:37 +03:00
parent 55419e59b7
commit 2dab6c53c9
2 changed files with 87 additions and 54 deletions

View File

@ -7,9 +7,6 @@ import (
// --------------------------------------------------------- // ---------------------------------------------------------
// EXERCISE: Practice advanced slice operations // EXERCISE: Practice advanced slice operations
// //
// This exercise's intention is warm you up and reinforce
// your memory for the advanced slice operations.
//
// Please follow the directions in the following code. // Please follow the directions in the following code.
// //
// To see the expected output, please run: // To see the expected output, please run:
@ -24,7 +21,6 @@ func main() {
// or do it with your own Printf that matches the output // or do it with your own Printf that matches the output
// of the prettyslice package. // of the prettyslice package.
// //
// This allows you to see the backing array of the slices. // This allows you to see the backing array of the slices.
s.PrintBacking = true s.PrintBacking = true
// Shows 10 slice elements per line // Shows 10 slice elements per line
@ -34,10 +30,10 @@ func main() {
// ######################################################## // ########################################################
// //
// #1: Create a string slice with a length and capacity // #1: Create a string slice: `names` with a length and
// of 5. Call the slice: `names` and print it. // capacity of 5, and print it.
//
// //
// ... // ...
// s.Show("1st step", names) // s.Show("1st step", names)
@ -51,82 +47,73 @@ func main() {
// //
// Observe how the slice and its backing array change. // Observe how the slice and its backing array change.
// //
//
// ... // ...
// s.Show("2nd step", names) // s.Show("2nd step", names)
// ######################################################## // ########################################################
// //
// #3: Fix the append problem by reinitializing the // #3: The previous code appends at the end of the names
// names slice below (currently the previous code // slice:
// appends after 5 elements).
// //
// Append the new elements to the head of the names // ["" "" "" "" "" "einstein", "tesla", "aristo"]
// slice instead.
// //
// Print the names slice. // Append the new elements to the beginning of the names
// slice instead:
// //
// HINT: // ["einstein", "tesla", "aristo" "" ""]
// //
// The problem is in the `make` function. // So: Overwrite and print the names slice.
// //
// ... // ...
// s.Show("3rd step", names) // s.Show("3rd step", names)
// ######################################################## // ########################################################
// //
// #4: Copy elements from an array to the `names` slice. // #4: Copy only the first two elements of the following
//
// Copy only the first two elements of the following
// array to the last two elements of the `names` slice. // array to the last two elements of the `names` slice.
// //
// Print the names slice (do not forget extending it // Print the names slice, you should see 5 elements.
// after appending). You should print 5 elements. // So, do not forget extending the slice.
//
// Observe how its backing array stays the same.
// //
// Observe how the backing array stays the same.
// //
// Array (uncomment): // Array (uncomment):
// moreNames := [...]string{"plato", "khayyam", "ptolemy"} // moreNames := [...]string{"plato", "khayyam", "ptolemy"}
//
// ... // ...
//
// s.Show("4th step", names) // s.Show("4th step", names)
// ######################################################## // ########################################################
// //
// #5: Clone the `names` slice to the `clone` slice. // #5: Only copy the last 3 elements of the `names` slice
// to a new slice: `clone`.
// //
// But only clone (copy) the last 3 elements of the // Append the first two elements of the `names` to the
// `names` slice. // `clone`.
//
// Then, append the first two elements of the `names`
// slice to the `clone` slice.
// //
// Ensure that after appending no new backing array // Ensure that after appending no new backing array
// allocations occur for the `clone` slice. // allocations occur for the `clone` slice.
// //
// Print the clone slice before and after the append. // Print the clone slice before and after the append.
// //
//
// ... // ...
// s.Show("5th step (before append)", clone) // s.Show("5th step (before append)", clone)
//
// ... // ...
// s.Show("5th step (after append)", clone) // s.Show("5th step (after append)", clone)
// ######################################################## // ########################################################
// //
// #6: Slice the `clone` slice between 2nd and 4th // #6: Slice the `clone` slice between 2nd and 4th (inclusive)
// elements. // elements into a new slice: `sliced`.
// //
// Put the sliced slice into a variable named: // Append "hypatia" to the `sliced`.
// `sliced`.
// //
// Append "hypatia" to the `sliced` slice. // Ensure that new backing array allocation "occurs".
//
// Ensure that new backing array allocation "happens".
// //
// Change the 3rd element of the `clone` slice // Change the 3rd element of the `clone` slice
// to "elder". // to "elder".
@ -136,7 +123,7 @@ func main() {
// //
// Print the `clone` and `sliced` slices. // Print the `clone` and `sliced` slices.
// //
//
// ... // ...
// s.Show("6th step", clone, sliced) // s.Show("6th step", clone, sliced)
} }

View File

@ -16,41 +16,74 @@ func main() {
s.MaxPerLine = 10 s.MaxPerLine = 10
s.Width = 60 s.Width = 60
// ########################################################
// //
// #1 // #1: Create a string slice: `names` with a length and
// capacity of 5, and print it.
// //
names := make([]string, 5) names := make([]string, 5)
s.Show("1st step", names) s.Show("1st step", names)
// ########################################################
// //
// #2 // #2: Append the following names to the names slice:
//
// "einstein", "tesla", "aristo"
//
// Print the names slice.
//
// Observe how the slice and its backing array change.
// //
names = append(names, "einstein", "tesla", "aristo") names = append(names, "einstein", "tesla", "aristo")
s.Show("2nd step", names) s.Show("2nd step", names)
// ########################################################
// //
// #3 // #3: The previous code appends at the end of the names
// slice:
//
// ["" "" "" "" "" "einstein", "tesla", "aristo"]
//
// Append the new elements to the beginning of the names
// slice instead:
//
// ["einstein", "tesla", "aristo" "" ""]
//
// So: Overwrite and print the names slice.
// //
names = make([]string, 0, 5) names = make([]string, 0, 5)
names = append(names, "einstein", "tesla", "aristo") names = append(names, "einstein", "tesla", "aristo")
s.Show("3rd step", names) s.Show("3rd step", names)
// ########################################################
// //
// #4 // #4: Copy only the first two elements of the following
// array to the last two elements of the `names` slice.
//
// Print the names slice, you should see 5 elements.
// So, do not forget extending the slice.
//
// Observe how its backing array stays the same.
// //
moreNames := [...]string{"plato", "khayyam", "ptolemy"} moreNames := [...]string{"plato", "khayyam", "ptolemy"}
copy(names[3:5], moreNames[:2]) copy(names[3:5], moreNames[:2])
names = names[:cap(names)] names = names[:cap(names)]
s.Show("4th step", names) s.Show("4th step", names)
// ########################################################
// //
// #5 // #5: Only copy the last 3 elements of the `names` slice
// to a new slice: `clone`.
//
// Append the first two elements of the `names` to the
// `clone`.
//
// Ensure that after appending no new backing array
// allocations occur for the `clone` slice.
//
// Print the clone slice before and after the append.
// //
clone := make([]string, 3, 5) clone := make([]string, 3, 5)
copy(clone, names[len(names)-3:]) copy(clone, names[len(names)-3:])
s.Show("5th step (before append)", clone) s.Show("5th step (before append)", clone)
@ -58,13 +91,26 @@ func main() {
clone = append(clone, names[:2]...) clone = append(clone, names[:2]...)
s.Show("5th step (after append)", clone) s.Show("5th step (after append)", clone)
// ########################################################
//
// #6: Slice the `clone` slice between 2nd and 4th (inclusive)
// elements into a new slice: `sliced`.
//
// Append "hypatia" to the `sliced`.
//
// Ensure that new backing array allocation "occurs".
//
// Change the 3rd element of the `clone` slice
// to "elder".
//
// Doing so should not change any elements of
// the `sliced` slice.
//
// Print the `clone` and `sliced` slices.
// //
// #6
// //
sliced := clone[1:4:4] sliced := clone[1:4:4]
sliced = append(sliced, "hypatia") sliced = append(sliced, "hypatia")
clone[2] = "elder" clone[2] = "elder"
s.Show("6th step", clone, sliced) s.Show("6th step", clone, sliced)