にあえん

主にバックエンド・インフラ周りをやってます。 あそびばはこちら -> ナナオのあそびば

アルゴ式の問題を解く Go ランレングス圧縮の復元

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 ランレングス圧縮の復元 | アルゴ式 実装 以下のように実装しました。 package main import ( "fmt" "strconv" ) func isNum(r byte) bool { if 10 > int(r - '0') && int(r - '0') >= 0 { return true } return false } func main() { var t, s string fmt.Scan(&t) i := 0 for ; i < len(t); { j := 1 for ; i+j < len(t); j++ { if !isNum(t[i+j]) { break } } n, _ := strconv.Atoi(t[i+1:i+j]) for k := 1; k <= n; k++ { s += string(t[i]) } i += j } fmt.Println(s) } 割と時間かかってしまいました。 文字が数値かどうか判定するための関数を実装して、次の文字が数値か判定して繋ぎ合わせるみたいな感じです。 ということで今回はこれで👍

2026年8月2日 · にあえん

アルゴ式の問題を解く Go ランレングス圧縮

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 ランレングス圧縮 | アルゴ式 実装 以下のように実装しました。 package main import ( "fmt" "strconv" ) func main() { var s string fmt.Scan(&s) c := s[0] ind := 1 r := "" for i := 1; i < len(s); i++ { if c != s[i] { r += string(c) + strconv.Itoa(ind) c = s[i] ind = 1 } else { ind++ } } r += string(c) + strconv.Itoa(ind) fmt.Println(r) } continueを使うとコードの重複もなくなりきれいになります。 package main import ( "fmt" "strconv" ) func main() { var s string fmt.Scan(&s) ind := 1 r := "" for i := 1; i <= len(s); i++ { if i < len(s) && s[i-1] == s[i] { ind++ continue } r += string(s[i-1]) + strconv.Itoa(ind) ind = 1 } fmt.Println(r) } ということで今回はこれで👍

2026年8月1日 · にあえん

アルゴ式の問題を解く Go 固定長符号の復元

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 固定長符号の復元 | アルゴ式 実装 以下のように実装しました。 package main import ( "fmt" ) func main() { var t string fmt.Scan(&t) var s []rune for i := 0; i < len(t); i += 2 { n := int(t[i] - '0') * 10 + int(t[i + 1] - '0') s = append(s, rune(n - 1) + 'a') } fmt.Println(string(s)) } 復号化のほうがコードが単純になりますね。 ということで今回はこれで👍

2026年7月31日 · にあえん

アルゴ式の問題を解く Go 固定長符号

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 固定長符号 | アルゴ式 実装 以下のように実装しました。 package main import ( "fmt" ) func main() { var s string fmt.Scan(&s) var runes []rune for _, r := range s { t := int(r) - int('a') + 1 if t < 10 { runes = append(runes, '0') runes = append(runes, rune(t) + '0') } else { runes = append(runes, rune(t / 10) + '0') runes = append(runes, rune(t % 10) + '0') } } fmt.Println(string(runes)) } 前回の応用で出来ました。 ということで今回はこれで👍

2026年7月30日 · にあえん

アルゴ式の問題を解く Go 符号化?

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 符号化? | アルゴ式 実装 以下のように実装しました。 package main import ( "fmt" ) func main() { var s string fmt.Scan(&s) var runes []rune for _, r := range s { t := int(r) - int('a') + 1 if t >= 10 { runes = append(runes, rune(t / 10) + '0') runes = append(runes, rune(t % 10) + '0') } else { runes = append(runes, rune(t) + '0') } } fmt.Println(string(runes)) } 一瞬Itoa使おうかとも考えましたが、使うまでもなかったですね。 ということで今回はこれで👍

2026年7月29日 · にあえん

アルゴ式の問題を解く Go シーザー暗号の復号

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 シーザー暗号の復号 | アルゴ式 実装 以下のように実装しました。 package main import ( "fmt" ) func main() { var m string fmt.Scan(&m) var n []rune for _, r := range m { num := int(r - '0') if num - 3 < 0 { num += 7 } else { num -= 3 } n = append(n, '0' + rune(num)) } fmt.Println(string(n)) } 前回の応用でいけますね。 ということで今回はこれで👍

2026年7月28日 · にあえん

アルゴ式の問題を解く Go シーザー暗号

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 シーザー暗号 | アルゴ式 実装 以下のように実装しました。 package main import ( "fmt" ) func main() { var n string fmt.Scan(&n) var result []rune for _, r := range n { a := int(r - '0') c := a + 3 if c >= 10 { c = c % 10 } result = append(result, '0' + rune(c)) } fmt.Println(string(result)) } intからruneにするのに'0' + rune(c)にするあたり、楽にできていいですね。 ということで今回はこれで👍

2026年7月27日 · にあえん

アルゴ式の問題を解く Go チェックディジット(2)

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 チェックディジット(2) | アルゴ式 実装 以下のように実装しました。 package main import ( "fmt" ) func main() { var m string fmt.Scan(&m) s := 0 for i := 0; i <= 8; i++ { a := int(m[i] - '0') if i % 2 == 0 { s += a } else { s += 2 * a } } c := s % 10 if c == int(m[9] - '0') { fmt.Println("Yes") } else { fmt.Println("No") } } int(n - '0')でruneを文字列にするの、楽でいいですね。 ということで今回はこれで👍

2026年7月26日 · にあえん

アルゴ式の問題を解く Go チェックディジット(1)

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 チェックディジット(1) | アルゴ式 実装 以下のように実装しました。 package main import ( "fmt" "strconv" ) func main() { var s string fmt.Scan(&s) n := 0 for i, r := range s { j := int(r - '0') if i % 2 == 0 { n += j } else { n += 2 * j } } c := n % 10 fmt.Println(s + strconv.Itoa(c)) } ということで今回はこれで👍

2026年7月25日 · にあえん

アルゴ式の問題を解く Go パスワードの強度判定(6)

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 パスワードの強度判定(6) | アルゴ式 実装 以下のように実装しました。 package main import ( "fmt" "unicode" ) func main() { var s string fmt.Scan(&s) if len(s) < 6 || len(s) > 64 { fmt.Println("invalid") return } upper := false lower := false number := false symbol := false for _, r := range s { switch { case !upper && unicode.IsUpper(r): upper = true case !lower && unicode.IsLower(r): lower = true case !number && unicode.IsNumber(r): number = true case !symbol && (unicode.IsSymbol(r) || unicode.IsPunct(r)): symbol = true } } cond := []bool{ len(s) >= 10, upper, lower, number, symbol, } score := 0 for _, ok := range cond { if ok { score++ } } if score <= 2 { fmt.Println("weak") } else if score == 3 { fmt.Println("medium") } else if score >= 4 { fmt.Println("strong") } } ちょっと工夫したところとしては、upperとかの条件を一つのスライスに入れて判定してるところですかね。 ...

2026年7月24日 · にあえん