TORANA TECH BLOG

株式会社トラーナのエンジニアチームの開発ブログ

PHPerKaigi 2022 にスポンサード登壇をします PHPer チャレンジトークン

スポンサード && 登壇

みなさま、こんにちは!CTO のめもりーです。 本年開催の PHPerKaigi 2022 にスポンサード、また私が登壇いたします。

phperkaigi.jp

YAPC と同様に「PHP で NFC リーダーを実装する」で登壇させていただく予定ですが、YAPC とは異なり PHP ユーザー向けの内容に資料をアップデートしておりますので、ぜひご覧ください。

speakerdeck.com

また、事前収録したトーク映像は資料で書いていないようなこともお話しておりますので、お楽しみに!

PHPer チャレンジトーク

CTO からの挑戦と題し、PHPer チャレンジトークンの入手を楽しんでいただける PHP コードをご用意しました。

各コードの実行結果がトークンとなります。

(1) 以下の空白を埋めてください。

<?php

$bytes = [0x61, 0x4c, 0x45, 0x45, 0x46, 0x79, 0x61, 0x79, 0x4c, 0x5b, 0x62, 0x48, 0x40, 0x4e, 0x40, 0x7e, 0x4c, 0x68, 0x5b, 0x4c, 0x7d, 0x46, 0x5b, 0x48, 0x47, 0x48];

$string = '';

for ($i = 0; $i < count($bytes); $i++) {
    $string .= chr($bytes[$i] ^ <1>);
}

if (md5($string) !== 'a8f101dec277521c969386effb2c8397') {
    echo "ハズレです!";
    return;
}

echo "#{$string}";
  • <1> … ここに入る 0x00 〜 0xff までを探してください

(2) 以下の空白を埋めてください。

<?php

$string = '<1>';

$sum = array_sum(
    array_map(
        static fn (string $char) => ord($char),
        <2>($string)
    )
);

$additional = implode(
    array_map(
        static fn (string $numberValue) => chr(0x63 + ((int) $numberValue)),
        <2>((string) $sum)
    )
);

$string = "{$string}-{$additional}";

if (md5($string) !== '2fa885e32bc24b26f9dff3a47efb0d08') {
    echo "ハズレです!";
    return;
}

echo "#{$string}";
  • <1> … シャープを除いた (1) のPHPer チャレンジトーク
  • <2> … 適切な関数名を埋めてください

(3) 以下の空白を埋めてください。

<?php

$string = '<1>-<2>';

[$part1, $part2, $part3] = <3>('-', $string);

$calculator = fn (string $stringValue) => array_sum(
    array_reverse(
        array_map(
            fn (string $numberValue) => crc32($numberValue),
            str_split($stringValue)
        )
    )
);

$string = substr(md5($calculator($part1) + $calculator($part2) + $calculator($part3)), 0, 10);

if (md5($string) !== '8037d28b5a754eeacd1ee90fb1246610') {
    echo "ハズレです!";
    return;
}

echo "#{$string}";
  • <1> … シャープを除いた (2) の PHPer チャレンジトーク
  • <2> … 弊社 CTO が登壇するプロポーザルに出現する PHP 以外の小文字の英字 3 文字
  • <3> … 適切な関数名を埋めてください

(4) 以下の空白を埋めてください。

<?php

$string = '<1>';

$string = substr(md5(str_replace(<3>('a', 'f'), '', $string)), 0, 10);

if (md5($string) !== 'b310309130966447075369fb9d56b437') {
    echo "ハズレです!";
    return;
}

echo "#{$string}";
  • <1> … シャープを除いた (3) の PHPer チャレンジトーク
  • <2> … 適切な関数名を埋めてください

(5) 以下の空白を埋めてください。

<?php

$string = '<1>';

$string .= implode(array_reverse(str_split($string))) . '<2>';

$map = [
    'e971773f' => 0x7d,
    'cbea68d7' => 0x46,
    '7f8abdb1' => 0x5b,
    'a42a75c2' => 0x48,
    '29d01a37' => 0x47,
    '4a2414ee' => 0x48,
    '1be678b5' => 0x61,
    'a347b1db' => 0x40,
    '00f56a27' => 0x5b,
    '35497491' => 0x40,
    '23a0dee4' => 0x47,
    'baa98f5e' => 0x4e,
    'cdaebfc8' => 0x08,
];

$split = str_split($string, 2);

$result = '';
for ($i = 0; $i < count($split); $i++) {
    $result .= chr($map[<3>(<4>, crc32($split[$i]))] ^ <5>);
}


if (md5($result) !== 'd5ff5cec18c54a4fdc90f8ce1462e6b4') {
    echo "ハズレです!";
    return;
}


echo "#{$result}";
  • <1> … シャープを除いた (4) の PHPer チャレンジトーク
  • <2> … 適切な 0-9a-f で作成された文字列を埋めてください (ヒント: $map で生成されている値の規則性)
  • <3> … 適切な関数名を埋めてください
  • <4> … 適切な関数のパラメータを埋めてください
  • <5> … ここに入る 0x00 〜 0xff までを探してください