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

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

当ブログでは順次『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をかけるなどをしてループを抜けるようにしなければならないだろう。

最後に

今回もそれほど難しい問題ではないだろう。あっという間にクリアできるはずなので、ぜひとも得意な言語でチャレンジしてもらいたいと考えている。

タイトルとURLをコピーしました