PaizaをGo言語で実行
入力の受け取り
- 一行ずつ取得する
func main() {
// NewScanner()でデータを読み取るScannerインスタンスを作成
// os.Stdinはプログラムの標準入力を参照しています
scanner := bufio.NewScanner(os.Stdin)
// Scan()で次の行を読み取ります
scanner.Scan()
// Text()で読み取ったデータを取得
text := scanner.Text()
fmt.Println(text)
scanner.Scan()
number, _ := strconv.Atoi(scanner.Text())
fmt.Println(number)
}- 半角空白でわかれているとき
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
parts := strings.Split(scanner.Text(), " ")
a := parts[0]
b, _ := strconv.Atoi(parts[1])
}- 一文字ずつ取得する
取得する数が分かっているときはこちらのほうが記述量が少ない
func main() {
var x, y, N int
fmt.Scan(&x, &y, &N)
}へび
プログラミング練習問題「へび」問題を解いてスキルアップ!みんなも一緒に解いてみよう!
paiza.jp
この問題は初期に与えられたマップ上をえびが移動し、最大 100 回行動するか障害物に当たり移動できなくなると終了するというものです。
重量な点としては、方向転換をおこなう時刻までは特定の向きに直進し続けることです。
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Position struct {
y, x int
}
type turn struct {
t int
d string
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
cols, rows, initY, initX, count, _ := readInt(scanner.Text())
grid := make([][]rune, cols)
for i := 0; i < cols; i++ {
scanner.Scan()
grid[i] = []rune(scanner.Text())
}
turns := make([]turn, count)
for i := 0; i < count; i++ {
scanner.Scan()
time, direction, _ := readTimeDirectionPair(scanner.Text())
turns[i].t = time
turns[i].d = direction
}
direction := 0 // 北向きで開始 (0: 北, 1: 東, 2: 南, 3: 西)
dirY := []int{-1, 0, 1, 0} // Y軸は北に移動する場合に-1される
dirX := []int{0, 1, 0, -1} // X軸は東に移動する場合に+1される
head := Position{initY, initX}
grid[head.y][head.x] = '*'
var nextX, nextY int
var time int = 0
var turnIndex int = 0
for time <= 99 {
if turnIndex < count && time == turns[turnIndex].t {
switch turns[turnIndex].d {
case "L":
direction = (direction + 3) % 4
case "R":
direction = (direction + 1) % 4
}
turnIndex++
}
// 次の移動先を計算
nextX = head.x + dirX[direction]
nextY = head.y + dirY[direction]
// 移動可能かどうかのチェック
if nextY < 0 || nextY >= cols || nextX < 0 || nextX >= rows || grid[nextY][nextX] == '#' || grid[nextY][nextX] == '*' {
break // 移動不可
}
// 移動する
head = Position{nextY, nextX}
grid[head.y][head.x] = '*'
time++
}
for _, line := range grid {
fmt.Println(string(line))
}
}
func readInt(line string) (int, int, int, int, int, error) {
parts := strings.Split(line, " ")
cols, _ := strconv.Atoi(parts[0])
rows, _ := strconv.Atoi(parts[1])
initY, _ := strconv.Atoi(parts[2])
initX, _ := strconv.Atoi(parts[3])
count, _ := strconv.Atoi(parts[4])
return cols, rows, initY, initX, count, nil
}
func readTimeDirectionPair(line string) (int, string, error) {
parts := strings.Split(line, " ")
time, _ := strconv.Atoi(parts[0])
return time, parts[1], nil
}
映画館の席の予約
package main
import (
"bufio"
"fmt"
"math"
"os"
"strconv"
"strings"
)
type Position struct {
p, q int
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
reservedSeatCount, seatRows, seatCols, bestSeatRow, bestSeatCol, _ := readInt(scanner.Text())
reserved := make(map[Position]bool)
for i := 0; i < reservedSeatCount; i++ {
scanner.Scan()
rp, rq, _ := readInt2(scanner.Text())
reserved[Position{rp, rq}] = true
}
minDistance := math.MaxInt
candidates := []Position{}
for p := 0; p < seatRows; p++ {
for q := 0; q < seatCols; q++ {
pos := Position{p, q}
if reserved[pos] {
continue
}
distance := absIf(p-bestSeatRow) + absIf(q-bestSeatCol)
if distance < minDistance {
minDistance = distance
candidates = []Position{pos}
} else if distance == minDistance {
candidates = append(candidates, pos)
}
}
}
for _, seat := range candidates {
fmt.Println(seat.p, seat.q)
}
}
func readInt(line string) (int, int, int, int, int, error) {
parts := strings.Split(line, " ")
reservedSeatCount, _ := strconv.Atoi(parts[0])
seatRows, _ := strconv.Atoi(parts[1])
seatCols, _ := strconv.Atoi(parts[2])
bestSeatRow, _ := strconv.Atoi(parts[3])
bestSeatCol, _ := strconv.Atoi(parts[4])
return reservedSeatCount, seatRows, seatCols, bestSeatRow, bestSeatCol, nil
}
func readInt2(line string) (int, int, error) {
parts := strings.Split(line, " ")
rp, _ := strconv.Atoi(parts[0])
rq, _ := strconv.Atoi(parts[1])
return rp, rq, nil
}
func absIf(x int) int {
if x < 0 {
return -x
}
return x
}