Code Golf Measurer © 2019

20

Code Golf Measurer © 2019

Hexdumps utilizados con un xxdaspecto similar a este:

00000000: 666f 6f20 6261 7220 7370 616d 2065 6767  foo bar spam egg
00000010: 730a                                     s.

Su tarea es convertir un hexdump de esta forma en la cantidad de bytes utilizados.

Reglas:

  • Lagunas habituales prohibidas.
  • Este es el , por lo que la respuesta válida más corta en bytes gana.
  • Puede incluir o no la nueva línea al final del texto ( 0a). Esto significa que si el hexdump termina en una nueva línea ( 0a), esa entrada puede tener su salida reducida en uno.
  • Una entrada vacía (literalmente nada: lista / cadena / etc. vacía) debe generar 0.
  • La entrada se puede tomar de cualquier forma
  • La entrada será ASCII válida sin caracteres de control
  • La entrada debe contener todo el hexdump

Casos de prueba:

00000000: 4865 6c6c 6f2c 2077 6f72 6c64 2120 4865  Hello, world! He
00000010: 6c6c 6f2c 2077 6f72 6c64 210a            llo, world!.

devuelve 28 o 27

00000000: 0a                                       .

devuelve 1 o 0

00000000: 6368 616c 6c65 6e67 650a                 challenge.

devuelve 10 o 9

00000000: 4865 6c6c 6f2c 2077 6f72 6c64 21         Hello, world!

devuelve 13


devuelve 0 (esto es literalmente nada: lista vacía / cadena / etc.)

Las explicaciones serían buenas para los idiomas no estándar.

gadzooks02
fuente
¿Podemos suponer que la entrada es ascii? ¿Puede contener caracteres de control? ¿Cuáles son las reglas de entrada? Algunos idiomas no pueden manejar la entrada en varias líneas. ¿Podemos rellenar la última línea para que todas las líneas sean igualmente largas? ¿Por qué incluir la entrada en blanco?
Stewie Griffin
@StewieGriffin Sí; No; si; porque si xxdse alimenta con una cadena vacía, no genera nada.
gadzooks02
1
@StewieGriffin Editaste tu comentario mientras respondía, así que aquí hay una expansión: Sí; No; se puede ingresar como desee, siempre que se incluya todo el volcado; Ver última respuesta; Si; Porque si xxd recibe una cadena vacía, no genera nada
gadzooks02
1
@ JonathanAllan Oh sí, bien visto.
gadzooks02
1
Puede ser interesante contar un formato hexdump que no incluye los datos ASCIIfied de la derecha. Todos van con solo quitar la parte hexadecimal y contar el resto en bytes. Si el desafío fuera hacer esto dada solo la última línea de hexdump, eso obligaría a analizar el número hexadecimal (la posición), así como contar el número de dígitos hexadecimales en esa línea. (Como lo hago a mano cuando veo el objdumpdesmontaje o las nasmlistas de respuestas de código de máquina). Creo que debería publicar eso en el sandbox ...
Peter Cordes

Respuestas:

12

Retina 0.8.2 , 8 bytes

.{51}

.

Pruébalo en línea! Explicación:

.{51}

Eliminar los primeros 51 caracteres de cada línea. (Las líneas solo pueden tener entre 52 y 67 caracteres, por lo que esto siempre coincide una vez por línea).

.

Cuente los caracteres restantes que no sean de nueva línea

7 bytes si la entrada vacía no tenía que ser compatible:

.{52}


Pruébalo en línea! Explicación:

.{52}

Eliminar los primeros 52 caracteres de cada línea. (Las líneas solo pueden tener entre 52 y 67 caracteres, por lo que esto siempre coincide una vez por línea).


Cuente 1 más que el número de caracteres restantes (incluidas las nuevas líneas).

Neil
fuente
7 con &`.{52}.
Grimmy
@ Grimy Eso es simplemente ... increíble ... debes publicar eso como tu propia respuesta.
Neil
Al principio no me di cuenta, pero en realidad ya hay una respuesta casi idéntica .
Grimmy
7

V (vim) , 7 bytes

Î51x
Ø.

Pruébalo en línea!

Explicación:

Î       " On every line...
 51x    "   Delete the first 51 characters
Ø.      " Count the number of remaining characters on any line

Hexdump:

00000000: ce35 3178 0dd8 2e                        .51x...
DJMcMayhem
fuente
6

Retina , 7 bytes

Esto cuenta el número total de cadenas de una sola línea de longitud 52. Podría ser posible hacer algo similar %52,`., pero no pude encontrar una manera de solucionarlo.

w`.{52}

Pruébalo en línea!

mi pronombre es monicareinstate
fuente
1
También: &`.{52}para Retina 0.8.2.
Grimmy
5

APL (Dyalog Extended) , 18 bytes

Programa completo Solicita una lista de cadenas (es decir, listas de caracteres).

2÷⍨≢∊(1↓≠⊆⊢)¨49↑¨⎕

Pruébalo en línea!

 rápido

49↑¨ tomar los primeros 49 caracteres de cada

(Aplique la siguiente función tácita a cada uno:

 el argumento

 cortar en series de personajes que son

 diferente del carácter de relleno (espacio)

1↓ soltar la primera "palabra"

ϵ nlist (aplanar)

 cuenta

2÷⍨ dividir por dos

Adán
fuente
4

Jalea , 5 bytes

Ẉ_51S

Un enlace monádico que acepta una lista de líneas que producen el número entero de bytes.

Pruébalo en línea!

¿Cómo?

Ẉ_51S - Link: list of lists of characters, H
Ẉ     - length of each (line in H)
  51  - literal fifty-one
 _    - subtract (vectorises)
    S - sum
Jonathan Allan
fuente
Puedes aceptar una lista de líneas. Además, ¿le gustaría agregar una explicación?
gadzooks02
Ah, genial, ¿entonces la entrada vacía es una lista vacía O una lista con una sola línea vacía? (Esto debe quedar claro en la publicación, ya que es un caso marginal).
Jonathan Allan
Es una lista vacía / cadena / etc. Acabo de aclarar esto.
gadzooks02
Gracias, explicación añadida ahora también.
Jonathan Allan
3

C (gcc) , 64 55 bytes

r;s[];f(l){while(*s=0,gets(s),l=strlen(s))r+=l-51;l=r;}

Pruébalo en línea!

¡9 bytes eliminados gracias a YSC!

Aquí hay una versión más frágil inspirada en la solución JavaScript de Arnauld que probablemente falla para entradas largas:

C (gcc) , 50 bytes

s[];f(l){l=read(0,s,1<<31);l=l?l/68*16+l%68-51:0;}

Pruébalo en línea!

G. Sliepen
fuente
1
59 bytes cambiando return ral=r
girobuz
2
¡El comportamiento indefinido de @JonathanFrech está perfectamente bien para el golf de código!
G. Sliepen
1
@YSC Hm, pero creo que hacer r global viola la regla de que si define una función para hacer algo (y no lo es main), debería ser posible llamarla varias veces.
G. Sliepen
2
@girobuz while()tiene el mismo número de bytes que for(;;). Por ;while()lo tanto, es un byte más largo que for(;;).
Jonathan Frech
3

Python 3, 48 46 bytes

lambda s:(len(s)or 51)+1-52*len(s.split('\n'))

La entrada se pasa como una cadena a la función. La función incrementa la longitud de la entrada (incluidas las nuevas líneas), luego resta 52 para cada línea.

Pruébalo en línea

IFcoltransG
fuente
2
Por lo que he visto, f=se puede mover al encabezado como `f =`, dejando solo el lambda como código y guardando dos bytes: ¡ Pruébelo en línea!
gadzooks02
@ gadzooks02 Gracias, editaré. Este f=es un hábito que aprendí del servidor de discordias Python.
IFcoltransG
2

Japt -x , 5 bytes

Entrada como un conjunto de líneas.

®Ê-51

Intentalo

®Ê-51     :Implicit input of array
®         :Map
 Ê        :  Length
  -51     :  Subtract 51
          :Implicit output of sum of resulting array
Lanudo
fuente
2

Perl 6 , 18 bytes

{.join.comb-51*$_}

Pruébalo en línea!

Anónimo Cualquier lambda que tome una lista de líneas y devuelva la suma de la cantidad de caracteres, restando 51 por cada línea

Jo King
fuente
2

05AB1E , 8 6 bytes

€g51-O

Pruébalo en línea!

Entrada como una lista de cadenas.

€g     get lengths of each line
51-    subtract 51 from each
O      push the sum of the resulting list
       implicitly print
dorio
fuente
1
Lo sentimos, la entrada debe contener todo el hexdump. (El tuyo omite las letras al final de cada línea)
gadzooks02
Oh mi error. Hice esto en mi teléfono inteligente. No vi que hay algo detrás de los códigos hexadecimales. Hice una corrección.
Dorian
2

Lenguaje de fórmulas IBM / Lotus Notes, 53 bytes

@Sum(@Length(@Explode(@Right(@Left(i;"  ");": ")))/2)

No hay TIO para Formula, por lo que aquí hay capturas de pantalla de los casos de prueba:

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

La fórmula se encuentra en el campo calculado que proporciona el valor después de "Devoluciones".

Explicación

Esta es una buena demostración de la forma en que Formula aplicará recursivamente una función a una lista sin necesidad de un bucle. La fórmula está en un campo calculado en la misma forma que el campo de entrada editable 'i'.

  1. Comience en el medio. @Lefty @Rightpermitir que se use un delimitador de cadena o varios caracteres. Por lo tanto, buscamos a la derecha :y luego a la izquierda de la primera aparición de dos espacios. Dado que Formula ve la nueva línea como un separador de lista, aplicará esto a cada línea en la entrada.
  2. @Explodees el equivalente de Fórmula de una splitfunción y su valor predeterminado es espacio, ,o ;. Nuevamente se aplica a cada línea en el campo, pero esta vez los resultados se combinan en una sola lista.
  3. @Lengthluego se aplicará a cada miembro de la lista. En cada caso dividimos su valor de retorno por 2.
  4. @Sum toda la lista y generar el resultado.
ElPedro
fuente
1
¿Tiene un enlace a un intérprete (ya sea en línea o descargado)?
gadzooks02
Lamentablemente no. Formula es un lenguaje propietario que está vinculado al producto IBM (pregunté a Meta hace algún tiempo si esto está permitido en este sitio y la respuesta fue "sí", pero no para los desafíos de Cops & Robbers). La última vez que miré, Domino Designer (que admite Formula) todavía estaba disponible como descarga gratuita de IBM. Desafortunadamente, solo Windows y como ejecuto Linux en casa no puedo confirmarlo. Esta respuesta fue escrita durante mi pausa para el almuerzo, ya que tengo la mala suerte de seguir
admitiendo
1
Por cierto, si buscas Lotus Notes en este sitio, encontrarás que soy el único tipo lo suficientemente estúpido como para intentar jugar golf en este idioma :-)
ElPedro
1

JavaScript (ES6), 34 bytes

s=>(n=s.length)&&(n/68<<4)+n%68-51

Pruébalo en línea!

Comentado

s =>                // s = input string
  (n = s.length) && // n = length of s; return 0 right away if n = 0 (special case)
  (n / 68 << 4) +   // otherwise compute the number of full lines and multiply it by 16
  n % 68 - 51       // add the length of the last line minus 51
Arnauld
fuente
1

Rojo , 81 55 bytes

func[s][n: 0 foreach l s[n: n - 51 + length? l]max 0 n]

Pruébalo en línea!

Toma la entrada como una lista de cadenas.

Galen Ivanov
fuente
1

JavaScript, 33 32 bytes

a=>a.map(x=>a=~~a+x.length-51)|a

Pruébalo en línea!

Guardado 1 byte gracias a Arnauld.

Lanudo
fuente
0

Zsh , 36 bytes

Con las banderas predeterminadas de zsh:

for l (${(f)1})((c+=$#l-52))
<<<$[c]

Pruébalo en línea!

${(f)1}se divide $1en líneas nuevas y descarta líneas vacías. Los $[ arithmetic expansion ]guardias contra el caso vacío, cuando el bucle nunca se establece $c.

Zsh , 28 bytes

Con -o extendedglob:

<<<${#${(F)${(f)1}#?(#c52)}}

Pruébalo en línea!

(f)Divida en líneas nuevas, ${ #?(#c52)}elimine los 52 caracteres (F)iniciales , únase en líneas nuevas para que el recuento sea en forma de caracteres en lugar de en listas, ${# }cuente los caracteres.

Función Gamma
fuente
0

asm2bf , 135 bytes

Versión de golf:

lbl 3
mov r2,51
lbl 1
in_ r1
dec r2
jz_ r1,4
jnz r2,1
lbl 2
in_ r1
jz_ r1,4
sub r1,10
jz_ r1,3
inc r3
jmp 2
lbl 4
out r3

Versión comentada:

lbl 3               ; Main loop - the kinda entry point

    mov r2, 51      ; Loop 51 times.
    lbl 1           ; Loop start.
        in_ r1      ; Read character
        dec r2      ; Decrement the loop accumulator.
        jz_ r1, 4   ; If zero was read, end.
        jnz r2, 1   ; If we still loop, loop again.

    lbl 2           ; Second loop, accumulating the result.
        in_ r1      ; Read a character.
        jz_ r1, 4   ; If character is zero, end the loop and print result.
        sub r1, 10  ; Decrement r1 by 10 for next check.
        jz_ r1, 3   ; If the character - 10 (the newline) is zero, jump to 3
        inc r3      ; Increment character read amount.
        jmp 2
lbl 4
    out r3          ; Print out the result as an ASCII character.
Krzysztof Szewczyk
fuente