elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


  Mostrar Temas
Páginas: [1]
1  Programación / Scripting / Duda: reemplazar sobrecarga de métodos en: 24 Enero 2018, 16:00 pm
Hola.

He hecho una clase para la estructura de datos Trie en Python y tengo un método recursivo que se llama addWord que tiene como argumentos la palabra que se quiere introducir, la subpalabra que se ha generado hasta el momento en cada llamada y el nodo actual. Me gustaría que el usuario pudiera utilizar el método con un solo argumento (la palabra a introducir), ya que los otros dos son consecuencia del algoritmo y la recursividad, de modo que el usuario no necesita conocerlos. En Java, por ejemplo, utilizaría la sobrecarga de métodos y el método addWord que he descrito sería privado y crearía otro con el mismo nombre, público y con la palabra a añadir como único argumento (creo que es el enfoque correcto, corregidme si me equivoco) ¿Hay alguna forma de hacer algo parecido en Python? ¿Cómo se procede en estos casos con este lenguaje?

(La solución obvia sería crear otro método en la clase con el argumento palabra y un nombre diferente, pero me gustaría saber si hay otro modo).
2  Programación / Scripting / Backtracking en: 14 Julio 2017, 20:53 pm
Hola. He intentado resolver el problema del 15-puzzle del Juez de la UVa en Python mediante backtracking (el problema en cuestión es este: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=36&page=show_problem&problem=1122). El problema está en que se supone que cada solución está limitada a un máximo de 50 pasos, pero el vector solución crece hasta más de 140 pasos en la mayor parte de las iteraciones, por lo que el programa no encuentra la solución en un tiempo razonable. Adjunto el código del programa completo, pero solo es necesario mirar el método backtracking (sé que nadie va a estudiar un código tan largo, pero tampoco hace falta). Solo debería generarse un movimiento como máximo en cada llamada a backtracking, y si la rama no tiene más nodos intermedios debería volver al estado anterior y borrar del vector solución el último movimiento. La condición 
Código
  1. if(a[k] != mov_inv[c[i]]):
sirve para evitar deshacer movimientos ¿Alguien puede decirme por qué el vector solución crece más allá de los 50 elementos? (Cabe decir, que efectivamente, k no sobrepasa nunca el valor 50).

Código
  1.  
  2. moves = {0:('R','D'),1:('R','L','D'),2:('R','L','D'),3:('L','D'),4:('R','D','U'),5:('R','L','D','U'),
  3.         6:('R','L','D','U'),7:('L','U','D'),8:('R','D','U'),9:('R','L','D','U'),10:('R','L','D','U'),
  4.         11:('L','U','D'),12:('U','R'),13:('L','U','R'),14:('L','U','R'),15:('U','L')}
  5.  
  6. mov_inv = {'U':'D','D':'U','R':'L','L':'R'}
  7.  
  8.  
  9. def backtracking(a,k,tab):
  10.    c = []
  11.    if is_solution(tab):
  12.        process_solution(a)
  13.    elif k < 51:
  14.        print a
  15.        c = construct_candidates(tab)
  16.        for i in range(len(c)):
  17.            if(a[k] != mov_inv[c[i]]):
  18.                a.append(c[i])
  19.                make_move(tab,a[k+1])
  20.                backtracking(a,k+1,tab)
  21.                unmake_move(tab,a[k+1])
  22.                a = a[:-1]
  23.  
  24. def inversions(a):
  25.    n_inv = 0
  26.    a_copy = a[:]
  27.    a_copy.remove(0)
  28.  
  29.    for i in range(len(a_copy)):
  30.        for j in range(i,len(a_copy)):
  31.            if a_copy[i] > a_copy[j]:
  32.                n_inv = n_inv + 1
  33.  
  34.    return n_inv
  35.  
  36. def is_solvable(a):
  37.    n_inv = inversions(a)
  38.    if ((a.index(0) % 4) % 2) == 0 and n_inv % 2 == 0:
  39.        return True
  40.    if ((a.index(0) % 4) % 2) == 1 and n_inv % 2 == 1:
  41.        return True
  42.    return False
  43.  
  44.  
  45. def construct_candidates(tab):
  46.    i = tab.index(0)
  47.    m = moves[i]
  48.    c = []
  49.    for j in range(len(m)):
  50.        c.append(m[j])
  51.    return c
  52.  
  53. def make_move(tab,m):
  54.    i = tab.index(0)
  55.    if m == 'U':
  56.        c = tab[i-4]
  57.        tab[i-4] = 0
  58.        tab[i] = c
  59.    elif m == 'D':
  60.        c = tab[i+4]
  61.        tab[i+4] = 0
  62.        tab[i] = c
  63.    elif m == 'L':
  64.        c = tab[i-1]
  65.        tab[i-1] = 0
  66.        tab[i] = c
  67.    elif m == 'R':
  68.        c = tab[i+1]
  69.        tab[i+1] = 0
  70.        tab[i] = c
  71.  
  72. def unmake_move(tab,m):
  73.    make_move(tab,mov_inv[m])
  74.  
  75. def is_solution(tab):
  76.    if(tab[15] != 0):
  77.        return False
  78.    else:
  79.        for i in range(len(tab)-1):
  80.            if tab[i] != i+1:
  81.                return False
  82.    return True
  83.  
  84. def process_solution(a):
  85.    print a
  86.  
  87. a = [-1]
  88. tab = [2,3,4,0,
  89.       1,5,7,8,
  90.       9,6,10,12,
  91.       13,14,11,15]
  92.  
  93.  
  94. if not is_solvable(tab):
  95.    print "This puzzle is not solvable"
  96. else:
  97.    backtracking(a,0,tab)
3  Programación / Programación C/C++ / [SOLUCIONADO] Array pasado por referencia a una función no se modifica en: 29 Octubre 2016, 12:04 pm
Hola.
Intento hacer un programa al que se le pase por parámetro (en la línea de comandos) el tamaño de un array tipo float. Tengo que reservar el espacio necesario con malloc. El usuario debe introducir los valores del array. El programa los imprime. A continuación invierte el vector (aquí viene el problema) y se vuelve a imprimir el array. El array se imprime en el orden original otra vez. Debe de ser algún problema con las referencias, pero no lo encuentro ¿Alguien me echa un cable?

Para hacer más fácil la revisión, diré que el problema probablemente esté en la función invertir, lo demás funciona sin problemas.

Edito: ya lo he resuelto. El problema no es de referencias. En la función invertir escribí mal la condición de fin del for. Debe acabar cuando el índice i supere al tam, es decir, el for quedaría:

Código
  1. for(int i = 0; i < tam; i++) {
  2. tmp = array[i];
  3. array[i] = array[tam];
  4. array[tam] = tmp;
  5. tam--;
  6. }
  7.  


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int POW(int a, int b);
  5. void invertir(float *array, int tam);
  6.  
  7. int main(int argc, char *argv[]) {
  8. if(argc < 2 | argc > 2) {
  9. printf("Este programa solo admite 1 argumento.\n");
  10. return 1;
  11. }
  12. int numero = 1;
  13. for(int i = 0; argv[1][i] != '\0'; i++) {
  14. if(argv[1][i] < 48 || argv[1][i] > 57) {
  15. numero = 0;
  16. }
  17. }
  18.  
  19. if(numero == 0) {
  20. printf("Argumento NO entero\n");
  21. return 2;
  22. }
  23.  
  24. int tam = 0; //tamaño del vector de floats (argumento programa)
  25. int tam_cadena = 0; //será el tamaño de la cadena argv[1]
  26.  
  27. for(int i = 0; argv[1][i] != '\0'; i++) {
  28. tam_cadena++;
  29. }
  30.  
  31. printf("Tamaño de la cadena argumento: %d\n", tam_cadena);
  32.  
  33. for(int i = 0; argv[1][i] != '\0'; i++) {
  34. tam += ((int)argv[1][i] - 48) * POW(10, tam_cadena-1-i);
  35. }
  36.  
  37. printf("%d\n", tam);
  38. //Creación del array tipo float de tamaño introducido por el usuario
  39. float *dir_array_float;
  40. dir_array_float = (float*)malloc(tam*sizeof(float));
  41.  
  42. float elem;
  43.  
  44. for(int i = 0; i < tam; i++) {
  45. printf("Introduzca el elemento (float) nº %d del array: \n", i+1);
  46. scanf("%f", &dir_array_float[i]);
  47. }
  48.  
  49. printf("\n");
  50.  
  51. for(int i = 0; i < tam; i++) {
  52. printf("%f\n", dir_array_float[i]);
  53. }
  54.  
  55. invertir(dir_array_float, tam);
  56.  
  57. printf("\n");
  58.  
  59. for(int i = 0; i < tam; i++) {
  60. printf("%f\n", dir_array_float[i]);
  61. }
  62.  
  63. return 0;
  64. }
  65.  
  66. int POW(int a, int b) {
  67. int base = a;
  68.  
  69. if(b>0) {
  70. while(b>1) {
  71. a *= base;
  72. b--;
  73. }
  74. }
  75. else if(b == 0) {
  76. return 1;
  77. }
  78.  
  79. return a;
  80. }
  81.  
  82. void invertir(float *array, int tam) {
  83. float tmp;
  84. tam--;
  85.  
  86. for(int i = 0; i > tam; i++) {
  87. tmp = array[i];
  88. array[i] = array[tam];
  89. array[tam] = tmp;
  90. tam--;
  91. }
  92.  
  93. return;
  94. }
4  Programación / Java / Duda getters en: 15 Agosto 2016, 17:30 pm
Hola.

Tengo una pequeña duda con un código de un libro que estoy leyendo de desarrollo de Android, pero el problema que tengo es simplemente de Java. El código es el siguiente:

Código
  1. public class Workout {
  2.    private String name;
  3.    private String description;
  4.  
  5.    public static final Workout[] workouts = {
  6.            new Workout("The Limb Loosener",
  7.                    "5 Handstand push-ups\n10 1-legged squats\n15 Pull-ups"),
  8.            new Workout("Core Agony",
  9.                    "100 Pull-ups\n100 Push-ups\n100 Sit-ups\n100Squats"),
  10.            new Workout("The Wimp Special",
  11.                    "5 Pull-ups\n10 Push-ups\n15 Squats"),
  12.            new Workout("Strength and Length",
  13.                    "500 meter run\n21 x 1.5 pood kettleball swing\n21 x pull-ups")
  14.    };
  15.  
  16.    //Each workout has a name and a description
  17.    private Workout(String name, String description) {
  18.        this.name = name;
  19.        this.description = description;
  20.    }
  21.  
  22.    public String getDescription() {
  23.        return description;
  24.    }
  25.  
  26.    public String getName() {
  27.        return name;
  28.    }
  29.  
  30.    public String toString() {
  31.        return this.name;
  32.    }
  33. }
  34.  

Mi duda está en la diferencia entre el método getName() y el método toString(). Según lo que tenía entendido hasta ahora, el toString daría el nombre de un objeto Workout ya instanciado (por el this) ¿Alguien me puede aclarar esto?
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines