From 04c5f52e6f2debeb5138b2a731212ff9a039086d Mon Sep 17 00:00:00 2001 From: CoderSherlock Date: Sat, 13 Apr 2024 02:40:32 +0000 Subject: [PATCH] Updated actions, fix some lint issues and introduce translate package --- .gitea/workflows/demo.yaml | 19 ------- bin/pattern-lookup/generatetable.go | 2 +- pkg/pattern/pattern.go | 16 +++--- pkg/tiles/tiles.go | 10 ++-- pkg/tiles/tiles_opts.go | 6 +-- pkg/tiles/tiles_test.go | 1 - pkg/tiles/translate.go | 77 +++++++++++++++++++++++++++++ pkg/tiles/translate_test.go | 32 ++++++++++++ 8 files changed, 128 insertions(+), 35 deletions(-) delete mode 100644 .gitea/workflows/demo.yaml create mode 100644 pkg/tiles/translate.go create mode 100644 pkg/tiles/translate_test.go diff --git a/.gitea/workflows/demo.yaml b/.gitea/workflows/demo.yaml deleted file mode 100644 index d67ac59..0000000 --- a/.gitea/workflows/demo.yaml +++ /dev/null @@ -1,19 +0,0 @@ -name: Gitea Actions Demo -run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀 -on: [push] - -jobs: - Explore-Gitea-Actions: - runs-on: ubuntu-latest - steps: - - run: echo "🎉 The job was automatically triggered by a ${{ gitea.event_name }} event." - - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by Gitea!" - - run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}." - - name: Check out repository code - uses: actions/checkout@v3 - - run: echo "💡 The ${{ gitea.repository }} repository has been cloned to the runner." - - run: echo "🖥️ The workflow is now ready to test your code on the runner." - - name: List files in the repository - run: | - ls ${{ gitea.workspace }} - - run: echo "🍏 This job's status is ${{ job.status }}." \ No newline at end of file diff --git a/bin/pattern-lookup/generatetable.go b/bin/pattern-lookup/generatetable.go index 9ef94cd..1d6679b 100644 --- a/bin/pattern-lookup/generatetable.go +++ b/bin/pattern-lookup/generatetable.go @@ -100,7 +100,7 @@ func allFans() []pattern.Fan { func AllFansToFile() { allFans := allFans() - pattern.FansToFile(allFans, "test.json") + _ = pattern.FansToFile(allFans, "test.json") } func GenerateFan(fan pattern.Fan) { diff --git a/pkg/pattern/pattern.go b/pkg/pattern/pattern.go index 5c58a89..4a66066 100644 --- a/pkg/pattern/pattern.go +++ b/pkg/pattern/pattern.go @@ -1,13 +1,13 @@ package pattern -type pattern struct { -} +// type pattern struct { +// } -type shun struct { -} +// type shun struct { +// } -type ke struct { -} +// type ke struct { +// } -type jiang struct { -} +// type jiang struct { +// } diff --git a/pkg/tiles/tiles.go b/pkg/tiles/tiles.go index 32a0de9..804487f 100644 --- a/pkg/tiles/tiles.go +++ b/pkg/tiles/tiles.go @@ -8,12 +8,12 @@ import ( "sort" ) -var TileTypes = [34]string{ +var TileTypes []string = []string{ "1W", "2W", "3W", "4W", "5W", "6W", "7W", "8W", "9W", "1T", "2T", "3T", "4T", "5T", "6T", "7T", "8T", "9T", "1B", "2B", "3B", "4B", "5B", "6B", "7B", "8B", "9B", "DO", "XI", "NA", "BE", "ZH", "FA", "BA"} -var tileHuaTypes = [8]string{"ME", "LA", "ZU", "JU", "CH", "XA", "QI", "DN"} +var TileHuaTypes []string = []string{"ME", "LA", "ZU", "JU", "CH", "XA", "QI", "DN"} // Given two tiles, return if first tile is smaller the second tile, functions used as comparator for ordering // Default order is: 万 < 条 < 饼 < 字(东西南北中发白) @@ -184,7 +184,7 @@ func CheckXushuTile(tiles []string) ([][][]string, error) { } func TilesDividedToPatterns(tiles []string) error { - Sort(tiles) + _ = Sort(tiles) var wan, tiao, bing, zi []string for _, tile := range tiles { switch tile[1] { @@ -198,5 +198,9 @@ func TilesDividedToPatterns(tiles []string) error { zi = append(zi, tile) } } + _, _ = CheckXushuTile(wan) + _, _ = CheckXushuTile(tiao) + _, _ = CheckXushuTile(bing) + log.Println(zi) return nil } diff --git a/pkg/tiles/tiles_opts.go b/pkg/tiles/tiles_opts.go index fe78659..af78f8d 100644 --- a/pkg/tiles/tiles_opts.go +++ b/pkg/tiles/tiles_opts.go @@ -1,5 +1,5 @@ package tiles -type tileStruct struct { - -} \ No newline at end of file +// type tileStruct struct { + +// } diff --git a/pkg/tiles/tiles_test.go b/pkg/tiles/tiles_test.go index fca3d07..d35d017 100644 --- a/pkg/tiles/tiles_test.go +++ b/pkg/tiles/tiles_test.go @@ -84,6 +84,5 @@ func TestCheckXushuTile(t *testing.T) { log.Fatalf("TestCheckXushuTile(%v) = %v want %v", tc.Args, result, tc.Want) } }) - } } diff --git a/pkg/tiles/translate.go b/pkg/tiles/translate.go new file mode 100644 index 0000000..48e8218 --- /dev/null +++ b/pkg/tiles/translate.go @@ -0,0 +1,77 @@ +package tiles + +import ( + "fmt" + "slices" + "strconv" + "strings" + "unicode" +) + +var jpnZiPaiTileTypes []string = []string{"DO", "NA", "XI", "BE", "BA", "FA", "ZH"} + +// Translate numberized Zi Pai to 2-letter format +// rule can be "CHN" or "JPN" +// If rule is "CHN", it should translate as DO XI NA BE ZH FA BA +// If rule is "JPN", it should translate as DO NA XI BE BA FA ZH +func ziPaiShortSplit(num int, rule string) (string, error) { + if num < 1 || num > 7 { + return "", fmt.Errorf("invalid zipai index %d", num) + } + switch rule { + case "CHN": + return TileTypes[num-1+27], nil + case "JPN": + return jpnZiPaiTileTypes[num-1], nil + } + return "", fmt.Errorf("error calling ziPaiShortSplit()") +} + +func shortToArray(tiles string) ([]string, error) { + var ret []string + var stack []string + var rule string + + // Check if it's jpn format + tiles = strings.ToUpper(tiles) + if strings.Contains(tiles, "M") || strings.Contains(tiles, "S") || strings.Contains(tiles, "P") { + rule = "JPN" + } else { + rule = "CHN" + } + + for _, char := range tiles { + if unicode.IsDigit(char) { + stack = append(stack, string(char)) + } else { + switch string(char) { + case "W", "M": + for _, prefix := range stack { + ret = append(ret, prefix+"W") + } + case "T", "S": + for _, prefix := range stack { + ret = append(ret, prefix+"T") + } + case "B", "P": + for _, prefix := range stack { + ret = append(ret, prefix+"B") + } + case "Z": + for _, prefix := range stack { + num, _ := strconv.Atoi(prefix) + ziPaiStr, _ := ziPaiShortSplit(num, rule) + ret = append(ret, ziPaiStr) + } + } + stack = []string{} + } + } + // Check return value valid, if not return error + for _, t := range ret { + if !slices.Contains(TileTypes, t) { + return []string{}, fmt.Errorf("invalid tile string with %s", t) + } + } + return ret, nil +} diff --git a/pkg/tiles/translate_test.go b/pkg/tiles/translate_test.go new file mode 100644 index 0000000..a67d947 --- /dev/null +++ b/pkg/tiles/translate_test.go @@ -0,0 +1,32 @@ +package tiles + +import ( + "fmt" + "log" + "reflect" + "testing" +) + +func TestShortToArray(t *testing.T) { + type testcase struct { + Name string + Arg string + Want []string + } + testcases := []testcase{ + {Name: "自创格式", Arg: "12W56T456B1234567Z", Want: []string{"1W", "2W", "5T", "6T", "4B", "5B", "6B", "DO", "XI", "NA", "BE", "ZH", "FA", "BA"}}, + {Name: "日麻格式", Arg: "1134m4p24s123677z6m", Want: []string{"1W", "1W", "3W", "4W", "4B", "2T", "4T", "DO", "NA", "XI", "FA", "ZH", "ZH", "6W"}}, + } + for _, tc := range testcases { + t.Run(tc.Name, func(t *testing.T) { + result, err := shortToArray(tc.Arg) + if err != nil { + log.Fatalf("Failed in translating tiles %s , error: %s", tc.Arg, err) + } + fmt.Println(result) + if !reflect.DeepEqual(result, tc.Want) { + log.Fatalf("Failed in translating tiles %s , expectd: %v, got %v", tc.Arg, tc.Want, result) + } + }) + } +}