\documentclass{article}
\usepackage[left=2cm,right=2cm,top=3cm,bottom=3cm,letterpaper]{geometry}
\usepackage[spanish]{babel}
\usepackage[utf8]{inputenc}
\author{Profesora: <NAME>\\
  Ayudante teoría: <NAME>\\
  Ayudante laboratorio: <NAME>}
\title{Practica 1 - Principios de Racket y Recursión}
\date{Fecha de inicio: 30 de enero de 2015\\
  \textbf{Fecha de entrega: 13 de febrero de 2015}}
\begin{document}
\maketitle
\section{Instrucciones}
En esta práctica se tienen once ejercicios, los primeros diez son
obligatorios siendo solamente el ultimo opcional con valor de un punto
extra. Por lo tanto la calificación máxima que se puede obtener en
esta práctica es 11.

Esta practica se puede entregar en equipos de a lo máximo dos
personas, pero se recomienda que esta practica la hagan de forma
individual.

Esta práctica debe ser implementada con la variante plai, es decir
su archivo rkt debe tener como primer linea lo siguiente:
\texttt{\#lang plai}

Todos los ejercicios requieren contar con pruebas mediante el uso de
la función \texttt{test}:
\begin{verbatim}
(test <result-expr> <expected-expr>)
\end{verbatim}

En donde \textit{result-expr} es la expresión que se evalúa a cierto
valor que es comparado con \textit{expected-expr} que es otra
expresión que evalúa al valor esperado. Si las dos expresiones evalúan
a lo mismo la prueba imprime el éxito de la prueba, en caso contrario
indicar un error.

\begin{verbatim}
> (test (+ 1 2) 3)
(good (+ 1 2) 3 3 "at line 34")

> (test (+ 1 2) 4)
(bad (+ 1 2) 3 4 "at line 36")
\end{verbatim}

Cada ejercicio debe contar al menos con cinco pruebas.

\section{Ejercicios}
\textbf{Sección I.} Define las funciones que se te piden. Puedes crear y utilizar
funciones auxiliares. No puedes utilizar funciones de Racket que
resuelvan \textbf{directamente} los ejercicios.
\begin{itemize}
\item $\textbf{mcd \& mcm}$ - Define las funciones mcd y mcm que
  toman dos números y regresan su máximo común divisor y mínimo común
  múltiplo respectivamente, \textit{i.e.}
\begin{verbatim}
> (mcd 72 32)
8
> (mcm 8 6)
24
\end{verbatim}

\newpage

\item $\textbf{average}$ - Dado una lista no vacía de números, regresar el
  promedio de esta, \textit{i.e.}
\begin{verbatim}
> (average ’(5))
5
> (average ’(3 2 6 2 1 7 2 1))
3
> (average ’(10 7 13))
10
\end{verbatim}

\item $\textbf{primes}$ - Dado un numero entero positivo regresar una lista los
números primos contenidos entre 2 y el numero entero dado, \textit{i.e.}
\begin{verbatim}
> (primes 30)
’(2 3 5 7 11 13 17 19 23 29)
> (primes 11)
'(2 3 5 7 11)
> (primes 1)
'()
\end{verbatim}

\item $\textbf{zip}$ - Dadas dos listas, regresar una lista cuyos elementos son
  listas de tamaños dos, tal que par la i-ésima lista, el primer
  elemento es el i-ésimo de la primera lista original y el segundo
  elemento es el i-ésimo de la segunda lista original, si una lista es
de menor tamaño que la otra, la lista resultante es del tamaño de la
menor, y si una de las listas es vacía, regresar una lista vacía,
\textit{i.e.}
\begin{verbatim}
> (zip ’(1 2) ’(3 4))
’((1 3) (2 4))
> (zip ’(1 2 3) ’())
’()
> (zip ’() ’(4 5 6))
’()
> (zip ’(8 9) ’(3 2 1 4))
’((8 3) (9 2))
> (zip ’(8 9 1 2) ’(3 4))
’((8 3) (9 4))
\end{verbatim}

\item $\textbf{reduce}$ - Dada una función de aridad 2 y una lista de
  n elementos, regresar la evaluación de la función encadenada de
  todos los elementos, \textit{i.e.}
\begin{verbatim}
> (reduce + ’(1 2 3 4 5 6 7 8 9 10))
55
> (reduce zip ’((1 2 3) (4 5 6) (7 8 9)))
’((1 (4 7)) (2 (5 8)) (3 (6 9)))
\end{verbatim}

\end{itemize}

\textbf{Sección II.} Define las funciones que se te piden. Puedes crear
y utilizar funciones auxiliares. Para el manejo de listas sólo puedes
utilizar funciones básicas de Racket como son \texttt{car, cdr, cons,
  list, empty, empty?, if, let, let*}

\begin{itemize}
\item $\textbf{mconcat}$ - Dadas dos listas, regresa la concatenación
  de la primera con la segunda, \textit{i.e.}
\begin{verbatim}
> (mconcat ’(1 2 3) ’(4 5 6))
’(1 2 3 4 5 6)
> (mconcat ’() ’(4 5 6))
’(4 5 6)
> (mconcat ’(1 2 3) ’())
’(1 2 3)
\end{verbatim}

\item $\textbf{mmap}$ - Dada una función de aridad 1 y una lista,
  regresar una lista con la aplicación de la función a cada uno de los
  elementos de la lista original, \textit{i.e.}
\begin{verbatim}
> (mmap add1 ’(1 2 3 4))
’(2 3 4 5)
> (mmap car ’((1 2 3) (4 5 6) (7 8 9)))
’(1 4 7)
> (mmap cdr ’((1 2 3) (4 5 6) (7 8 9)))
’((2 3) (5 6) (8 9))
\end{verbatim}

\item $\textbf{mfilter}$ - Dado un predicado de un argumento y una
  lista, regresar la lista original sin los elementos que al aplicar
  el predicado, regresa falso (un predicado es una función que
  regresa un valor booleano), \textit{i.e.}
\begin{verbatim}
> (mfilter (lambda (x) (not (zero? x))) ’(2 0 1 4 0))
’(2 1 4)
> (mfilter (lambda (l) (not (empty? l))) ’((1 4 2) () (2 4) ()))
’((1 4 2) (2 4))
> (mfilter (lambda (n) (= (modulo n 2) 0)) ’(1 2 3 4 5 6))
’(2 4 6)
\end{verbatim}

\item $\textbf{mreverse}$ - Dada una lista, regresar otra lista con
  los elementos de la lista original en orden inverso, \textit{i.e.}
\begin{verbatim}
> (mreverve ’(1 2 3 4 5))
’(5 4 3 2 1)
> (mreverve ’(100 99))
’(99 100)
> (mreverve ’())
’()
\end{verbatim}

\item $\textbf{mpowerset}$ - Dada una lista, regresar otra como el
  conjunto potencia de la original (un conjunto potencia de S es un
  conjunto de subconjuntos de S), \textit{i.e.}
\begin{verbatim}
> (mpowerset ’())
’(())
> (mpowerset ’(1))
’(() (1))
> (mpowerset ’(1 2))
’(() (1) (2) (1 2))
> (mpowerset ’(1 2 3))
’(() (1) (2) (3) (1 2) (1 3) (2 3) (1 2 3))
\end{verbatim}
\end{itemize}

\textbf{Punto extra:} \texttt{day-of-week} - Dado un año, mes y día,
determinar qué día de la semana es, empezando desde 0 con lunes y
terminando domingo con 6, \textit{i.e.}
\begin{verbatim}
> (day-of-week 2014 2 10)
0
> (day-of-week 2014 2 16)
6
> (day-of-week 2016 2 29)
0
\end{verbatim}
\end{document}
