From 8e59e43da1c79de1ad23057919553e04aa8a89b5 Mon Sep 17 00:00:00 2001 From: VicRen Date: Tue, 29 Aug 2023 16:32:55 +0800 Subject: [PATCH] code kata 230829 --- code_kata_230828/main.go | 46 ++++++++++++++ code_kata_230829/move_list_test.go | 97 ++++++++++++++++++++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 code_kata_230828/main.go create mode 100644 code_kata_230829/move_list_test.go diff --git a/code_kata_230828/main.go b/code_kata_230828/main.go new file mode 100644 index 0000000..e5a35c5 --- /dev/null +++ b/code_kata_230828/main.go @@ -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{}{} +} diff --git a/code_kata_230829/move_list_test.go b/code_kata_230829/move_list_test.go new file mode 100644 index 0000000..7faae53 --- /dev/null +++ b/code_kata_230829/move_list_test.go @@ -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 +}