Code Golf Measurer © 2019


20

Code Golf Measurer © 2019

Hexdump utilizzati con xxdaspetto simile a questo:

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

Il tuo compito è convertire un hexdump in questo modulo nel numero di byte utilizzati.

Regole:

  • Sono vietate le solite scappatoie.
  • Questo è , quindi vince la risposta valida più breve in byte.
  • È possibile o meno includere la nuova riga alla fine del testo ( 0a). Ciò significa che se il hexdump termina in una newline ( 0a), quell'input potrebbe avere l'output ridotto di uno.
  • Un input vuoto (letteralmente niente: lista vuota / stringa / ecc.) Deve produrre 0.
  • L'input può essere preso in qualsiasi forma
  • L'immissione sarà ASCII valida senza caratteri di controllo
  • L'input deve contenere l'intero hexdump

Casi test:

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

restituisce 28 o 27

00000000: 0a                                       .

restituisce 1 o 0

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

restituisce 10 o 9

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

restituisce 13


restituisce 0 (Questo è letteralmente niente: lista vuota / stringa / ecc.)

Le spiegazioni sarebbero utili per le lingue non standard.


Possiamo supporre che l'input sia ASCII? Può contenere caratteri di controllo? Quali sono le regole di input? Alcune lingue non sono in grado di gestire l'input su più righe. Possiamo riempire l'ultima linea in modo che tutte le linee siano ugualmente lunghe? Perché includere l'input vuoto?
Stewie Griffin,

@StewieGriffin Sì; no; sì; perché se xxdviene alimentata una stringa vuota, non produce nulla.
gadzooks02

1
@StewieGriffin Hai modificato il tuo commento mentre rispondevo, quindi ecco un'espansione: Sì; No; può essere immesso come desiderato, purché sia ​​incluso l'intero dump; Vedi l'ultima risposta; Sì; Perché se xxd viene alimentato con una stringa vuota, non produce nulla
gadzooks02

1
@JonathanAllan Oh sì, ben individuato.
gadzooks02

1
Il conteggio di un formato hexdump che non includeva i dati ASCIIfied a destra potrebbe essere interessante. Tutti si limitano a rimuovere la parte esadecimale e contare i byte per il resto. Se la sfida fosse fare questo dato solo l'ultima riga di hexdump, ciò costringerebbe ad analizzare il numero esadecimale (la posizione), oltre a contare il numero di cifre esadecimali su quella linea. (Come faccio a mano quando osservo lo objdumpsmontaggio o gli nasmelenchi per le risposte del codice macchina.) Immagino che dovrei pubblicarlo nella sandbox ...
Peter Cordes

Risposte:


12

Retina 0.8.2 , 8 byte

.{51}

.

Provalo online! Spiegazione:

.{51}

Elimina i primi 51 caratteri di ogni riga. (Le righe possono contenere solo tra 52 e 67 caratteri, quindi questo corrisponde sempre una volta per riga.)

.

Contare i rimanenti caratteri non di nuova riga.

7 byte se non era necessario supportare input vuoti:

.{52}


Provalo online! Spiegazione:

.{52}

Elimina i primi 52 caratteri di ogni riga. (Le righe possono contenere solo tra 52 e 67 caratteri, quindi questo corrisponde sempre una volta per riga.)


Conta 1 in più rispetto al numero di caratteri rimanenti (comprese le nuove righe).


7 con &`.{52}.
Grimmy,

@Grimy È semplicemente ... fantastico ... devi pubblicarlo come risposta personale.
Neil

All'inizio non me ne sono accorto, ma in realtà c'è già una risposta quasi identica .
Grimmy,


7

V (vim) , 7 byte

Î51x
Ø.

Provalo online!

Spiegazione:

Î       " 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...


5

APL (Dyalog Extended) , 18 byte

Programma completo. Richiede un elenco di stringhe (ovvero di elenchi di caratteri).

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

Provalo online!

 richiesta

49↑¨ prendi i primi 49 caratteri da ciascuno

(... applica la seguente funzione tacita a ciascuno:

 l'argomento

 tritare in serie di personaggi che lo sono

 diverso dal carattere di riempimento (spazio)

1↓ rilascia la prima "parola"

ϵ nlist (appiattisci)

 conteggio

2÷⍨ dividere per due


4

Gelatina , 5 byte

Ẉ_51S

Un collegamento monadico che accetta un elenco di righe che generano il conteggio dei byte interi.

Provalo online!

Come?

Ẉ_51S - Link: list of lists of characters, H
Ẉ     - length of each (line in H)
  51  - literal fifty-one
 _    - subtract (vectorises)
    S - sum

Puoi accettare un elenco di righe. Inoltre, ti andrebbe di aggiungere una spiegazione?
gadzooks02

Ah bene, quindi l'ingresso vuoto è un elenco vuoto O un elenco con una sola riga vuota? (Questo dovrebbe essere chiarito nel post dal momento che è un caso limite.)
Jonathan Allan il

È e lista vuota / stringa / ecc. L'ho appena chiarito.
gadzooks02

Grazie, spiegazione aggiunta anche adesso.
Jonathan Allan,

3

C (gcc) , 64 55 byte

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

Provalo online!

9 byte eliminati grazie a YSC!

Ecco una versione più fragile ispirata alla soluzione JavaScript di Arnauld che probabilmente fallisce per input lunghi:

C (gcc) , 50 byte

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

Provalo online!


1
59 byte cambiando return rinl=r
girobuz l'

2
Il comportamento indefinito di @JonathanFrech va benissimo per il golf del codice!
G. Sliepen,

1
@YSC Hm, ma penso che rendere globale v violi la regola che se si definisce una funzione per fare qualcosa (e non lo è main), dovrebbe essere possibile chiamarla più volte.
G. Sliepen,


2
@girobuz while()ha lo stesso numero di byte di for(;;). Quindi ;while()è un byte più lungo di for(;;).
Jonathan Frech,

3

Python 3, 48 46 byte

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

L'input viene passato come stringa alla funzione. La funzione aumenta la lunghezza dell'input (comprese le nuove righe), quindi sottrae 52 per ogni riga.

Provalo online


2
Da quello che ho visto, f=può essere spostato nell'intestazione come `f =`, lasciando solo lambda come codice e salvando due byte: provalo online!
gadzooks02

@ gadzooks02 Grazie, lo modificherò. È f=un'abitudine che ho preso dal server discord Python.
IFcoltransG

2

Japt -x , 5 byte

Input come una matrice di linee.

®Ê-51

Provalo

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

2

Perl 6 , 18 byte

{.join.comb-51*$_}

Provalo online!

Anonimo Qualunque lambda che prende un elenco di righe e restituisce la somma del numero di caratteri, sottraendo 51 per ogni riga


2

05AB1E , 8 6 byte

€g51-O

Provalo online!

Inserisci come un elenco di stringhe.

€g     get lengths of each line
51-    subtract 51 from each
O      push the sum of the resulting list
       implicitly print

1
Spiacenti, l'input deve contenere l'intero hexdump. (Salta le lettere alla fine di ogni riga)
gadzooks02

Oh mio Dio. L'ho fatto sul mio smartphone. Non ho visto che c'è qualcosa dietro i codici esadecimali. Ho fatto una correzione.
Dorian

2

Linguaggio formula IBM / Lotus Notes, 53 byte

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

Non esiste un TIO per la formula, quindi ecco gli screenshot dei casi di test:

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

La formula si trova nel campo calcolato che fornisce il valore dopo "Restituisce".

Spiegazione

Questa è una buona dimostrazione del modo in cui Formula applicherà ricorsivamente una funzione a un elenco senza bisogno di un ciclo. La formula si trova in un campo calcolato nella stessa forma del campo di input modificabile "i".

  1. Inizia nel mezzo. @Lefte @Rightconsentire l'utilizzo di un delimitatore di stringa o di un numero di caratteri. Quindi cerchiamo a destra :e poi a sinistra della prima occorrenza di due spazi. Poiché Formula vede la newline come un separatore di elenco, questo verrà applicato a ciascuna riga nell'input.
  2. @Explodeè l'equivalente di Formula di una splitfunzione e il valore predefinito è spazio, ,oppure ;. Anche in questo caso viene applicato a ciascuna riga del campo, ma questa volta i risultati vengono combinati in un unico elenco.
  3. @Lengthverrà quindi applicato a ciascun membro dell'elenco. In ogni caso dividiamo il valore restituito per 2.
  4. @Sum l'intero elenco e produce il risultato.

1
Hai un link a un interprete (online o scaricato)?
gadzooks02

Sfortunatamente no. Formula è un linguaggio proprietario collegato al prodotto IBM (qualche tempo fa ho chiesto a Meta se questo è consentito su questo sito e la risposta era "sì" ma non per le sfide di Cops & Robbers). L'ultima volta che ho guardato, Domino Designer (che supporta la Formula) era ancora disponibile come download gratuito da IBM. Sfortunatamente solo Windows e mentre eseguo Linux a casa non posso confermare. Questa risposta è stata scritta durante la pausa pranzo poiché sono abbastanza sfortunato da supportare ancora alcune app Note legacy e avere ancora Note sulla mia macchina al lavoro :-)
ElPedro

1
A proposito, se cerchi Lotus Notes su questo sito troverai che sono l'unico ragazzo abbastanza stupido da provare a giocare a golf in questa lingua :-)
ElPedro

1

JavaScript (ES6), 34 byte

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

Provalo online!

Commentate

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





0

Zsh , 36 byte

Con i flag predefiniti di zsh:

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

Provalo online!

${(f)1}si divide $1su newline e scarta le righe vuote. Le $[ arithmetic expansion ]protezioni contro il caso vuoto, quando il loop non si avvia mai $c.

Zsh , 28 byte

Con -o extendedglob:

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

Provalo online!

(f)Dividi su newline, ${ #?(#c52)}rimuovi 52 caratteri (F)iniziali, unisciti su newline in modo che il conteggio avvenga per carattere anziché per elenco, ${# }conta i caratteri.


0

asm2bf , 135 byte

Versione golfizzata:

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

Versione commentata:

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.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.