Code Golf Measurer © 2019

20

Code Golf Measurer © 2019

Hexdumps xxdsehen ungefähr so aus:

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

Ihre Aufgabe ist es, einen Hexdump in dieser Form in die Anzahl der verwendeten Bytes umzuwandeln.

Regeln:

  • Übliche Schlupflöcher verboten.
  • Dies ist , also gewinnt die kürzeste gültige Antwort in Bytes.
  • Sie können die neue Zeile am Ende des Textes einfügen oder nicht ( 0a). Dies bedeutet 0a, dass die Ausgabe dieser Eingabe möglicherweise um eins reduziert wird , wenn der Hexdump in einer newline ( ) endet .
  • Eine leere Eingabe (buchstäblich nichts: leere Liste / Zeichenfolge / etc.) Muss 0 ausgeben.
  • Die Eingabe kann in beliebiger Form erfolgen
  • Die Eingabe erfolgt in gültigem ASCII-Format ohne Steuerzeichen
  • Die Eingabe muss den gesamten Hexdump enthalten

Testfälle:

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

gibt 28 oder 27 zurück

00000000: 0a                                       .

gibt 1 oder 0 zurück

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

gibt 10 oder 9 zurück

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

gibt 13 zurück


gibt 0 zurück (Dies ist buchstäblich nichts: leere Liste / Zeichenfolge / etc.)

Erklärungen wären für Nicht-Standardsprachen nett.

gadzooks02
quelle
Dürfen wir annehmen, dass die Eingabe ASCII ist? Kann es Steuerzeichen enthalten? Was sind die Eingaberegeln? Einige Sprachen können keine Eingaben über mehrere Zeilen verarbeiten. Können wir die letzte Zeile so auffüllen, dass alle Zeilen gleich lang sind? Warum die Leereingabe einschließen?
Stewie Griffin
@StewieGriffin Ja; Nein; Ja; denn wenn xxdeine leere Zeichenkette eingegeben wird, gibt sie nichts aus.
Gadzooks02
1
@StewieGriffin Sie haben Ihren Kommentar bearbeitet, während ich geantwortet habe. Hier ist eine Erweiterung: Ja; Nein; Es kann eingegeben werden, wie Sie möchten, vorausgesetzt, der gesamte Speicherauszug ist enthalten. Siehe letzte Antwort; Ja; Denn wenn xxd mit einem leeren String gefüttert wird, gibt er nichts aus
gadzooks02
1
@ JonathanAllan Oh ja, gut gesehen.
Gadzooks02
1
Es könnte interessant sein, ein Hexdump-Format zu zählen, in dem die ASCII-Daten auf der rechten Seite nicht enthalten waren. Alle wollen nur den Hex-Teil entfernen und den Rest byteweise zählen. Wenn die Herausforderung darin bestand, dies nur in Anbetracht der letzten Hex-Dump-Zeile zu tun , würde dies das Parsen der Hex-Nummer (der Position) sowie das Zählen der Hex-Ziffern in dieser Zeile erzwingen. (Wie ich es von Hand mache, wenn ich nach objdumpZerlegungen oder nasmAuflistungen suche, um Antworten auf Maschinencodes zu erhalten.) Ich schätze, ich sollte das in der Sandbox posten ...
Peter Cordes

Antworten:

12

Retina 0.8.2 , 8 Bytes

.{51}

.

Probieren Sie es online! Erläuterung:

.{51}

Löschen Sie die ersten 51 Zeichen jeder Zeile. (Zeilen können nur zwischen 52 und 67 Zeichen enthalten, dies entspricht also immer einmal pro Zeile.)

.

Zählen Sie die verbleibenden Nicht-Zeilenumbrüche.

7 Bytes, wenn leere Eingabe nicht unterstützt werden musste:

.{52}


Probieren Sie es online! Erläuterung:

.{52}

Löschen Sie die ersten 52 Zeichen jeder Zeile. (Zeilen können nur zwischen 52 und 67 Zeichen enthalten, dies entspricht also immer einmal pro Zeile.)


Zählen Sie 1 mehr als die Anzahl der verbleibenden Zeichen (einschließlich Zeilenumbrüche).

Neil
quelle
7 mit &`.{52}.
Grimmy
@Grimy Das ist einfach ... großartig ... du musst das als deine eigene Antwort posten.
Neil
Anfangs habe ich es nicht bemerkt, aber tatsächlich gibt es bereits eine fast identische Antwort .
Grimmy
11

tcsh , 12 bytes

xxd -r|wc -c

Probieren Sie es online!

Krzysztof Szewczyk
quelle
1
Sehr robust und genau das tun, was OP will.
Dienstag,
7

V (vim) , 7 Bytes

Î51x
Ø.

Probieren Sie es online!

Erläuterung:

Î       " 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
quelle
6

Retina , 7 Bytes

Dies zählt die Gesamtzahl der einzeiligen Zeichenfolgen mit der Länge 52. Es könnte möglich sein, etwas Ähnliches zu tun %52,`., aber ich habe keinen Weg gefunden, dies zu beheben.

w`.{52}

Probieren Sie es online!

Mein Pronomen ist monicareinstate
quelle
1
Auch &`.{52}für Retina 0.8.2.
Grimmy
5

APL (Dyalog Extended) , 18 Byte

Volles Programm. Fordert zur Eingabe einer Liste von Zeichenfolgen (dh von Zeichenlisten) auf.

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

Probieren Sie es online!

 Prompt

49↑¨ nimm die ersten 49 Zeichen von jedem

(Wenden auf jede folgende stillschweigende Funktion an:

 das Argument

 zerhacken in Serien von Zeichen, die sind

 unterscheidet sich vom Füllzeichen (Leerzeichen)

1↓ Lass das erste "Wort" fallen

ϵ nlist (Abflachen)

 übereinstimmen

2÷⍨ durch zwei teilen

Adam
quelle
4

Gelee , 5 Bytes

Ẉ_51S

Ein monadischer Link, der eine Liste von Zeilen akzeptiert, die die Ganzzahl der Bytes ergeben.

Probieren Sie es online!

Wie?

Ẉ_51S - Link: list of lists of characters, H
Ẉ     - length of each (line in H)
  51  - literal fifty-one
 _    - subtract (vectorises)
    S - sum
Jonathan Allan
quelle
Sie können eine Liste von Zeilen akzeptieren. Möchten Sie auch eine Erklärung hinzufügen?
Gadzooks02
Ah cool, ist der leere Eingang eine leere Liste ODER eine Liste mit einer einzelnen leeren Zeile? (Dies sollte im Beitrag klargestellt werden, da es sich um einen Randfall handelt.)
Jonathan Allan,
Es ist eine leere Liste / string / etc. Ich habe das gerade geklärt.
Gadzooks02
Danke, Erklärung jetzt auch hinzugefügt.
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;}

Probieren Sie es online!

9 Bytes dank YSC abgeschnitten!

Hier ist eine fragilere Version, die von der JavaScript-Lösung von Arnauld inspiriert ist und bei langen Eingaben wahrscheinlich fehlschlägt:

C (gcc) , 50 Bytes

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

Probieren Sie es online!

G. Sliepen
quelle
1
59 Bytes durch Ändern return raufl=r
girobuz
2
@JonathanFrech undefiniertes Verhalten ist perfekt für Code-Golf!
G. Sliepen
1
@YSC Hm, aber ich denke, r global zu machen verstößt gegen die Regel, dass, wenn Sie eine Funktion definieren, um etwas zu tun (und es ist nicht so main), es möglich sein sollte, es mehrmals aufzurufen.
G. Sliepen
2
@girobuz while()hat die gleiche Anzahl von Bytes wie for(;;). Also ;while()ist ein Byte länger als for(;;).
Jonathan Frech
3

Python 3, 48 46 Bytes

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

Die Eingabe wird als Zeichenfolge an die Funktion übergeben. Die Funktion erhöht die Länge der Eingabe (einschließlich der Zeilenumbrüche) und subtrahiert dann 52 für jede Zeile.

Probieren Sie es online aus

IFcoltransG
quelle
2
Nach allem, was ich gesehen habe, f=kann das als `f =` in den Header verschoben werden, wobei nur das Lambda als Code übrig bleibt und zwei Bytes gespart werden: Probieren Sie es online aus!
Gadzooks02
@ gadzooks02 Danke, werde bearbeiten. Das f=ist eine Angewohnheit, die ich vom Python-Discord-Server aufgegriffen habe.
IFcoltransG
2

Japt -x , 5 Bytes

Eingabe als Array von Zeilen.

®Ê-51

Versuch es

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

Perl 6 , 18 Bytes

{.join.comb-51*$_}

Probieren Sie es online!

Anonym Welches Lambda auch immer, das eine Liste von Zeilen aufnimmt und die Summe der Anzahl der Zeichen zurückgibt, wobei für jede Zeile 51 subtrahiert werden

Scherzen
quelle
2

05AB1E , 8 6 Bytes

€g51-O

Probieren Sie es online!

Eingabe als Liste von Zeichenfolgen.

€g     get lengths of each line
51-    subtract 51 from each
O      push the sum of the resulting list
       implicitly print
Dorian
quelle
1
Entschuldigung, die Eingabe muss den gesamten Hexdump enthalten. (Ihre überspringt die Buchstaben am Ende jeder Zeile)
gadzooks02
Oh mein Schlechtes. Ich habe das auf meinem Smartphone gemacht. Ich habe nicht gesehen, dass etwas hinter den Hex-Codes steckt. Ich habe eine Korrektur vorgenommen.
Dorian
2

MathGolf , 7 6 Bytes (nicht konkurrierend)

m£Ex-Σ

Es ist (vorerst) nicht konkurrierend, da es derzeit einen Fehler in MathGolf für Zeichenketten-Eingaben gibt, die Leerzeichen enthalten. Sie werden automatisch in eine Liste umgewandelt (durch Leerzeichen getrennt). Im TIO habe ich alle Leerzeichen durch ein ersetzt, um Bzu zeigen, dass es wie beabsichtigt funktioniert.

Eingabe als Liste von Zeichenfolgen.

-1 Byte durch Auffinden einer zu generierenden Methode 51 in 2 Bytes (siehe Verlauf für mehr als 10 Möglichkeiten, dies in 3 Bytes zu tun.)

Probieren Sie es online aus.

Erläuterung:

m    # Map each string in the (implicit) input-list
 £   #  Pop the string and get the length
E    # Push 15
 x   # Reverse, but keep it an integer
     # (NOTE: simply `51` would be interpret as two values on the stack: 5 and 1)
  -  # Subtract each of the lengths by this
Σ    # Take the sum of the list
     # (after which the entire stack joined together is output implicitly as result)
Kevin Cruijssen
quelle
Angenommen, Sie haben den Fehler in MathGolf nicht behoben, seit Sie diese Antwort gepostet haben, ist sie ungültig und nicht konkurrierend.
Paprika
2

IBM / Lotus Notes Formula Language, 53 Byte

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

Es gibt kein TIO für Formula. Hier sind Screenshots der Testfälle:

Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben

Die Formel befindet sich in dem berechneten Feld, das den Wert nach "Returns" liefert.

Erläuterung

Dies ist eine gute Demonstration, wie Formula eine Funktion rekursiv auf eine Liste anwendet, ohne eine Schleife zu benötigen. Die Formel befindet sich in einem berechneten Feld in derselben Form wie das bearbeitbare Eingabefeld "i".

  1. Beginnen Sie in der Mitte. @Leftund @Rightzulassen, dass ein Zeichenkettenbegrenzer oder eine Anzahl von Zeichen verwendet wird. Wir suchen also rechts :und dann links vom ersten Vorkommen zweier Räume. Da Formula die neue Zeile als Listentrennzeichen ansieht, wird dies auf jede Zeile in der Eingabe angewendet.
  2. @Explodeist Formulas Äquivalent zu einer splitFunktion und verwendet standardmäßig Leerzeichen ,oder; . Es wird wieder auf jede Zeile im Feld angewendet, aber dieses Mal werden die Ergebnisse in einer einzigen Liste zusammengefasst.
  3. @Lengthwird dann auf jedes Mitglied der Liste angewendet. In jedem Fall dividieren wir den Rückgabewert durch 2.
  4. @Sum die ganze Liste und das Ergebnis ausgeben.
ElPedro
quelle
1
Haben Sie einen Link zu einem Dolmetscher (entweder online oder heruntergeladen)?
Gadzooks02
Leider nicht. Formula ist eine proprietäre Sprache, die an das IBM-Produkt gebunden ist (ich habe vor einiger Zeit bei Meta gefragt, ob dies auf dieser Site zulässig ist, und die Antwort lautete "Ja", aber nicht für Cops & Robbers-Herausforderungen). Als ich das letzte Mal nachgesehen habe, war Domino Designer (der Formula unterstützt) immer noch als kostenloser Download von IBM erhältlich. Leider nur Windows und da ich Linux zu Hause laufe, kann ich das nicht bestätigen. Diese Antwort wurde während meiner Mittagspause geschrieben, da ich leider immer noch einige ältere Notes-Apps unterstütze und immer noch Notes auf meinem Computer bei der Arbeit habe :-)
ElPedro
1
Übrigens, wenn Sie Lotus Notes auf dieser Site durchsuchen, werden Sie feststellen, dass ich der einzige bin, der dumm genug ist, Golf in dieser Sprache zu spielen :-)
ElPedro
1

JavaScript (ES6), 34 Byte

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

Probieren Sie es online!

Kommentiert

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
quelle
1

Rot , 81-55 Bytes

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

Probieren Sie es online!

Übernimmt die Eingabe als Liste von Zeichenfolgen.

Galen Ivanov
quelle
1

JavaScript, 33 32 Bytes

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

Probieren Sie es online!

1 Byte dank Arnauld gespeichert.

Zottelig
quelle
0

Zsh , 36 Bytes

Mit den Standard-Flags von zsh:

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

Probieren Sie es online!

${(f)1}$1Teilt sich in Zeilenumbrüche und verwirft leere Zeilen. Das $[ arithmetic expansion ]schützt vor dem leeren Koffer, wenn die Schlaufe nie untergeht $c.

Zsh , 28 Bytes

Mit -o extendedglob:

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

Probieren Sie es online!

(f)Teilen Sie Zeilenumbrüche auf, ${ #?(#c52)}entfernen Sie die führenden 52 Zeichen und (F)fügen Sie Zeilenumbrüche hinzu, sodass die Zeichen nicht in der Liste, sondern in der Zeichenanzahl ${# }gezählt werden.

GammaFunktion
quelle
0

asm2bf , 135 Bytes

Golf Version:

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

Kommentierte Version:

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
quelle