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 (это буквально ничто: пустой список / строка / и т. д.)

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


Можем ли мы предположить, что вход 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




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 для каждой строки.

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


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

@ gadzooks02 Спасибо, отредактирую. Это f=привычка, которую я подхватил с сервера разногласий Python.
IFcoltransG



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 весь список и вывести результат.

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





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 символов, объединение на новых строках, так что счет идет по символам, а не по спискам, ${# }подсчитывает символы.


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.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.