パパエンジニアのポエム

奥さんと娘ちゃんへの愛が止まらない

Golangで文字列変換の問題を解く

前回同様、AOJの問題を解いてみます。 yuki-toida.hatenablog.com

文字列変換の問題をやってみた

問題

https://onlinejudge.u-aizu.ac.jp/courses/lesson/2/ITP1/9/ITP1_9_D

自分が書いたコードはこちら

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
)

// 文字列変換
func main() {
    sc := bufio.NewScanner(os.Stdin)
    sc.Scan()
    str := sc.Text()
    sc.Scan()
    q, _ := strconv.Atoi(sc.Text())
    for i := 0; i < q; i++ {
        sc.Scan()
        ary := strings.Split(sc.Text(), " ")
        a, _ := strconv.Atoi(ary[1])
        b, _ := strconv.Atoi(ary[2])
        switch ary[0] {
        case "replace":
            str = str[:a] + ary[3] + str[b+1:]
        case "reverse":
            str = str[:a] + reverse(str[a:b+1]) + str[b+1:]
        case "print":
            fmt.Printf("%v\n", str[a:b+1])
        }
    }
}

func reverse(s string) string {
    runes := []rune(s)
    for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
        runes[i], runes[j] = runes[j], runes[i]
    }
    return string(runes)
}

AOJからのフィードバック

f:id:yuki-toida:20180911175351p:plain

Golangのスライスの部分取得が便利だったので抜粋。

str[:]       // 0 から len(str)-1 まで
str[a:]     // a から len(str)-1 まで
str[a:b]   // a から b-1 まで
str[:a]     // 0 から aまで

これはとても分かりやすく良いですね、使っていこう。