paizaオンラインハッカソン7に参加してみた – 縞ニーソ(C++, Swift)

当ブログでは順次『paizaオンラインハッカソンVol.7 プログラミングで彼女をつくる』の回答例を上げており、基本的にはC++とSwiftでの解答例を上げている。ソースコードはGitHubでも公開しているので、ソースコードを見たい方はそちらもご確認されたい。今回は縞ニーソのお題の解答例と解説を上げたい。

今回のお題の目的

今回は一定の幅ごとに紅白が入れ替わる文字列を一定の長さまで出力するというものである。

サンプルコード

C++

参考URL: https://github.com/saitomarch/POH7/blob/master/cpp/kneeso.cpp

[code lang=cpp]
#include <iostream>
#include <string>
#include <cstdlib>
#include <vector>
using namespace std;
string readline() {
string str;
getline(cin, str);
return str;
}
int main(void){
auto width = stoi(readline());
auto length = stoi(readline());

vector<string> pattern = {"R", "W"};

string str = "";
for (auto idx = 0; idx < length; idx++) {
str += pattern[(idx / width) % pattern.size()];
}
cout << str << endl;

return EXIT_SUCCESS;
}
[/code]

Swift

参考URL: https://github.com/saitomarch/POH7/blob/master/swift/kneeso.swift

[code lang=swift]
let width = Int(readLine()!)!
let length = Int(readLine()!)!
let pattern = ["R", "W"];
var str = ""
for (var idx = 0; idx < length; idx++) {
let colorStr = pattern[(idx / width) % pattern.count]
str += colorStr
}
print(str)
[/code]

解説

入力としてはまず紅白のパターンの幅、次に全体の長さとなっている。それを整数としてもたせることで準備を行う。

なお、今回はカラーパターンを配列でもたせた。こうすることによってカラーパターンが変わった場合にも対応が比較的容易にできるようにするためである。

今回は1文字ずつ文字を結合するという方法で行っている。この方法は比較的シンプルに書ける上に、かなり確実だが、パフォーマンス的には長さの分だけforループを回さなければならないため、長くなるほどパフォーマンスに影響を及ぼすかもしれない。

最後に

これで水着以外のC++/Swiftでのサンプル、水着についてはJavaでのサンプルの解答例と解説について一通り書き終えた。

今回のPOHは問題数がかなり多く、説明もかなり面倒だったものの、問題自体はこれまでのPOHと比較してもかなりゆるい部類に入ったため、サンタ服やメガネを除けばプログラミングをかじった程度でも問題なく解けるだろう。

当ブログではC++及びSwift(水着以外)、及び水着においてはJavaでの解答例を上げたほか、ソースコードはGitHubでも公開しているので、プログラミングに慣れてないけどチャレンジしてみたい方は是非参考にしてもらえれば幸いである。

ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しております。仕事依頼や相談などについては、Contact Formよりお願いいたします。