Solución al reto de programación I

Solución al reto de programación I
31/12/08


¡Llegó el momento!. Me alegra observar que la participación ha sido considerable en este primer reto de programación que planteé. Si no habías oído hablar de él no leas las soluciones aún, no seas tonto y aventúrate a conseguirlo por ti mismo.

Para ver algunas de las soluciones propuestas por los lectores (y un servidor) sigue leyendo…

Para pasar al siguiente reto ve aquí.

Para empezar, y como prometí, aquí publico mi solución (en Java). Posteo el método main completo, para que podais probarlo en vuestro PC con un simple copy-paste. Los elementos del array se pasan como argumentos, por linea de comandos, separados por espacios. Ahí va:

sgm (YakiBoo) – Lenguaje: Java

public static void main(String[] array) {
  int a = 0, b = 1;
  int longitud = array.length;
  String repetido = "Ninguno";
  int i;
  for(i=0; i<longitud*longitud && a<longitud-1; i++){
    if (a<longitud-2 && i!=0 && i%longitud==0){
      a++;
      b = a + 1;
    }
    if (array[a].equals(array[b])) {
      i = longitud * longitud;
      repetido = array[a];
    }
    if (b < longitud - 1) {
      b++;
    }
  }
  System.out.println("Repetido: " + repetido);
}

Ahora le toca a los lectores. Así que a continuación podrás encontrar las diferentes soluciones que me habeis enviado, junto al protagonista de cada fragmento de código:

Pablo – Lenguaje: PHP

<?php
  $vector = array('Maria', 'Luis', 'Alberto2',
                  'Alberto', 'Cesar', 'Adriana',
                  'Cesar3', 'Adriana');
  $temporal ="";
  sort($vector);
  while (list($i,$valor)=each($vector))
  {
    if($temporal==$valor) echo "Repetido: ". $valor;
    $temporal=$valor;
  }
?>

Rodrigo Testillano – Lenguaje: C

#include <stdio.h>

int main(int argc, char **args)
{
  int a,b,n,i,longitud,aux,repe;
  longitud = 5; /*vale cualquier longitud*/
  int m[] = {1,2,4,0,3};
  n = longitud;
  a = 0;
  b = a+1;
  for(i=0; i<n; i++)
  {
    if(b==longitud){ a++; b = a+1; n--; i = 0;}
    if(m[a]==m[b]){repe = m[a]; aux = 1; break; }
    else b++;
  }
  if (aux != 1) printf("No hay repetidos\n");
  else printf("%s%i\n", "Elemento repetido: ", repe);
  return 0;
}

Maek – Lenguaje: Java

OBJETO array [];
OBJETO actual = null;
int posicion1 = 0;
int posicion2 = 1;
boolean repetido = false;
while (!repetido) {
  actual = array[posicion1];
  if (actual == array[posicion2]) {
    repetido = true;
  } else {
    posicion2++;
  }
  if (posicion2 == array.length) {
    posicion1++;
    posicion2 = posicion1 + 1;
  }
}
return posicion2;

Jose Luis Espinosa – Lenguaje: Matlab

for i=1:length(matriz)
  b=find(matriz==matriz(i));
  if length(b)>1
    solucion=matriz(i);
  end
end

Además, Jose Luis nos propuso otras soluciones: mediante recursividad y utilizando estructuras de datos.

Con recursividad:

int elemento_repetido(int[] matriz){
  for(i=0;i<matriz.length;i++){
    int encontrado=buscar(matriz[i],i+1,matriz);
    if (encontrado==1) return a[i];
  }
}
int encontrado(int buscado, int pos, int[] matriz){
  if (pos==matriz.length) return 0;
  if (buscado==matriz[pos]) return 1;
  else return encontrado(buscado, pos+1, matriz);
}

Con estructuras de datos:

/*Usando árboles binarios (deberían estar implementados
algunos métodos get y set jeje)*/

int elemento_repetido(int[] matriz){
  int[] matriz;
  arbol_binario arbol;
  for (int i=0;i<matriz.length;i++){
    int result=arbol.insertar(matriz[i]);
    if (result==1)
      System.out.println("Repetido: "+matriz[i]);
  }
}

public int insertar(int i){
  int a=0;
  if (this.nodo==i) a=1;
  else{
    if (i>this.nodo){
      if(this.getder()==null)
        this.setder(new arbol_binario(i));
      else a=this.getder().insertar(i);
    }
    else{
      if(this.getizq()==null)
        this.setizq(new arbol_binario(i));
      else a=this.getizq().insertar(i);
    }
  }
  return a;
}

Lesthack – Lenguaje: Python

#! /usr/bin/env python
# -*- coding: UTF-8 -*-
if __name__ == "__main__":
  vector = [1,5,3,4,2,5]
  while(len(vector)>0):
    temp = vector.pop()
    if temp in vector:
      print "Elemento repetido:",temp

Gracias a todos los que habeis colaborado enviando vuestra solución. Esto motiva a proponer más retos. No os alejeis mucho de YakiBoo porque mañana o pasado mañana publicaré el “Segundo reto de programación” (promete ser curioso, aunque algo más complicado).

Un saludo.

Actualización (14-11-2010)

Una nueva solución, de Christian Caldera, en Java:

public static int detectarRepetido(int v[]){
  int i=0,j=0;
  while(!(v[j]==v[i] && i!=j)){
    if(i+1==v.length)
    {
      i=0;
      j++;
    }
    i++;
  }
  return v[j];
}

Escrito por sgm


Puedes dejar un comentario, o referenciar este post desde tu sitio web.

Hay 4 comentarios en este post.

 
JoseL.Espinosa Diciembre 31, 2008 Reply

Eso eso, uno más jodío jeje, así ya tengo excusa pa no ponerme a hacer las prácticas XD

 
Atribute Enero 30, 2009 Reply

pseudocodigo

array(1,4,5,2,3,1,9,0)

create myarray[0..9]
set zero myarray
while not end of array do
get element in array
increment myarray[element]
if myarray[element] is greater than one then element is repeated, end; otherwise continue

 
sgm Enero 30, 2009 Reply

Interesante solución!
Es perfectamente válida para un array de enteros. La única pega es si el array fuese de otros elementos…
Pero bien bien, gracias por la idea.
Un saludo.

 
Atribute Febrero 4, 2009 Reply

Si, pero ya eso depende del lenguaje de prog que utilices; hay lenguajes que aceptan cadenas como indices de arreglos, entonces el arreglo ya no estaria restringido a los enteros.

Saludos, Atribute.

Responde