Miernik golfowy © 2019

20

Miernik golfowy © 2019

Hexdumps użyte z xxdwyglądają mniej więcej tak:

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

Twoim zadaniem jest przekonwertowanie zrzutu heksadecymalnego w tej formie na liczbę używanych bajtów.

Zasady:

  • Zwykle luki zabronione.
  • To jest , więc wygrywa najkrótsza ważna odpowiedź w bajtach.
  • Możesz dodać nowy wiersz na końcu tekstu ( 0a). Oznacza to, że jeśli zrzut heksowy kończy się na nowej linii ( 0a), to wejście może mieć zmniejszoną moc wyjściową o jeden.
  • Puste wejście (dosłownie nic: pusta lista / ciąg / itd.) Musi mieć wartość 0.
  • Dane wejściowe można przyjmować w dowolnej formie
  • Dane wejściowe będą prawidłowe ASCII bez znaków kontrolnych
  • Dane wejściowe muszą zawierać cały zrzut heksowy

Przypadki testowe:

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

zwraca 28 lub 27

00000000: 0a                                       .

zwraca 1 lub 0

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

zwraca 10 lub 9

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

zwraca 13


zwraca 0 (To dosłownie nic: pusta lista / ciąg znaków itp.)

Wyjaśnienia byłyby przydatne w przypadku niestandardowych języków.

gadzooks02
źródło
Czy możemy założyć, że dane wejściowe to ascii? Czy może zawierać znaki kontrolne? Jakie są reguły wprowadzania? Niektóre języki nie obsługują wprowadzania w wielu wierszach. Czy możemy wstawić ostatnią linię, aby wszystkie linie były jednakowo długie? Dlaczego warto uwzględnić puste dane wejściowe?
Stewie Griffin
@StewieGriffin Tak; Nie; tak; ponieważ jeśli xxdzostanie podany pusty ciąg, nic nie wyprowadza.
gadzooks02
1
@StewieGriffin Edytowałeś swój komentarz, kiedy odpowiadałem, więc oto rozszerzenie: Tak; Nie; można go wprowadzić dowolnie, pod warunkiem uwzględnienia całego zrzutu; Zobacz ostatnią odpowiedź; Tak; Ponieważ jeśli xxd zostanie podany pusty ciąg, nic nie wyświetli
gadzooks02,
1
@JonathanAllan O tak, dobrze zauważony.
gadzooks02
1
Interesujące może być zliczanie formatu zrzutu heksowego, który nie zawierał danych ASCII po prawej stronie. Wszyscy zaczynają od usuwania części heksadecymalnej i liczenia bajtów reszty. Jeśli wyzwaniem byłoby to zrobić, biorąc pod uwagę tylko ostatnią linię zrzutu heksowego, wymusiłoby to parsowanie liczby heksadecymalnej (pozycji), a także zliczanie liczby cyfr szesnastkowych w tej linii. (Jak robię to ręcznie, patrząc na objdumpdemontaż lub nasmlistę odpowiedzi na kod maszynowy.) Chyba powinienem to opublikować w piaskownicy ...
Peter Cordes

Odpowiedzi:

12

Retina 0.8.2 , 8 bajtów

.{51}

.

Wypróbuj online! Wyjaśnienie:

.{51}

Usuń pierwsze 51 znaków z każdej linii. (Linie mogą mieć tylko od 52 do 67 znaków, więc zawsze są one dopasowane raz na linię).

.

Policz pozostałe znaki, które nie są znakami nowej linii.

7 bajtów, jeśli puste dane wejściowe nie musiały być obsługiwane:

.{52}


Wypróbuj online! Wyjaśnienie:

.{52}

Usuń pierwsze 52 znaki z każdej linii. (Linie mogą mieć tylko od 52 do 67 znaków, więc zawsze są one dopasowane raz na linię).


Policz 1 więcej niż liczba pozostałych znaków (w tym nowych linii).

Neil
źródło
7 z &`.{52}.
Grimmy,
@Grimy To po prostu ... niesamowite ... musisz opublikować to jako własną odpowiedź.
Neil
Z początku tego nie zauważyłem, ale w rzeczywistości jest już prawie identyczna odpowiedź .
Grimmy,
11

tcsh , 12 bajtów

xxd -r|wc -c

Wypróbuj online!

Krzysztof Szewczyk
źródło
1
Bardzo solidny i rób dokładnie to, czego chce OP.
tsh
7

V (vim) , 7 bajtów

Î51x
Ø.

Wypróbuj online!

Wyjaśnienie:

Î       " 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
źródło
6

Siatkówka , 7 bajtów

Zlicza to całkowitą liczbę ciągów jednowierszowych o długości 52. Możliwe, że można zrobić coś podobnego %52,`., ale nie udało mi się znaleźć sposobu, aby to naprawić.

w`.{52}

Wypróbuj online!

mój zaimek to monicareinstate
źródło
1
Także: &`.{52}dla Retina 0.8.2.
Grimmy,
5

APL (Dyalog Extended) , 18 bajtów

Pełny program Monity o listę ciągów znaków (tj. List znaków).

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

Wypróbuj online!

 skłonić

49↑¨ weź pierwsze 49 znaków od każdego

(Zastosuj następującą funkcję ukrytą dla każdego:

 argument

 posiekaj na serie postaci, które są

 różni się od znaku dopełniającego (spacja)

1↓ upuść pierwsze „słowo”

ε nlist (spłaszczyć)

 zestawienie

2÷⍨ podziel przez dwa

Adám
źródło
4

Galaretka , 5 bajtów

Ẉ_51S

Monadyczny link akceptujący listę wierszy, które dają liczbę całkowitą bajtów.

Wypróbuj online!

W jaki sposób?

Ẉ_51S - Link: list of lists of characters, H
Ẉ     - length of each (line in H)
  51  - literal fifty-one
 _    - subtract (vectorises)
    S - sum
Jonathan Allan
źródło
Możesz zaakceptować listę linii. Czy chciałbyś również dodać wyjaśnienie?
gadzooks02
Ach fajnie, więc czy puste wejście jest pustą listą LUB listą z pojedynczą pustą linią? (Powinno to zostać wyjaśnione w poście, ponieważ jest to przypadek.)
Jonathan Allan,
To i pusta lista / ciąg / etc. Właśnie to wyjaśniłem.
gadzooks02
Dzięki, teraz dodano także wyjaśnienie.
Jonathan Allan
3

C (gcc) , 64 55 bajtów

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

Wypróbuj online!

Ogolono 9 bajtów dzięki YSC!

Oto bardziej delikatna wersja zainspirowana rozwiązaniem JavaScript Arnauld, które prawdopodobnie zawodzi przy długich wejściach:

C (gcc) , 50 bajtów

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

Wypróbuj online!

G. Sliepen
źródło
1
59 bajtów, zmieniając return rnal=r
girobuz,
2
@JonathanFrech niezdefiniowane zachowanie jest całkowicie w porządku dla golfa kodu!
G. Sliepen
1
@YSC Hm, ale myślę, że r globalne narusza zasadę, że jeśli zdefiniujesz funkcję, aby coś zrobić (a nie jest main), powinna istnieć możliwość wielokrotnego wywoływania tego.
G. Sliepen
1
W każdym razie r;s[];f(l){while(*s=0,gets(s),l=strlen(s))r+=l-51;l=r;}: 55 bajtów :)
YSC
2
@girobuz while()ma taką samą liczbę bajtów jak for(;;). Zatem ;while()jest o jeden bajt dłuższy niż for(;;).
Jonathan Frech,
3

Python 3, 48 46 bajtów

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

Dane wejściowe są przekazywane do funkcji jako ciąg znaków. Funkcja zwiększa długość danych wejściowych (w tym znaki nowej linii), a następnie odejmuje 52 dla każdej linii.

Wypróbuj online

IFcoltransG
źródło
2
Z tego, co widziałem, f=można go przenieść do nagłówka jako `f =`, pozostawiając tylko lambda jako kod i oszczędzając dwa bajty: Wypróbuj online!
gadzooks02
@ gadzooks02 Dzięki, dokonam edycji. f=Jest nawykiem Podniosłem z serwera niezgody Pythona.
IFcoltransG
2

Japt -x , 5 bajtów

Wprowadź jako tablicę wierszy.

®Ê-51

Spróbuj

®Ê-51     :Implicit input of array
®         :Map
 Ê        :  Length
  -51     :  Subtract 51
          :Implicit output of sum of resulting array
Kudłaty
źródło
2

Perl 6 , 18 bajtów

{.join.comb-51*$_}

Wypróbuj online!

Anonimowy Cokolwiek lambda, które pobiera listę wierszy i zwraca sumę liczby znaków, odejmując 51 dla każdego wiersza

Jo King
źródło
2

05AB1E , 8 6 bajtów

€g51-O

Wypróbuj online!

Wprowadź jako listę ciągów.

€g     get lengths of each line
51-    subtract 51 from each
O      push the sum of the resulting list
       implicitly print
dorycki
źródło
1
Przepraszamy, dane wejściowe muszą zawierać cały zrzut heksowy. (Twój pomija litery na końcu każdej linii)
gadzooks02
Och, mój zły. Zrobiłem to na moim smartfonie. Nie widziałem, że coś kryje się za kodami szesnastkowymi. Zrobiłem korektę.
Dorian
2

Język formuły IBM / Lotus Notes, 53 bajty

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

Formula nie ma TIO, więc oto zrzuty ekranów przypadków testowych:

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Formuła znajduje się w polu obliczeniowym, które podaje wartość po „Zwraca”.

Wyjaśnienie

To dobra demonstracja sposobu, w jaki Formula będzie rekurencyjnie stosować funkcję do listy bez potrzeby tworzenia pętli. Formuła znajduje się w polu obliczeniowym w tej samej formie, co edytowalne pole wejściowe `i '.

  1. Zacznij od środka. @Lefti @Rightzezwól na użycie ogranicznika ciągu lub liczby znaków. Dlatego szukamy po prawej stronie: a następnie na lewo od pierwszego wystąpienia dwóch spacji. Ponieważ Formula widzi nowy wiersz jako separator listy, zastosuje go do każdego wiersza na wejściu.
  2. @Explodejest równoważnikiem splitfunkcji Formula i domyślnie jest spacją, ,lub ;. Ponownie jest stosowany do każdej linii w polu, ale tym razem wyniki są łączone w jedną listę.
  3. @Lengthzostaną następnie zastosowane do każdego członka listy. W każdym przypadku dzielimy jego wartość zwracaną przez 2.
  4. @Sum całą listę i wyślij wynik.
ElPedro
źródło
1
Czy masz link do tłumacza (online lub pobrany)?
gadzooks02
Niestety nie. Formula jest zastrzeżonym językiem związanym z produktem IBM (zapytałem Meta jakiś czas temu, czy jest to dozwolone na tej stronie, a odpowiedź brzmiała „tak”, ale nie dotyczy wyzwań Cops & Robbers). Ostatnim razem, gdy szukałem, Domino Designer (który obsługuje Formula) był nadal dostępny do bezpłatnego pobrania z IBM. Niestety tylko Windows i kiedy uruchamiam Linuxa w domu, nie mogę tego potwierdzić. Ta odpowiedź została napisana podczas przerwy na lunch, ponieważ niestety jestem wystarczająco nieszczęśliwy, aby nadal obsługiwać niektóre starsze aplikacje Notes i nadal mam Notatki na moim komputerze w pracy :-)
ElPedro
1
BTW, jeśli przeszukasz Lotus Notes na tej stronie, przekonasz się, że jestem jedynym głupcem, który jest na tyle głupi, aby spróbować grać w golfa w tym języku :-)
ElPedro
1

JavaScript (ES6), 34 bajty

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

Wypróbuj online!

Skomentował

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
źródło
1

Czerwony , 81 55 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako listę ciągów znaków.

Galen Iwanow
źródło
1

JavaScript, 33 32 bajty

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

Wypróbuj online!

Oszczędność 1 bajtu dzięki Arnauldowi.

Kudłaty
źródło
0

Zsh , 36 bajtów

Z domyślnymi flagami zsh:

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

Wypróbuj online!

${(f)1}dzieli się $1na nowe linie i odrzuca puste linie. Do $[ arithmetic expansion ]chroni przed pustym przypadku, gdy pętla nigdy nie zachodzi $c.

Zsh , 28 bajtów

Z -o extendedglob:

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

Wypróbuj online!

(f)Podziel na nowe linie, ${ #?(#c52)}usuń wiodące 52 znaki, (F)dołącz do nowych linii, aby liczenie odbywało się znakowo zamiast listowo, ${# }policz znaki.

Funkcja Gamma
źródło
0

asm2bf , 135 bajtów

Wersja golfowa:

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

Skomentowana wersja:

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
źródło