<?php [$columns, $movements] = explode("\n\n", file_get_contents('./input.txt')); $columns = parseColumns($columns); $movements = explode("\n", $movements); foreach ($movements as $movement) { preg_match('/^move (\d+) from (\d+) to (\d+)$/', $movement, $matches); [, $number, $from, $to] = $matches; $elements = array_splice($columns[$from], count($columns[$from]) - $number, $number); $columns[$to] = array_merge($columns[$to], $elements); } echo implode(array_map('array_pop', $columns)); function parseColumns(string $columns) { $parsed_columns = []; $rows = array_map('str_split', explode("\n", $columns)); array_unshift($rows, null); $rows = array_map(...$rows); $rows = array_map('array_reverse', $rows); foreach ($rows as $row) { $number = array_shift($row); if (!is_numeric($number) || empty($number)) { continue; } $parsed_columns[$number] = array_filter($row, fn($cell) => !empty(trim($cell))); } return $parsed_columns; }