にあえん

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

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月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日 · にあえん

kanataでWindowsPCのキーボードをリマップする

こんにちは、ナナオです。 今回はキーボードリマップツールのkanataを試してみます。 GitHub - jtroo/kanata: Improve keyboard comfort and usability with advanced customization なぜリマップツールを使うのか? 最近40%キーボードに憧れており、その使用感がどのようなものなのかを試したかったからです。 分割型60%を使っていても、エンターやバックスペースまでの移動が微妙に気になっていました。 現在使用しているキーボードは、Mistel MD600 Alphaという、分割型の60%キーボードです。 Barocco Mistel MD600 Alpha RGB BT Black(英語配列) | キーボード | PCアクセサリー | 製品案内 | 株式会社プリンストン 欲しいなと思っているキーボードはtorabo-tsukiという40%レイアウトのキーボードです。 torabo-tsuki LP トラックボール付き無線分割キーボードキット - のぎけす屋 - BOOTH 大きな違いとしては、数字列がなくなることもそうですが全体的に大きくサイズダウンするところです。 サイズダウンすることで、今まで遠い位置にあったキー(エンターやバックスペースなど)がかなり近くになります。 とはいえ、いきなりこの40%キーボードに手を出すのも、本当に慣れるのか?という不安があります。 ということでリマップツールで40%レイアウトによるタイピングを導入していこうと思います。 kanataの導入 導入方法としてはwindowsの場合、二種類あります。 Chocolateyを使用する バイナリをダウンロードする 今回はバイナリでダウンロードする方法にします。 (Chocolatey使った方法のほうがたぶん楽です。自分は後からそれに気づいたのでバイナリでやっています。) ダウンロード リリースページに移動します。 Releases · jtroo/kanata · GitHub windows-binaries-xxx.zipという名前のアセットがあるので、自身のアーキテクチャに合ったものをダウンロードします。 中に入っているファイル一式を、適当なフォルダに配置します。 私は~\.local\share\kanataというディレクトリを作成してそこに配置しました。 これで中のkanata_windows_tty_winIOv2_cmd_allowed_x64.exeを実行すれば、kanata.kbdに書かれているレイアウトが適用されます。 スタートアップに登録 できれば起動時にkanataの設定を適用したいので、スタートアップに登録しましょう。 エクスプローラーでshell:startupと入力し、スタートアップのフォルダを表示します。 ...

2026年2月27日 · にあえん

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日 · にあえん

paizaの練習問題を解く マップの判定・縦横 Go編

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 マップの判定・縦 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】 実装 こちらも前回の実装を応用すればできますね。 package main import "fmt" func main(){ var h, w int fmt.Scan(&h, &w) s := make([]string, h) for i := 0; i < h; i++ { fmt.Scan(&s[i]) } isWall := func(x, y int) bool { if x < 0 || x >= w || y < 0 || y >= h { return true } return s[y][x] == '#' } for y := 0; y < h; y++ { for x := 0; x < w; x++ { if isWall(x, y - 1) && isWall(x, y + 1) && isWall(x - 1, y) && isWall(x + 1, y) { fmt.Println(y, x) } } } } めでたしめでたし。

2026年2月22日 · にあえん

paizaの練習問題を解く マップの判定・縦 Go編

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 マップの判定・縦 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】 実装 前回の実装を応用すればできますね。 package main import "fmt" func main(){ var h, w int fmt.Scan(&h, &w) s := make([]string, h) for i := 0; i < h; i++ { fmt.Scan(&s[i]) } isWall := func(x, y int) bool { if y < 0 || y >= h { return true } return s[y][x] == '#' } for y := 0; y < h; y++ { for x := 0; x < w; x++ { if isWall(x, y - 1) && isWall(x, y + 1) { fmt.Println(y, x) } } } } 簡単に実装できました。

2026年2月21日 · にあえん