29 апреля 2010

Odd Man Out

Заглянул в Google Code Jam - очень интересные задачки. Для задачи Odd Man Out вот такое решение у меня получилось:

<?php

$file = file('in.txt');
$fh = fopen("out.txt", 'w');

for($i=0; $i<$file[0]; $i++)
{
$values = array_flip(array_count_values(explode(" ", str_replace("\n", "", $file[$i*2+2]))));
fwrite($fh, "Case #".($i+1).": ".$values["1"]."\n");
}

fclose($fh);

?>

К слову, из 20 победителей, эту задачу решали только на C++ и Python. Да и решения не совсем элегантные - в основном с использованием циклов, по аналогии с карманной сортировкой. Тот карман, к котором будет 1 элемент будет иметь индекс одинокого гостя. Хотя элегантность тут мало поможет - на решение задачи дается всего 8 минут...

Есть и другое решение для этой задачи - использовать исключающее или (XOR).
Однако PHP предоставляет функции, которые позволяют решить задачу буквально в одну строку...