Guía de uso de Kattis

Índice

El procedimiento para trabajar con Kattis consta de los pasos que se describen a continuación.

1 Registro en Kattis

En primer lugar, tienes que ir a la página de registro en la que pregunta

  • "Full Name" (es el nombre con que se mostrarán tus estadísticas, te recomiendo que ponga tu nombre completo).
  • "E-email" (es el correo en donde recibirás las notificaciones de Kattis)
  • "Password" (es la clave que usarás para acceder a tu cuenta en Kattis).

Cuando lo tengas relleno, debes de pulsar en "Submit".

Al pulsar, aparece la página de configuración del perfil con los siguientes campos:

  • "Username": debes de cambiar el que ha cogido a partir de tu nombre por tu UVUS (todo en minúscula).
  • "Country": debes de seleccionar Spain
  • "Subdivision": debes de seleccionar Andalusia
  • "University": debes de seleccionar "University of Seville"
  • "Prefered language": debes de seleccionar English
  • "Preferred time zone": debes de seleccionar Madrid
  • "Default programming language": debes de seleccionar Haskell

Al final de la página, debes de pulsar en "Update"

Kattis te enviará un correo para validar tu cuenta. Abre el correo y la valida.

2 Solución de un problema simple: "Hello World!"

Después de validar la cuenta de Kattis, entra en el problema Hello World!

El objetivo es escribir la cadena "Hello World!"

Abre un fichero en tu ordenador (por ejemplo, hello.hs) y escribe la solución

main :: IO ()
main = putStrLn "Hello World!\n"

Después, de escribir la solución en tu ordenador

  • vuelve a la página del problema,
  • pulsa el botón "Submit" (que está en verde colocado en la esquina superior derecha),
  • pulsa en "Drag & drop a file here to upload",
  • selecciona el fichero con la solución (en este caso hello.hs) y
  • pulsa el botón "Submit".

Kattis corregirá automáticamente tu solución y actualizará tus estadísticas junto con las de la Universidad de Sevilla y las de España.

3 Solución de un problema con datos de entrada y salida

El problema "Hello World!" no tenía datos de entrada. Vamos a ver la estructura básica de los problemas con datos de entrada y salida comentando la solución del problema A different problem.

Una forma de proceder es la siguiente:

  • crear una carpeta para los problemas de Kattis (puedes ponerla en C:/I1M/Kattis)
  • en la carpeta de Kattis crear una carpeta para el problema (por ejemplo, Different que quedaría como c:/I1M/Kattis/Different)
  • ir a A different problem y pulsar en Sample data files para descargar los ficheros de prueba y descargar el fichero samples.zip en el directorio del problema (en este caso, C:/I1M/Kattis/Different)
  • descomprimir el fichero samples.zip y se extrae los ficheros sample.in y sample.ans (con la extensión .in se indica los ficheros de entrada y con la extensión .ans la respuesta esperada en los de salida)
  • borrar el fichero samples.zip
  • crear el fichero Different.hs para escribir la solución.

La solución es

main :: IO ()
main = interact resolucion

-- λ> resolucion <$> readFile "sample.in" >>= putStr 
-- 2
-- 71293781685339
-- 12345677654320
resolucion :: String -> String
resolucion = escribeSalida . solucion . leeEntrada

-- λ> leeEntrada <$> readFile "sample.in"
-- [10,12,71293781758123,72784,1,12345677654321]
leeEntrada :: String -> [Integer]
leeEntrada = map read . words

-- λ> solucion [10,12,71293781758123,72784,1,12345677654321]
-- [2,71293781685339,12345677654320]
solucion :: [Integer] -> [Integer]
solucion (x:y:zs) = abs (x - y) : solucion zs
solucion _        = []

-- λ> escribeSalida [2,71293781685339,12345677654320]
-- "2\n71293781685339\n12345677654320\n"
escribeSalida :: [Integer] -> String
escribeSalida = unlines . map show

En el fichero tiene que tener una función principal (main) de tipo IO() que interactivamente llama a la función resolucion que

  • lee los datos de entrada, con la función leeEntrada;
  • soluciona el problema, con la función solucion;
  • escribe los datos de salida, con la función escribeSalida e

Cuando se está resolviendo un problema, es conveniente seguir las enntras y salida de cada una de las funciones con los ejemplos del problema.

José A. Alonso

2019-11-05 mar 19:41