El mensaje de Arecibo es un mensaje de radio interestelar de 1974 que contiene información básica sobre la humanidad y la Tierra enviada al cúmulo estelar globular M13 con la esperanza de que la inteligencia extraterrestre pueda recibirlo y descifrarlo ... El mensaje constaba de 1.679 dígitos binarios, aproximadamente 210 bytes ...
Se eligió el número 1,679 porque es un semiprime (el producto de dos números primos), que se organizará de forma rectangular como 73 filas por 23 columnas. La disposición alternativa, 23 filas por 73 columnas, produce un conjunto ininteligible de caracteres (al igual que todos los demás formatos X / Y).
Este es el mensaje con color agregado para resaltar sus partes separadas. La transmisión binaria real no tenía información de color.
Su tarea es enviar el mensaje de Arecibo en la disposición exacta de 23x73 que se muestra en la imagen. Cualquiera de estos formatos de salida es aceptable:
- Texto, usando un carácter para unos y otro para ceros (usando las reglas habituales para la separación de filas)
- Una matriz 2D de dos valores distintos.
- Una imagen de 23x73 con dos colores distintos.
- Una secuencia ininterrumpida de 1679 elementos de dos valores distintos (es decir, cualquiera de los formatos anteriores, pero planos).
- Un entero de 1679 bits. Indique el orden de bits y bytes (endianness) en su solución.
Para su comodidad, aquí hay una versión que se puede copiar y pegar (también un ejemplo de salida en formato de texto):
00000010101010000000000
00101000001010000000100
10001000100010010110010
10101010101010100100100
00000000000000000000000
00000000000011000000000
00000000001101000000000
00000000001101000000000
00000000010101000000000
00000000011111000000000
00000000000000000000000
11000011100011000011000
10000000000000110010000
11010001100011000011010
11111011111011111011111
00000000000000000000000
00010000000000000000010
00000000000000000000000
00001000000000000000001
11111000000000000011111
00000000000000000000000
11000011000011100011000
10000000100000000010000
11010000110001110011010
11111011111011111011111
00000000000000000000000
00010000001100000000010
00000000001100000000000
00001000001100000000001
11111000001100000011111
00000000001100000000000
00100000000100000000100
00010000001100000001000
00001100001100000010000
00000011000100001100000
00000000001100110000000
00000011000100001100000
00001100001100000010000
00010000001000000001000
00100000001100000000100
01000000001100000000100
01000000000100000001000
00100000001000000010000
00010000000000001100000
00001100000000110000000
00100011101011000000000
00100000001000000000000
00100000111110000000000
00100001011101001011011
00000010011100100111111
10111000011100000110111
00000000010100000111011
00100000010100000111111
00100000010100000110000
00100000110110000000000
00000000000000000000000
00111000001000000000000
00111010100010101010101
00111000000000101010100
00000000000000101000000
00000000111110000000000
00000011111111100000000
00001110000000111000000
00011000000000001100000
00110100000000010110000
01100110000000110011000
01000101000001010001000
01000100100010010001000
00000100010100010000000
00000100001000010000000
00000100000000010000000
00000001001010000000000
01111001111101001111000
Si su idioma, por alguna razón, tiene un mensaje incorporado para el mensaje de Arecibo, no puede usarlo.
¡Buena suerte!
ACTUALIZACIÓN: acepté la respuesta 05AB1E ya que fue la primera en ser más corta que el mensaje original. No dejes que eso te disuada de nuevas soluciones.
ACTUALIZACIÓN 2019-09-09: La respuesta aceptada se movió a una nueva respuesta 05AB1E, ya que obsoleta la respuesta anterior 05AB1E. El mismo punto se aplica a la actualización anterior; nuevas soluciones aún son bienvenidas.
fuente
Respuestas:
05AB1E , 182 bytes
Pruébalo en línea! (utiliza
1
para 0 y0
para 1, según lo permitido por la pregunta).Pruébalo en línea! (5 bytes más,
0
para 0 y1
para 1, se agregaron nuevas líneas para facilitar la lectura).La mayor parte del código es una constante entera N de base 255, el resto es un decodificador de sistema numérico asimétrico , que utiliza probabilidades codificadas de 75% / 25% (la frecuencia real de 0 es 76.35%, que está tan cerca del 75% que solo ahorraría 1.2 bits en la carga útil, mientras que el agradable y redondo 75% nos permite guardar varios bytes en el decodificador).
Aquí está el codificador ANS que generó la constante: ¡ Pruébelo en línea!
fuente
05AB1E ,
215210200 bytesGuardado 15 bytes gracias a Magic Octopus Urn
Pruébalo en línea! o con formato adicional
Serie-255 codificada cadena trinaria con ocurrencias de
0000
reemplazado por2
.fuente
0000
con2
9 bytes más. - pastebin.com/aZ6tHxjx for 201Java,
688 678 590 379361 bytesDevuelve una cadena.
-10 bytes devolviendo el flujo sin procesar (respuesta anterior)
-88 bytes usando números de base 10 (¡gracias @ceilingcat!)
-211 bytes (¡sabía que podría jugar golf!) Usando un BigInteger codificado en base 36 (gracias @JollyJoker !)
-18 bytes usando un número entero codificado diferente (gracias de nuevo @JollyJoker) ¡
Pruébelo en línea!
Explicación:
fuente
Jalea , 213 bytes
Pruébalo en línea!
Jugué con la codificación Huffman, pero las mejoras en el tamaño de los datos fueron superadas por el código adicional. Como tal, esta es simplemente una versión codificada en base 250 de la salida deseada. La salida consiste en un número entero que cuando se decodifica como base biyectiva 2 producirá la lista 1D de 1s y 2s. Gracias @Emigna por señalar el cambio en las reglas.
Pruébelo en línea, ¡con más decodificación para demostrar la salida!
Si se prefiere una codificación binaria más convencional, aquí hay una que codifica una representación entera del mensaje binario invertido. El bit más significativo del número entero representa el comienzo del mensaje.
fuente
Brainfuck,
236020081938 bytesPruébalo en línea!
Probablemente jugaré golf aún más pronto.
fuente
Deadfish ~ ,
111510881084 bytesPruébalo en línea!
Si alguien tiene la paciencia para jugar golf más allá, lo saludo con anticipación. :PAGS
-27 bytes imprimiendo 10s y 100s en lugares donde corresponda.
-4 bytes imprimiendo tres 1000 y un 1001 en la línea 3
fuente
Piet , 1763 codeles
Emite una secuencia de 0s y 1s (sin saltos de línea).
Codel talla 1:
Codel tamaño 4, para facilitar la visualización:
Explicación
Notas
El programa sigue un camino en espiral, en sentido horario desde la parte superior izquierda hacia el centro. Los bloques negros dispersos que siguen más o menos las diagonales son el control de flujo. Aquí está el rastro de NPiet .
He estado trabajando en esto desde el día en que surgió este desafío, ¡pero me tomó un poco de tiempo hacer que el mensaje "se escribiera" en la imagen! Primero escribí los bucles finales y el valor centinela, y luego construí el mensaje desde el centro hacia afuera. (Dado que Piet siempre comienza la ejecución desde la parte superior izquierda, esperaba tener que barajar y rotar la imagen para evitar el exceso de espacio en blanco, ¡pero encaja perfectamente!)
Dato curioso: la codificación de longitud de ejecución en Piet no (por sí misma) ahorra espacio. Se necesitan n codeles de un color para insertar el valor n en la pila, o n codels de diferentes colores para insertar esos 1s en la pila. Por lo tanto, es el mismo número de códeles en ambos sentidos. Pero los números más grandes que le da RLE significan que puede usar trucos aritméticos (por ejemplo, en lugar de presionar 9, puede presionar 3, duplicar y multiplicar) para reducir la cantidad de códeles y bloques de formas divertidas para completar el espacio en blanco disponible.
No estaba seguro de cómo contar el puntaje para las entradas de Piet. Encontré algunos que parecen contar todos los códeles, y otros que explícitamente solo cuentan aquellos utilizados activamente. Acabo de contarlos a todos; Ignorar los códeles blancos (incluso aquellos por los que el programa nunca se mueve) parece ignorar los espacios en blanco en un lenguaje de programación más típico.
Ah, y justo ahora (dos horas después de publicar) me di cuenta de que perdí el último tiempo trabajando en esto. Quería recortar la última fila y columna casi completamente blancas, así que barajé las cosas ... incluyendo los bloques negros de control de flujo. ¡Pero los bordes de la imagen funcionan igual que el negro! Si hubiera recordado eso, no habría necesitado pasar tanto tiempo pensando en las complejidades de los DP y CC ...
fuente
C # (compilador interactivo de Visual C #) ,
366332329319 bytesReemplace todas las instancias de
␀
con\0
para probar.Pruébalo en línea!
C # (compilador interactivo de Visual C #) , 305 bytes, 210 caracteres
Lo mismo con lo anterior, reemplace con
␀
con\0
para probar. Salida comoIEnumerable<string>
.¡Pruébelo en línea! (Cortesía de Jo King)
fuente
++
in12-i++%2
es un nop (al menos, funcionó para mí cuando lo quité)Perl 6 , 368 bytes
Pruébalo en línea!
La cadena larga es el mensaje como un único número de base 36 (con un solo prefijo de 1 bit para preservar los ceros iniciales) que luego se vuelve a convertir en binario e imprime 23 bits a la vez.
fuente
>>.say
y&{S/.//}
para guardar bytes. ¿Has pensado en usar una base diferente en su lugar?Wolfram Language (Mathematica) , 383 bytes
Pruébalo en línea!
fuente
Nodo.js , 333 bytes
Devuelve una cadena binaria de 1,679 caracteres.
Pruébalo en línea! (con salida formateada)
JavaScript (ES8), 413 bytes
Devuelve una cadena binaria de 1,679 caracteres.
Pruébalo en línea! (con salida formateada)
fuente
Chicle,
275236 bytesPruébalo en línea!
fuente
herramientas bash + GNU, 351 bytes
TIO
fuente
MathGolf ,
223220 bytesPruébalo en línea!
Explicación
fuente
L/n
al pie de página, por lo que en realidad son 220 bytes. ¿Se pueden guardar más bytes al portar las respuestas 05AB1E / Java (usando este entero comprimido , convertirlo a base-3 y reemplazar todos los2
s por0000
s)?2
a♫░╞
? EDITAR: no importa. ¿Veo que no tiene una conversión de base integrada (excepto para binario / hexadecimal) para convertir a base-3?+
pie de páginaPerl 5 , 460 bytes
Pruébalo en línea!
fuente
Python 2 , 336 bytes
Pruébalo en línea!
Imprime una cadena de bytes
fuente
Java (OpenJDK 8) , 364 bytes
Pruébalo en línea!
Explicación: Primero tuve
n->new java.math.BigInteger(str,36).toString(2)
, simplemente convirtiendo un número de radix 36 en binario, pero eso necesitaba nueve caracteres adicionales para ceros iniciales. Entonces, tuve la idea de codificar en longitud de ejecución algunos ceros como dos. Una longitud de cuatro ceros parece minimizar la longitud de la raíz 36, por lo quen->new java.math.BigInteger(str,36).toString(3).replaceAll("2","0000")
Vea la discusión bajo esta respuesta para la corrección de errores de ceros a la izquierda por @KevinCruijssen
fuente
[Python 2] , 345 bytes
Codifiqué la longitud de las cadenas de 0 como un byte que comienza en chr (31). Luego codifiqué los 10101 restantes como números binarios que comienzan en chr (70) hasta chr (126). Las cadenas binarias que no encajaban se dividieron en trozos más pequeños.
Editar: reducido a 326 bytes. Gracias jo king
Editar: se corrigió un error en el programa generador de código
Editar: Edición final
fuente
o
una variable.Zsh , 577 bytes
Pruébalo en línea !!
Lógica de codificación personalizada utilizada. La cadena
S
tiene 421 caracteres, posiblemente podría comprimirse un poco más. Las letrasa-w
representan0
s repetidos . Los números1-9
representan1
s repetidos . Las letrasx y z
representan10 100 1000
respectivamente.Tal vez debería haber intentado codificación de pares de bytes o Ascii85 .
fuente
Golpetazo ,
702697 bytesPruébalo en línea!
fuente
Rubí , 362 bytes
Entero escrito en la base 36. Seguramente hay una forma más eficiente de comprimir el entero, por ejemplo, con
zlib
obase64
.Pruébalo en línea!
fuente
[C ++ (VC ++) (pero también probado con gcc)], 585 bytes
Pruébalo en línea!
Versión sin golf (sin embargo, carece del descanso después del elemento 1679 y continúa hasta el 1680):
Como explicación: concatenaba las 73 líneas de salida de muestra dadas a una línea larga. los codifiqué en hexadecimal donde el orden de bits es msbfirst (usando este programa https://github.com/Marc-Bender/longBinaryStreamToHex/releases/download/addedErrorCode-4/longBinaryStreamToHex.exe ) acorté la salida de eso en aproximadamente 70 Dígitos hexadecimales usando las letras 'G' - 'Z' como un signo para repetir el último Dígito durante una cierta cantidad de veces (Z = 2 más veces, Y = 3 más veces ...) el resto debería ser relativamente explicativo para los golfistas de código . abusar del preprocesador para acortar los bucles, abusar del
,
operador y similares.El formato de salida es una secuencia ininterrumpida de 1679 valores 0/1.
fuente
Perl 6 , 348 bytes
Basado en la solución Java de Benjamin Urquhart .
Utiliza un flujo directo de 0 y 1 caracteres. El siguiente enlace tiene un código para embellecer la salida.
Pruébalo en línea!
fuente
Tcl , 366 bytes
Pruébalo en línea!
fuente
C ++ (con biblioteca de precisión múltiple Gnu), 359 bytes
Esto genera la cadena como una línea. Utiliza '1' para 0 y '0' para 1: /
Simplemente lee la cadena incrustada como base 62, y la imprime como base 2.
Úselo
g++ -g arecibo.cpp -lgmp -lgmpxx
para compilar y vincularfuente
class_mpz
conmpz_class
Perl 6 , 276 bytes
Pruébalo en línea!
Salidas como una serie de 1679 0s y 1s. Puede tenerlo en diferentes líneas agregando
.comb(23)>>
antes desay
.Explicación:
Probablemente pueda guardar bytes usando la salida como un entero de 1679 bits o invirtiendo la representación de bits.
fuente
C ++ (gcc) , 748 bytes
Pruébalo en línea!
Al reemplazar la subcadena más utilizada con un nuevo personaje hasta que ya no valga la pena
fuente
Python 3 , 331 bytes
Pruébalo en línea!
fuente