mirror of
https://github.com/cubixle/codekata-golang.git
synced 2026-04-24 21:24:46 +01:00
code kata 230829
This commit is contained in:
46
code_kata_230828/main.go
Normal file
46
code_kata_230828/main.go
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
ch1 := make(chan struct{})
|
||||||
|
ch2 := make(chan struct{})
|
||||||
|
ctx, _ := context.WithTimeout(context.Background(), 2*time.Second)
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
go f1(ch1)
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
fmt.Println("f1 timeout")
|
||||||
|
break
|
||||||
|
case <-ch1:
|
||||||
|
fmt.Println("f1 done")
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
go f2(ch2)
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
fmt.Println("f2 timeout")
|
||||||
|
break
|
||||||
|
case <-ch2:
|
||||||
|
fmt.Println("f2 done")
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
time.Sleep(5 * time.Second)
|
||||||
|
}
|
||||||
|
|
||||||
|
func f1(in chan struct{}) {
|
||||||
|
time.Sleep(1 * time.Second)
|
||||||
|
in <- struct{}{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func f2(in chan struct{}) {
|
||||||
|
time.Sleep(3 * time.Second)
|
||||||
|
in <- struct{}{}
|
||||||
|
}
|
||||||
97
code_kata_230829/move_list_test.go
Normal file
97
code_kata_230829/move_list_test.go
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func moveList(k int, head *node) {
|
||||||
|
printList(head)
|
||||||
|
if head == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
cnt := head.Len()
|
||||||
|
if k == cnt || k == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
p := head
|
||||||
|
var r *node
|
||||||
|
if k > cnt {
|
||||||
|
k = k % cnt
|
||||||
|
}
|
||||||
|
for i := 0; i < k; i++ {
|
||||||
|
r = p
|
||||||
|
p = p.next
|
||||||
|
}
|
||||||
|
r.next = nil
|
||||||
|
printList(p)
|
||||||
|
printList(head)
|
||||||
|
r = head
|
||||||
|
head = p
|
||||||
|
for p != nil && p.next != nil {
|
||||||
|
p = p.next
|
||||||
|
}
|
||||||
|
p.next = r
|
||||||
|
printList(head)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMoveList(t *testing.T) {
|
||||||
|
moveList(4, makeList1())
|
||||||
|
moveList(0, makeList1())
|
||||||
|
moveList(2, makeList2())
|
||||||
|
moveList(5, makeList2())
|
||||||
|
}
|
||||||
|
|
||||||
|
func printList(head *node) {
|
||||||
|
for head != nil {
|
||||||
|
fmt.Printf("%d->", head.value)
|
||||||
|
head = head.next
|
||||||
|
}
|
||||||
|
fmt.Println("nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeList2() *node {
|
||||||
|
return &node{
|
||||||
|
next: &node{
|
||||||
|
next: &node{
|
||||||
|
next: &node{
|
||||||
|
next: &node{
|
||||||
|
value: 4,
|
||||||
|
},
|
||||||
|
value: 3,
|
||||||
|
},
|
||||||
|
value: 2,
|
||||||
|
},
|
||||||
|
value: 1,
|
||||||
|
},
|
||||||
|
value: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeList1() *node {
|
||||||
|
return &node{
|
||||||
|
next: &node{
|
||||||
|
next: &node{
|
||||||
|
value: 2,
|
||||||
|
},
|
||||||
|
value: 1,
|
||||||
|
},
|
||||||
|
value: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type node struct {
|
||||||
|
value int
|
||||||
|
next *node
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *node) Len() int {
|
||||||
|
ret := 0
|
||||||
|
p := n
|
||||||
|
for p != nil {
|
||||||
|
p = p.next
|
||||||
|
ret++
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user