問題一覧 > 通常問題

No.3136 F,B in FizzBuzzString16

レベル : / 実行時間制限 : 1ケース 2.000秒 / メモリ制限 : 512 MB / 標準ジャッジ問題
タグ : / 解いたユーザー数 16
作問者 : ID 21712
0 ProblemId : 12215 / 出題時の順位表 / 自分の提出
問題文最終更新日: 2025-05-04 13:06:58
2025-05-03更新: 難易度設定に関して助言を頂いたのでレベルを★2.5から★3.5に上方修正しました(この難易度の変更は暫定で難易度投票は受け付けてます)
2025-05-04更新: 指摘をいただいたので転載であることの旨を問題文ページにも表示しました
はじめに

本問は、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は整数i15で割った余りが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$となります



※念のために擬似言語以外でのFizzBuzz16FizzBuzzString16の定義に対応するコードを置いておきます(各ボタンをクリックすると開きます)

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