LoginSignup
14
2

More than 3 years have passed since last update.

作成したアルゴリズムが行進する

Last updated at Posted at 2018-12-11

11日目の記事は @okateim さんの 「最短包含区間問題」 でした。

※[注意]この記事はネタです。

"アルゴリズムこうしん"とは

アルゴリズムたいそう / アルゴリズムこうしんとは、NHK教育「ピタゴラスイッチ」の中で行われる体操のようなレクリエーションである。
(引用: ニコニコ大百科 - アルゴリズムこうしん)

詳しくはNHK教育の"ピタゴラスイッチ"を見てください。

行進の状態

ID 掛け声(状態) 備考
0 ( いっぽ すすむ だけ ) 最初の状態
1 いっぽ すすんで まえならえ メイン行進の1番目
2 いっぽ すすんで えらいひと メイン行進の2番目
3 ひっくりかえって ぺこりんこ メイン行進の3番目
4 よこにあるいて きょろきょろ メイン行進の4番目
5 ちょっと ここらで ひらおよぎ メイン行進の5番目
6 ちょっと しゃがんで くりひろい メイン行進の6番目
7 くうき いれましょ シュウッ シュウ メイン行進の7番目
8 くうきが はいって ピュウッ ピュウ メイン行進の8番目
9 そろそろ おわりかな 終了にかけての行進
10 おわり 行進終了

この辺はenumでまとめましょう。

enum
    enum algorithm_march_name :size_t {
        empty,
        maenarae,
        eraihito,
        pekorinko,
        kyorokyoro,
        hiraoyogi,
        kurihiroi,
        shushu,
        pyupyu,
        owarikana,
        owari,
    };

また、文章もまとめます。

string
    constexpr std::array<const char* const, 11> algorithm_march_string{{
    "",
    "いっぽ すすんで まえならえ",
    "いっぽ すすんで えらいひと",
    "ひっくりかえって ぺこりんこ",
    "よこにあるいて きょろきょろ",
    "ちょっと ここらで ひらおよぎ",
    "ちょっと しゃがんで くりひろい",
    "くうき いれましょ シュウッ シュウ",
    "くうきが はいって ピュウッ ピュウ",
    "そろそろ おわりかな",
    "おわり"
    }};

行進の状態を蝶々に例えると

状態 蝶々
最初の状態
メイン行進 幼虫
終了にかけての行進 さなぎ
行進終了 成虫

こんな感じです。例えがわかりにくすぎる

行進に使う変数はクラスにまとめておきます。

The_Algorithm_March.hpp
    class AlgorithmMarch {
    private:
        //行進(更新)カウンタ
        size_t update_counter = 0;
        //メイン行進のループ数
        size_t main_loop = 2;
        size_t main_loop_counter = 0;
        //おわりかなのループ数
        size_t end_loop = 5;
        size_t end_loop_counter = 0;
        bool is_end_loop = false;
        bool is_end = false;
        //行進するメンバー数
        size_t people_num;
        std::unique_ptr<size_t[]> people;
    };

これにて完成です。

全体のソースコード

The_Algorithm_March.hpp
//------------------------------
//The Algorithm March
//------------------------------

#pragma once
#include <array>
#include <vector>
#include <string>
#include <memory>
#include <iostream>

namespace march {

    enum algorithm_march_name :size_t {
        empty,
        maenarae,
        eraihito,
        pekorinko,
        kyorokyoro,
        hiraoyogi,
        kurihiroi,
        shushu,
        pyupyu,
        owarikana,
        owari,
    };

    constexpr std::array<const char* const, 11> algorithm_march_string{{
    "",
    "いっぽ すすんで まえならえ",
    "いっぽ すすんで えらいひと",
    "ひっくりかえって ぺこりんこ",
    "よこにあるいて きょろきょろ",
    "ちょっと ここらで ひらおよぎ",
    "ちょっと しゃがんで くりひろい",
    "くうき いれましょ シュウッ シュウ",
    "くうきが はいって ピュウッ ピュウ",
    "そろそろ おわりかな",
    "おわり"
    }};

    class AlgorithmMarch {
    private:
        //行進(更新)カウンタ
        size_t update_counter = 0;
        //メイン行進のループ数
        size_t main_loop = 2;
        size_t main_loop_counter = 0;
        //おわりかなのループ数
        size_t end_loop = 5;
        size_t end_loop_counter = 0;
        bool is_end_loop = false;
        bool is_end = false;
        //行進するメンバー数
        size_t people_num;
        std::unique_ptr<size_t[]> people;

    public:
        //コンストラクタ
        //AlgorithmMarch(行進のループ数, "おわりかな"の回数, 行進する人数)
        AlgorithmMarch(const size_t main_, const size_t end_, const size_t num_)
            :main_loop(main_), end_loop(end_), people_num(num_), people(new size_t[num_]) {
            for (size_t i = 0; i < num_; ++i) people[i] = empty;
        }
        //コンストラクタ
        //AlgorithmMarch(行進する人数)
        AlgorithmMarch(const size_t num_)
            : people_num(num_), people(new size_t[num_]) {
            for (size_t i = 0; i < num_; ++i) people[i] = empty;
        }

        size_t updateCounter() const { return update_counter; }
        size_t mainLoop() const { return main_loop; }
        size_t mainLoopCounter() const { return main_loop_counter; }
        size_t endLoop() const { return end_loop; }
        size_t endLoopCounter() const { return end_loop_counter; }
        bool isEndLoop() const { return is_end_loop; }
        bool isEnd() const { return is_end; }
        //行進する人数を返す
        size_t peopleNum() const { return people_num; }

        //指定したIDの人の行進状態を返す
        size_t peopleArrayID(const size_t id_) const { return people[id_]; }

        //人々の行進状態をstd::vectorに入れる
        void peopleVector(std::vector<size_t>& people_vector_) {
            people_vector_.resize(people_num);
            for (size_t i = 0; i < people_num; ++i) people_vector_[i] = people[i];
        }
        //人々の行進状態を配列に入れる
        void peopleArray(size_t* const people_vector_) {
            for (size_t i = 0; i < people_num; ++i) people_vector_[i] = people[i];
        }

        int statusUpdateMain(const size_t id_) {
            switch (people[id_])
            {
            case empty:
                people[id_] = maenarae;
                return 1;
            case owarikana:
            case owari:
                break;
            case pyupyu:
                people[id_] = maenarae;
                break;
            default:
                ++people[id_];
                break;

            }
            return 0;
        }

        //行進を更新
        int statusUpdate(const size_t id_) {

            if (is_end) {
                for (size_t i = 0; i < people_num; ++i) people[i] = owari;
                return 3;
            }
            if (end_loop_counter > 0 && people[id_] != owarikana) {
                people[id_] = owarikana;
                for (size_t i = id_ + 1; i < people_num; ++i) statusUpdateMain(i);
                return 2;
            }
            return statusUpdateMain(id_);
        }

        void mainLoopUpdate() {
            if (update_counter % 8 == 0) {
                if (main_loop == main_loop_counter) is_end_loop = true;
                ++main_loop_counter;
            }
            ++update_counter;
        }

        void endLoopUpdate() {
            if (!is_end_loop) return;
            if (end_loop == end_loop_counter) is_end = true;
            ++end_loop_counter;
        }

        void statusUpdate() {
            //"おわり"だったら終了
            if (is_end) return;
            mainLoopUpdate();
            endLoopUpdate();
            for (size_t i = 0; i < people_num; ++i) if (statusUpdate(i)) break;
        }

        void print(const size_t id_) {
            std::cout << algorithm_march_string[people[id_]];
        }
        void print(const size_t id_, const std::array<const char* const, 11>& message_) {
            std::cout << message_[people[id_]];
        }

        void print() {
            for (size_t i = 0; i < people_num; ++i) print(i);
        }
        void print(const std::array<const char* const, 11>& message_) {
            for (size_t i = 0; i < people_num; ++i) print(i, message_);
        }

        void print(const std::string& str_) {
            for (size_t i = 0; i < people_num; ++i) {
                print(i);
                std::cout << str_;
            }
        }
        void print(const std::string& str_, const std::array<const char* const, 11>& message_) {
            for (size_t i = 0; i < people_num; ++i) {
                print(i, message_);
                std::cout << str_;
            }
        }

    };

}
Source.cpp
#include "The_Algorithm_March.hpp"

int main() {

    //行進を作成(行進のループ数, "おわりかな"の回数, 行進する人数)
    march::AlgorithmMarch am(3, 10, 5);

    //行進メインループ
    while(!am.isEnd()) {

        //行進を更新
        am.statusUpdate();

        //参加者の行進を"/"で区切る
        am.print("/", march::algorithm_march_string);

        //1ターンの行進が終わったら改行
        std::cout << std::endl;
    }

    return 0;
}

実行結果

いっぽ すすんで まえならえ/////
いっぽ すすんで えらいひと/いっぽ すすんで まえならえ////
ひっくりかえって ぺこりんこ/いっぽ すすんで えらいひと/いっぽ すすんで まえならえ///
よこにあるいて きょろきょろ/ひっくりかえって ぺこりんこ/いっぽ すすんで えらいひと/いっぽ すすんで まえならえ//
ちょっと ここらで ひらおよぎ/よこにあるいて きょろきょろ/ひっくりかえって ぺこりんこ/いっぽ すすんで えらいひと/いっぽ すすんで まえならえ/
ちょっと しゃがんで くりひろい/ちょっと ここらで ひらおよぎ/よこにあるいて きょろきょろ/ひっくりかえって ぺこりんこ/いっぽ すすんで えらいひと/
くうき いれましょ シュウッ シュウ/ちょっと しゃがんで くりひろい/ちょっと ここらで ひらおよぎ/よこにあるいて きょろきょろ/ひっくりかえって ぺこりんこ/
くうきが はいって ピュウッ ピュウ/くうき いれましょ シュウッ シュウ/ちょっと しゃがんで くりひろい/ちょっと ここらで ひらおよぎ/よこにあるいて きょろきょろ/
いっぽ すすんで まえならえ/くうきが はいって ピュウッ ピュウ/くうき いれましょ シュウッ シュウ/ちょっと しゃがんで くりひろい/ちょっと ここらで ひらおよぎ/
いっぽ すすんで えらいひと/いっぽ すすんで まえならえ/くうきが はいって ピュウッ ピュウ/くうき いれましょ シュウッ シュウ/ちょっと しゃがんで くりひろい/
ひっくりかえって ぺこりんこ/いっぽ すすんで えらいひと/いっぽ すすんで まえならえ/くうきが はいって ピュウッ ピュウ/くうき いれましょ シュウッ シュウ/
よこにあるいて きょろきょろ/ひっくりかえって ぺこりんこ/いっぽ すすんで えらいひと/いっぽ すすんで まえならえ/くうきが はいって ピュウッ ピュウ/
ちょっと ここらで ひらおよぎ/よこにあるいて きょろきょろ/ひっくりかえって ぺこりんこ/いっぽ すすんで えらいひと/いっぽ すすんで まえならえ/
ちょっと しゃがんで くりひろい/ちょっと ここらで ひらおよぎ/よこにあるいて きょろきょろ/ひっくりかえって ぺこりんこ/いっぽ すすんで えらいひと/
くうき いれましょ シュウッ シュウ/ちょっと しゃがんで くりひろい/ちょっと ここらで ひらおよぎ/よこにあるいて きょろきょろ/ひっくりかえって ぺこりんこ/
くうきが はいって ピュウッ ピュウ/くうき いれましょ シュウッ シュウ/ちょっと しゃがんで くりひろい/ちょっと ここらで ひらおよぎ/よこにあるいて きょろきょろ/
いっぽ すすんで まえならえ/くうきが はいって ピュウッ ピュウ/くうき いれましょ シュウッ シュウ/ちょっと しゃがんで くりひろい/ちょっと ここらで ひらおよぎ/
いっぽ すすんで えらいひと/いっぽ すすんで まえならえ/くうきが はいって ピュウッ ピュウ/くうき いれましょ シュウッ シュウ/ちょっと しゃがんで くりひろい/
ひっくりかえって ぺこりんこ/いっぽ すすんで えらいひと/いっぽ すすんで まえならえ/くうきが はいって ピュウッ ピュウ/くうき いれましょ シュウッ シュウ/
よこにあるいて きょろきょろ/ひっくりかえって ぺこりんこ/いっぽ すすんで えらいひと/いっぽ すすんで まえならえ/くうきが はいって ピュウッ ピュウ/
ちょっと ここらで ひらおよぎ/よこにあるいて きょろきょろ/ひっくりかえって ぺこりんこ/いっぽ すすんで えらいひと/いっぽ すすんで まえならえ/
ちょっと しゃがんで くりひろい/ちょっと ここらで ひらおよぎ/よこにあるいて きょろきょろ/ひっくりかえって ぺこりんこ/いっぽ すすんで えらいひと/
くうき いれましょ シュウッ シュウ/ちょっと しゃがんで くりひろい/ちょっと ここらで ひらおよぎ/よこにあるいて きょろきょろ/ひっくりかえって ぺこりんこ/
くうきが はいって ピュウッ ピュウ/くうき いれましょ シュウッ シュウ/ちょっと しゃがんで くりひろい/ちょっと ここらで ひらおよぎ/よこにあるいて きょろきょろ/
そろそろ おわりかな/くうきが はいって ピュウッ ピュウ/くうき いれましょ シュウッ シュウ/ちょっと しゃがんで くりひろい/ちょっと ここらで ひらおよぎ/
そろそろ おわりかな/そろそろ おわりかな/くうきが はいって ピュウッ ピュウ/くうき いれましょ シュウッ シュウ/ちょっと しゃがんで くりひろい/
そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/くうきが はいって ピュウッ ピュウ/くうき いれましょ シュウッ シュウ/
そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/くうきが はいって ピュウッ ピュウ/
そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/
そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/
そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/
そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/
そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/
そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/
おわり/おわり/おわり/おわり/おわり/

おわり。

14
2
1

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
14
2