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;
}
#実行結果
いっぽ すすんで まえならえ/////
いっぽ すすんで えらいひと/いっぽ すすんで まえならえ////
ひっくりかえって ぺこりんこ/いっぽ すすんで えらいひと/いっぽ すすんで まえならえ///
よこにあるいて きょろきょろ/ひっくりかえって ぺこりんこ/いっぽ すすんで えらいひと/いっぽ すすんで まえならえ//
ちょっと ここらで ひらおよぎ/よこにあるいて きょろきょろ/ひっくりかえって ぺこりんこ/いっぽ すすんで えらいひと/いっぽ すすんで まえならえ/
ちょっと しゃがんで くりひろい/ちょっと ここらで ひらおよぎ/よこにあるいて きょろきょろ/ひっくりかえって ぺこりんこ/いっぽ すすんで えらいひと/
くうき いれましょ シュウッ シュウ/ちょっと しゃがんで くりひろい/ちょっと ここらで ひらおよぎ/よこにあるいて きょろきょろ/ひっくりかえって ぺこりんこ/
くうきが はいって ピュウッ ピュウ/くうき いれましょ シュウッ シュウ/ちょっと しゃがんで くりひろい/ちょっと ここらで ひらおよぎ/よこにあるいて きょろきょろ/
いっぽ すすんで まえならえ/くうきが はいって ピュウッ ピュウ/くうき いれましょ シュウッ シュウ/ちょっと しゃがんで くりひろい/ちょっと ここらで ひらおよぎ/
いっぽ すすんで えらいひと/いっぽ すすんで まえならえ/くうきが はいって ピュウッ ピュウ/くうき いれましょ シュウッ シュウ/ちょっと しゃがんで くりひろい/
ひっくりかえって ぺこりんこ/いっぽ すすんで えらいひと/いっぽ すすんで まえならえ/くうきが はいって ピュウッ ピュウ/くうき いれましょ シュウッ シュウ/
よこにあるいて きょろきょろ/ひっくりかえって ぺこりんこ/いっぽ すすんで えらいひと/いっぽ すすんで まえならえ/くうきが はいって ピュウッ ピュウ/
ちょっと ここらで ひらおよぎ/よこにあるいて きょろきょろ/ひっくりかえって ぺこりんこ/いっぽ すすんで えらいひと/いっぽ すすんで まえならえ/
ちょっと しゃがんで くりひろい/ちょっと ここらで ひらおよぎ/よこにあるいて きょろきょろ/ひっくりかえって ぺこりんこ/いっぽ すすんで えらいひと/
くうき いれましょ シュウッ シュウ/ちょっと しゃがんで くりひろい/ちょっと ここらで ひらおよぎ/よこにあるいて きょろきょろ/ひっくりかえって ぺこりんこ/
くうきが はいって ピュウッ ピュウ/くうき いれましょ シュウッ シュウ/ちょっと しゃがんで くりひろい/ちょっと ここらで ひらおよぎ/よこにあるいて きょろきょろ/
いっぽ すすんで まえならえ/くうきが はいって ピュウッ ピュウ/くうき いれましょ シュウッ シュウ/ちょっと しゃがんで くりひろい/ちょっと ここらで ひらおよぎ/
いっぽ すすんで えらいひと/いっぽ すすんで まえならえ/くうきが はいって ピュウッ ピュウ/くうき いれましょ シュウッ シュウ/ちょっと しゃがんで くりひろい/
ひっくりかえって ぺこりんこ/いっぽ すすんで えらいひと/いっぽ すすんで まえならえ/くうきが はいって ピュウッ ピュウ/くうき いれましょ シュウッ シュウ/
よこにあるいて きょろきょろ/ひっくりかえって ぺこりんこ/いっぽ すすんで えらいひと/いっぽ すすんで まえならえ/くうきが はいって ピュウッ ピュウ/
ちょっと ここらで ひらおよぎ/よこにあるいて きょろきょろ/ひっくりかえって ぺこりんこ/いっぽ すすんで えらいひと/いっぽ すすんで まえならえ/
ちょっと しゃがんで くりひろい/ちょっと ここらで ひらおよぎ/よこにあるいて きょろきょろ/ひっくりかえって ぺこりんこ/いっぽ すすんで えらいひと/
くうき いれましょ シュウッ シュウ/ちょっと しゃがんで くりひろい/ちょっと ここらで ひらおよぎ/よこにあるいて きょろきょろ/ひっくりかえって ぺこりんこ/
くうきが はいって ピュウッ ピュウ/くうき いれましょ シュウッ シュウ/ちょっと しゃがんで くりひろい/ちょっと ここらで ひらおよぎ/よこにあるいて きょろきょろ/
そろそろ おわりかな/くうきが はいって ピュウッ ピュウ/くうき いれましょ シュウッ シュウ/ちょっと しゃがんで くりひろい/ちょっと ここらで ひらおよぎ/
そろそろ おわりかな/そろそろ おわりかな/くうきが はいって ピュウッ ピュウ/くうき いれましょ シュウッ シュウ/ちょっと しゃがんで くりひろい/
そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/くうきが はいって ピュウッ ピュウ/くうき いれましょ シュウッ シュウ/
そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/くうきが はいって ピュウッ ピュウ/
そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/
そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/
そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/
そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/
そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/
そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/そろそろ おわりかな/
おわり/おわり/おわり/おわり/おわり/
おわり。