This is Sparta: Maratones de programación

This is Sparta: Maratones de programación

Así es tal vez a cualquiera que haya estado escribiendo código contra el tiempo se ha sentido como en una maratón de programación; y es que acá no importa las buenas prácticas de código, ni la segmentación, ni mucho menos la complejidad temporal que tenga el código (Si no lo pide el problema ) acá solo importa dar una solución y RÁPIDA a un problema propuesto muchas veces para romperte los cojones, pero seamos sinceros, todos nos hemos preguntado alguna vez, porque los problemas de maratones de programación tienen una historia que contar con todo un árbol de comedia donde los competidores se pueden perder. Porque no simplemente son como los problemas de projecteuler : The prime factors of 13195 are 5, 7, 13 and 29. What is the largest prime factor of the number 600851475143. Eso es lo que uno necesita en una maratón de programación, que sean directos, que vayan al grano y no lo pongan a uno a dudar en la historia donde la mayoría de las maratones se encuentran en inglés y solo aquellos versados en esta lengua y con las cualidades de programar, poseen el don de resolver los problemas de manera solitaria, para aquellos que no poseen las dos características forman los llamados grupos de maratón, conjunto cerrado de 3 o 2 personas, donde o las dos programan y saben la lengua o una sabe la lengua y le traduce al otro, como tal cual extranjero tratando de interpretar donde se encuentra la parada del autobús. Pero está bien es hora de mostrarles un problema de maratón algo fácil sin tanta historia así como nos gustan y como siempre resuelto por varias personas para que podáis ver  las diferentes soluciones implementadas en lenguajes desde Javascript pasando por Java y C++.

2011 – 1.Digital Roots

Introducción

Iniciamos el 2011, con una nueva serie de ejercicios para que desarrollemos nuestro pensamiento algorítmico y para obtener una mayor habilidad en el lenguaje de nuestra elección y en uno de los fundamentos básicos de las maratones de programación, el manejo de Strings.

Metodología

A continuación se les planteará el problema a resolver, se debe tener en cuenta que en las maratones de programación, los valores de entrada y los de salida, deben ser archivo planos, por esta razón es importante que el nombre del archivo de lectura (Entrada) concuerde con el especificado en la prueba y lo mismo para el archivo de escritura (Salida). Archivo de entrada: roots.in Archivo de salida: roots.out:

The digital root of a positive integer is found by summing the digits of the integer. If the resulting value is a single digit then that digit is the digital root. If the resulting value contains two or more digits, those digits are summed and the process is repeated. This is continued as long as necessary to obtain a single digit. For example, consider the positive integer 24. Adding the 2 and the 4 yields a value of 6. Since 6 is a single digit, 6 is the digital root of 24. Now consider the positive integer 39. Adding the 3 and the 9 yields 12. Since 12 is not a single digit, the process must be repeated. Adding the 1 and the 2 yeilds 3, a single digit and also the digital root of 39. Input The input le will contain a list of positive integers, one per line. The end of the input will be indicated by an integer value of zero. Output For each integer in the input, output its digital root on a separate line of the output.

Sample Input 24 39 0

Sample Output 6 3

Soluciones

C++

 /************************************************
* Nombre : Solución_reto_1.cpp *
* *
* Raíces digitales  *
* Problema propuesto por Monje  *
* *
* Radical *
* *
************************************************/
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
main()
{
      string a_x1;
      while(cin>>a_x1)
      {if(a_x1=="0"){break;break;}
      a:
      if(a_x1.size()>1)
      { int a_x2=0;

 for(int i=0;i<a_x1.size();i++){

                               a_x2+=(int)a_x1[i] - 48;

                                }
                                 a_x1.clear();
                       if(a_x2<10 )
                       {
                          cout<<a_x2<<endl;
                 }

else {
stringstream out;
out << a_x2;
a_x1 = out.str();
     goto a;}
 }
 }
      getchar();
      }

Java

/************************************************
* Nombre : Solución_reto_1.cpp *
* *
* Raíces digitales  *
* Problema propuesto por Monje  *
* *
* Monje y Galatea *
* *
************************************************/
public class Root {
	private Vector numeros= new Vector();

	public static void main(String[] args) throws Exception {
		Root r= new Root();
		r.leer();
		r.metodoRaiz();
	}

	public void leer() throws Exception{
		File f = new File( "root.in" );
		BufferedReader entrada = new BufferedReader( new FileReader( f ) );
		String linea;
		while ((linea= entrada.readLine()) !=null) {
			numeros.addElement(linea);
		}
	}

	public void metodoRaiz(){
		for (int i = 0; i < numeros.size(); i++) {
			String numero=(String) numeros.get(i);
			int arrEnteros[]=convertir(numero);
			calcular(arrEnteros);
		}
	}

	private void calcular(int[] arrEnteros) {
		String resultado="10";
		int raiz=0;
		while(resultado.length()!=1){
			raiz=0;
			for (int i =0; i < arrEnteros.length; i++) {
				raiz= raiz+ arrEnteros[i];
			}
			resultado= String.valueOf(raiz);
			arrEnteros=convertir(resultado);
		}
		if (Integer.parseInt(resultado)!=0) {
			System.out.println(resultado);
		}

	}

	public int [] convertir(String numero){
		char raiz [] = numero.toCharArray();
		int  convertir[]=new int [raiz.length];
		for (int i = 0; i < raiz.length; i++) {
			String num=String.valueOf(raiz[i]);
			convertir[i]=Integer.parseInt(num);
		}
		return convertir;
	}
}

/************************************************
* Nombre : Solución_reto_1.cpp *
* *
* Raíces digitales  *
* Problema propuesto por Monje  *
* *
* edgarof *
* *
************************************************/

package pruebas;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

public class Main {

    public static void main(String[] args) throws Exception {
     //Main m=new Main();
   //  m.lectura();
     int o=0;

        String h[]={"992"};
        for(int i=0;i<h.length;i++){
          String u =h[i];
      char[] temp = u.toCharArray();
      for(int j=0;j<temp.length;j++){
         char l=temp[j];
         String y= ""+l;
          o += Integer.parseInt(y);
         System.out.println(o);
          }
      int s=o;
        calcular(s);
                }
        }

    private static void calcular(int s) {
       int p=s;
       int r=0;
       if(p>10){
String numCadena= p+"";
 char[] temp2 = numCadena.toCharArray();
    for(int j=0;j<temp2.length;j++){
        char ñ= temp2[j];
        String y= ""+ñ;
        r+= Integer.parseInt(y);
            System.out.println(r);
    }
        }else
            System.out.println(p);
}
}

JavaScript

//Nombre : Solución_reto_1.cpp
/* * * * Raíces digitales * *
Problema propuesto por Monje * * * * 4ng3r*/
window.onload = function(){
 digitalRoots.leer();
 }

 digitalRoots = {
 leer: function(){
 var ajax = new XMLHttpRequest();
 var right_now = new Date();
 ajax.open("GET","http://localhost/datos.txt",true);
 ajax.send(null);</p>
<p style="text-align: left;">
 ajax.onreadystatechange = function(){
 if(ajax.readyState == 4){
 digitalRoots.calcular(ajax.responseText.split("\n"));
 }
 };

 },

 calcular: function(arreglo){
 for( i in arreglo){
 if(arreglo[i] == 0)
 return;

 var sum=0;
 for(j = 0; j < arreglo[i].length-1; j++)
 sum += parseInt(arreglo[i].charAt(j));

 while(sum >= 10){
 var tmp = String(sum);
 sum = 0;
 for(j = 0; j < tmp.length; j++)
 sum += parseInt(tmp.charAt(j));
 }

 this.crearElemento(sum)
 }
 },

 crearElemento: function(sum){
 document.getElementById("resultado").innerHTML += sum+"<br>";
 }
 }
<html>
 <head>
 <title>:: Digital Roots ::</title>
 <script src="digitalRoots.js"></script>
 </head>
 <body>
 <div id="resultado">
 </div>
 </body>
</html>

Así que si tienes una recomendación para las maratones de programación, comentala y así podremos armar un post de recomendaciones bien enriquecido. 🙂

Radical es ingeniero de sistemas, le gusta estar en constante aprendizaje y crear aplicaciones que automaticen procesos. Es un apasionado por los patrones en ingeniería social, procesamiento del lenguaje natural y la interacción hombre máquina. Portavoz de RIC.

1 Comentario

  1. Responder

    Creo que puede llegar a gustarte mucho este foro, está lleno de ejemplos como ese: http://codegolf.stackexchange.com/

Deja un comentario

Your email address will not be published. Required fields are marked *

You may use these <abbr title="HyperText Markup Language">HTML</abbr> tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>