8
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Zigで、B - FizzBuzz Sum問題を解いてみる

Last updated at Posted at 2022-01-04

信長之代、五年、三年は持たるべく候。明年辺は公家などに成さるべく候かと見及び申候。左候て後、高ころびに、あおのけに転ばれ候ずると見え申候。藤吉郎さりとてはの者にて候

Advent Calendar 2022 5日目1です。
私のAdvent Calendar 2022 一覧

はじめに

Elixirを楽しんでいますか:bangbang::bangbang::bangbang:

AtCoderB - FizzBuzz SumZigで解いてみます。

ZigHello, world!的なことは下記の記事をご参照ください。

この記事では、Elixirのことは取り扱っていません。

B - FizzBuzz Sum

AtCoderは、オンラインで参加できるプログラミングコンテスト(競技プログラミング)のサイトです。リアルタイムのコンテストで競い合ったり、約3000問のコンテストの過去問にいつでも挑戦することが出来ます。

AtCoderB - FizzBuzz Sum問題とは次のような問題です。

例: 入力が5の場合、FizzBuzzの列は、1,2,Fizz,4,Buzzとなり、数字だけを足し算して、7が答え

問題文はリンク先をご参照ください。

プログラミングの基本である

  • 順次
  • 分岐
  • 繰り返し

が含まれている良問だとおもっています。

src/main.zig
//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 :lgtm::lgtm::lgtm::lgtm:

Enjoy Zig:bangbang::bangbang::bangbang:

2022年に流行る技術予想 ーー それは、Zigです:rocket::rocket::rocket:

  1. @kaizen_nagoya さんの「「@e99h2121 アドベントカレンダーではありますまいか Advent Calendar 2020」の改訂版ではありますまいか Advent Calendar 2022 1日目 Most Breakthrough Generator」から着想を得て、模倣いたしました。

8
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?