code kata 230829

This commit is contained in:
VicRen
2023-08-29 16:32:55 +08:00
parent 45f6b47eba
commit 8e59e43da1
2 changed files with 143 additions and 0 deletions

46
code_kata_230828/main.go Normal file
View 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{}{}
}

View 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
}