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もしくは右上の雲マークをクリックしてアカウントを作成してください。
 
             ID 21712
ID 21712