From 96982b9ae9fe79b480c13d17853c07b27c17624d Mon Sep 17 00:00:00 2001 From: Yi-Ting Shih Date: Wed, 8 Oct 2025 19:24:13 +0800 Subject: [PATCH] Feat: done --- .gitmodules | 3 +++ Makefile | 16 ++++++++++++++++ docs/main.pdf | Bin 0 -> 32862 bytes docs/main.typ | 20 ++++++++++++++++++++ docs/template | 1 + go.mod | 3 +++ result | 5 +++++ reverse.go | 31 +++++++++++++++++++++++++++++++ reverse_test.go | 21 +++++++++++++++++++++ 9 files changed, 100 insertions(+) create mode 100644 .gitmodules create mode 100644 Makefile create mode 100644 docs/main.pdf create mode 100644 docs/main.typ create mode 160000 docs/template create mode 100644 go.mod create mode 100644 result create mode 100644 reverse.go create mode 100644 reverse_test.go diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..2aa7d37 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "docs/template"] + path = docs/template + url = ../typst-template diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..bcd1473 --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ +.PHONY: all watch clean + +SOURCE := $(shell find docs/ -type f -name '*.typ') +TARGET := docs/main.pdf +TYPST_ARGS += --root . + +all: $(TARGET) + +docs/main.pdf: docs/main.typ $(SOURCE) + typst compile $(TYPST_ARGS) $< + +watch: + typst watch --root . docs/main.typ + +clean: + -rm docs/main.pdf diff --git a/docs/main.pdf b/docs/main.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a1482ee226344834aa0b7a4b055658159928ccce GIT binary patch literal 32862 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 BdX@kH literal 0 HcmV?d00001 diff --git a/docs/main.typ b/docs/main.typ new file mode 100644 index 0000000..683b908 --- /dev/null +++ b/docs/main.typ @@ -0,0 +1,20 @@ +#import "template/module.typ": * + +#show: default.with( + title: "Golang Homework 5", + authors: (( + name: "Yi-Ting Shih (111550013)", + affiliation: "National Yang Ming Chaio Tung University", + email: "ytshih@cs.nycu.edu.tw", + ),), +) + +== Code + +#code(read("../reverse.go")) + +This code doesn't allocate new memory except array subscript `i, l, r`. + +== Result + +#code(read("../result")) diff --git a/docs/template b/docs/template new file mode 160000 index 0000000..5a29091 --- /dev/null +++ b/docs/template @@ -0,0 +1 @@ +Subproject commit 5a290913a2b076125191ce8c1c46457e726b893d diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..b97b025 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module reverse + +go 1.25.1 diff --git a/result b/result new file mode 100644 index 0000000..657b981 --- /dev/null +++ b/result @@ -0,0 +1,5 @@ +> go test -v +=== RUN TestReverse +--- PASS: TestReverse (0.00s) +PASS +ok reverse 0.001s diff --git a/reverse.go b/reverse.go new file mode 100644 index 0000000..e3b5a0d --- /dev/null +++ b/reverse.go @@ -0,0 +1,31 @@ +package reverse + +import "unicode/utf8" + +func swap(a *byte, b *byte) { + *a ^= *b + *b ^= *a + *a ^= *b +} + +func reverse(b []byte) { + for i := 0; i < len(b); { + _, sz := utf8.DecodeRune(b[i:]) + l := i + r := i + sz - 1 + for l < r { + swap(&b[l], &b[r]) + l++ + r-- + } + i += sz + } + + l := 0 + r := len(b) - 1 + for l < r { + swap(&b[l], &b[r]) + l++ + r-- + } +} diff --git a/reverse_test.go b/reverse_test.go new file mode 100644 index 0000000..9e2eae2 --- /dev/null +++ b/reverse_test.go @@ -0,0 +1,21 @@ +package reverse + +import "testing" + +func TestReverse(t *testing.T) { + tcs := []struct { + input string + expects string + }{ + {"Hello 世界", "界世 olleH"}, + } + + for _, tc := range tcs { + b := []byte(tc.input) + reverse(b) + ret := string(b) + if ret != tc.expects { + t.Errorf("Failed to remove unicode space. Input: %s, expects: %s, results: %s", tc.input, tc.expects, ret) + } + } +}