Kolmogorov-mania

32

La complejidad de Kolmogorov de una cadena s se define como la longitud del programa P más corto que emite s. Si la longitud de P es más corta que la longitud de s, entonces se dice que s es compresible , de lo contrario s es incompresible . La mayoría de las cadenas son incompresibles ...

Escriba el programa más corto que genera esta cadena (sin espacios y sin líneas nuevas):

d9 a6 b6 33 56 a7 95 4b 29 b0 ac 7f 2a aa 6d 19 b8 4b 4c f8 b6 2a ac 95 
a1 4b 4e a5 9d b3 e7 c9 4c 49 59 ec 94 b3 aa 6c 93 8f 11 5a 4d 39 75 82 
ec ea 24 cc d3 2d c3 93 38 4e b7 a6 0d d2 b5 37 23 54 ad 1b 79 aa 6e 49 
55 52 94 5a a7 3a 6a e9 e4 52 cd 2d 79 ad c6 12 b5 99 5b b4 76 51 17 4e 
94 f3 9a a2 e7 15 6a 55 14 4d 4e 4a a3 5c 2f ab 63 cc b5 a6 a4 92 96 8a 
2e c3 d8 88 9b 8c a9 16 f5 33 22 5b a2 e2 cc 1b 27 d4 e8 db 17 a4 39 85 
ca aa 5b 4f 36 24 d3 c6 f6 94 ad d7 0f 71 24 e1 b1 c5 ef 65 35 6c 8d d7 
1a 87 1e 25 df 5d c0 13 b2 6f 5a 57 28 98 bd 41 66 04 ed a2 52 c9 ac 83 
b3 6c 56 7e d1 c6 cc 53 4a 62 c5 59 a9 b2 d4 af 22 a5 a9 f4 b2 99 23 32 
f8 fb ae 48 6a 8a 9a b5 46 7a 36 59 9f 92 d3 25 b5 19 bd 8a 4a 49 62 a5 
e4 59 fb e5 ba a2 35 dd a9 36 1d a9 c9 69 89 77 6a b2 34 2d 1d 22 61 c5 
c2 66 1c e2 76 74 52 a5 d9 84 b9 8a a6 b5 14 ec 29 58 b2 bc 96 16 16 48 
f5 c5 bd 2f 32 1b 3d 4f 4b 2e b2 6b 9a d9 32 a4 4b 5c bc 92 b7 b3 26 39 
fa 42 2d 64 ed 1a 79 49 4c a3 b7 85 b2 a6 e2 8c d9 55 90 e1 a8 87 4b 60 
a6 e1 ba c4 bb ec 32 39 76 90 a6 b4 c6 65 79 61 91 aa 3d 54 b7 18 3d 15 
4b 06 db 30 8a 4d 4a a1 35 75 5d 3b d9 98 ac 55 5b 10 dd b3 e2 cc f1 5e 
b3 2b 53 90 b6 ee 2b ac 8f 88 8d 95 5a 75 df 59 2d 1c 5a 4c e8 f4 ea 48 
b9 56 de a0 92 91 a9 15 4c 55 d5 e9 3a 76 8e 04 ba e7 b2 aa e9 ab 2a d6 
23 33 45 3d c4 e9 52 e3 6a 47 50 ba af e4 e5 91 a3 14 63 95 26 b3 8b 4c 
bc aa 5a 92 7a ab ad a6 db 53 2e 97 06 6d ba 3a 66 49 4d 95 d7 65 c2 aa 
c3 1a 92 93 3f ca c2 6c 2b 37 55 13 c9 88 4a 5c 62 6b a6 ae cc de 72 94 

La salida debería verse así:

d9a6b63356a7954b29b0ac7f2aaa6d19b84b4cf8b62aac95a14b4e...7294

Nota: no se permite la entrada del usuario, ni el acceso web, ni las bibliotecas (excepto la requerida para imprimir la salida).

Edición I: la secuencia parece aleatoria ... pero resulta ser altamente compresible manejando un poco de números primos ...

Edición II: ¡ Bien hecho! Revisaré las respuestas en las próximas horas, luego asignaré la recompensa. Esta es mi idea sobre cómo podría resolverse:

  1. Si intentas comprimir los datos, no te alejas ...
  2. En internet puede encontrar la (¿conocida?) Enciclopedia en línea de secuencias enteras (OEIS);
  3. probar los primeros dígitos hexadecimales d9, a6, b6, 33, ...(o su representación decimal) no da ningún resultado;
  4. pero si convierte los números a binario ( 1,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0) y los busca en OEIS, obtendrá este resultado .
  5. Como señaló Claudiu, también di una pequeña pista en la pregunta (Editar I arriba) ... :-)

El ganador es : Peter Taylor (GolfScript, 50), con una mención especial para Claudiu (Python, 92), el primero que lo "resolvió".

Marzio De Biasi
fuente
2
¿Cómo es esto más interesante que otras preguntas de complejidad komogorov ?
Pomo de la puerta
2
@Doorknob: tal vez nada ... al menos hasta que alguien publique una respuesta :-)
Marzio De Biasi
55
¿Se supone que esto es un juego de "Adivina la constante"?
Peter Taylor
77
¡No des la solución! La gente está trabajando en ello :-)
Mau
3
Creo que el concurso debe ser en dos partes. La primera parte es un premio otorgado a quienes encontraron la respuesta. La segunda parte es un premio otorgado a aquellos que realmente saben cómo comprimir el código y generar el más pequeño. En este momento, es más una pregunta de "adivina mi algoritmo", que excluye a los tontos como yo, pero también a los profesionales de golf de código real, (que tampoco soy yo), y aquellos que conocen APL y los otros lenguajes concisos (todavía no soy yo). )

Respuestas:

11

GolfScript (50 bytes)

$ wc -c codegolf24909.min.gs 
50 codegolf24909.min.gs
$ md5sum codegolf24909.min.gs 
ce652060039fba071d17333a1199fd72  codegolf24909.min.gs
$ time golfscript.rb codegolf24909.min.gs 
d9a6b63356a7954b29b0ac7f2aaa6d19b84b4cf8b62aac95a14b4ea59db3e7c94c4959ec94b3aa6c938f115a4d397582ecea24ccd32dc393384eb7a60dd2b5372354ad1b79aa6e495552945aa73a6ae9e452cd2d79adc612b5995bb47651174e94f39aa2e7156a55144d4e4aa35c2fab63ccb5a6a492968a2ec3d8889b8ca916f533225ba2e2cc1b27d4e8db17a43985caaa5b4f3624d3c6f694add70f7124e1b1c5ef65356c8dd71a871e25df5dc013b26f5a572898bd416604eda252c9ac83b36c567ed1c6cc534a62c559a9b2d4af22a5a9f4b2992332f8fbae486a8a9ab5467a36599f92d325b519bd8a4a4962a5e459fbe5baa235dda9361da9c96989776ab2342d1d2261c5c2661ce2767452a5d984b98aa6b514ec2958b2bc96161648f5c5bd2f321b3d4f4b2eb26b9ad932a44b5cbc92b7b32639fa422d64ed1a79494ca3b785b2a6e28cd95590e1a8874b60a6e1bac4bbec32397690a6b4c665796191aa3d54b7183d154b06db308a4d4aa135755d3bd998ac555b10ddb3e2ccf15eb32b5390b6ee2bac8f888d955a75df592d1c5a4ce8f4ea48b956dea09291a9154c55d5e93a768e04bae7b2aae9ab2ad62333453dc4e952e36a4750baafe4e591a314639526b38b4cbcaa5a927aabada6db532e97066dba3a66494d95d765c2aac31a92933fcac26c2b375513c9884a5c626ba6aeccde7294

real    365m11.938s
user    364m45.620s
sys     0m6.520s

Dado que todos los demás ahora están revelando su código, también me adelantaré a la solicitud de OP para no ofuscar:

38200,{:x,{)x\%!},,2=},4/{3\{2&!!1$++}/.57>39*+}%+

Disección general

  • Calcular primos más pequeños que N con N = 38200: esto da los primeros 4032 primos:38200,{:x,{)x\%!},,2=},
  • Queremos un bit por primo, con una conversión hexadecimal, así que divídalos en grupos de 4: 4/
  • Para cada grupo, asigne cada primo pa p&2 != 0, y haga una conversión de base-2 a base-16: {3\{2&!!1$++}/.57>39*+}%(aquí es donde están los trucos interesantes)
  • Ahora tenemos una matriz de valores ASCII, más la cadena vacía de stdin; concatenarlos para obtener una sola cadena de salida:+

Disección más detallada de la conversión de base

Dada una pila que contiene una cadena vacía y una lista de números primos, necesitamos hacer dos conversiones:

  1. Convierta cada primo en un bit que indique si es igual a 2 o 3 (mod 4)
  2. Convierte los bits en dígitos hexadecimales

Hay muchas maneras igualmente largas de hacer 1; p.ej

{4%1>}%
{4%2/}%
{2/1&}%
{2/2%}%
{2&!!}%

o incluso

{2&}% followed by a 2/ after the base conversion

Para 2, el enfoque obvio es

2base 16base{'0123456789abcdef'=}%+

Pero base es una palabra larga, y como 16 = 2 4 podemos guardar fácilmente algunos caracteres con

4/{2base'0123456789abcdef'=}%+

Ahora el desperdicio más obvio son los 18 caracteres dedicados a esa cadena. Solo queremos una función de dígito a código ASCII. Queremos mapear 0a '0' = 48, ..., 9a '9' = 57, 10a 'a' = 97, ... 15a 'f' = 102.

4/{2base.9>39*+48+}%+

Pero ahora arroja a la mezcla una prohibición base. Necesitamos implementarlo nosotros mismos. La implementación obvia (en esta dirección, la fácil) es quek base es un pliegue {\k*+}*. La alternativa un poco más largo es una iteración directa, que necesita un caso base: 0\{\k*+}/. Base 2 es ligeramente especial: 1$++es equivalente a \2*+la misma longitud, y he adoptado ese enfoque.

Ambos son más largos que el 5-char 2base , pero dado que ahora estamos iterando sobre los valores, podemos extraer en la parte 1 para tener un solo bucle. Reemplazamos

{2&!!}%4/{2base.9>39*+48+}%+

con

4/{{2&!!1$++}*.9>39*+48+}%+

para un buen ahorro de 1 char, o

4/{0\{2&!!1$++}/.9>39*+48+}%+

por una pérdida de 1 char.

Pero aunque esa pérdida de 1 carácter parece un paso atrás, considere lo que le sucede a ese 0. Se multiplica por 16 y se agrega a la salida de conversión de base. Y lo último que hacemos es agregar un múltiplo de 16 a la salida. Entonces podemos combinar los dos como

4/{3\{2&!!1$++}/.57>39*+}%+

La articulación más corta y la inteligencia adicional lo hacen más interesante.

Peter Taylor
fuente
1
360 minutos! Eso es bastante tiempo. Me pregunto qué enfoque tomaste ... el mío toma <1 min
Claudiu
44
@Claudiu, podría hacerlo mucho más rápido, pero agregaría unos 5 caracteres, y esto es una complejidad de kolmogorov en lugar de un código de golf con limitaciones de tiempo.
Peter Taylor
¿Cuánto podrías bajar si lo usaras base? Todas las otras soluciones usan un equivalente (la mina usa hex, la C usa printf("%x"), la Haskell usa showHex)
Claudiu
1
@Claudiu, en realidad mi mejor enfoque actual basees más largo que este, porque hice la mayor parte de la optimización después de aclarar que no podía usarla. baseme da un valor de 0 a 15, por lo que todavía necesita algo de trabajo para convertir 0-9a-f. Podría volver a usarlo baseen algún momento, pero no esta noche.
Peter Taylor
32

Python, 92 caracteres

¡Aquí están damas y caballeros, el código en sí!

>>> code = "R=range;print hex(int(''.join(`i/2%2`for i in R(38198)if all(i%x for x in R(2,i))),2))[2:-1]"
>>> len(code)
92
>>> exec code
d9a6b63356a7954b29b0ac7f2aaa6d19b84b4cf8b62aac95a14b4ea59db3e7c94c4959ec94b3aa6c938f115a4d397582ecea24ccd32dc393384eb7a60dd2b5372354ad1b79aa6e495552945aa73a6ae9e452cd2d79adc612b5995bb47651174e94f39aa2e7156a55144d4e4aa35c2fab63ccb5a6a492968a2ec3d8889b8ca916f533225ba2e2cc1b27d4e8db17a43985caaa5b4f3624d3c6f694add70f7124e1b1c5ef65356c8dd71a871e25df5dc013b26f5a572898bd416604eda252c9ac83b36c567ed1c6cc534a62c559a9b2d4af22a5a9f4b2992332f8fbae486a8a9ab5467a36599f92d325b519bd8a4a4962a5e459fbe5baa235dda9361da9c96989776ab2342d1d2261c5c2661ce2767452a5d984b98aa6b514ec2958b2bc96161648f5c5bd2f321b3d4f4b2eb26b9ad932a44b5cbc92b7b32639fa422d64ed1a79494ca3b785b2a6e28cd95590e1a8874b60a6e1bac4bbec32397690a6b4c665796191aa3d54b7183d154b06db308a4d4aa135755d3bd998ac555b10ddb3e2ccf15eb32b5390b6ee2bac8f888d955a75df592d1c5a4ce8f4ea48b956dea09291a9154c55d5e93a768e04bae7b2aae9ab2ad62333453dc4e952e36a4750baafe4e591a314639526b38b4cbcaa5a927aabada6db532e97066dba3a66494d95d765c2aac31a92933fcac26c2b375513c9884a5c626ba6aeccde7294
>>> import hashlib; hashlib.sha256(code).hexdigest()
'60fa293bbe895f752dfe208b7b9e56cae4b0c8e4cdf7c5cf82bf7bab60af3db6'

Marzio dejó una pista inteligente al decir que "resulta ser muy compresible manejar un poco de números primos". Estaba seguro de que el "bit" no estaba en cursiva por accidente, así que convertí la cadena hexadecimal en bits e intenté encontrar patrones. Al principio pensé que él representaba todos los números primos como bits y los concatenaba, pero eso no funcionó. Entonces, tal vez solo tome unos pocos dígitos o elimine todos los ceros en la cadena de bits, aún no. ¿Quizás es una cadena de bits del bit menos significativo de los primeros números primos? No exactamente. Pero finalmente encontré el que funcionó: es una cadena de bits del segundo bit menos significativo de los primeros sin embargo, muchos primos.

Entonces, mi código hace exactamente eso: generar suficientes primos, tomar el segundo bit de cada ( i/2%2), concatenarlos como una cadena binaria, luego convertirlo a base-10 ( int(..., 2)) y luego a base-16 ( hex(...)).

Claudiu
fuente
1
¡Excelente! Soy nuevo en el código de golf, pero el hash es una buena manera de permitir que otras personas se diviertan descubriendo "cómo hacerlo". Esperaré dos días, luego abriré una recompensa (que recompensaré con la confianza :).
Marzio De Biasi
55
@MarzioDeBiasi: ¡Seguro que funciona! O tal vez sea mejor decir que lo recompensará el día antes de que venza la recompensa, y si el ganador no revela su respuesta, el segundo en el lugar gana, etc ... ¿por qué confiar en la confianza cuando no tiene que hacerlo? ?
Claudiu
¿Por qué no se ha contado el código en hashlib? ¿No se está ejecutando el código para generar resultados?
philcolbourn 01 de
2
@philcolbourn: No, el código no usa hashlib. Es solo para generar el hash sha256 para que mañana pueda probar que escribí el código cuando publiqué esto por primera vez. Verás mañana!
Claudiu
@Claudiu: ¡Ahora deberías explicarme cómo resolviste el problema! ¡Bien hecho!
rubik
9

Haskell, 105

SHA1 hash: a24bb0f4f8538c911eee59dfc2d459194ccb969c

Salida:

d9a6b63356a7954b29b0ac7f2aaa6d19b84b4cf8b62aac95a14b4ea59db3e7c94c4959ec94b3aa6c938f115a4d397582ecea24ccd32dc393384eb7a60dd2b5372354ad1b79aa6e495552945aa73a6ae9e452cd2d79adc612b5995bb47651174e94f39aa2e7156a55144d4e4aa35c2fab63ccb5a6a492968a2ec3d8889b8ca916f533225ba2e2cc1b27d4e8db17a43985caaa5b4f3624d3c6f694add70f7124e1b1c5ef65356c8dd71a871e25df5dc013b26f5a572898bd416604eda252c9ac83b36c567ed1c6cc534a62c559a9b2d4af22a5a9f4b2992332f8fbae486a8a9ab5467a36599f92d325b519bd8a4a4962a5e459fbe5baa235dda9361da9c96989776ab2342d1d2261c5c2661ce2767452a5d984b98aa6b514ec2958b2bc96161648f5c5bd2f321b3d4f4b2eb26b9ad932a44b5cbc92b7b32639fa422d64ed1a79494ca3b785b2a6e28cd95590e1a8874b60a6e1bac4bbec32397690a6b4c665796191aa3d54b7183d154b06db308a4d4aa135755d3bd998ac555b10ddb3e2ccf15eb32b5390b6ee2bac8f888d955a75df592d1c5a4ce8f4ea48b956dea09291a9154c55d5e93a768e04bae7b2aae9ab2ad62333453dc4e952e36a4750baafe4e591a314639526b38b4cbcaa5a927aabada6db532e97066dba3a66494d95d765c2aac31a92933fcac26c2b375513c9884aaec626ba2

Editar: Código:

import Numeric;f(x:z)s=f[y|y<-z,0/=mod y x]$s*2+quot(mod x 4)2;f[]s=s;main=putStr$showHex(f[2..38198]0)""

Me perdí la regla sobre no usar ninguna función de biblioteca excepto la impresión (putStr). Supongo que los operadores matemáticos, aunque técnicamente son funciones, están permitidos.

usuario253751
fuente
9

C, 136 116 109 103 caracteres

Bien, entonces, aquí está mi esfuerzo:

i;p;q;main(n){for(;n++,q<4032;){for(i=1;++i<n&&n%i;);if(i==n)p+=p+(n&2)/2,p=++q&3?p:printf("%x",p)*0;}}

MD5 hash = f638552ef987ca302d1b6ecbf0b50e66
ossifrage aprensivo
fuente
1
Como printfdevuelve el número de caracteres escritos, que aquí siempre es distinto de cero, puede usar en !printf(...)lugar de printf(...)*0guardar un carácter.
user12205
@ace * golpea la frente * Ah, ¿por qué no pensé en eso? Gracias as, como siempre :-) (También puede dejar el código como está, ya que se supone que debe coincidir con el hash MD5.)
apretujado ossifrage
7

JS, 764

Si consideramos esta cadena como base64, podemos tener una versión más pequeña usando la versión un-base-64-ed:

btoa("wÖºo­÷离÷ÛÖôiÎßÙ¦éÝ}oÎáÇüo­iÏyk^áæ¹õÖ÷{·=áÎ=ç×÷÷i®÷×^ZáÝýï6yÇÛw}swßÎo¶ºÑ×voûÛ~xiÝ[ïÖéî=çv÷Zk½Ú駽{vqÝïÖs­vo}å¶øï®u×¾÷÷õ¦¶{½yé®y×áîk~\Ùöëwoºkv÷¯Ùç7wÏ<õ¿kÝz÷Ûn[kg¶qÍ[Û·x{Ç[׶¸ßß9q¦å¾ß­¸ww:¯xi×{ÑþõÛµoW9yþ¹ßñ×{Õ¯;Õí¹uþ]sMwonå®{ÛÏ|mÞ5ë­8yÖ¶çg=iÏ7o~ç®ÞwW:qÎw᮶s}kÖöwÛf¹k×øoo}Û}öÇÛiî<é¯õ¦ùã®Úß®}õÿvw}¹o}mßá®=ëf¹{}}·¹m¦¶ß]kÝúÕÖ½sÞ½óÞûé¦ößÕݶëW9snºÕǶï®øçf¹wß8oßk¦ù×ÛÞ|ofÜ÷­z×®<9mÝßm[ÝÞá½onõ§}ßf¸á¾\mÏvo¶÷Û­ý}®6ÙÞ¸yÝZïÞ=áÆ·o¿9ofº{owÞy÷GµkÏ;á¾´k§µm§8m·ßmýï¯tk¦øs®¹ïÞµ÷VÝÞxo½|ÝÝyá½:u½ôñ®á¦µßùåÝÛwß|iÎyå½tuÖ÷{g^^o}çto§Ù¶ñÿ<ñßyå®ùuþ}ÙÝ\å®{Çøy®<oÞzuæ´÷oukÝyáÎyw½Ý®úñí8m§»of{ÖÙ§zÛ}÷ãÝs½çg·é®;çFÚi÷¸{uk}xëyÛ¦÷ñ¾mÆå¯ví¦iÖºu¾wÙï{Ó®m­Úë®=áßyw¾¹sfs}Z÷owÝ÷snÙ½ûçwsß<á®\ënk¦qÇ^ïox")

Pero creo que el autor quiere que encontremos la lógica detrás de esta cadena no aleatoria.

xem
fuente
1
para evitar la "fiebre de los votos negativos" agregué algunos detalles en la pregunta :-)
Marzio De Biasi
4

Mathetmatica - 56

El misterio ya está resuelto, así que solo implementando la idea

⌊.5Prime@Range@4032⌋~Mod~2~FromDigits~2~IntegerString~16
silbido
fuente
Agradable. Tengo curiosidad por saber cuál es la posibilidad más corta ahora que el gato está fuera de la bolsa
Claudiu
¿Llamas a eso "no hay bibliotecas (excepto la requerida para imprimir la salida)"?
Peter Taylor
@PeterTaylor Sí, no hay importaciones, no hay bibliotecas.
swish
A juzgar por los comentarios, no creo que sea así como OP pretendía que fuera interpretado.
Peter Taylor
3

J - 46 char

No te preocupes por mí, simplemente registrando el golf J aquí para la posteridad. No fue lo suficientemente inteligente como para descubrir el truco.

4[1!:2&4'0123456789abcdef'{~#.2|<.-:p:i.1007 4

Explicado:

  • p:i.1007 4- Cree una matriz de 1007 filas y 4 columnas de enteros a partir de 0, luego tome los números primos correspondientes a esos enteros. Sí, p:es un J incorporado. Sí, somos cuatro primos cortos.

  • 2|<.-:- Reduzca a la mitad cada número ( -:), suéltelo ( <.) y tome ese módulo 2 ( 2|). Esto es lo mismo que tomar el bit significativo siguiente al arrendamiento.

  • #.- Convierta cada fila del resultado de la base 2 en un entero. Esto nos da 1007 números del 0 al 15 inclusive.

  • '0123456789abcdef'{~#.- Tome cada fila de esta matriz de bits como el binario para un número, y use ese número para seleccionar de la lista de dígitos hexadecimales. Esto convierte cada cuatro bits en el hex.

  • 1!:2&4- El intérprete J tiene un problema al generar cadenas de más de 256 caracteres, por lo que debemos enviar estos datos directamente a stdout. A veces se gana, se pierde algo.

  • 4[- Finalmente, descarte el resultado 1!:2y, en su lugar, envíe los 4 que faltan de la salida. Hacemos esto porque es más corto que incluir esos últimos cuatro números primos y devolver un resultado vacío aquí.

Algoritmo de tiburón
fuente
0

JS, 503

Siguiendo la idea de @xem:

s='Ù¦¶3V§K)°¬*ªm¸KLø¶*¬¡KN¥³çÉLIY쳪lZM9uìê$ÌÓ-Ã8N·¦\nÒµ7#T­yªnIURZ§:jéäRÍ-y­Æµ[´vQNó¢çjUMNJ£\/«c̵¦¤.ÃØ©õ3"[¢âÌ'+"'"+'ÔèÛ¤9ʪ[O6$ÓÆö­×q$á±Åïe5l×%ß]À²oZW(½Afí¢Rɬ³lV~ÑÆÌSJbÅY©²Ô¯"¥©ô²#2øû®HjµFz6YÓ%µ½JIb¥äYûåº\n5Ý©6©Éiwj²4-"aÅÂfâvtR¥Ù¹¦µì)X²¼HõŽ/2=OK.²kÙ2¤K\¼·³&9úB-díyIL£·²¦âÙUá¨K`¦áºÄ»ì29v¦´Æeyaª=T·=KÛ0MJ¡5u];Ù¬U[ݳâÌñ^³+S¶î+¬ZußY-ZLèôêH¹VÞ ©LUÕé:vºç²ªé«*Ö#3E=ÄéRãjGPº¯äå£c&³L¼ªZz«­¦ÛS.mº:fIM×eªÃ?ÊÂl+7UÉJ\bk¦®ÌÞr'
r=''
for(var i=0;i<s.length;i++) r+=s.charCodeAt(i).toString(16);
console.log(r)
Antonio Ragagnin
fuente
0

Mathematica, 55

Prime~Array~4031~BitAnd~2~FromDigits~2~IntegerString~16

Probado en Mathematica 8. Esto hace uso de dos observaciones:

  • En FromDigitsrealidad , Mathematica no verifica el rango de los dígitos dados, por lo tanto, si lo aplica a una lista del formulario {2,0,2,2,0,...}, obtendrá el doble de resultados que si aplicara {1,0,1,1,0,...}. Pero esa es exactamente la forma generada por BitAndlos primos con 2.
  • El último bit del número cuya representación hexadecimal que queremos resulta ser cero (como lo demuestra la cadena que termina en un dígito par), por lo que es solo dos veces el número que obtendría con un primo menos. Pero un factor de dos es exactamente lo que obtenemos al usar la observación anterior, por lo que todo encaja perfectamente.
celtschk
fuente