Code Golf Measurer © 2019

20

Code Golf Measurer © 2019

Используемые Hexdumps xxdвыглядят примерно так:

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

Ваша задача - преобразовать hexdump в этой форме в число используемых байтов.

Правила:

  • Обычные лазейки запрещены.
  • Это , поэтому выигрывает кратчайший действительный ответ в байтах.
  • Вы можете включать или не включать новую строку в конце текста ( 0a). Это означает, что если hexdump оканчивается символом новой строки ( 0a), то на этом входе его вывод может быть уменьшен на единицу.
  • Пустой ввод (буквально ничего: пустой список / строка / и т. Д.) Должен выводить 0.
  • Ввод можно принимать в любой форме
  • Ввод будет действительным ASCII без управляющих символов
  • Входные данные должны содержать весь hexdump

Тестовые случаи:

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

возвращает 28 или 27

00000000: 0a                                       .

возвращает 1 или 0

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

возвращает 10 или 9

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

возвращает 13


возвращает 0 (это буквально ничто: пустой список / строка / и т. д.)

Пояснения были бы хороши для нестандартных языков.

gadzooks02
источник
Можем ли мы предположить, что вход ASCII? Может ли он содержать управляющие символы? Каковы правила ввода? Некоторые языки не могут обрабатывать ввод в несколько строк. Можем ли мы дополнить последнюю строку, чтобы все строки были одинаково длинными? Зачем включать пустой ввод?
Стьюи Гриффин
@StewieGriffin Да; нет; да; потому что, если xxdподается пустая строка, он ничего не выводит.
gadzooks02
1
@StewieGriffin Вы отредактировали свой комментарий, когда я отвечал, так что вот расширение: Да; Нет; он может быть введен как угодно, при условии, что весь дамп включен; Смотрите последний ответ; Да; Потому что, если xxd получает пустую строку, он ничего не выводит
gadzooks02
1
@JonathanAllan О да, хорошо заметили.
gadzooks02
1
Подсчет шестнадцатеричного формата, не содержащего ASCII-данные справа, может быть интересным. Каждый собирается просто снять шестнадцатеричную часть и подсчитать все остальное. Если задача состояла в том, чтобы сделать это с учетом только последней строки hexdump, это привело бы к разбору шестнадцатеричного числа (позиции), а также к подсчету числа шестнадцатеричных цифр в этой строке. (Как я делаю вручную, когда смотрю на objdumpразборки или nasmсписки для ответов машинного кода.) Я думаю, я должен опубликовать это в песочнице ...
Питер Кордес

Ответы:

12

Сетчатка 0.8.2 , 8 байт

.{51}

.

Попробуйте онлайн! Объяснение:

.{51}

Удалите первые 51 символ каждой строки. (Строки могут содержать от 52 до 67 символов, поэтому они всегда совпадают по одной строке.)

.

Подсчитайте оставшиеся символы не новой строки.

7 байтов, если пустой ввод не должен поддерживаться:

.{52}


Попробуйте онлайн! Объяснение:

.{52}

Удалите первые 52 символа каждой строки. (Строки могут содержать от 52 до 67 символов, поэтому они всегда совпадают по одной строке.)


Количество на 1 больше, чем количество оставшихся символов (включая переводы строки).

Нил
источник
7 с &`.{52}.
Grimmy
@ Грими Это просто ... круто ... ты должен опубликовать это как свой собственный ответ.
Нил
Сначала я этого не заметил, но на самом деле уже есть почти идентичный ответ .
Grimmy
7

V (vim) , 7 байтов

Î51x
Ø.

Попробуйте онлайн!

Объяснение:

Î       " 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
источник
6

Сетчатка , 7 байт

Это подсчитывает общее количество однострочных строк длиной 52. Возможно, можно сделать что-то похожее %52,`., но я не смог найти способ это исправить.

w`.{52}

Попробуйте онлайн!

мое местоимение monicareinstate
источник
1
Также: &`.{52}для Retina 0.8.2.
Grimmy
5

APL (Dyalog Extended) , 18 байт

Полная программа. Запрашивает список строк (то есть списков символов).

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

Попробуйте онлайн!

 незамедлительный

49↑¨ взять первые 49 символов от каждого

(Применить следующую молчаливую функцию к каждому:

 Аргумент

 разделить на ряды персонажей, которые

 отличается от символа заполнения (пробел)

1↓ брось первое слово

ε NLIST (Flatten)

 число

2÷⍨ разделить на два

Адам
источник
4

Желе , 5 байт

Ẉ_51S

Монадическая ссылка, принимающая список строк, которые дают целое число байтов.

Попробуйте онлайн!

Как?

Ẉ_51S - Link: list of lists of characters, H
Ẉ     - length of each (line in H)
  51  - literal fifty-one
 _    - subtract (vectorises)
    S - sum
Джонатан Аллан
источник
Вы можете принять список строк. Кроме того, вы хотели бы добавить объяснение?
gadzooks02
Ах, круто, так что пустой ввод - пустой список ИЛИ список с одной пустой строкой? (Это должно быть ясно указано в сообщении, так как это крайний случай.)
Джонатан Аллан
Это и пустой список / строка / и т.д. Я только что прояснил это.
gadzooks02
Спасибо, объяснение добавлено сейчас тоже.
Джонатан Аллан
3

C (gcc) , 64 55 байт

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

Попробуйте онлайн!

9 байтов сброшено благодаря YSC!

Вот более хрупкая версия, вдохновленная JavaScript-решением Арно, которое, вероятно, не подходит для длинных входов:

C (gcc) , 50 байтов

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

Попробуйте онлайн!

Г. Слипен
источник
1
59 байтов, изменив return rнаl=r
girobuz
2
@JonathanFrech неопределенное поведение отлично подходит для кода гольф!
Г. Слипен
1
@YSC Хм, но я думаю, что создание r global нарушает правило, что если вы определяете функцию, которая делает что-то (а это не так main), ее можно вызывать несколько раз.
Г. Слипен
1
В любом случае r;s[];f(l){while(*s=0,gets(s),l=strlen(s))r+=l-51;l=r;}: 55 байтов :)
YSC
2
@girobuz while()имеет то же количество байтов, что и for(;;). Таким образом, ;while()на один байт длиннее for(;;).
Джонатан Фрех
3

Python 3, 48 46 байт

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

Ввод передается в виде строки в функцию. Функция увеличивает длину ввода (включая новые строки), затем вычитает 52 для каждой строки.

Попробуйте онлайн

IFcoltransG
источник
2
Из того, что я видел, его f=можно переместить в заголовок как `f =`, оставив только лямбда-код в виде кода и сохранив два байта: попробуйте это онлайн!
gadzooks02
@ gadzooks02 Спасибо, отредактирую. Это f=привычка, которую я подхватил с сервера разногласий Python.
IFcoltransG
2

Japt -x , 5 байт

Ввод в виде массива строк.

®Ê-51

Попытайся

®Ê-51     :Implicit input of array
®         :Map
 Ê        :  Length
  -51     :  Subtract 51
          :Implicit output of sum of resulting array
мохнатый
источник
2

Perl 6 , 18 байт

{.join.comb-51*$_}

Попробуйте онлайн!

Аноним Любая лямбда, которая берет список строк и возвращает сумму количества символов, вычитая 51 для каждой строки

Джо Кинг
источник
2

05AB1E , 8 6 байт

€g51-O

Попробуйте онлайн!

Ввод в виде списка строк.

€g     get lengths of each line
51-    subtract 51 from each
O      push the sum of the resulting list
       implicitly print
Дориан
источник
1
Извините, входные данные должны содержать весь hexdump. (Ваш пропускает буквы в конце каждой строки)
gadzooks02
О, мой плохой. Я сделал это на своем смартфоне. Не видел что-то позади шестнадцатеричных кодов. Я сделал исправление.
Дориан
2

Язык формул IBM / Lotus Notes, 53 байта

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

Там нет TIO для Формулы, поэтому вот скриншоты тестовых случаев:

введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь

Формула находится в вычисляемом поле, которое предоставляет значение после «Returns».

объяснение

Это хорошая демонстрация того, как Формула будет рекурсивно применять функцию к списку без необходимости цикла. Формула находится в вычисляемом поле в той же форме, что и редактируемое поле ввода `i '.

  1. Начните с середины. @Leftи @Rightразрешить использование разделителя строк или количества символов. Поэтому мы ищем справа от :и затем слева от первого вхождения двух пробелов. Так как Формула видит новую строку как разделитель списка, она будет применять ее к каждой строке ввода.
  2. @Explodeявляется формулой эквивалента splitфункции и по умолчанию пробел, ,или ;. Опять же, он применяется к каждой строке в поле, но на этот раз результаты объединяются в один список.
  3. @Lengthбудет применяться к каждому члену списка. В каждом случае мы делим его возвращаемое значение на 2.
  4. @Sum весь список и вывести результат.
ElPedro
источник
1
У вас есть ссылка на переводчика (онлайн или загруженного)?
gadzooks02
К сожалению нет. Формула является проприетарным языком, связанным с продуктом IBM (я спрашивал у Meta некоторое время назад, разрешено ли это на этом сайте, и ответ был «да», но не для задач Cops & Robbers). В прошлый раз, когда я смотрел, Domino Designer (который поддерживает Формулу) все еще был доступен для бесплатной загрузки от IBM. К сожалению, только для Windows, и так как я запускаю Linux дома, я не могу подтвердить. Этот ответ был написан во время моего обеденного перерыва, так как я достаточно неудачлив, чтобы по-прежнему поддерживать некоторые старые приложения Notes и у меня все еще есть Notes на моей машине :-)
ElPedro
1
Кстати, если вы будете искать Lotus Notes на этом сайте, вы обнаружите, что я единственный парень, который достаточно глуп, чтобы попытаться
сыграть
1

JavaScript (ES6), 34 байта

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

Попробуйте онлайн!

комментарии

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
источник
0

Zsh , 36 байт

С флагами zsh по умолчанию:

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

Попробуйте онлайн!

${(f)1}разбивает $1на новые строки и отбрасывает пустые строки. В $[ arithmetic expansion ]защищает от пустого случая, когда цикл никогда не заходит $c.

Зш , 28 байт

С -o extendedglob:

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

Попробуйте онлайн!

(f)Разделение на новые строки, ${ #?(#c52)}удаление (F)первых 52 символов, объединение на новых строках, так что счет идет по символам, а не по спискам, ${# }подсчитывает символы.

GammaFunction
источник
0

asm2bf , 135 байт

Гольф версия:

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

Комментируемая версия:

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.
Кшиштоф Шевчик
источник