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.


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).



@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,


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


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


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

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!


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


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


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

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


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

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.

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





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.


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.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.