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

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

当ブログでは順次『paizaオンラインハッカソンVol.7 プログラミングで彼女をつくる』の回答例を上げているが、今回はツインテールのお題を上げてみたい。

今回のお題の目的

今回のお題の目的としては、2つのエナジードリンクの中、値段とカフェイン量からどちらの方がコストパフォーマンスが良いかを選ぶものである1 。したがって、今回の場合は、以下の要素が出来ているかどうかが重要となる。

  • 除法
  • 比較
  • 文字列から整数にすべきか浮動小数点数にすべきか

サンプルコード

C++

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

[code lang=”cpp”]#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <cstdlib>
using namespace std;
string readline() {
string str;
getline(cin, str);
return str;
}
vector<string> split(const string &str, char sep) {
vector<string> vec;
istringstream sstream(str);
string buf;
while (getline(sstream, buf, sep)) {
vec.push_back(buf);
}
return vec;
}
int main(void){
const auto nums = 2;
int selected = 0;
int max_performance = 0.0;
for (int cnt = 0; cnt < nums; cnt++) {
auto arr = split(readline(), ‘ ‘);
float performance = stof(arr[0]) / stof(arr[1]);
if (performance > max_performance) {
selected = cnt;
max_performance = performance;
}
}
cout << selected + 1 << endl;
return EXIT_SUCCESS;
}[/code]

Swift

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

[code lang=”swift”]let times = 2
var maxPerformance:Float = 0.0
var selected = 0
for (var cnt = 0; cnt < times; cnt++) {
var arr = readLine()!.characters.split{$0 == " "}.map(String.init)
var performance = Float(arr[0])! / Float(arr[1])!
if (performance > maxPerformance) {
maxPerformance = performance
selected = cnt
}
}
print(selected + 1)[/code]

解説

C++においては、標準入力から文字列を取得する処理と、文字列を分割して配列にする処理を簡単にするため、予めreadline()split()を定義した。

コストパフォーマンスを取得する処理についてだが、除法を使う関係上、整数で取得するには望ましくないため、C++ではstd::stof()を、SwiftではFloat()を使った。今回はどちらがコストパフォーマンスが高いかを取得するため、そこまで高い精度は必要としていないことから、float型を使った。

なお、今回はforループを使って最もコストパフォーマンスが高い値とインデックス値をもとに出力している。また、このコードでは0始まり、お題では1始まりであること2 を配慮して、出力時は1を加算している。

1始まりとしたい場合は以下のような書き方になるだろう。

[code lang=”cpp”]for (int cnt = 1; cnt <= times; cnt++)[/code]

[code lang=”swift”]for (var cnt = 0; cnt <= times; cnt++)[/code]

なお、2つしか選択肢がないのにあえて今回forループを使った理由は、仮に3つ以上の選択肢あるいは可変長だった場合などでも比較的容易に対応できるようにするためである。forループを使わない場合は三項演算子やifなどを使うことになるが、その場合、対応が面倒になることが考えられる。

最後に

今回も各言語の基礎がわかれば、多くの言語ではそれほど苦労せずに解けるだろう。ただし、今回は型に気をつけないと想定しない答えが出るという思わぬ落とし穴がある点と、将来的な改修の可能性があることを想定して修正しやすいようなコードの書き方は心がけてみたほうが良いだろう。

ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。ご用の方はコメントかコンタクトフォームにて。
  1. 値段の割にカフェイン量が多いものがコストパフォーマンスがよいという条件となっている []
  2. コンピューター関連では0始まりは配列などでよく使われる []