<?php

function flatten(array $array)
{
    $result = [];
    foreach ($array as $value) {
        $key = current(array_keys($value));
        $result[$key] = $value[$key];
    }

    return $result;
}

function generate_patterns($sequence_length)
{
    $base_pattern = [0, 1, 0, -1];
    $base_pattern_length = count($base_pattern);
    $patterns = [];
    for($i = 0; $i <= $sequence_length; $i++) {
        $current_pattern = [];
        $j = $i + 1;
        // $i = 0, pattern = $base_pattern en boucle
        // $i = 1, pattern = chaque base pattern * $j (en virant le 1er)
        for ($m = 0; $m <= $sequence_length / $base_pattern_length; $m++) {
            foreach ($base_pattern as $kValue) {
                if (array_key_exists($i, $current_pattern)) {
                    $current_pattern[$i] .= str_repeat($kValue.',', $j);
                } else {
                    $current_pattern[$i] = str_repeat($kValue.',', $j);
                }
            }
        }

        $patterns[] = substr($current_pattern[$i], 2);
    }

    unset($current_pattern, $i, $j, $m, $k);

    return $patterns;
}

$sequence = str_split(file_get_contents('input.txt'));
$sequence_length = count($sequence);

echo "generating patterns…\n";
$patterns = generate_patterns($sequence_length);
echo "patterns generated\n";
for ($loops = 0; $loops < 100; $loops++) {

    $numbers = [];
    foreach ($sequence as $i => $number) {
        $line_pattern = explode(',', $patterns[$i]);
        $numbers[] = substr(
            array_sum(
                array_map(function($number, $pattern) use ($line_pattern) {
                    return $number * $line_pattern[$pattern];
                }, $sequence, range(0, $sequence_length))
            ), -1
        );
    }
    $sequence = $numbers;
    echo "loop $loops finished\n";
}

echo implode('', array_slice($sequence, 0, 8));