paizaの練習問題を解く 幅のある移動 Go編

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 幅のある移動 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】 実装 前回の実装から少し変わりました。 文字列置き換えの処理はちょっとGoっぽいですね。 (Goの文字列はイミュータブル) package main import "fmt" func main(){ var h, w, sy, sx, n int fmt.Scan(&h, &w, &sy, &sx, &n) s := make([]string, h) for i := 0; i < h; i++ { fmt.Scan(&s[i]) } dir := []string{"N", "E", "S", "W"} c := 120 result := false // 初期の座標に印をつける runes := []rune(s[sy]) runes[sx] = '*' s[sy] = string(runes) for i := 0; i < n; i++ { var d string var l int fmt.Scan(&d, &l) lr := 1 if d == "L" { lr = -1 } for j := 0; j < l; j++ { switch dir[c%4] { case "N": sx += lr case "S": sx -= lr case "E": sy += lr case "W": sy -= lr } if sy >= h || sx >= w || sy < 0 || sx < 0 || s[sy][sx] == '#' { result = true break } else { runes := []rune(s[sy]) runes[sx] = '*' s[sy] = string(runes) } } c += lr if result { break } } for i := 0; i < h; i++ { fmt.Println(s[i]) } } 一応実装はできたんですが、なんかresultのあたりはもうちょっときれいにできそうな気がする。。 ...

2026年3月5日 · にあえん

paizaの練習問題を解く 移動が可能かの判定・幅のある移動 Go編

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 移動が可能かの判定・幅のある移動 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】 実装 コアとなるロジックはあまり変わらないのですが、途中で壁があったり壁を超えたりする場合はそれを超える手前の座標を出力したうえでStopと出力しなければいけないようです。 ちょっと大変でしたが実装しました。 package main import "fmt" func main(){ var h, w, sy, sx, n int fmt.Scan(&h, &w, &sy, &sx, &n) s := make([]string, h) for i := 0; i < h; i++ { fmt.Scan(&s[i]) } dir := []string{"N", "E", "S", "W"} c := 120 // 現在の向き for i := 0; i < n; i++ { var d string var l int fmt.Scan(&d, &l) lr := 1 if d == "L" { lr = -1 } move := l * lr // 移動量 // X軸上に壁があるかどうか判定 checkWallX := func(y, fromX, toX, lr int) bool { i := fromX for { i += lr if i == toX { fmt.Println(y, toX) return true } if i >= w || i < 0 || s[sy][i] == '#' { fmt.Println(y, i - lr) fmt.Println("Stop") return false } } } // Y軸上に壁があるかどうか判定 checkWallY := func(x, fromY, toY, lr int) bool { i := fromY for { i += lr if i == toY { fmt.Println(toY, x) return true } if i >= h || i < 0 || s[i][sx] == '#' { fmt.Println(i - lr, x) fmt.Println("Stop") return false } } } // チェック結果を格納 result := true switch dir[c%4] { case "N": result = checkWallX(sy, sx, sx + move, lr) sx += move case "S": result = checkWallX(sy, sx, sx - move, -lr) sx -= move case "E": result = checkWallY(sx, sy, sy + move, lr) sy += move case "W": result = checkWallY(sx, sy, sy - move, -lr) sy -= move } c += lr if !result { return } } } ポイントはcheckWall関数です。 ...

2026年3月4日 · にあえん

paizaの練習問題を解く 移動が可能かの判定・複数回の移動 Go編

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 移動が可能かの判定・方向 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】 実装 実装しました。 ポイントとしてはlr変数を使って向きと座標の管理をしている点くらいですかね。 package main import "fmt" func main(){ var h, w, sy, sx, n int fmt.Scan(&h, &w, &sy, &sx, &n) s := make([]string, h) for i := 0; i < h; i++ { fmt.Scan(&s[i]) } dir := []string{"N", "E", "S", "W"} c := 120 // 現在の向き for i := 0; i < n; i++ { var d string fmt.Scan(&d) lr := 1 if d == "L" { lr = -1 } switch dir[c%4] { case "N": sx += lr case "S": sx -= lr case "E": sy += lr case "W": sy -= lr } c += lr if sx >= w || sy >= h || 0 > sx || 0 > sy || s[sy][sx] == '#' { fmt.Println("Stop") break } else { fmt.Println(sy, sx) } } } 👍

2026年3月3日 · にあえん

paizaの練習問題を解く 移動が可能かの判定・方向 Go編

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 移動が可能かの判定・方向 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】 実装 以下のように実装しました! package main import "fmt" func main(){ var h, w, sy, sx int var d, m string fmt.Scan(&h, &w, &sy, &sx, &d, &m) s := make([]string, h) for i := 0; i < h; i++ { fmt.Scan(&s[i]) } dir := []string{"N", "E", "S", "W"} var count int switch d { case "N": count = 4 case "E": count = 5 case "S": count = 6 case "W": count = 7 } if m == "R" { count++ } else { count-- } switch dir[count%4] { case "N": sy-- case "S": sy++ case "E": sx++ case "W": sx-- } if sy >= h || sx >= w || sy < 0 || sx < 0 || s[sy][sx] == '#' { fmt.Println("No") } else { fmt.Println("Yes") } } でもなんかスリムじゃないですよね。 ...

2026年3月2日 · にあえん

paizaの練習問題を解く 移動が可能かの判定・方角 Go編

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 移動が可能かの判定・方角 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】 実装 最初は以下のように実装しました。 package main import "fmt" func main(){ var h, w, sx, sy int var m string fmt.Scan(&h, &w, &sy, &sx, &m) d := make([]string, h) for i := 0; i < h; i++ { fmt.Scan(&d[i]) } switch m { case "E": sx++ case "W": sx-- case "S": sy++ case "N": sy-- } if sy >= h || sx >= w || d[sy][sx] == '#' { fmt.Println("No") } else { fmt.Println("Yes") } } ですが、実行してみるとうまくいかないテストケースがありました。 それもそうで、syとsxが負の値の場合の考慮が漏れていたためです。 これを修正してやることでうまくうごきました。 package main import "fmt" func main(){ var h, w, sx, sy int var m stringze fmt.Scan(&h, &w, &sy, &sx, &m) d := make([]string, h) for i := 0; i < h; i++ { fmt.Scan(&d[i]) } switch m { case "E": sx++ case "W": sx-- case "S": sy++ case "N": sy-- } if sy >= h || sx >= w || sy < 0 || sx < 0 || d[sy][sx] == '#' { fmt.Println("No") } else { fmt.Println("Yes") } } 👍

2026年3月1日 · にあえん

paizaの練習問題を解く 座標系での向きの変わる移動 Go編

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 座標系での向きの変わる移動 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】 実装 前回の問題を応用すればいけます。 package main import "fmt" func main(){ var x, y, n int fmt.Scan(&x, &y, &n) // 方角のスライス dir := []string{"N", "E", "S", "W"} // 現在の向き current := 120 for i := 0; i < n; i++ { var d string fmt.Scan(&d) // 現在の向きを変える if d == "R" { current++ } else { current-- } switch dir[current%4] { case "N": y-- case "S": y++ case "E": x++ case "W": x-- } fmt.Println(x, y) } } かなりいい感じに実装できたと思います👍

2026年2月28日 · にあえん

paizaの練習問題を解く 座標系での規則的な移動 Go編

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 座標系での規則的な移動 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】 実装 最初は以下のように実装しました。 package main import "fmt" func main(){ var x, y, n int fmt.Scan(&x, &y, &n) // stepは偶数の時に増える // 方角が変わるのはc数だけ移動したとき step := 0 c := 0 d := "E" for i := 0; i < n; i++ { if i % 2 == 0 { step++ } // cの数だけ移動していた場合、現在の方角を変える if i == c { switch d { case "E": d = "S" case "W": d = "N" case "N": d = "E" case "S": d = "W" } } switch d { case "E": x++ case "W": x-- case "N": y++ case "S": y-- } } fmt.Println(x, y) } ですが、これだとcに何を入れればいいのかわからず断念してしまいました。 ...

2026年2月26日 · にあえん

paizaの練習問題を解く 座標系での移動・向き Go編

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 座標系での移動・向き | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】 実装 前回の問題に方向が追加されました。 ということで条件を足しました。 package main import "fmt" func main(){ var y, x int var D, d string fmt.Scan(&y, &x, &D) fmt.Scan(&d) // N, S, E, W のいずれかでそれぞれ 北・南・東・西 を意味する。 switch D { case "N": if d == "R" { x++ } else { x-- } case "S": if d == "R" { x-- } else { x++ } case "E": if d == "R" { y++ } else { y-- } case "W": if d == "R" { y-- } else { y++ } } fmt.Println(y, x) } 随分と長くなってしまいました。 ...

2026年2月25日 · にあえん

paizaの練習問題を解く 座標系での移動・方角 Go編

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 座標系での移動・方角 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】 実装 実装はswitch文を使えば割と簡潔にできます。 package main import "fmt" func main(){ var y, x, n int fmt.Scan(&y, &x, &n) for i := 0; i < n; i++ { var d string fmt.Scan(&d) // N, S, E, W のいずれかでそれぞれ 北・南・東・西 を意味する。 switch d { case "N": y-- case "S": y++ case "E": x++ case "W": x-- } fmt.Println(y, x) } } めでたしめでたし。

2026年2月24日 · にあえん

paizaの練習問題を解く マップからの座標取得 Go編

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 マップからの座標取得 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】 実装 stringsパッケージのIndexを使えば楽に実装できます。 if文での変数宣言もうまく活用できたので、僕は満足です(?) package main import ( "fmt" "strings" ) func main(){ var h, w int fmt.Scan(&h, &w) s := make([]string, h) for i := 0; i < h; i++ { fmt.Scan(&s[i]) if j := strings.Index(s[i], "#"); j != -1 { fmt.Println(i, j) break } } } めでたしめでたし。

2026年2月23日 · にあえん