Escriba un programa que genere una lista del número de ocurrencias de cada carácter único en su código fuente.
Por ejemplo, este programa hipotético {Source_Print_1};
debería producir esta salida:
; 1
P 1
S 1
_ 2
c 1
e 1
i 1
n 1
o 1
p 1
r 2
t 1
u 1
{ 1
} 1
El formato debe coincidir con este ejemplo. No se permiten espacios en blanco extraños, excepto una nueva línea final opcional.
Es posible que su programa no lea su propio código fuente del archivo fuente.
Los caracteres enumerados deben estar en uno de dos órdenes. O el orden de los valores de caracteres en la codificación de caracteres utilizada por su idioma (probablemente ASCII), o el orden en que aparecen los caracteres en su fuente.
Esta pregunta inspirada en este comentario de Jan Dvorak .
Respuestas:
CJam, 14 bytes
Pruébalo aquí .
La salida está en el orden en que aparecen primero:
Simplemente se agrega
<SP>2<NL>
a cada personaje en{S2N`/}
.fuente
/// , 12 bytes
Un gran agradecimiento a @ user23013, quien sugirió esta mejora con respecto a mi código CJam, superando su propia respuesta de mayor puntaje en el proceso.
Los personajes están ordenados por apariencia. Este código funciona en cualquier lenguaje que solo imprima su propio código fuente en las circunstancias dadas (PHP, ASP, etc.).
CJam, 20 bytes
Este enfoque no utiliza ningún recuento de caracteres incorporado.
Pruébelo en línea en el intérprete de CJam .
Cómo funciona
fuente
CJam, 20 bytes
Cómo funciona
Primero comenzamos con una de las quine estándar en CJam
que empuja el primer bloque en la pila, lo copia y ejecuta la copia, lo que hace que finalmente imprima el código fuente.
Luego agregamos la lógica para calcular el recuento de caracteres del código fuente:
Pruébalo en línea aquí
fuente
Python 3.5.0b1 ,
10773 bytesEn lugar de la quine de reemplazo de cadena habitual, que requiere escribir todo dos veces, aquí hay una
exec
quine.fuente
Mathematica, 101 bytes
Desafortunadamente, no puedo usar ninguno de los trucos normales de golf, como eliminar espacios en blanco,
<>
paraStringJoin
, en#
lugar de#1
,@
para llamadas de función de prefijo o en@@@
lugar deApply[...,{1}]
, porqueToString[...,InputForm]
cree que tiene que imprimir todo ...Esto imprime los caracteres en el orden en que aparecen por primera vez en el código. Si puedo suponer que esto no se ejecuta en un entorno REPL (lo cual es bastante inusual para Mathematica), puedo guardar dos bytes omitiendo los dos
;
.fuente
InputForm
es molesto ...OutputForm
es mejor pero no cita cadenas.Haskell, 178 bytes
Nada sofisticado. Todos los caracteres del programa están en una lista literal (String). Así son las frecuencias. Comprime ambas listas e imprime. Salida:
fuente
Dardo -
214127Una versión directa:
El "4" es solo un factor de violín para que los números sumen. Ver / ejecutar en DartPad .
Original: táctica de quine estándar, y los nombres de las funciones de Dart son demasiado largos para un buen golf.
Ver / ejecutarlo en DartPad .
fuente
Haskell , 146 bytes
Pruébalo en línea!
Salida:
(Más una nueva línea adicional)
Explicación:
El código es
donde
"<code>"
es una cadena del código del programa sin el"
.a
pasa por los caracteres ascii comenzando con un espacio.sum[2|b<-show"<code>",a==b]
cuenta con qué frecuencia aparece el carácter en la cadena, con cada aparición contada dos veces.a:" "++show s
construye una cadena del carácter actual, un espacio y el recuento de caracteres. FinalmentemapM putStrLn
imprime cada cadena en la lista con una nueva línea final.La parte más difícil fue contar el
"
derecho. Usar solob<-"<code>"
contaría comillas cero porque no hay ninguno en la cadena. El usoshow"<code>"
agrega"
a al frente y al final de la cadena, lo que resulta en un conteo de cuatro. Así que tuve que poner dos comillas adicionales en el código, así que en lugar del (más corto)a:' ':show s
que uséa:" "++show s
.fuente