当ブログでは順次『paizaオンラインハッカソンVol.7 プログラミングで彼女をつくる』の回答例を上げており、前回ではpaizaオンラインハッカソン7に参加してみた – メガネ(C++, Swift※コードゴルフ版付き)として先にメガネのお題の回答例を提示したが、今回は戻ってポニーテールのお題について回答例及びお題を挙げてみたい。
今回のお題の目的
ポニーテールのお題では、数値が入力されるので、それをカウントダウンして表示、0になった時だけその後ろに「!!」をつなげて表示するということが目的となっている。
したがって、今回は以下の要素が必要になってくる。
- 文字列の数値化が使えるか
- whileループまたはforループが使えるか
- 条件分岐または三項演算子が使えるか
回答例コード
C++
参考URL: https://github.com/saitomarch/POH7/blob/master/cpp/pony_tail.cpp
[code lang=”cpp”]#include <iostream>
#include <cstdlib>
using namespace std;
int main(void){
string str;
getline(cin, str);
int num = stoi(str);
while(num >= 0) {
cout << num << ((num == 0) ? "!!" : "") << endl;
num–;
}
return EXIT_SUCCESS;
}[/code]
Swift
参考URL: https://github.com/saitomarch/POH7/blob/master/swift/pony_tail.swift
[code lang=”swift”][/code]var num = Int(readLine()!)!
while (num >= 0) {
print(String(num) + (num == 0 ? “!!” : “”))
num–
}[/swift]
解説
今回は、C++/Swift共にwhileループとデクリメントを併用してカウンドダウン処理を行った。
while文の中ではまず数字を、その直後に0かどうかを判別し、0であれば「!!」を、そうでなければ空文字列 ((文字数が0の文字列の事。ヌルポインターやヌル参照でもないので要注意。)) を結合する ((文字数が0の文字を結合しても、実質的には影響はない)) という処理を行っている。
その後、数値をデクリメントするという方法を取っている。
なお、今回は符号付き整数で計算を行っている。unsined intなどの符号なし整数で行う場合、0をデクリメントしたら、マイナス値にならず、最大値になってしまうため、このままでは無限ループに陥ってしまう。その場合は、0になったらbreakをかけるなどをしてループを抜けるようにしなければならないだろう。
最後に
今回もそれほど難しい問題ではないだろう。あっという間にクリアできるはずなので、ぜひとも得意な言語でチャレンジしてもらいたいと考えている。
ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。主にスマートフォン向けアプリやウェブアプリの開発を携わっています。ご用の方はコメントかコンタクトフォームにて。