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

 

 


Tema destacado: Tutorial básico de Quickjs


  Mostrar Temas
Páginas: [1] 2 3
1  Programación / Ingeniería Inversa / Ayuda para identificar algoritmo de compresion zlib en: 24 Diciembre 2021, 16:26 pm
Hola, tengo un archivo que fue comprimido con zlib y estoy tratando de averiguar el método que fue utilizado para comprimirlo.

Este archivo en particular usa un nivel 9 de compresión, y por lo que pude descifrar la entrada se divide en bloques de 8KiB, y se hace Z_SYNC_FLUSH luego de comprimir cada bloque, pero cada 8 bloques el algoritmo parece hacer otra cosa.

Este es el código que escribí para descomprimir y comprimir el archivo.
Para descomprimir funciona bien, pero solo comprime correctamente los primeros 7 bloques del archivo.
Código
  1. import sys
  2. import zlib
  3.  
  4. # python3 zlib-flate.py -d output.bin input.bin
  5. # python3 zlib-flate.py -9 input.bin output_test.bin
  6.  
  7. def usage():
  8. print("Usage:")
  9. print(f"python3 {sys.argv[0]} -[1-9,d] input.bin output.bin")
  10. exit()
  11.  
  12. def main():
  13. argc = len(sys.argv)
  14. if argc != 4:
  15. usage()
  16. try:
  17. if sys.argv[1] == "-d":
  18. # Decompress file
  19. with open(sys.argv[2], "rb") as input_file, open(sys.argv[3], "wb") as output_file:
  20. data = input_file.read()
  21. comp_obj = zlib.decompressobj()
  22. data_plain = comp_obj.decompress(data)
  23. output_file.write(data_plain)
  24. else:
  25. # Compress file
  26. level = -int(sys.argv[1])
  27. if level < 1 or level > 9:
  28. print("Invalid compression level")
  29. with open(sys.argv[2], "rb") as input_file, open(sys.argv[3], "wb") as output_file, open("output.bin", "rb") as test_file:
  30. comp_obj = zlib.compressobj(level)
  31. data = input_file.read(8 * 1024) # Read block of 8KiB
  32. i = 1
  33. while data != b"":
  34. data_zip = comp_obj.compress(data)
  35. data_zip += comp_obj.flush(zlib.Z_SYNC_FLUSH)
  36.  
  37. # Check if compressed data differs
  38. lenght = len(data_zip)
  39. data_test = test_file.read(lenght)
  40. if data_zip == data_test:
  41. print(f"Block #{i}: correctly compressed")
  42. else:
  43. print(f"Block #{i}: invalid data")
  44. exit()
  45.  
  46. output_file.write(data_zip)
  47. data = input_file.read(8 * 1024)
  48. i = i + 1
  49. print("File compressed correctly!")
  50. except (IOError, ValueError) as error:
  51. print("Invalid parameters")
  52.  
  53. main()
  54.  

Archivo comprimido con zlib:
https://mega.nz/file/8a5C1SyQ#xqy9nCycTrWfrnwuvWa39xd128s9huSFuf8kOr6kK8Q

2  Programación / Programación General / Programa que imprime un número entre 0 y un billón como texto [SWI-Prolog] en: 8 Octubre 2020, 23:34 pm
Siempre quise hacer un programa que dado un numero lo imprima como texto, por ejemplo 132 -> ciento treinta y dos, pero nunca me puse, hasta hoy que vi gramáticas de cláusulas definidas en programación lógica y en poco más de media hora salió.
Los casos más difíciles de hacer fueron por ejemplo 16 (dieciséis), 21 (veintiuno) que son una única palabra y 1002 (mil dos) que no es “un mil dos” o “uno mil dos”.
Como no chequeo que el resto sea distinto de cero pueden generarse casos como “40 -> cuarenta y cero” o “41 -> cuarenta y cero y uno, cuarenta y cero… y cero y uno” que son quitados con el operador cut (!).
Les dejo acá el código y algunos ejemplos.
17 diecisiete
29 veintinueve
547 quinientos cuarenta y siete
1234 mil doscientos treinta y cuatro
3597426 tres millones quinientos noventa y siete mil cuatrocientos veintiséis
742258963 setecientos cuarenta y dos millones doscientos cincuenta y ocho mil novecientos sesenta y tres
100000000000 cien mil millones
999999999999 novecientos noventa y nueve mil novecientos noventa y nueve millones novecientos noventa y nueve mil novecientos noventa y nueve
1000000000000 un billon
31000 treinta y uno mil*
* Y aquí encontré un bug, debería decir treinta y un mil

Código
  1. % Imprime un numero como texto
  2. print_number(N) :- numero(N, L, []), !, atomic_list_concat(L, ' ', A), writeln(A).
  3.  
  4. % Crea una lista [0..N]
  5. create_list(N, L) :- findall(X, between(0, N, X), L).
  6.  
  7. % Imprime los numeros entre 0 y N
  8. print_numbers(N) :- create_list(N, L), print_aux(L).
  9. print_aux([]).
  10. print_aux([X|L]) :- print_number(X), print_aux(L).
  11.  
  12. % Convierte un numero en una lista de palabras
  13. % ej: numero(132, L, []) -> [ciento, treinta, y, dos].
  14. numero(0) --> [cero].
  15. numero(1) --> [uno].
  16. numero(2) --> [dos].
  17. numero(3) --> [tres].
  18. numero(4) --> [cuatro].
  19. numero(5) --> [cinco].
  20. numero(6) --> [seis].
  21. numero(7) --> [siete].
  22. numero(8) --> [ocho].
  23. numero(9) --> [nueve].
  24.  
  25. numero(10) --> [dies].
  26. numero(11) --> [once].
  27. numero(12) --> [doce].
  28. numero(13) --> [trece].
  29. numero(14) --> [catorce].
  30. numero(15) --> [quince].
  31.  
  32. numero(20) --> [veinte].
  33. numero(30) --> [treinta].
  34. numero(40) --> [cuarenta].
  35. numero(50) --> [cincuenta].
  36. numero(60) --> [sesenta].
  37. numero(70) --> [setenta].
  38. numero(80) --> [ochenta].
  39. numero(90) --> [noventa].
  40. numero(100) --> [cien].
  41.  
  42. % Convertir numeros entre 16 y 19
  43. numero(N) --> {N > 15, N < 20, U is N mod 10, numero(U, X, []), atomic_list_concat([dieci|X], S)}, [S].
  44. % Convertir numeros entre 21 y 29
  45. numero(N) --> {N > 20, N < 30, U is N mod 10, numero(U, X, []), atomic_list_concat([veinti|X], S)}, [S].
  46. % Convertir numeros entre 31 y 99
  47. numero(N) --> {N > 30, N < 100, D is N - (N mod 10), U is N mod 10}, numero(D), [y], numero(U).
  48.  
  49. numero(200) --> [doscientos].
  50. numero(300) --> [trescientos].
  51. numero(400) --> [cuatrocientos].
  52. numero(500) --> [quinientos].
  53. numero(600) --> [seiscientos].
  54. numero(700) --> [setecientos].
  55. numero(800) --> [ochocientos].
  56. numero(900) --> [novecientos].
  57. numero(1000) --> [mil].
  58.  
  59. % Convertir numeros entre 101 y 199
  60. numero(N) --> {N > 100, N < 200, D is N mod 100}, [ciento], numero(D).
  61. % Convertir numeros entre 201 y 999
  62. numero(N) --> {N > 200, N < 1000, C is N - (N mod 100), D is N mod 100}, numero(C), numero(D).
  63.  
  64. % Convertir numeros entre 1001 y 1999
  65. numero(N) --> {N > 1000, N < 2000, D is N mod 1000}, [mil], numero(D).
  66. % Convertir numeros entre 2000 y 999 000 que terminan en 000, ej: 7000
  67. numero(N) --> {N >= 2000, N =< 999000, C is N div 1000, D is N mod 1000, D = 0}, numero(C), [mil].
  68. % Convertir numeros entre 2001 y 999 999
  69. numero(N) --> {N > 2000, N < 1000000, C is N div 1000, D is N mod 1000}, numero(C), [mil], numero(D).
  70.  
  71. numero(1000000) --> [un, millon].
  72.  
  73. % Convertir numeros entre 1 000 001 y 1 999 999
  74. numero(N) --> {N > 1000000, N < 2000000, D is N mod 1000000}, [un, millon], numero(D).
  75. % Convertir numeros entre 2 000 000 y 999 999 000 000 que terminan en 000 000, ej: 7 000 000
  76. numero(N) --> {N >= 2000000, N =< 999999000000, C is N div 1000000, D is N mod 1000000, D = 0}, numero(C), [millones].
  77. % Convertir numeros entre 2000001 y 999 999 999 999
  78. numero(N) --> {N > 2000000, N < 1000000000000, C is N div 1000000, D is N mod 1000000}, numero(C), [millones], numero(D).
  79.  
  80. numero(1000000000000) --> [un, billon].
  81.  

Para ejecutar instalan SWI-Prolog
Guardan el código como “numtext.pl”
Abren cmd en el directorio donde guardaron el archivo
> swipl numtext.pl
?- print_number(N). # donde N es el número a mostrar
3  Programación / Programación C/C++ / Ayuda con HTML Proxy en C en: 11 Febrero 2020, 17:39 pm
Supongamos que tengo una página web en un servidor Apache corriendo en 192.168.1.1:80 y quiero acceder a él desde 127.0.0.1:8080 (las ip y puertos son solo de ejemplo).

El siguiente programa me muestra la página pero las imágenes no cargan, tampoco puedo hacer login. No se que es lo que tengo mal.

Código
  1. // g++ -Wall -Werror tcp_proxy.cpp -o tcp_proxy -lpthread -lws2_32
  2.  
  3. #include <ctype.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <unistd.h>
  8. #include <pthread.h>
  9. #include <winsock2.h>
  10. #include <ws2tcpip.h>
  11.  
  12. #define Localhost "127.0.0.1"
  13. #define ProxyPort 8080
  14. #define HTTP_Server "192.168.1.1"
  15. #define HTTP_Port "80"
  16.  
  17. #define MaxUsersQueue 10
  18. #define MaxMsgSize 2048
  19.  
  20. struct sockets {
  21. int source;
  22. int dest;
  23. };
  24.  
  25. void* conectarProxy(void*);
  26. void* pushData(void*);
  27.  
  28. int main(int argc, char* argv[]) {
  29. WSADATA wsaData;
  30. WSAStartup(MAKEWORD(2, 2), &wsaData);
  31.  
  32. int proxy_socket = socket(AF_INET, SOCK_STREAM, 0);
  33.  
  34. sockaddr_in server_addr;
  35. server_addr.sin_family = AF_INET;
  36. server_addr.sin_addr.s_addr = inet_addr(Localhost);
  37. if (argc < 2)
  38. server_addr.sin_port = htons(ProxyPort);
  39. else // Usar puerto pasado desde la terminal
  40. server_addr.sin_port = htons(atoi(argv[1]));
  41.  
  42. int server_addr_size = sizeof(server_addr);
  43. bind(proxy_socket, (sockaddr*) &server_addr, server_addr_size);
  44.  
  45. listen(proxy_socket, MaxUsersQueue);
  46.  
  47. while (true) {
  48. sockaddr_in client_addr;
  49. int client_addr_size = sizeof(client_addr);
  50. int socket_client = accept(proxy_socket, (sockaddr*) &client_addr, &client_addr_size);
  51.  
  52. pthread_t hilo_conectarProxy;
  53. pthread_create(&hilo_conectarProxy, NULL, conectarProxy, &socket_client);
  54. }
  55. close(proxy_socket);
  56. return 0;
  57. }
  58.  
  59. void* conectarProxy(void* sc_param) {
  60. int socket_client = *((int*)sc_param);
  61.  
  62. int httpServerSock = socket(AF_INET, SOCK_STREAM, 0);
  63. addrinfo hints;
  64. memset(&hints, 0, sizeof(hints));
  65. hints.ai_family = AF_INET;
  66. hints.ai_socktype = SOCK_STREAM;
  67. addrinfo* res;
  68. getaddrinfo(HTTP_Server, HTTP_Port, &hints, &res);
  69. connect(httpServerSock, res->ai_addr, res->ai_addrlen);
  70. freeaddrinfo(res);
  71.  
  72. sockets* cliente_proxy = new sockets{socket_client, httpServerSock};
  73. pthread_t hilo_cliente_proxy;
  74. pthread_create(&hilo_cliente_proxy, NULL, pushData, cliente_proxy);
  75.  
  76. sockets* proxy_cliente = new sockets{httpServerSock, socket_client};
  77. pthread_t hilo_proxy_cliente;
  78. pthread_create(&hilo_proxy_cliente, NULL, pushData, proxy_cliente);
  79.  
  80. pthread_join(hilo_cliente_proxy, NULL);
  81. pthread_join(hilo_proxy_cliente, NULL);
  82. return NULL;
  83. }
  84.  
  85. void* pushData(void* args) {
  86. sockets* src_dst = (sockets*)args;
  87. int src = src_dst->source;
  88. int dst = src_dst->dest;
  89. char* data = new char[MaxMsgSize];
  90. char buffer[MaxMsgSize];
  91. while (true) {
  92. strcpy(data, "");
  93. strcpy(buffer, "");
  94. int msg_size = 0;
  95. do {
  96. msg_size += recv(src, buffer, MaxMsgSize, 0);
  97. if (msg_size == 0) break;
  98. if (msg_size == -1) break;
  99. printf("%d->%d Recibido: %d bytes\n", src, dst, msg_size);
  100. strcat(data, buffer);
  101. } while (strchr(data, '\n') == NULL);
  102. if (msg_size == -1) break;
  103. int sent_msg_size = send(dst, data, msg_size, 0);
  104. printf("%d->%d Enviado: %d bytes\n", src, dst, msg_size);
  105. if (sent_msg_size == -1) break;
  106. }
  107. delete (sockets*)args;
  108. delete[] data;
  109. close(src);
  110. close(dst);
  111. return NULL;
  112. }
  113.  
4  Programación / Scripting / [PYTHON] Como crear conjunto a partir de lista de tuplas por clave? en: 29 Marzo 2019, 03:07 am
Como crear conjunto a partir de lista de tuplas por clave?
Por ejemplo tengo la siguiente lista de tuplas
Código
  1. x = [('El', 'auto'), ('el', 'auto'), ('un', 'auto'), ('algun', 'auto'), ('Los', 'camiones'),  ('UN', 'auto')]
  2.  
Y quiero obtener la siguiente:
Código
  1. y =  [('el', 'auto'), ('Los', 'camiones')]
En lugar de "el" podria estar cualquiera de los determinantes usados anteriormente.

He intentado usar set() pero no se como hacer para que tome solo el segundo parametro para crear el conjunto.

He implementado el siguiente codigo pero es muy ineficiente, basicamente busca todas las ocurrencias para quedarse con una sola.

Código
  1.    nombres = [('El', 'auto'), ('el', 'auto'), ('un', 'auto'), ('El', 'camion')]
  2.    pares = []
  3.    palabras = list(set(x[1] for x in nombres))
  4.    for i in range(0, len(palabras)):
  5.        j = [det[0] for det in nombres if det[1] == palabras[i]]
  6.        pares = pares + [(j[0], palabras[i])]
  7.    print(pares)
  8.  
5  Programación / Programación C/C++ / [AYUDA] Como se de que tipo se creo una clase que deriba de otra en: 16 Marzo 2019, 05:01 am
Código
  1. #include <random>
  2. #include <cstdio>
  3. #include <stdexcept>
  4.  
  5. class Vehiculo {
  6. public:
  7.  virtual ~Vehiculo() { }; // Clase abstracta
  8. };
  9.  
  10. class Automovil : public Vehiculo {
  11. public:
  12.  int matricula = 4409;
  13. };
  14.  
  15. class Bicicleta : public Vehiculo {
  16. public:
  17.  int cambios = 18;
  18. };
  19.  
  20. void MostrarAtrb(const Vehiculo& vehiculo) {
  21.  try {
  22.    const Automovil& car = dynamic_cast<const Automovil&>(vehiculo);
  23.    printf("Es un Automovil con matricula: %d\n", car.matricula);
  24.  } catch(std::bad_cast &e) {
  25.    printf("Error %s\n", e.what());
  26.  }
  27.  try {
  28.    const Bicicleta& bici = dynamic_cast<const Bicicleta&>(vehiculo);
  29.    printf("Es una Bicicleta con %d cambios\n", bici.cambios);
  30.  } catch(std::bad_cast &e) {
  31.    printf("Error %s\n", e.what());
  32.  }
  33. }
  34.  
  35. int main() {
  36.  Vehiculo vehiculo;
  37.  if (rand() % 2 == 0)
  38.    vehiculo = Automovil();
  39.  else
  40.    vehiculo = Bicicleta();
  41.  MostrarAtrb(vehiculo); // Como se de que tipo se creo el objeto???
  42.  return 0;
  43. }
  44.  

Ambas conversiones de tipo dan error.
6  Programación / Programación C/C++ / Desofuscar codigo en: 22 Noviembre 2018, 03:17 am
Queria compartir el siguiente codigo que genera un Donut 3D (solo funciona en la terminal de Linux o la de MinGW) y mi intento por desofuscarlo.


Código
  1.             k;double sin()
  2.         ,cos();main(){float A=
  3.       0,B=0,i,j,z[1760];char b[
  4.     1760];printf("\x1b[2J");for(;;
  5.  ){memset(b,32,1760);memset(z,0,7040)
  6.  ;for(j=0;6.28>j;j+=0.07)for(i=0;6.28
  7. >i;i+=0.02){float c=sin(i),d=cos(j),e=
  8. sin(A),f=sin(j),g=cos(A),h=d+2,D=1/(c*
  9. h*e+f*g+5),l=cos      (i),m=cos(B),n=s\
  10. in(B),t=c*h*g-f*        e;int x=40+30*D*
  11. (l*h*m-t*n),y=            12+15*D*(l*h*n
  12. +t*m),o=x+80*y,          N=8*((f*e-c*d*g
  13. )*m-c*d*e-f*g-l        *d*n);if(22>y&&
  14. y>0&&x>0&&80>x&&D>z[o]){z[o]=D;;;b[o]=
  15. ".,-~:;=!*#$@"[N>0?N:0];}}/*#****!!-*/
  16.  printf("\x1b[H");for(k=0;1761>k;k++)
  17.   putchar(k%80?b[k]:10);A+=0.04;B+=
  18.     0.02;}}/*****####*******!!=;:~
  19.        ~::==!!!**********!!!==::-
  20.          .,~~;;;========;;;:~-.
  21.              ..,--------,*/
  22.  
Código
  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. #define PI 3.14
  6. #define HEIGHT 22
  7. #define WIDTH 80
  8.  
  9. const float R2 = 2; // Distancia del centro del Toroide a la mitad: (   )   |---(-. )
  10. const char* illumination = ".,-~:;=!*#$@";
  11.  
  12. int main(){
  13. float zbuffer[HEIGHT][WIDTH];
  14. char framebuffer[HEIGHT][WIDTH];
  15. float A = 0, C = 0; // Ejes X y Z sobre los que rota el Toroide
  16. printf("\x1b[2J"); // Borrar Pantalla
  17.  
  18. while (true) {
  19. memset(zbuffer, 0.0, HEIGHT * WIDTH * sizeof(float)); // Fondo a distancia infinita
  20. memset(framebuffer, ' ', HEIGHT * WIDTH * sizeof(char)); // Pantalla vacia
  21.  
  22. for (float B = 0; B < 2 * PI; B += 0.07) // Eje Y sobre el que rota el Toroide
  23. for (float phi = 0; phi < 2 * PI; phi += 0.02) { // Eje del toroide (perpendicular al centro)
  24. float
  25. sin_phi = sin(phi),
  26. cos_phi = cos(phi),
  27. sinA = sin(A),
  28. cosA = cos(A),
  29. sinB = sin(B),
  30. cosB = cos(B),
  31. sinC = sin(C),
  32. cosC = cos(C),
  33. // Solo otro par de valores que precalculamos
  34. h = cosB + R2,
  35. t = h * sin_phi * cosA - sinA * sinB,
  36. // Distancia inversa del observador al centro del Toroide
  37. D = 1 / (h * sin_phi * sinA + cosA * sinB + 5);
  38. int
  39. // Posicion de la pantalla donde se renderiza un punto del Toroide
  40. x = 40 + 30 * D * (h * cos_phi * cosC - sinC * t),
  41. y = 12 + 15 * D * (h * cos_phi * sinC + cosC * t),
  42. /* La luz proviene de arriba y atras del observador (0, 1, -1)
  43.   que tiene modulo 2, hay 12 tonos de luz: 0..11, 11 / sqrt(2) = 8
  44.   L = 8 * (y - z); */
  45. L = 8 * ((sinA * sinB - sin_phi * cosA * cosB) * cosC -
  46. sin_phi * sinA * cosB - cosA * sinB - cos_phi * cosB * sinC);
  47. // LAS MATRICES TIENEN INDICES i VERTICAL Y j HORIZONTAL
  48. // MIENTRAS QUE LAS GRAFICAS TIENEN x HORIZONTAL E y VERTICAL
  49. if (x > 0 && x < WIDTH && y > 0 && y < HEIGHT && zbuffer[y][x] < D) {
  50. /* Si el punto actual es mas cercano a la pantalla que alguno calculado
  51.   previamente entonces sobrescribir al anterior */
  52. if (L < 0) L = 0; // Sombra
  53. framebuffer[y][x] = illumination[L];
  54. zbuffer[y][x] = D; // Guardar profundidad
  55. }
  56. }
  57. printf("\x1b[H"); // Mover el cursor a la esquina superior izquierda
  58. for (int i = 0; i < HEIGHT; i++) {
  59. for (int j = 0; j < WIDTH; j++)
  60. putchar(framebuffer[i][j]); // Mostrar Toroide
  61. putchar('\n');
  62. }
  63. A += 0.04;
  64. C += 0.02;
  65. }
  66. return 0;
  67. }
  68.  
7  Sistemas Operativos / GNU/Linux / Gestor de descargas para Linux en: 5 Noviembre 2018, 15:18 pm
Busco un gestor de descarga para Linux que sea portable (no tengo permisos de root para instalarlo) sin interfax grafica (que se ejecute desde terminal) y que me permita descargar de servidores como Mega, 1fichier o Google Drive.
Algo como MiPony pero que pueda pasar los links desde la terminal.
8  Programación / Programación General / [AYUDA] ¿Cómo hacer este código más eficiente? en: 16 Octubre 2018, 00:12 am
El siguiente codigo se ejecuta en orden lineal con respecto al tamaño del arreglo A, mi pregunta es cómo hacer dicho codigo más eficiente, digamos O(log n), la idea que tengo es hacer busqueda binaria, es decir, dividir A a la mitad ((i-1) / 2) y buscar en cada mitad.
Pero:
  • Si encuentro un i > 0 en la primera mitad deberia buscar en la segunda. (podria existir un i mayor)
  • Si no encuentro un i > 0 en la segunda mitad debería buscar en la primera si no lo hice antes. (ya que podria existir un i > 0)
Por lo que sigue siendo O(n) en el peor caso, quiza no sea posible implementarlo en O(log n)

Código
  1. /* A[1..n] esta ordenado de menor a mayor
  2.  * Devuelve el mayor indice i' menor o igual a i tal que A[i'] <= c
  3.  * o cero si no se encuentra. Cota superior asintotica: O(n)
  4.  */
  5. void buscarIndice(const uint* A, uint &i, const uint c) {
  6. while (i > 0 && A[i] > c)
  7. i--;
  8. }
  9.  

El siguente codigo es O(n^2), lo que si es seguro es que como A está ordenado es posible implementarlo en O(n log n) (La demostración queda a cargo del lector) ¿Alguna idea de por donde empezar?
Código
  1. for (uint j = 1; j <= n; j++) {
  2. uint i = j; // No es ortodoxo modificar j
  3. buscarIndice(A, i, c);
  4. hacerAlgoUtilCon(i);
  5. }
9  Programación / Programación C/C++ / ¿Cómo hallar una Permutacion ordenada con MergeSort? en: 11 Octubre 2018, 01:12 am
Dado un arreglo desordenado con n elementos, el siguiente código retorna una permutación tal que al aplicarla al arreglo original los elementos quedan ordenados.

Código
  1. #include <stdio.h>
  2.  
  3. typedef unsigned int uint;
  4.  
  5. void Swap(int &a, int &b) {
  6. int t = a;
  7. a = b;
  8. b = t;
  9. }
  10.  
  11. int* BubbleSort(const int* A, uint n) {
  12. int* P = new int[n];
  13. for (uint i = 0; i < n; i++)
  14. P[i] = i;
  15. bool ordenado;
  16. do {
  17. ordenado = true;
  18. for (uint i = 1; i < n; i++)
  19. if (A[P[i-1]] > A[P[i]]) {
  20. Swap(P[i-1], P[i]);
  21. ordenado = false;
  22. }
  23. } while (!ordenado);
  24. return P;
  25. }
  26.  
  27. int main() {
  28. uint n;
  29. printf("Ingrese la cantidad de numeros: ");
  30. scanf("%u", &n);
  31. printf("Ingrese los numeros:\n");
  32. int* A = new int[n];
  33. for (uint i = 0; i < n; i++)
  34. scanf("%d", &A[i]);
  35. int* P = BubbleSort(A, n);
  36. printf("Los numeros ordenados son:\n");
  37. for (uint i = 0; i < n; i++)
  38. printf("%d ", A[P[i]]);
  39. printf("\n");
  40. delete[] A;
  41. delete[] P;
  42. return 0;
  43. }

Pero lo hace en tiempo O(n^2), en cambio el siguiente codigo: https://www.geeksforgeeks.org/merge-sort/ retorna el arreglo ordenado en tiempo O(n log(n))
¿Cómo puedo modificar MergeSort para obtener una permutación ordenada en lugar de ordenar el propio arreglo?

10  Sistemas Operativos / Windows / [AYUDA!!!] Mover partición "Reservado para el sistema" en: 16 Mayo 2018, 00:15 am
Hola, tengo tres unidades de almacenamiento:
  • SSD 120GB Sistema Operativo
  • HDD 500GB (particion de 100MB Reservado para el sistema)
  • HDD 1TB

¿Cómo puedo mover la particion: "Reservado para el sistema" 100MB NTFS Correcto (Sistema, Activo, Partición Primaria) del disco de 500GB a alguno de los otros sin tener que reinstalar el Sistema Operativo?

Puedo redimensionar los otros dos discos y formatear el de 1TB si fuera necesario, uso Windows 7 Ultimate SP1 y dispongo de la ISO.

El problema que tengo es que si quito el disco de 500GB me sale el siguiente mensaje luego de la BIOS:
"Reboot and Select proper Boot device or Insert Boot Media in selected Boot device and press a key"
Páginas: [1] 2 3
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines