/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Algoritmo para mostrar los dígitos misteriosos del DNI

 
      Índice del Foro elrincondelc.com -> Algoritmos
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
DCelso



Registrado: 28 Abr 2004
Mensajes: 112

MensajePublicado: 20/09/2007 5:30 am
Título: Algoritmo para mostrar los dígitos misteriosos del DNI

Hola os dejo un algoritmo para mostrar los dígitos misteriosos de la parte de atrás del DNI. Probadlo, ya me contareis.
Esto resuelve negativamente el enigma de la leyenda urbana de que el último de los números equivale a las veces que está repetido tu nombre y apellidos en España.

Código:

#define n char
#include <ctype.h>
#define e isdigit
#include <iostream.h>
#define a isalpha
char cd(char *);
#define o toupper
#include <string.h>
#define u int
#define c cd
#define i endl
int main()/////
{n r[255];cout <<"Introduce tu NIF: ";cin>> &r[1];r[0]=cd(&r[1]);cout <<"Introduce fecha de nacimiento (AAMMDD): ";cin>> &r[11];cout <<"Introduce fecha de caducidad (AAMMDD): ";cin>> &r[21];sprintf(&r[31], "%s%d%s%d%s%d", &r[1], r[0], &r[11], cd(&r[11]), &r[21],cd(&r[21]));cout <<" El primer dígito misterioso es:"<<(u)r[0]<<endl;cout <<" El segundo dígito misterioso es:"<<(u)cd(&r[31]);}n c(n*h)///
{int f[5]={7,3,1,0,0};for(;h[f[4]]!=0;f[4]++)//
if(e(h[f[4]]))//
{f[3]+=(h[f[4]]-48)*f[f[4]%3];}else if(a(h[f[4]]))//
{f[3]+=(o(h[f[4]])-65)*f[f[4]%3];}else return-1;return f[3]%10;}


NOTA: he puesto a prueba mi nivel de código ofuscado, si teneis sugerencias para ofuscarlo mas son bienvenidas.
Si alguien lo quiere desofuscado que lo comente.
Salu2.
Volver arriba
cheroky



Registrado: 22 Sep 2005
Mensajes: 1331
Ubicación: En ecx esperando un call

MensajePublicado: 20/09/2007 6:50 am
Título:

Critica constructiva:

Ofuscar un codigo no es darle la espalda al estandar de C++, ahi hay un huevo de errores.

S2.
_________________
- Explícito es mejor que implícito.
- Simple es mejor que complejo.
- Complejo es mejor que complicado.
- Plano es mejor que anidado.
- Ralo es mejor que denso.
Volver arriba
DCelso



Registrado: 28 Abr 2004
Mensajes: 112

MensajePublicado: 20/09/2007 4:33 pm
Título:

Yo uso g++ y compila de p... madre, si va con el g++ casi que debería ir en cualquier otro.

¿Que compilador usas tu y que errores te da? A ver si puedo ayudar a compilarlo en tu entorno.

¿En qué parte estoy saltandome el standard C++?

Nunca viene de mal una crítica constructiva Very Happy.

De todas formas eso de decir que ofuscar no es saltarse el standard es discutiblie, no se en qué te basas, porque en todas las competiciones de código ofuscado la única norma era que compilase el código fuente y el binario cumpliera con el objetivo final.
Si lo piensas es lógico si lo estás ofuscando para que sea ininteligible, si te saltas normativas lo consigues aún más.
Si quisieras ensuciarte ¿te mancharías con agua?

http://www.ioccc.org/

Venga, saludos.
Volver arriba
cheroky



Registrado: 22 Sep 2005
Mensajes: 1331
Ubicación: En ecx esperando un call

MensajePublicado: 21/09/2007 12:45 am
Título:

DCelso escribió:
Yo uso g++ y compila de p... madre, si va con el g++ casi que debería ir en cualquier otro.

Código:
$g++ dc.cpp
In file included from C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/backward/iostream.h:31,
                 from dc.cpp:4:
C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/backward/backward_warning.h:32:2: warning: #warnin
g This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in
section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes
, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
In file included from C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/cstdio:52,
                 from C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/mingw32/bits/c++locale.h:43,

                 from C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/iosfwd:46,
                 from C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/ios:44,
                 from C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/ostream:45,
                 from C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/iostream:45,
                 from C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/backward/iostream.h:32,
                 from dc.cpp:4:
C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/stdio.h:216: error: extraneous `char' ignored
C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/stdio.h:219: error: extraneous `char' ignored
C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/stdio.h: In function `int vsnprintf(char*, size_t, const cha
r*, char*)':
C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/stdio.h:219: error: expected primary-expression before "char
"
In file included from C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/cstdio:52,
                 from C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/mingw32/bits/c++locale.h:43,

                 from C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/iosfwd:46,
                 from C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/ios:44,
                 from C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/ostream:45,
                 from C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/iostream:45,
                 from C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/backward/iostream.h:32,
                 from dc.cpp:4:
C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/stdio.h: At global scope:
C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/stdio.h:465: error: extraneous `char' ignored
C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/stdio.h:468: error: extraneous `char' ignored
C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/stdio.h: In function `int vsnwprintf(wchar_t*, size_t, const
 wchar_t*, char*)':
C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/stdio.h:468: error: expected primary-expression before "char
"
In file included from C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/cwchar:54,
                 from C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/bits/postypes.h:46,
                 from C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/iosfwd:50,
                 from C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/ios:44,
                 from C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/ostream:45,
                 from C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/iostream:45,
                 from C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/backward/iostream.h:32,
                 from dc.cpp:4:
C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/wchar.h: At global scope:
C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/wchar.h:280: error: extraneous `char' ignored
C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/wchar.h:281: error: extraneous `char' ignored
C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/wchar.h:282: error: extraneous `char' ignored
C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/wchar.h:284: error: extraneous `char' ignored
C:/Mingw/bin/../lib/gcc/mingw32/3.4.2/../../../../include/wchar.h:285: error: extraneous `char' ignored

DCelso escribió:
¿En qué parte estoy saltandome el standard C++?

En la inclusion de headers propios de C++ con la extension *.h, en la inclusion de headers de C con la (tambien) llamada obsoleta *.h y por ende en la omision del namespace estandar std

DCelso escribió:
De todas formas eso de decir que ofuscar no es saltarse el standard es discutiblie, no se en qué te basas, porque en todas las competiciones de código ofuscado la única norma era que compilase el código fuente y el binario cumpliera con el objetivo final.
Si lo piensas es lógico si lo estás ofuscando para que sea ininteligible, si te saltas normativas lo consigues aún más.
Si quisieras ensuciarte ¿te mancharías con agua?

Ese es el problema, que no compila. He participadoen alguna compe de ofuscate code y salvo las de golf (minimal bytes code), era requisito imprescindible no tener warnings. No dudo que no las haya de otro modo. Para un servidor la gracia esta en ofuscarlo sin lanzar un solo warning.
Y sobre la web que posteas... que se va a esperar de un grupo de hippies que no ven mas alla del POSIX. No te imaginas lo ofuscadas que pueden llegar a ser las apis de windows.

Y ya para terminar y como curiosidad hay en la red bastantes ofuscudores (si no quieres hacerte uno propio) que respetan los estandares.

S2.
_________________
- Explícito es mejor que implícito.
- Simple es mejor que complejo.
- Complejo es mejor que complicado.
- Plano es mejor que anidado.
- Ralo es mejor que denso.


Ultima edición por cheroky el 21/09/2007 4:22 am; editado 1 vez
Volver arriba
DCelso



Registrado: 28 Abr 2004
Mensajes: 112

MensajePublicado: 21/09/2007 4:11 am
Título:

Tienes mucha razón, no tiene quedar ni errores ni warnigs, debe ser una compilación limpia. Es que uso el eclipse CDT y me abtraía esa información.

Con mi afán de hacer menos pesado el código intenté usar terminología C en C++. Cagada total. He comprobado que devuelve el mismo tamaño final de archivo con los *.h y con la std. Asi que para que ocupe poquito hay que usar C , con gcc.

Pasteo aqui el código en sendos formatos sin warnigns ni errores.

C
Código:

#define n char
#include <ctype.h>
#define e isdigit
#include <stdio.h>
#define a isalpha
char cd(char *);
#define o toupper
#include <string.h>
#define u int
#define c cd
#define i return
int main()/////
{n r[255];puts("Introduce tu NIF: ");scanf("%s",&r[1]);r[0]=cd(&r[1]);puts("Introduce fecha de nacimiento (AAMMDD): ");scanf("%s",&r[11]);puts("Introduce fecha de caducidad (AAMMDD): ");scanf("%s",&r[21]);sprintf(&r[31], "%s%d%s%d%s%d", &r[1], r[0], &r[11], cd(&r[11]), &r[21],cd(&r[21]));printf(" El primer dígito misterioso es:%d\n",r[0]);printf(" El segundo dígito misterioso es:%d",cd(&r[31]));i 0;}n c(n*h)///
{int f[5]={7,3,1,0,0};for(;h[f[4]]!=0;f[4]++)//
if(e(h[f[4]]))//
{f[3]+=(h[f[4]]-48)*f[f[4]%3];}else if(a(h[f[4]]))//
{f[3]+=(o(h[f[4]])-65)*f[f[4]%3];}else return-1;return f[3]%10;}


C++
Código:

#define n char
#include <cctype>
#define e isdigit
#include <iostream>
#define a isalpha
char cd(char *);
#define o toupper
#include <cstring>
#define u int
#define c cd
#define i endl
using namespace std;
int main()/////
{n r[255];cout <<"Introduce tu NIF: ";cin>> &r[1];r[0]=cd(&r[1]);cout <<"Introduce fecha de nacimiento (AAMMDD): ";cin>> &r[11];cout <<"Introduce fecha de caducidad (AAMMDD): ";cin>> &r[21];sprintf(&r[31], "%s%d%s%d%s%d", &r[1], r[0], &r[11], cd(&r[11]), &r[21],cd(&r[21]));cout <<" El primer dígito misterioso es:"<<(u)r[0]<<endl;cout <<" El segundo dígito misterioso es:"<<(u)cd(&r[31]);}n c(n*h)///
{int f[5]={7,3,1,0,0};for(;h[f[4]]!=0;f[4]++)//
if(e(h[f[4]]))//
{f[3]+=(h[f[4]]-48)*f[f[4]%3];}else if(a(h[f[4]]))//
{f[3]+=(o(h[f[4]])-65)*f[f[4]%3];}else return-1;return f[3]%10;}


Gracias por la informacion.

Por otra parte. ¿Alguien ha probado la aplicación a ver si funciona con su DNI?
Volver arriba
cheroky



Registrado: 22 Sep 2005
Mensajes: 1331
Ubicación: En ecx esperando un call

MensajePublicado: 21/09/2007 4:26 am
Título:

Con el paquete gnu-gcc y mingw cualquier uso de la STL llena de basura innecesaria el codigo ejecutable, aunque no afecta en nada en el runtime.

S2.
_________________
- Explícito es mejor que implícito.
- Simple es mejor que complejo.
- Complejo es mejor que complicado.
- Plano es mejor que anidado.
- Ralo es mejor que denso.
Volver arriba
Killrazor



Registrado: 24 Ene 2006
Mensajes: 1170
Ubicación: Barcelona

MensajePublicado: 21/09/2007 6:20 am
Título:

No te ofendas, pero mi pregunta es: para que compartes codigo a modo de tutorial, pero ofuscado? No es un poco incongruente?
_________________
I wanna heal i wanna feel like I'm close to something real.
I wanna find something I've wanted all along
somewhere i belong
Volver arriba
Pantalàimon_



Registrado: 17 Jul 2007
Mensajes: 90

MensajePublicado: 05/10/2007 10:11 am
Título:

Código:
0  1  2  3  4  5  6  7  8  9  10 11
T  R  W  A  G  M  Y  F  P  D  X  B

12 13 14 15 16 17 18 19 20 21 22
N  J  Z  S  Q  V  H  L  C  K  E 


¿Hay alguna relación entre estos números y las letras o se pueso así porque sí?

Saludos!
Volver arriba
      Índice del Foro elrincondelc.com -> Algoritmos
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com