No.3136 F,B in FizzBuzzString16
はじめに
本問は、HackerRankの問題からの許可をもらっての転載で、誰も解いてないとのことで問題文解説文テストケース解法コードの一式をもらっての転載です。
問題文
FizzBuzz16
を次のように定義します (※擬似言語コード)
function FizzBuzz16(i) {
if ( i % 15 == 0 ) {
return "FizzBuzz"
} else if ( i % 3 == 0 ) {
return "Fizz"
} else if ( i % 5 == 0 ) {
return "Buzz"
} else {
return i.toString(16).toUpperCase()
}
}
※ i % 15 == 0
は整数i
を15
で割った余りが0
と等しいとき真偽値の真値になる計算式です
※ i.toString(16).toUpperCase()
は整数i
を16進表記(英字は大文字)の文字列に変換する処理です
例えばFizzBuzz16(14)
は"E"
、FizzBuzz16(15)
は"FizzBuzz"
、FizzBuzz16(16)
は"10"
、FizzBuzz16(251)
は"FB"
になります
FizzBuzzString16
を次のように定義します (※擬似言語コード)
function FizzBuzzString16(n) {
s = ""
for ( i = 1 ; i <= n ; i++ ) {
s += FizzBuzz16(i)
}
return s
}
※ i++
は整数i
の値を1
だけ増加する処理です
※ s +=
は文字列s
の最後尾に右辺値の文字列を連結する処理です
例えばFizzBuzzString16(4)
は"12Fizz4"
、FizzBuzzString16(16)
は"12Fizz4BuzzFizz78FizzBuzzBFizzDEFizzBuzz10"
になります
整数$X$と$Y$が与えられるのでFizzBuzzString16(1000000000000)
の$X$文字目から$Y$文字目の間(※$X$文字目と$Y$文字目も含む)にある文字F
の個数と文字B
の個数の合計を求めてください
例えば$X=1,Y=5$のときFizzBuzzString16(1000000000000)
の$1$文字目から$5$文字目は"12Fiz"
で文字F
は$1$個、文字B
は$0$個で合計は$1$となります
例えば$X=3,Y=18$のときFizzBuzzString16(1000000000000)
の$3$文字目から$18$文字目は"Fizz4BuzzFizz78F"
で文字F
は$3$個、文字B
は$1$個で合計は$4$となります
※念のために擬似言語以外でのFizzBuzz16
とFizzBuzzString16
の定義に対応するコードを置いておきます(各ボタンをクリックすると開きます)
C++
#include <sstream>
std::string to_hex_string(int64_t i) {
std::stringstream s;
s << std::uppercase << std::hex << i;
return s.str();
}
std::string FizzBuzz16(int64_t i) {
if (i % 15 == 0) {
return "FizzBuzz";
} else if (i % 3 == 0) {
return "Fizz";
} else if (i % 5 == 0) {
return "Buzz";
} else {
return to_hex_string(i);
}
}
std::string FizzBuzzString16(int64_t n) {
std::string s = "";
for (int64_t i = 1; i <= n; i++) {
s += FizzBuzz16(i);
}
return s;
}
Python
def FizzBuzz16(i):
if i % 15 == 0:
return "FizzBuzz"
elif i % 3 == 0:
return "Fizz"
elif i % 5 == 0:
return "Buzz"
else:
return "%X" % i
def FizzBuzzString16(n):
s = ""
for i in range(1,n+1):
s += FizzBuzz16(i)
return s
Java
String FizzBuzz16(long i) {
if (i % 15L == 0L) {
return "FizzBuzz";
} else if (i % 3L == 0L) {
return "Fizz";
} else if (i % 5L == 0L) {
return "Buzz";
} else {
return String.format("%X", i);
}
}
String FizzBuzzString16(long n) {
String s = "";
for (long i = 1L; i <= n; i++) {
s += FizzBuzz16(i);
}
return s;
}
入力
$X$ $Y$
1行目に整数$X$が与えられます
2行目に整数$Y$が与えられます
制約
$1 \le X \le Y \le 1{,}000{,}000{,}000{,}000=10^{12}$
出力
FizzBuzzString16(1000000000000)
の$X$文字目から$Y$文字目の間(※$X$文字目と$Y$文字目も含む)にある文字F
の個数と文字B
の個数の合計を出力してください
サンプル
サンプル1
入力
1 5
出力
1
FizzBuzzString16(1000000000000)
の$1$文字目から$5$文字目は"12Fiz"
で文字F
の数は$1$個、文字B
の数は$0$個で合計は$1$となります
サンプル2
入力
3 18
出力
4
FizzBuzzString16(1000000000000)
の$3$文字目から$18$文字目は"Fizz4BuzzFizz78F"
で文字F
の数は$3$個、文字B
の数は$1$個で合計は$4$となります
サンプル3
入力
33 33
出力
1
FizzBuzzString16(1000000000000)
の$33$文字目は"F"
で文字F
の数は$1$個、文字B
の数は$0$個で合計は$1$となります
サンプル4
入力
769 797
出力
11
FizzBuzzString16(1000000000000)
の$769$文字目から$797$文字目は"F4BuzzFizzF7F8FizzBuzzFBFizzF"
で文字F
は$8$個、文字B
は$3$個で合計は$11$となります
サンプル5
入力
128153 128159
出力
0
FizzBuzzString16(1000000000000)
の$128153$文字目から$128159$文字目は"7777777"
で文字F
も文字B
もありません
サンプル6
入力
808 277288
出力
52258
サンプル7
入力
1 1000000000000
出力
157481468199
提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。