Retos de java

Iniciado por 4dr14n31t0r, 19 Enero 2016, 20:54 PM

0 Miembros y 1 Visitante están viendo este tema.

4dr14n31t0r

No se si este es el lugar correcto para proponer retos de java, si no es asi le pido a los moderadores que muevan este hilo al sitio correcto.

Reto 1: Adios punto y coma.
¿Serías capaz de programar en java sin utilizar este simpatico caracter para separar sentencias?
EDITO(22/01/2016) Por ejemplo, hacer un algoritmo de ordenamiento sin usar los que ya proporciona java
Nota: es posible.

Reto 2: Perdido entre las dimensiones
¿A que no eres capaz de crear una función que declare un array de N dimensiones? (Es decir, que devuelva un objeto de una clase generica en el que su atributo generico sea del tipo array de N dimensiones)
Si ademas eres capaz de inicializarlo me habrás superado

Reto 3: Recursividad sin recursos
Supongamos el caso de una funcion recursiva. Lo normal es que cuando se llame a si mismo lo haga pasando por parametro un valor diferente. Por ejemplo, el factorial de un numero es ese por el factorial del anterior. Pero ¿Seria posible hacer recursividad si la funcion no tiene parametros por el cual pasarle nuevos valores cuando se llama asi mismo? Claro que si. Solo habria que usar atributos de la clase en la que implementas la funcion, pero ¿Que tal si te digo que no puedes usar esos atributos? ¿Como harias una funcion recursiva entonces? (Reto añadido el 22/01/2016)

Reto 4: Bucles y mas bucles
Si quieres sumar todos los numeros de 1 a N, (Es decir, el sumatorio de los primeros N numeros) haces un bucle. Si quieres sumar todos los sumatorios de 1 a N (Sumatorio de sumatorio, llamemosle sumatorio de grado 2) haces un bucle dentro de un bucle. ¿A que no te atreves a sumar el sumatorio de grado G de los numeros de 1 a N? Existe una formula matematica, pero la idea es hacer N bucles dentro de bucles (Reto añadido el 22/01/2016)

EDITO(22/01/2016):Respecto del problema del punto y coma, me refiero a no utilizarlo en situaciones que normalmente harian falta. Por ejemplo suponte que tengo un array y quiero ordenarlo, pero tuviera que crear el metodo en lugar de usar uno como Arrays.sort ¿Que hariais entonces? ¿A que ya no parece tan sencillo?
De todos modos vosotros tambien podeis sugerir retos en este mismo hilo. Si lo veo edito este mensaje y lo añado por cortesia del que haya sugerido el reto.

0xFer

#1
Hola, me gusta la idea pero los problemas que propones son muy pocos y no me parecen adecuados, por ejemplo el primer problema no es como para sentarse todo el día y teclear lo que sea para ver si encontramos la solución porque con una búsqueda en Google tienes el problema solucionado y da igual lo que se haga porque no se ganaría mucho que digamos en ambos casos, en cambio un problema del tipo "calcular la suma entre los dígitos del número (1 ^ 34627550862)" sería algo como para ponerse con él todo el día y no buscarlo en Google ya que en ese caso ya no tendría su gracias, y si logramos cumplir con el reto entonces tendríamos algo que sería útil para futuros trabajos.

Debemos ir pensando en otros problemas, algo así como 20 ya sería buena idea, claro que ya depende de la dificultad.

Te enviaré un MP con más problemas y vemos si publicamos otro hilos un poco más formal con más problemas y reglas definidas.
Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}

crack81

Me parece interesante la propuesta si se va hacer algo yo me apunto

saludos...
Si C/C++ es el padre de los lenguajes entonces ASM es dios.

fary

Son chorradas. Sin ';'.

Código (java) [Seleccionar]
package main;

public class main
{
public static void main(String [] Args)
{
if (System.out.printf("Hola Adrian\n") != null){}
if (System.out.printf("Que tal?") != null){}

}
}
Un byte a la izquierda.

sodark

Justo he publicado un post en mi blog. Mas que un problema de programación es un problema "raro", que a mi me dejo bastante flipado.

Os dejo el link
http://www.driverlandia.com/importancia-de-como-recorrer-una-matriz/

A ver si sacáis porque sucede esto :D, aún así os dejo el código aquí.

Código (java) [Seleccionar]

import java.util.Random;

public class StrangesArrays {
int MAXcols = 10000;
int MAXrows = 10000;
Random rd;
int[][] MATRIX = new int[MAXrows][MAXcols];
int cantidad = 0;
public StrangesArrays() {
rd = new Random();
this.initalizeMatrix();
}

public void initalizeMatrix() {
for (int i=0; i<MAXrows; i++) {
for (int j=0; j<MAXcols; j++) {
this.MATRIX[i][j] = this.getRandom();
}
}
}
public int getRandom() {
return this.rd.nextInt(200);
}

public long recorreFilasColumnas(int value) {
cantidad = 0;
long tsStart = System.currentTimeMillis();
long tsStop = 0;
for (int i=0; i<MAXrows; i++) {
for (int j=0; j<MAXcols; j++) {
if ( this.MATRIX[i][j] == value ) { cantidad++; }
}
}
tsStop = System.currentTimeMillis();
return (tsStop-tsStart);
}

public long recorreColumnasFilas(int value) {
cantidad = 0;
long tsStart = System.currentTimeMillis();
long tsStop = 0;
for (int i=0; i<MAXcols; i++) {
for (int j=0; j<MAXrows; j++) {
if ( this.MATRIX[j][i] == value ) { cantidad++; }
}
}
tsStop = System.currentTimeMillis();
return (tsStop-tsStart);
}

public static void main(String[] args) {
StrangesArrays test = new StrangesArrays();
System.out.println("Time outer rows - inner cols: "+test.recorreFilasColumnas(10));
System.out.println("Time outer cols - inner rows: "+test.recorreColumnasFilas(10));
}
}

0xFer

#5
CitarA ver si sacáis porque sucede esto

Puedes ver un arreglo de la siguiente forma;

  dirBase        variables que están en direcciones relativas a dirBase     
  0x0001           4             6             7              8
  0x0005           3             6             7              2
  0x0009           4             3             10             8
  0x00013          1             0             7              1
 
Cada variable como podrás imaginar tiene una dirección en la memoria, para acceder a un elemento del arreglo en java por ejemplo puedes hacer algo así arreglo[2][3]; esto sería un 8 teniendo en cuenta el arreglo de arriba, pero la computadora lo ve más como una dirección así;

[i][j] ->[2][3]->[0x0009][3] ->[0x0009 + 3] -> (La dirección de memoria donde está el 8)

nota que solo hay que aumentarle un 3 a la dirección base.

Ahora para recorrer un arreglo empezando por filas y luego columnas solo es necesario aumentar un valor a la base, puesto que la base suele ser "i" entonces solo hay que variar el valor de "j", pero si quieres recorrer por columnas entonces tienes que cambiar la dirección base constantemente y luego incrementarlo.

Para entenderlo mejor te recomiendo estudiar ASM, la verdad muchas cosas entenderás cuando estudies ese lenguaje.

Suerte
Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}

sodark

Aunque es cierto lo que dices, realmente el motivo de que haya tanta diferencia se debe a

https://es.wikipedia.org/wiki/Cercan%C3%ADa_de_referencias

Vease, cuando tenemos que cargar datos de la memoria a la cache, no solamente se carga la variable que hemos pedido, si no que se carga un bloque entero ya que se entiende que accederemos a la direccion cercana. El problema es que cuando recorremos un array de la segunda forma (y es un array grande) la siguiente posicion a la que vamos a acceder no esta en el bloque que ya hemos cargado, por lo que el sistema tiene que cargar el nuevo bloque, y asi por cada nueva lectura, haciendo que la memoria cache que sirve precisamente para optimizar no sirva para nada.

En el caso de una lectura normal, como las posiciones que leemos estan en el mismo bloque, es mas rapido leerlas puesto que leemos de la cache y solo cargamos un bloque cuando ya hemos terminado el otro.

No?


0xFer

Pues veo que es otra de las razones. La verdad no sabía eso que acabas de comentar y pues es algo importante a tener en cuenta cuando programas aplicaciones que precisan de la velocidad para funcionar correctamente, quiero decir: no tratar de conmutar entre direcciones de memoria que estén muy alejados.

Saludos...
Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}

4dr14n31t0r

#8
Cita de: 0xFer en 20 Enero 2016, 04:28 AM
Hola, me gusta la idea pero los problemas que propones son muy pocos y no me parecen adecuados, por ejemplo el primer problema no es como para sentarse todo el día y teclear lo que sea para ver si encontramos la solución porque con una búsqueda en Google tienes el problema solucionado y da igual lo que se haga porque no se ganaría mucho que digamos en ambos casos, en cambio un problema del tipo "calcular la suma entre los dígitos del número (1 ^ 34627550862)" sería algo como para ponerse con él todo el día y no buscarlo en Google ya que en ese caso ya no tendría su gracias, y si logramos cumplir con el reto entonces tendríamos algo que sería útil para futuros trabajos.

Debemos ir pensando en otros problemas, algo así como 20 ya sería buena idea, claro que ya depende de la dificultad.

Te enviaré un MP con más problemas y vemos si publicamos otro hilos un poco más formal con más problemas y reglas definidas.
Si con la expresion "1 ^ 34627550862" te refieres a 1 elevado a 34627550862 entonces el resultado es 1, y la suma de sus digitos 1 tambien. De todos modos, si no te referias a eso, no veo el problema en convertir el numero en String y sumar el valor que representa cada caracter. Tambien se puede dividiendo entre 10 y pillando el resto cada vez. Si con retos te refieres a algo como eso, la verdad es que el proposito de este hilo es el de poner problemas lo mas dificiles posibles. Por eso de momento solo hay 4 retos. Tampoco es una tarea facil encontrar un reto muy dificil.

4dr14n31t0r

¿Vosotros sabeis como se almacenan los arrays en C, verdad? Lo que hace con las matrices es guardar un array de una sola dimension en su lugar, y cambiar el modo en que se calculan el contenido de las posiciones: Multiplica el numero de columnas que tiene cada fila y despues le suma la columna indicada.

Teniendo en cuenta esto, aunque se trate de un array simple realmente tambien pasara lo mismo al acceder de esa forma a los elementos de la matriz: Es mas facil multiplicar una vez y sumar varias veces que lo contrario.
Lo que quiero decir es que, incluso aunque los arrays no funcionaran con punteros, seguirian produciendo ese increible retraso de tiempo al cambiar filas por columnas.