Skip to content

Instantly share code, notes, and snippets.

@josser
Created September 9, 2014 10:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save josser/812b8b2a92a38e4b479c to your computer and use it in GitHub Desktop.
Save josser/812b8b2a92a38e4b479c to your computer and use it in GitHub Desktop.
<?php
// dnepr -> ujgorod -> poltava -> kharkov -> kiev => odessa -> lvov -> doceck
$tickets = [
['start' => 'kiev', 'finish' => 'odessa'],
['start' => 'dnepr', 'finish' => 'ujgorod'],
['start' => 'odessa', 'finish' => 'lvov'],
['start' => 'kharkov', 'finish' => 'kiev'],
['start' => 'poltava', 'finish' => 'kharkov'],
['start' => 'ujgorod', 'finish' => 'poltava'],
['start' => 'lvov', 'finish' => 'doneck'],
['start' => 'lvov1', 'finish' => 'doneck'],
['start' => 'lvov', 'finish' => 'doneck1']
];
function getStacks($list) {
$stacks = [];
foreach ($list as $item) {
$stacked = false;
// crunch
if (!isset($item['items'])) {
$item['items'] = [$item];
}
foreach ($stacks as &$stack) {
if ($stack['start'] == $item['finish'] && !$stacked) {
$stack['items'] = array_merge($item['items'], $stack['items']); // unshift
$stack['start'] = $item['start'];
$stacked = true;
}
if ($stack['finish'] == $item['start'] && !$stacked) {
$stack['items'] = array_merge($stack['items'], $item['items']); // push
$stack['finish'] = $item['finish'];
$stacked = true;
}
}
if ($stacked == false ) {
$stacks[] = $item;
}
}
return $stacks;
}
$iterations = 0;
$initialTicketsSize = sizeof($tickets);
do {
$tickets = getStacks($tickets);
$iterations++;
} while (sizeof($tickets) != 1 && $iterations <= $initialTicketsSize);
var_dump($tickets);
var_dump($iterations);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment