Video podcast de ViveCodigo 00x12 - 2do. Coding Dojo

"En esta emisión del podcast convocamos a la comunidad de desarrolladores a asistir al 2do. Coding Dojo de ViveCodigo.org, en donde les pusimos un par de retos a implementar: #7 Project Euler y Roman Numerals
Es interesante ver las respuestas de todos pues se utilizaron varios lenguajes y las soluciones incluso entre mismos lenguajes difieren en su implementación.
Les recomendamos leer el post del Dojo en ViveCodigo.org, pues encontrarán las referencias a las respuestas que se desarrollaron y en la mayoría de los casos los asistentes mejoraron sus soluciones.
Que lo disfruten tanto como nosotros..."

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de rodrigo salado anaya

Primos en JavaScript

Jajaja parece que andaba drogado. Pues como me da penita, hice el primer ejercicio pero con JavaScript y sin jQuery porque no fue necesario.
Saludos y muchas Gracias ViveCodigo : )

<script>       
        var isPrime = function(n){
                if(n <= 1){ return false}
                if(n <= 3){ return true }
                if(n%2 == 0){ return false}
                var lim = Math.sqrt(n)
                for(var i = 3; i <= lim; i++){
                        if(n%i == 0){
                                return false;
                        }
                }              
                return true;
        };
       
        var getSolution = function(n){
                var index = 0;
                while(n!=0){
                        if(isPrime(++index)){
                                n--
                        }
                }    
                return index;
        };
       
        /*TEST*/
        var assert = function(fun){
                if(fun) ; else throw 'error assert!!!';
        };
       
        assert( isPrime(-1) == false );
        assert( isPrime(0) == false );
        assert( isPrime(1) == false );
        assert( isPrime(2) == true );
        assert( isPrime(3) == true );
        assert( isPrime(4) == false );
        assert( isPrime(5) == true );
        assert( isPrime(6) == false );
        assert( isPrime(7) == true );
        assert( isPrime(8) == false );
        assert( isPrime(9) == false );
        assert( isPrime(10) == false );
        assert( isPrime(11) == true );
        assert( isPrime(12) == false );        
        assert( isPrime(13) == true );
        assert( isPrime(14) == false );
        assert( isPrime(15) == false );
        assert( isPrime(16) == false );
        assert( isPrime(17) == true );
        assert( isPrime(18) == false );
        assert( isPrime(19) == true );
        assert( isPrime(20) == false );
        assert( isPrime(21) == false );
        assert( isPrime(22) == false );
        assert( isPrime(23) == true );
        assert( isPrime(24) == false );
        assert( isPrime(25) == false );
       
        assert( getSolution(2) == 3 );
        assert( getSolution(3) == 5 );
        assert( getSolution(6) == 13 );
        assert( getSolution(10001) == 104743 );
</script>

Rompe el ciclo antes

Rodrigo: Para hace rmas rápida la ejecucion de tu codigo podrias romper el ciclo antes. Cuando haces esto:

if(n%i == 0){
    // is = false;
    return false; // asi pienso que seria mas rapidito
}

en ves de establecer el valor a false mejor retornalo. Ya que sabes que no es primo no tienes nada mas que validar.a ver pruebalo y nos compartes el resultado.

Imagen de rodrigo salado anaya

Gracias Gera…

Gracias Gera… ya actualice el código : )

En clojure

Primos

(defn div?[n m]
  (= (mod n m) 0))

(defn primo?[x]
    (cond (= x 2) true
          (or (< x 2) (div? x 2)) false
          true  (empty? (for [r (range 3  (+ (Math/sqrt x) 1) 2)  
          :when (div? x r)] [r]))))

(defn primo-nth[n]
    (last (take n (filter primo? (range)))))
(println (primo-nth 10001))

Romanos

(def romuni ["" "I" "II" "III" "IV" "V" "VI" "VII" "VIII" "IX" ] )
(def romdec ["" "X" "XX" "XXX" "XL" "L" "LX" "LXX" "LXXX" "XC"] )
(def romcen ["" "C" "CC" "CCC" "DC" "D" "DC" "DCC" "DCCC" "CM"])
(def rommi ["" "M" "MM" "MMM"])
(def romanos [romuni romdec romcen rommi])

(defn dig [n]  ;; Descompone un numero en sus digitos
  (cond (zero? n) nil
          true (cons (mod n 10) (dig (quot n 10)))))

;; Convierte decimal a romano.
;; Parte un numero ejem: 3999.
;; ( 9 9 9 3)
;; Lo asocia cada numero con su representacion en romano (IX XC CM MMM)
;; Une  la lista anterior en una cadena MMMCMXCIX.
(defn dectorom[n]
    (reduce #(str %2 %1 ) ""  (map #(%2 %1) (dig n) romanos)))

(println  (dectorom 3999))

Imagen de Sr. Negativo

Excelente !!

Muy buen vídeo.

Se ve que estuvo muy entretenida la reunión. Me gustó que usarán más de un lenguaje para resolver los ejercicios.

0_o

Imagen de rodrigo salado anaya

(Excelente BT(En clojure))

Te quedo muy bien tus soluciones, de hecho me gustaron mucho. Mi amigo Alcides Flores resolvió de esta manera el ejercicio de los números romanos http://pastebin.com/WALgBxxb en Lisp

Un saludo a @alcidesfp y a todos los demás tambien un saludos : )

Imagen de yngwie74

Muy buenas soluciones en Clojure BT

Me parece excelente el enfoque orientadas a las listas (o sequiencias/iterables/whatever) en contraposición a las soluciones más procedurales que hemos visto hasta ahora. Enhorabuena por una solución compacta, eficiente Y elegante.

Imagen de yngwie74

Primos en JavaScript (Rodrigo)

jajaja... ya ve como a todos se nos puede llegar a dormir el gallo en alguna ocasión?

Cuando comencé a escribir mi solución en javascript (https://gist.github.com/1714307), no sé qué me pasó pero no pude escribir getNthPrime hasta el 6o o 7o intento y solo usando yield (que hasta lo que sé, solo funciona en mozilla/firefox)

Creo que programar en .NET nos está comenzando a hacer daño, no? =)