信長之代、五年、三年は持たるべく候。明年辺は公家などに成さるべく候かと見及び申候。左候て後、高ころびに、あおのけに転ばれ候ずると見え申候。藤吉郎さりとてはの者にて候
Advent Calendar 2022 5日目1です。
私のAdvent Calendar 2022 一覧。
はじめに
Elixirを楽しんでいますか
AtCoderのB - FizzBuzz SumをZigで解いてみます。
ZigのHello, world!
的なことは下記の記事をご参照ください。
この記事では、Elixirのことは取り扱っていません。
B - FizzBuzz Sum
AtCoderは、オンラインで参加できるプログラミングコンテスト(競技プログラミング)のサイトです。リアルタイムのコンテストで競い合ったり、約3000問のコンテストの過去問にいつでも挑戦することが出来ます。
AtCoderのB - FizzBuzz Sum問題とは次のような問題です。
例: 入力が5の場合、FizzBuzzの列は、1,2,Fizz,4,Buzz
となり、数字だけを足し算して、7が答え
問題文はリンク先をご参照ください。
プログラミングの基本である
- 順次
- 分岐
- 繰り返し
が含まれている良問だとおもっています。
//const builtin = @import("builtin");
const std = @import("std");
const io = std.io;
const fmt = std.fmt;
pub fn main() !void {
const stdout = io.getStdOut().writer();
const stdin = io.getStdIn();
var line_buf: [20]u8 = undefined;
const amt = try stdin.read(&line_buf);
if (amt == line_buf.len) {
try stdout.print("Input too long.\n", .{});
}
const line = std.mem.trimRight(u8, line_buf[0..amt], "\r\n");
const n = try fmt.parseInt(u128, line, 10);
var i: u128 = 1;
var sum: u128 = 0;
while (i <= n) {
if (i % 3 == 0) {
} else if (i % 5 == 0) {
} else {
sum += i;
}
i += 1;
}
try stdout.print("{d}\n", .{sum});
return;
}
残念ながら、AtCoderでは2022/01/03現在、まだZigを選べませんでしたので、手元でzig build run
して自分で標準入力して結果を確かめました。
作成にあたって、以下のプログラム例を参考にしました。
- 入力を受け取って整数に変換するところはもっとすっきり書けるのかもしれません
-
const n = try fmt.parseInt(u128, line, 10);
は、カンでtry
をつけています-
try
がないと、i <= n
のところで、下記のエラーがでます- error: expected type 'u128', found 'std.fmt.ParseIntError!u128'
-
どうでもいい話ですが、ググるとRustの記事がよくでてきます。
Rustに似ているところがあるのでしょうか。
Wrapping up
Enjoy Zig
2022年に流行る技術予想 ーー それは、Zigです