\documentclass[]{article}
\usepackage[utf8]{inputenc}
\usepackage[spanish]{babel}
\usepackage{listings}
\usepackage{xcolor}
\usepackage[a4paper, total={6.5in, 8in}]{geometry}

\definecolor{codegreen}{rgb}{0,0.6,0}
\definecolor{codegray}{rgb}{0.5,0.5,0.5}
\definecolor{codepurple}{rgb}{0.58,0,0.82}
\definecolor{backcolour}{rgb}{0.95,0.95,0.92}

\lstdefinestyle{mystyle}{
	backgroundcolor=\color{backcolour},   
	commentstyle=\color{codegreen},
	keywordstyle=\color{magenta},
	numberstyle=\tiny\color{codegray},
	stringstyle=\color{codepurple},
	basicstyle=\ttfamily\footnotesize,
	breakatwhitespace=false,         
	breaklines=true,                 
	captionpos=b,                    
	keepspaces=true,                 
	numbers=left,                    
	numbersep=5pt,                  
	showspaces=false,                
	showstringspaces=false,
	showtabs=false,                  
	tabsize=2
}

\lstset{style=mystyle}

\newcommand{\quotes}[1]{``#1''}

%opening
\title{Soluciones a los principales problemas con arreglos}
\author{betology}
\date{}

\begin{document}

\maketitle

\section{Código en Go para la función findPeak}

La siguiente función en Go encuentra todos los picos en un arreglo. Un elemento es considerado un pico si es mayor o igual a sus vecinos. A continuación, se presenta el código con su respectiva explicación.

\begin{lstlisting}[language=Go, caption={Código en Go para encontrar todos los picos en un arreglo}]
package main

import "fmt"

// findPeaks finds all peaks in the array
func findPeaks(arr []int) []int {
    var peaks []int
    n := len(arr)
    if n == 0 {
        return peaks
    }
    
    // Check if the first element is a peak
    if n == 1 || arr[0] >= arr[1] {
        peaks = append(peaks, arr[0])
    }
    
    // Check for peaks in the middle of the array
    for i := 1; i < n-1; i++ {
        if arr[i] >= arr[i-1] && arr[i] >= arr[i+1] {
            peaks = append(peaks, arr[i])
        }
    }
    
    // Check if the last element is a peak
    if n > 1 && arr[n-1] >= arr[n-2] {
        peaks = append(peaks, arr[n-1])
    }
    
    return peaks
}

func main() {
    arr := []int{1, 3, 20, 4, 1, 0, 5, 2, 1, 4, 1}
    peaks := findPeaks(arr)
    fmt.Println("Peaks are:", peaks)
}
\end{lstlisting}

\section{Explicación del código en Go}

Explicación de cada línea:

\begin{lstlisting}[language=Go, numbers=left, stepnumber=1]
package main

import "fmt"
\end{lstlisting}

\textbf{Líneas 1-2:} Definimos el paquete principal \texttt{main} y luego importamos el paquete \texttt{fmt}, que necesitaremos para imprimir los resultados en la consola.

\begin{lstlisting}[language=Go, numbers=left, firstnumber=3]
// findPeaks finds all peaks in the array
func findPeaks(arr []int) []int {
\end{lstlisting}

\textbf{Líneas 3-5:} Definimos una función llamada \texttt{findPeaks} que toma una matriz de enteros como entrada y devuelve una slice de enteros (que contiene todos los picos). 

\begin{lstlisting}[language=Go, numbers=left, firstnumber=6]
    var peaks []int
    n := len(arr)
    if n == 0 {
        return peaks
    }
\end{lstlisting}

\textbf{Líneas 6-10:} Inicializamos una slice vacía llamada \texttt{peaks} para almacenar los picos encontrados. Luego, obtenemos la longitud de la matriz de entrada \texttt{arr} y verificamos si está vacía. Si lo está, devolvemos la slice vacía.

\begin{lstlisting}[language=Go, numbers=left, firstnumber=11]
    // Check if the first element is a peak
    if n == 1 || arr[0] >= arr[1] {
        peaks = append(peaks, arr[0])
    }
\end{lstlisting}

\textbf{Líneas 11-15:} Comprobamos si el primer elemento de la matriz es un pico. Si la longitud de la matriz es 1 o si el primer elemento es mayor o igual que el segundo, entonces añadimos el primer elemento a la slice de picos.

\begin{lstlisting}[language=Go, numbers=left, firstnumber=16]
    // Check for peaks in the middle of the array
    for i := 1; i < n-1; i++ {
        if arr[i] >= arr[i-1] && arr[i] >= arr[i+1] {
            peaks = append(peaks, arr[i])
        }
    }
\end{lstlisting}

\textbf{Líneas 16-20:} Iteramos a través de los elementos intermedios de la matriz y verificamos si cada elemento es un pico comparándolo con sus vecinos. Si es así, lo añadimos a la slice de picos.

\begin{lstlisting}[language=Go, numbers=left, firstnumber=21]
    // Check if the last element is a peak
    if n > 1 && arr[n-1] >= arr[n-2] {
        peaks = append(peaks, arr[n-1])
    }
\end{lstlisting}

\textbf{Líneas 21-24:} Comprobamos si el último elemento de la matriz es un pico y lo añadimos a
