Saltar al contenido

Contar los bytes de un programa

Hola usuario de nuestra página, tenemos la respuesta a lo que buscabas, desplázate y la obtendrás un poco más abajo.

Solución:

Shell + coreutils, 6

Esta respuesta deja de ser válida si se utiliza una codificación que no sea UTF-8.

wc -mc

Salida de prueba:

$ printf '%s' "(~R∊R∘.×R)/R←1↓ιR" | ./count.sh 
     17      27
$ 

En caso de que el formato de salida se aplique estrictamente (solo un espacio separando los dos números enteros), entonces podemos hacer esto:

Shell + coreutils, 12

echo`wc -mc`

Gracias a @immibis por sugerir quitar el espacio después de la echo. Me tomó un tiempo darme cuenta de eso: el shell expandirá esto a echonmy las pestañas por defecto están en $IFSpor lo que son separadores de fichas perfectamente legales en el comando resultante.

guion de golf, 14 12 bytes

.,p64/2^,,

Pruébelo en línea en Web GolfScript.

Ocurrencia

GolfScript no tiene ni idea de qué es Unicode; todas las cadenas (entrada, salida, internas) están compuestas por bytes. Si bien eso puede ser bastante molesto, es perfecto para este desafío.

UTF-8 codifica caracteres ASCII y no ASCII de manera diferente:

  • Todos los puntos de código por debajo de 128 se codifican como 0xxxxxxx.

  • Todos los demás puntos de código se codifican como 11xxxxxx 10xxxxxx ... 10xxxxxx.

Esto significa que la codificación de cada carácter Unicode contiene un único 0xxxxxxx byte o un solo 11xxxxxx byte (y 0 a 5 10xxxxxx bytes).

Al dividir todos los bytes de la entrada por 64giramos 0xxxxxxx dentro 0 o 1, 11xxxxxx dentro 3y 10xxxxxx dentro 2. Todo lo que queda es contar los bytes cuyo cociente no es 2.

Código

                (implicit) Read all input and push it on the stack.
.               Push a copy of the input.
 ,              Compute its length (in bytes).
  p             Print the length.
        ,     Filter; for each byte in the original input:
    64/           Divide the byte by 64.
       2^         XOR the quotient with 2.
                If the return is non-zero, keep the byte.
           ,    Count the kept bytes.
                (implicit) Print the integer on the stack.

Pitón, 42 40 bytes

lambda i:[len(i),len(i.encode('utf-8'))]

Gracias a Alex A. por los dos bytes de descuento.

Sencillo, hace lo que dice. con argumento iimprime la longitud de ientonces la longitud de i en UTF-8. Tenga en cuenta que para aceptar la entrada de varias líneas, el argumento de la función debe estar entre comillas triples: '''.

EDITAR: no funcionó para la entrada de varias líneas, así que en su lugar lo convertí en una función.

Algunos casos de prueba (separados por saltos de línea en blanco):

f("Hello, World!")
13 13

f('''
friends = ['john', 'pat', 'gary', 'michael']
for i, name in enumerate(friends):
    print "iteration iteration is name".format(iteration=i, name=name)
''')
156 156

f("(~R∊R∘.×R)/R←1↓ιR")
17 27

Sección de Reseñas y Valoraciones

Si para ti ha sido de utilidad nuestro post, nos gustaría que lo compartas con el resto entusiastas de la programación y nos ayudes a extender este contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *