問題 #2 - 回答 #21

Base32

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

回答 #21

yamamoto-hiroya が 2024-03-07 23:27:32 に投稿

コード

530 byte

const A='ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
while ($line = fgets(STDIN)) {
  $line = rtrim($line);
  $bits = '';
  for ($i = 0; $i < strlen($line); $i++) {
    $bits .= str_pad(base_convert(strval(ord($line[$i])), 10, 2), 8, '0', STR_PAD_LEFT);
  }
  $base32 = '';
  foreach (str_split($bits, 5) as $b) {
    $base32 .= A[base_convert(str_pad($b, 5, '0'), 2, 10)];
  }
  $base32 .= match (strlen($bits) % 40) {
    8 => '======',
    16 => '====',
    24 => '===',
    32 => '=',
    default => '',
  };
  echo $base32, PHP_EOL;
}

実行結果

ステータス: OK

テストケース 1

ステータス: OK

標準出力

NBXWOZI=
OBUXS3Y=
MZ2WOYI=

標準エラー出力


テストケース 2

ステータス: OK

標準出力

4OAYNY4BRPRYFCXDQGX6HAMS
4OA2VY4BRTRYFCPDQGDOHAMX
4OBI7Y4BTHRYFCPDQKBOHANB

標準エラー出力


テストケース 3

ステータス: OK

標準出力

GEZDGNBVGY3Q====
GEZA====
GEZDGNBVGY3TQOJQ
GEZDGNBVGY3TQ===
GEZDG===
GEZDGNBV
GEZDGNBVGY3TQOI=
GEZDGNA=
GE======
GEZDGNBVGY======

標準エラー出力


テストケース 4

ステータス: OK

標準出力

MEQGEIDD
EAQOHAMC4OAYIIHDQGDCBY4BRAQOHAMK

標準エラー出力