Preparando la escena:
Es una tarde promedio, ya que te relajas después de un largo día participando en tu pasatiempo favorito: respondiendo a la gran cantidad de preguntas cautivadoras sobre PPCG. No ha sido un buen día para ti; esos malditos programadores de Pyth siguen obteniendo la mejor respuesta y está matando tu ambiente. De repente, te das cuenta de que se ha publicado una nueva pregunta. Te decides; esta vez no CJammers. Furiosamente, comienzas a escribir, generando una corriente de personajes; Un feto del glorioso bucle BrainFuck que será su producto final. Escribes y escribes. ¡Más rápido! ¡Más rápido todavía! Estás tan concentrado que ni siquiera notas que las luces de tu pantalla comienzan a parpadear. De repente, el monitor se ilumina en verde, un símbolo extraterrestre marcado en el escritorio. Usando tus habilidades impecablescat ~/Desktop/aliensymbol
y que te presenten un montón de números, un mensaje! Siendo el astuto programador de PPCG que eres, te das cuenta de que se parece a ASCII. No importa para ti, print(chr(i) for i in file)
descifra el mensaje. Tu primer pensamiento: "¡Necesito compartir esto con la comunidad!".
...
¿Quién lo hubiera pensado? Que las primeras personas en contactar con extraterrestres serían los humildes programadores de PPCG. ¿Porque nosotros? Tal vez sea porque somos el epítome de la inteligencia humana. O tal vez porque BrainFuck está tan cerca como tenemos de un idioma extraño. Sin embargo, los extraterrestres, siendo las formas de vida ultrainteligentes que son, quieren probar si deben clasificar a la raza humana como inteligente o no. Como prueba de nuestra destreza mental, los extraterrestres nos han pedido que les enviemos algunos programas de computadora para demostrar que estamos tecnológicamente cultos. ¡El problema es que el único lenguaje humano que entienden es ASCII numérico!
Ayuda a la humanidad a mostrarles a esas criaturas quién es el verdadero alfa intelectual. Necesitamos enviarles un script que convierta nuestros códigos fuente basados en texto en sus versiones ASCII numéricas. Desafortunadamente, debido a nuestra tecnología subdesarrollada (gracias Obama), debemos enviar un programa de traducción lo más pequeño posible. ¡Qué bueno que eligieron contactar a PPCG!
El reto:
La premisa de este desafío es simple: debe escribir un programa que tomará el código fuente de cualquier programa (o cualquier archivo de texto general) y generará una versión separada por espacios con una traducción ASCII debajo de cada línea. Es decir, dada la entrada de un archivo de texto, debe generar cada línea de ese archivo seguida de una línea que contenga la representación ASCII de cada carácter en la línea superior (con cada número alineado con el carácter que representa).
Un ejemplo aclarará mucho esto. Tomando el código fuente de los infames hello world
como entrada:
#include <stdio.h>
int main() {
printf("hello, world\n");
return 0;
}
su programa debería generar:
# i n c l u d e < s t d i o . h >
35 105 110 99 108 117 100 101 32 60 115 116 100 105 111 46 104 62 10
10
i n t m a i n ( ) {
105 110 116 32 109 97 105 110 40 41 32 123 10
p r i n t f ( " h e l l o , w o r l d \ n " ) ;
32 32 32 32 112 114 105 110 116 102 40 34 104 101 108 108 111 44 32 119 111 114 108 100 92 110 34 41 59 10
r e t u r n 0 ;
32 32 32 32 114 101 116 117 114 110 32 48 59 10
}
125 10
Detalles de implementacion:
Puede optar por tomar la entrada en la forma que desee (abrir archivo, línea de comando, parámetro de función, etc.) y debe enviar a stdout o devolver la salida de una función.
Cosas a tener en cuenta
- Cada carácter en la salida está separado por un '\ t' para permitir el espacio de 3 dígitos en la línea de abajo para alinear (vamos a suponer que su pestaña está configurada en 4 espacios o más).
- Las nuevas líneas se muestran en la línea donde se presionó la tecla de retorno (observe los 10 en el ejemplo)
- Los requisitos de impresión '\ t' y '\ n' son laxos. Su salida debe, en el sentido general, verse agradable a la vista (necesita mostrar a esos extraterrestres que también tenemos un sentido estético), y si puede doblar los dos puntos anteriores mientras mantiene la integridad visual, será perdonado.
- Puede optar por suponer si hay una nueva línea al final de la última línea.
Tanteo
Este es el código de golf, por lo que gana el programa más corto. Tenga en cuenta que, incluso si su programa no es el más corto, pero usa trucos realmente buenos en relación con el idioma que está utilizando, ¡muchos + 1 para usted!
Buena suerte. La clasificación de inteligencia intergaláctica de la humanidad descansa sobre tus hombros.
Nota: Por favor, perdona los agujeros de la trama. No soy escritor : D
Respuestas:
Dyalog APL , 14 bytes
Toma una lista de cadenas que incluyen secuencias de nueva línea (10 o 13 10, etc.)
↑
Matrificar la lista de listas que consiste en(
...)¨
para cada línea de retorno ...⊢
el texto en sí,[.5]
seguido en una nueva dimensión antes de la primera dimensión por⎕UCS
los U nicode C r incón dele S et puntos de códigoTryAPL en línea!
fuente
f
se llama directamente en la entrada. Llamar a una función una vez por línea, si hubiera dichof¨
.Pyth,
1713 bytesOtro de esos programadores Pyth. Lo siento.
El nuevo código requiere que cada línea se envuelva entre comillas y se escape (incluidas las nuevas líneas si desea que se impriman), pero coloca una nueva línea adicional entre la línea y el ASCII.
Pruébalo en línea!
Explicación:
Mantengo el código antiguo y su explicación a continuación.
Pruébalo en línea! o use un caso de prueba más fácil de leer .
Explicación:
fuente
Python 2, 105 bytes
Esto utiliza un enfoque ligeramente diferente a la respuesta del OP. Tenga en cuenta que SO ensucia mis pestañas literales con espacios.
Pruébalo en línea
fuente
x+=ord(c)+" "
sería más corto que"%s "%ord(c)
?x+=`ord(c)`+" "
es de la misma longitudVim,
86,77 pulsaciones de teclasEsto es demasiado largo, pero eso es lo que obtienes cuando usas la
eval
función de vim (\=
).fuente
\=
está explicando la función de evaluación, o una cara triste porque está utilizando la función de evaluación ...D;
Perl,
> 3331 bytesIncluye +3 para
-F
(no se puede combinar con-e
y el código'
también, así que el espacio y también-
se cuentan).Ejecutar con la entrada en STDIN o dar uno o más nombres de archivo como argumento
asciidump.pl
El resultado no es estético si el texto contiene una pestaña o no hay una nueva línea final
fuente
Pyth, 21 bytes
Aquí hay una entrada de uno de "esos malditos programadores de Pyth" ;)
Un programa que toma la entrada de una cadena multilínea sin comillas en STDIN e imprime el resultado. Esto supone que todas las entradas tienen una nueva línea final. Si desea que no se ejecute una nueva línea final, agregue
<
al principio del programa y)_3
al final.Pruébalo en línea
El resultado para el caso de prueba es difícil de ver en el intérprete en línea, así que lo he incluido aquí:
Cómo funciona
fuente
.z
entrada y tomando como lista de líneasC,
136117114 Byteschar l[99];i;f(f){while(fgets(l,256,f)){i=0;while(l[i])printf("%c\t",l[i++]);i=0;puts("");while(l[i])printf("%d\t",l[i++]);puts("");}}
Puede ser probado así
fuente
char**v
dentromain()
te ahorraría 2 personajes allí ..PowerShell v2 +, 85 bytes
La entrada es a través de una ruta a un archivo. Luego
Get-Content
(aliasgc
) en ese archivo, que se divide automáticamente en las nuevas líneas. Hacemos un bucle sobre cada uno de esos|%{...}
. Comience configurando$a
y$b
en una cadena vacía: estos son nuestros caracteres ASCII y puntos de código respectivamente. Luego,-split
la línea de entrada en cada carácter, manteniéndola(.)
y eliminando los valores vacíos-ne''
(se debe a cómo analiza .NET regex), luego los enviamos a otro bucle.Cada ciclo interno, encadenamos el carácter actual con una pestaña
`t
y lo agregamos$a
. Del mismo modo$b
, excepto que estamos explícitamente lanzando como aychar
luego como int+
.Fuera del bucle interno, colocamos el resultado
$a
y$b
(con un designador de salto de línea, ya que eso nunca aparecerá en nuestro bucle) en la tubería. Esos se reúnen con un implícitoWrite-Output
en la finalización del programa.Ejemplo
(con el entendimiento de que tengo un salto de línea final y Markdown destruye el carácter de tabulación)
fuente
> <> (Pescado), 48 Bytes
¡Una tarea en la que brilla el lenguaje! Estoy seguro de que probablemente podría haber jugado un poco más al golf, pero ha sido una semana larga. Sin embargo, podría echarle un vistazo más tarde.
Pruébalo en línea!
Alternativamente, pruébelo en línea que se ve mejor en mi opinión, pero el ajuste de texto se complica un poco para la entrada con líneas largas como el caso de prueba.
fuente
PHP,
131115 bytesSolo un FGITW, tal vez pueda mejorarlo más. Resulta que puedo!
Primera versión a 131 bytes:
El nombre del archivo se proporciona como primer argumento después del nombre del script:
php aliens.php helloworld.c
Segunda versión a 115 bytes:
La primera versión tiene en cuenta las líneas nuevas que faltan al final de la línea, pero después de la aclaración adicional, podemos dejar ese código y poner todo en una función para guardar 16 bytes.
Los espacios en blanco
join(' ',$a)
, así como en,echo$c.' '
son caracteres de tabulación =\t
. Las nuevas líneas en el código son a propósito.fuente
Python 3,
8977 bytesversión más golfizada basada en la misma idea:
Si hay '\ t's en la entrada, entonces cambie el
4
a a9
.Versión anterior:
Toma una lista de cadenas, cada una terminando con un '\ n'.
fuente
for l in s
iefor l in s:print(*l,sep='\t',end='');print(*l.encode(),sep='\t',end='\n\n')
lambda s:'\n\n'.join(*map('{:>4}'.format,[*a,*a.encode()])for a in s)
Powershell, 56 Bytes
El script acepta una ruta de archivo como entrada. Get-Content divide automáticamente la entrada en una serie de cadenas divididas en nuevas líneas en la fuente.
A partir de ahí, ingreso un foreach, lo elevo a una variedad de caracteres y lo configuro en $ a, lo uno con pestañas e imprimo. A continuación, pero aún dentro del foreach, convierto la matriz de caracteres en una matriz de enteros, agrego un salto de línea y vuelvo a unirme con una pestaña.
La llamada se ve así:
y aquí hay una muestra de salida
fuente
JavaScript (ES6), 94 bytes
Donde ␉ representa el carácter de tabulación literal. Funciona siempre que la entrada no contenga caracteres de tabulación. Versión de 81 bytes que también requiere que la entrada tenga una nueva línea final:
fuente
.split().map()
puede ganar.replace()
. Una vez que se escapan los caracteres optimizados con backticks, esto debería ser de 85 bytes:s=>s.split('\n').map(c=>(s=[...c]).join('\t')+'\n'+s.map(c=>c.charCodeAt()).join('\t')).join('\n')
(Lo siento, no tengo idea si / cómo se pueden incluir backticks en un comentario.)C #,
6463 bytes-1 byte utilizando el carácter de tabulación real en lugar de
\t
. Nota: se representa como 4 espacios arriba y 2 espacios en la versión sin golf debajo.Sin golf:
Resultados:
(Nota: Visual Studio se ha utilizado
\r\n
para las nuevas líneas cuando pegué la entrada, por lo tanto, las13 10
terminaciones de línea en la salida)fuente
CJam, 27 bytes
Pruébalo en línea!
Explicación
fuente
1/
y els
son innecesarios.PowerShell,
6159 bytesCosas a tener en cuenta:
m
en el directorio actual.$_
) son solo saltos de línea literales (0xA), por lo que un byte cada uno.-join
operadores es un carácter de tabulación individual (independientemente de cómo se represente aquí).Sin golf
fuente
Java, 202 bytes
Ni siquiera me molesto en hacer esto más corto ...
fuente
Haskell - 71 bytes
fuente
Python 3,
9297107 bytespara i en la lista (open (input ()). read (). split ("\ n")): para j en i: print (i + "\ n" + ord (j))Esto no se ha probado, pero debería funcionar.
Gracias @gowrath por señalar que el código no funciona como lo especifica la pregunta.
fuente
input()
comando está haciendo allí es abrir el nombre del archivo.