Code Golf – Saving Time

Code Golf es un sitio donde se juega a resolver problemas informáticos en la menor cantidad posible de pulsaciones de tecla. Para ello pueden utilizarse lenguajes como Perl, PHP, Python y Ruby. Quien resuelva el desafío en menor cantidad de keystrokes es quien tendrá mayor puntaje.

Me anoté en uno llamado Saving Time y llegué al puesto 20 de PHP, con 245 keystrokes. (2009-03-27: Aunque ahora me encuentro en el 22, malditos nerds!)

El desafío consiste en crear la cara de un reloj analógico partiendo de una hora dada en formatohh:mm. Algunas de las reglas son

  • La hora dada en hh:mm se representa con una ‘h’ minúscula.
  • La hora que indica los minutos dados en hh:mm se representa con una ‘m’ minúscula.
  • Cuando hora y minutos coinciden en la misma posición se representa con una ‘x’ minúscula.
  • El resto de las horas se representan con una ‘o’ minúscula.
  • Los minutos deben redondearse al múltiplo de 5 más cercano (23 se convierte en 20, 39 en 35, etc.)

Salida del programa

Código

<?$f="874D1F0D1748110202020201";
list($h,$m)=split(':',fgets(STDIN));
if($h>=12)$h-=12;
$m=floor($m/5);$a=$i=12;
while($i){$a+=$i%2?$i:-$i;
echo str_pad("",hexdec($f{--$i})).
(($a==$h)?($h==$m?'x':'h'):($a==$m?'m':'o')).
str_repeat("\n",$f{$i+12});}?>

El string hexadecimal $f contiene el formato necesario para “dibujar” el reloj. Para interpretarlo es necesario dividirlo en dos mitades. La primera mitad contiene, en cada caracter hexadecimal, la distancia a la que se encuentra respecto de su elemento anterior, que puede ser el número de la izquierda o un salto de línea. De aquí surge el por qué de haber usado el sistema hexadecimal: el espacio mayor a representar es 15. En la segunda mitad cada caracter representa la cantidad de saltos de línea que preceden al caracter.

Tags: ,

Comments are closed.