Code Measurer Golf © 2019


20

Code Measurer Golf © 2019

Шестнадцятки, що використовуються, xxdвиглядають приблизно так:

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

Ваше завдання - перетворити hexdump у цій формі в кількість використаних байтів.

Правила:

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

Тестові приклади:

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
Підрахунок формату hexdump, який не містить ASCIIfied даних праворуч, може бути цікавим. Усі йдуть, лише зачистивши шістнадцяткову частину і перерахувавши решту байтів. Якщо викликом було це зробити, враховуючи лише останній рядок шістнадцяткової дамби, це змусило б проаналізувати шістнадцятковий номер (позицію), а також підрахувати кількість шістнадцяткових цифр у цьому рядку. (Як я це роблю вручну, коли дивлюся objdumpрозбирання чи nasmсписки для відповідей машинного коду.) Я думаю, що я повинен розмістити це в пісочниці ...
Пітер Кордес

Відповіді:


12

Сітківка 0,8,2 , 8 байт

.{51}

.

Спробуйте в Інтернеті! Пояснення:

.{51}

Видаліть перші 51 символ кожного рядка. (Рядки можуть містити лише від 52 до 67 символів, тому це завжди відповідає один раз на рядок.)

.

Порахуйте решта символів, що не належать до нового рядка.

7 байт, якщо порожній вхід не потрібно було підтримувати:

.{52}


Спробуйте в Інтернеті! Пояснення:

.{52}

Видаліть перші 52 символи кожного рядка. (Рядки можуть містити лише від 52 до 67 символів, тому це завжди відповідає один раз на рядок.)


Нарахуйте на 1 більше кількості символів, що залишилися (включаючи нові рядки).



@Grimy Це просто ... приголомшливо ... Ви повинні це розмістити як власну відповідь.
Ніл

Я спочатку цього не помічав, але насправді вже є майже однакова відповідь .
Grimmy




5

APL (розширений діалог) , 18 байт

Повна програма. Підказки до списку рядків (тобто списків символів).

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

Спробуйте в Інтернеті!

 підказка

49↑¨ візьміть перші 49 символів з кожного

(Застосувати таку негласну функцію до кожного:

 аргумент

 рубати на ряди символів, які є

 відрізняється від символу прокладки (пробіл)

1↓ киньте перше "слово"

ϵ список (згладити)

 підрахунок

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-рішенням Arnauld, яке, ймовірно, не дає тривалих даних:

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), це повинно мати можливість викликати його кілька разів.
Г. Сліпен


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
Вибачте, вхід повинен містити всю шестнадцятку. (Ваш пропускає букви в кінці кожного рядка)
gadzooks02

Ой, моя погана. Я зробив це на своєму смартфоні. Не бачив, що щось стоїть за шістнадцятковими кодами. Я вніс корекцію.
Доріан

2

Мова формули IBM / Lotus Notes, 53 байти

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

Для Формули немає TIO, ось ось скріншоти тестових випадків:

enter image description here enter image description here enter image description here enter image description here enter image description here

Формула знаходиться в обчисленому полі, яке надає значення після "Повернення".

Пояснення

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

  1. Почніть з середини. @Leftі @Rightдозволити використовувати роздільник рядків або кількість символів. Тому ми шукаємо праворуч :та ліворуч від першого появи двох пробілів. Оскільки Формула бачить новий рядок як роздільник списку, він застосує це до кожного рядка вхідних даних.
  2. @Explodeє еквівалентом splitфункції формули та за замовчуванням простору, ,або; . Знову він застосовується до кожного рядка в полі, але цього разу результати об'єднуються в єдиний список.
  3. @Lengthбуде застосовано до кожного учасника списку. У кожному випадку ми ділимо його повернене значення на 2.
  4. @Sum весь список і вивести результат.

1
Чи є у вас посилання на перекладача (онлайн або завантажений)?
gadzooks02

На жаль ні. Формула - це власна мова, прив’язана до продукту IBM (я запитував у Meta деякий час тому, якщо це дозволено на цьому веб-сайті, і відповідь була «так», але не для проблем Cops & Robbers). Востаннє я дивився, що дизайнер Domino (який підтримує Формулу) все ще був доступний як безкоштовне завантаження з IBM. На жаль, тільки для Windows, і коли я запускаю Linux вдома, я не можу підтвердити. Ця відповідь була написана під час моєї перерви на обід, тому що мені дуже прикро, що я все ще підтримую деякі застарілі програми Notes і все ще маю нотатки на своїй машині на роботі :-)
ElPedro

1
До речі, якщо ви шукаєте Lotus Notes на цьому сайті, ви виявите, що я єдиний хлопець, який досить дурний, щоб спробувати пограти в гольф цією мовою :-)
ElPedro

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

Зш , 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)}видаліть провідні 52 символи, (F)приєднайтеся до нових рядків, щоб підрахунок був символьним, а не списовим, ${# }підрахуйте символи.


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.