Code Golf Measurer © 2019

20

Code Golf Measurer © 2019

Les hexdumps utilisés avec xxdressemblent à ceci:

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

Votre tâche consiste à convertir un vidage hexadécimal sous cette forme en nombre d'octets utilisés.

Règles:

  • Failles habituelles interdites.
  • C'est le , donc la réponse valide la plus courte en octets l'emporte.
  • Vous pouvez ou non inclure la nouvelle ligne à la fin du texte ( 0a). Cela signifie que si l'hexdump se termine par une nouvelle ligne ( 0a), cette entrée peut voir sa sortie réduite d'une unité .
  • Une entrée vide (littéralement rien: liste / chaîne / etc. Vide) doit sortir 0.
  • L'entrée peut être prise sous n'importe quelle forme
  • L'entrée sera ASCII valide sans caractères de contrôle
  • L'entrée doit contenir tout le vidage hexadécimal

Cas de test:

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

renvoie 28 ou 27

00000000: 0a                                       .

renvoie 1 ou 0

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

renvoie 10 ou 9

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

renvoie 13


renvoie 0 (ce n'est littéralement rien: liste / chaîne / etc. vide)

Des explications seraient intéressantes pour les langues non standard.

gadzooks02
la source
Pouvons-nous supposer que l'entrée est ascii? Peut-il contenir des caractères de contrôle? Quelles sont les règles d'entrée? Certaines langues ne peuvent pas gérer l'entrée sur plusieurs lignes. Pouvons-nous remplir la dernière ligne afin que toutes les lignes soient également longues? Pourquoi inclure l'entrée vide?
Stewie Griffin
@StewieGriffin Oui; non; Oui; car si xxdest alimenté une chaîne vide, il ne produit rien.
gadzooks02
1
@StewieGriffin Vous avez modifié votre commentaire pendant que je répondais, alors voici une extension: Oui; Non; il peut être saisi comme vous le souhaitez, à condition que tout le vidage soit inclus; Voir dernière réponse; Oui; Parce que si xxd reçoit une chaîne vide, il ne produit rien
gadzooks02
1
@JonathanAllan Oh oui, bien repéré.
gadzooks02
1
Compter un format hexdump qui n'incluait pas les données ASCIIfied à droite pourrait être intéressant. Tout le monde y va en supprimant simplement la partie hexadécimale et en comptant le reste. Si le défi était de le faire étant donné uniquement la dernière ligne de vidage hexadécimal, cela forcerait l'analyse du numéro hexadécimal (la position) ainsi que le nombre de chiffres hexadécimaux sur cette ligne. (Comme je le fais à la main lorsque je regarde le objdumpdémontage ou les nasmlistes de réponses au code machine.) Je suppose que je devrais poster cela dans le bac à sable ...
Peter Cordes

Réponses:

12

Retina 0.8.2 , 8 octets

.{51}

.

Essayez-le en ligne! Explication:

.{51}

Supprimez les 51 premiers caractères de chaque ligne. (Les lignes ne peuvent avoir qu'entre 52 et 67 caractères, donc cela correspond toujours une fois par ligne.)

.

Comptez les caractères non-newline restants.

7 octets si l'entrée vide ne devait pas être prise en charge:

.{52}


Essayez-le en ligne! Explication:

.{52}

Supprimez les 52 premiers caractères de chaque ligne. (Les lignes ne peuvent avoir qu'entre 52 et 67 caractères, donc cela correspond toujours une fois par ligne.)


Comptez 1 de plus que le nombre de caractères restants (y compris les retours à la ligne).

Neil
la source
7 avec &`.{52}.
Grimmy
@Grimy C'est juste ... génial ... vous devez le poster comme votre propre réponse.
Neil
Je ne l'ai pas remarqué au début, mais en fait, il y a déjà une réponse presque identique .
Grimmy
11

tcsh , 12 octets

xxd -r|wc -c

Essayez-le en ligne!

Krzysztof Szewczyk
la source
1
Très robuste et fait exactement ce que OP veut.
tsh
7

V (vim) , 7 octets

Î51x
Ø.

Essayez-le en ligne!

Explication:

Î       " 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
la source
6

Rétine , 7 octets

Cela compte le nombre total de chaînes unifilaires de longueur 52. Il pourrait être possible de faire quelque chose de similaire %52,`., mais je n'ai pas trouvé de moyen de résoudre ce problème.

w`.{52}

Essayez-le en ligne!

mon pronom est monicareinstate
la source
1
Aussi: &`.{52}pour Retina 0.8.2.
Grimmy
5

APL (Dyalog Extended) , 18 octets

Programme complet. Demande la liste des chaînes (c'est-à-dire des listes de caractères).

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

Essayez-le en ligne!

 rapide

49↑¨ prendre les 49 premiers caractères de chacun

(Appliquer à chacun la fonction tacite suivante:

 l'argument

 couper en séries de personnages qui sont

 différent du caractère de remplissage (espace)

1↓ déposez le premier "mot"

ϵ nlist (aplatir)

 pointage

2÷⍨ diviser par deux

Adam
la source
4

Gelée , 5 octets

Ẉ_51S

Un lien monadique acceptant une liste de lignes qui produisent le nombre d'octets entiers.

Essayez-le en ligne!

Comment?

Ẉ_51S - Link: list of lists of characters, H
Ẉ     - length of each (line in H)
  51  - literal fifty-one
 _    - subtract (vectorises)
    S - sum
Jonathan Allan
la source
Vous pouvez accepter une liste de lignes. Souhaitez-vous également ajouter une explication?
gadzooks02
Ah cool, donc l'entrée vide est-elle une liste vide OU une liste avec une seule ligne vide? (Cela devrait être précisé dans le post car il s'agit d'un cas de bord.)
Jonathan Allan
C'est une liste / chaîne / etc vide. Je viens de clarifier cela.
gadzooks02
Merci, explication ajoutée maintenant aussi.
Jonathan Allan
3

C (gcc) , 64 55 octets

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

Essayez-le en ligne!

9 octets rasés grâce à YSC!

Voici une version plus fragile inspirée de la solution JavaScript d'Arnauld qui échoue probablement pour de longues entrées:

C (gcc) , 50 octets

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

Essayez-le en ligne!

G. Sliepen
la source
1
59 octets en changeant return rpourl=r
girobuz
2
Le comportement non défini de @JonathanFrech convient parfaitement au golf de code!
G. Sliepen
1
@YSC Hm, mais je pense que rendre r global viole la règle selon laquelle si vous définissez une fonction pour faire quelque chose (et ce n'est pas le cas main), il devrait être possible de l'appeler plusieurs fois.
G. Sliepen
1
Quoi qu'il en soit,: r;s[];f(l){while(*s=0,gets(s),l=strlen(s))r+=l-51;l=r;}55 octets :)
YSC
2
@girobuz while()a le même nombre d'octets que for(;;). Ainsi, ;while()un octet est plus long que for(;;).
Jonathan Frech
3

Python 3, 48 46 octets

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

L'entrée est transmise sous forme de chaîne à la fonction. La fonction incrémente la longueur de l'entrée (y compris les retours à la ligne), puis soustrait 52 pour chaque ligne.

Essayez-le en ligne

IFcoltransG
la source
2
D'après ce que j'ai vu, le f=peut être déplacé dans l'en-tête en tant que `f =`, laissant juste le lambda comme code et économisant deux octets: Essayez-le en ligne!
gadzooks02
@ gadzooks02 Merci, va éditer. C'est f=une habitude que j'ai prise sur le serveur de discordance Python.
IFcoltransG
2

Japt -x , 5 octets

Entrez comme un tableau de lignes.

®Ê-51

Essayez-le

®Ê-51     :Implicit input of array
®         :Map
 Ê        :  Length
  -51     :  Subtract 51
          :Implicit output of sum of resulting array
Hirsute
la source
2

Perl 6 , 18 octets

{.join.comb-51*$_}

Essayez-le en ligne!

Anonyme Quel que soit lambda qui prend une liste de lignes et renvoie la somme du nombre de caractères, en soustrayant 51 pour chaque ligne

Jo King
la source
2

05AB1E , 8 6 octets

€g51-O

Essayez-le en ligne!

Entrée sous forme de liste de chaînes.

€g     get lengths of each line
51-    subtract 51 from each
O      push the sum of the resulting list
       implicitly print
Dorian
la source
1
Désolé, l'entrée doit contenir tout le vidage hexadécimal. (Le vôtre saute les lettres à la fin de chaque ligne)
gadzooks02
Oh, ma mauvaise. Je l'ai fait sur mon smartphone. Je n'ai pas vu qu'il y avait quelque chose derrière les codes hexadécimaux. J'ai fait une correction.
Dorian
2

Langage de formule IBM / Lotus Notes, 53 octets

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

Il n'y a pas de TIO pour Formula, voici donc des captures d'écran des cas de test:

enter image description here enter image description here enter image description here enter image description here enter image description here

La formule se trouve dans le champ calculé qui fournit la valeur après "Retours".

Explication

C'est une bonne démonstration de la façon dont Formula appliquera récursivement une fonction à une liste sans avoir besoin d'une boucle. La formule est dans un champ calculé sur la même forme que le champ d'entrée modifiable «i».

  1. Commencez au milieu. @Leftet @Rightautoriser l'utilisation d'un délimiteur de chaîne ou d'un certain nombre de caractères. Nous recherchons donc à droite :puis à gauche la première occurrence de deux espaces. Puisque Formula voit la nouvelle ligne comme un séparateur de liste, elle l'appliquera à chaque ligne de l'entrée.
  2. @Explodeest l'équivalent de la formule d'une splitfonction et par défaut à l'espace, ,ou ;. Encore une fois, il est appliqué à chaque ligne du champ, mais cette fois, les résultats sont combinés en une seule liste.
  3. @Lengthsera ensuite appliqué à chaque membre de la liste. Dans chaque cas, nous divisons sa valeur de retour par 2.
  4. @Sum toute la liste et afficher le résultat.
ElPedro
la source
1
Avez-vous un lien vers un interprète (en ligne ou téléchargé)?
gadzooks02
Malheureusement non. La formule est un langage propriétaire qui est lié au produit IBM (j'ai demandé à Meta il y a quelque temps si cela était autorisé sur ce site et la réponse était "oui" mais pas pour les défis Cops & Robbers). La dernière fois que j'ai regardé, Domino Designer (qui prend en charge Formula) était toujours disponible en téléchargement gratuit auprès d'IBM. Malheureusement, Windows uniquement et comme j'utilise Linux à la maison, je ne peux pas le confirmer. Cette réponse a été écrite pendant ma pause déjeuner car j'ai la malchance de continuer à prendre en charge certaines applications Notes héritées et d'avoir toujours des notes sur ma machine au travail :-)
ElPedro
1
BTW, si vous recherchez Lotus Notes sur ce site, vous constaterez que je suis le seul gars qui est assez stupide pour essayer de
jouer
1

JavaScript (ES6), 34 octets

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

Essayez-le en ligne!

Commenté

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
la source
1

Rouge , 81 55 octets

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

Essayez-le en ligne!

Prend l'entrée comme une liste de chaînes.

Galen Ivanov
la source
0

Zsh , 36 octets

Avec les drapeaux par défaut de zsh:

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

Essayez-le en ligne!

${(f)1}se divise $1sur les nouvelles lignes et supprime les lignes vides. Les $[ arithmetic expansion ]gardes contre le boîtier vide, quand la boucle ne se met jamais$c .

Zsh , 28 octets

Avec -o extendedglob:

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

Essayez-le en ligne!

(f)Fractionnez sur les sauts de ligne, ${ #?(#c52)}supprimez les 52 premiers caractères, (F)rejoignez les sauts de ligne pour que le comptage se fasse par caractère plutôt que par liste, ${# }comptez les caractères.

GammaFunction
la source
0

asm2bf , 135 octets

Version golfée:

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

Version commentée:

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
la source