143 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package main
 | |
| 
 | |
| import (
 | |
| 	s "github.com/inancgumus/prettyslice"
 | |
| )
 | |
| 
 | |
| // ---------------------------------------------------------
 | |
| // 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.
 | |
| //
 | |
| //  To see the expected output, please run:
 | |
| //
 | |
| //    go run solution/main.go
 | |
| //
 | |
| // ---------------------------------------------------------
 | |
| 
 | |
| func main() {
 | |
| 	//
 | |
| 	// Use the prettyslice package for printing the slices,
 | |
| 	// or do it with your own Printf that matches the output
 | |
| 	// of the prettyslice package.
 | |
| 	//
 | |
| 
 | |
| 	// This allows you to see the backing array of the slices.
 | |
| 	s.PrintBacking = true
 | |
| 	// Shows 10 slice elements per line
 | |
| 	s.MaxPerLine = 10
 | |
| 	// Prints 60 character per line
 | |
| 	s.Width = 60
 | |
| 
 | |
| 	// ########################################################
 | |
| 	//
 | |
| 	// #1: Create a string slice with a length and capacity
 | |
| 	//     of 5. Call the slice: `names` and print it.
 | |
| 	//
 | |
| 
 | |
| 	// ...
 | |
| 	// s.Show("1st step", names)
 | |
| 
 | |
| 	// ########################################################
 | |
| 	//
 | |
| 	// #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.
 | |
| 	//
 | |
| 
 | |
| 	// ...
 | |
| 	// s.Show("2nd step", names)
 | |
| 
 | |
| 	// ########################################################
 | |
| 	//
 | |
| 	// #3: Fix the append problem by reinitializing the
 | |
| 	//     names slice below (currently the previous code
 | |
| 	//     appends after 5 elements).
 | |
| 	//
 | |
| 	//     Append the new elements to the head of the names
 | |
| 	//     slice instead.
 | |
| 	//
 | |
| 	//     Print the names slice.
 | |
| 	//
 | |
| 	// HINT:
 | |
| 	//
 | |
| 	//    The problem is in the `make` function.
 | |
| 	//
 | |
| 
 | |
| 	// ...
 | |
| 	// s.Show("3rd step", names)
 | |
| 
 | |
| 	// ########################################################
 | |
| 	//
 | |
| 	// #4: Copy elements from an array to the `names` slice.
 | |
| 	//
 | |
| 	//     Copy only the first two elements of the following
 | |
| 	//     array to the last two elements of the `names` slice.
 | |
| 	//
 | |
| 	//     Print the names slice (do not forget extending it
 | |
| 	//     after appending). You should print 5 elements.
 | |
| 	//
 | |
| 	//     Observe how the backing array stays the same.
 | |
| 	//
 | |
| 
 | |
| 	// Array (uncomment):
 | |
| 	// moreNames := [...]string{"plato", "khayyam", "ptolemy"}
 | |
| 
 | |
| 	// ...
 | |
| 
 | |
| 	// s.Show("4th step", names)
 | |
| 
 | |
| 	// ########################################################
 | |
| 	//
 | |
| 	// #5: Clone the `names` slice to the `clone` slice.
 | |
| 	//
 | |
| 	//     But only clone (copy) the last 3 elements of the
 | |
| 	//     `names` slice.
 | |
| 	//
 | |
| 	//     Then, append the first two elements of the `names`
 | |
| 	//     slice to the `clone` slice.
 | |
| 	//
 | |
| 	//     Ensure that after appending no new backing array
 | |
| 	//     allocations occur for the `clone` slice.
 | |
| 	//
 | |
| 	//     Print the clone slice before and after the append.
 | |
| 	//
 | |
| 
 | |
| 	// ...
 | |
| 	// s.Show("5th step (before append)", clone)
 | |
| 
 | |
| 	// ...
 | |
| 	// s.Show("5th step (after append)", clone)
 | |
| 
 | |
| 	// ########################################################
 | |
| 	//
 | |
| 	// #6: Slice the `clone` slice between 2nd and 4th
 | |
| 	//     elements.
 | |
| 	//
 | |
| 	//     Put the sliced slice into a variable named:
 | |
| 	//     `sliced`.
 | |
| 	//
 | |
| 	//     Append "hypatia" to the `sliced` slice.
 | |
| 	//
 | |
| 	//     Ensure that new backing array allocation "happens".
 | |
| 	//
 | |
| 	//       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.
 | |
| 	//
 | |
| 
 | |
| 	// ...
 | |
| 	// s.Show("6th step", clone, sliced)
 | |
| }
 |