問題 #2 - 回答 #79

Base32

RFC 4648 で定義された Base32 エンコーディングを実装してください。 標準入力から与えられる各行に対し、Base32 エンコードをおこなった文字列を標準出力へ改行区切りで出力してください。 なお、アルファベットの出力には大文字を用いてください。

回答 #79

oogFranz が 2024-03-08 13:27:17 に投稿

コード

947 byte

<?php

/**
 * RFC 4648 準拠の Base32 エンコーディング
 *
 * @param string $input エンコード対象の文字列
 * @return string Base32 エンコードされた文字列
 */
function base32_encode_rfc4648($input)
{
    $base32Alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
    $output = '';
    $buffer = 0;
    $bitsRemaining = 0;

    foreach (str_split($input) as $byte) {
        $buffer <<= 8;
        $buffer |= ord($byte);
        $bitsRemaining += 8;

        while ($bitsRemaining >= 5) {
            $output .= $base32Alphabet[$buffer >> (32 - 5)];
            $buffer <<= 5;
            $bitsRemaining -= 5;
        }
    }

    if ($bitsRemaining > 0) {
        $buffer <<= (32 - $bitsRemaining);
        $output .= $base32Alphabet[$buffer];
    }

    return $output;
}

// 標準入力から各行を読み込み、Base32 エンコード
while ($line = fgets(STDIN)) {
    echo base32_encode_rfc4648(trim($line)) . PHP_EOL;
}

実行結果

ステータス: 失敗

テストケース 1

ステータス: 不正解

標準出力

AAAAQAA
AAAAQAA
AAAAQAA

標準エラー出力


テストケース 2

ステータス: 不正解

標準出力

AAAQQAAOAQAQQAAIAQAQQAQI
AAAQQAAOAQAAQAAIAQAQAAQI
AAAQAAQOAQAQQAAIAQAAAAQI

標準エラー出力


テストケース 3

ステータス: 不正解

標準出力

AAAQAAQDAQAA
AAAA
AAAQAAQDAQAAQAAD
AAAQAAQDAQAAA
AAAQA
AAAQAAQD
AAAQAAQDAQAAQAA
AAAQAAA
AA
AAAQAAQDAA

標準エラー出力


テストケース 4

ステータス: 不正解

標準出力

AAAQAAAC
AAAQQAAOAQAAAAQIAAAAQAQIAAAQA

標準エラー出力