Напишите функцию, которая при b
выделении буфера (длиной 1 - 104857600 байт) и количества бит n
(1 <= n <= 64) разделяет буфер на куски n
битов. Вставьте правую часть последнего фрагмента с битами 0
до s n
.
например
Учитывая буфер b = "f0oBaR"
или эквивалентно [102,48,111,66,97,82]
и n = 5
, вернуть
[12, 24, 24, 6, 30, 16, 19, 1, 10, 8]
Это потому, что вышеприведенный буфер, представленный в виде двоичного файла, выглядит следующим образом:
01100110 00110000 01101111 01000010 01100001 01010010
А при перегруппировке в 5s выглядит так:
01100 11000 11000 00110 11110 10000 10011 00001 01010 010[00]
Который при преобразовании обратно в десятичную дает ответ.
Заметки
- Вы можете использовать любой тип данных, наиболее подходящий для вашего языка, для представления буфера. В PHP вы, вероятно, будете использовать строку, в Node вы можете использовать буфер
- Если вы используете строку для представления буфера, предположите, что это ASCII для преобразования char -> int
- Вы можете использовать массив значений (0-255) для ввода, если вы предпочитаете
- Возвращаемое значение должно быть массивом или списком целых
Тестовые случаи
> b = "Hello World", n = 50
318401791769729, 412278856237056
> b = [1,2,3,4,5], n = 1
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1
> b = "codegolf", n = 32
1668244581, 1735355494
> b = "codegolf" n = 64
7165055918859578470
> b = "codegolf" n = 7
49, 91, 108, 70, 43, 29, 94, 108, 51, 0
> b = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque vel est eu velit lacinia iaculis. Nulla facilisi. Mauris vitae elit sapien. Nullam odio nulla, laoreet at lorem eu, elementum ultricies libero. Praesent orci elit, sodales consectetur magna eget, pulvinar eleifend mi. Ut euismod leo ut tortor ultrices blandit. Praesent dapibus tincidunt velit vitae viverra. Nam posuere dui quis ipsum iaculis, quis tristique nisl tincidunt. Aliquam ac ligula a diam congue tempus sit amet quis nisl. Nam lacinia ante vitae leo efficitur, eu tincidunt metus condimentum. Cras euismod quis quam vitae imperdiet. Ut at est turpis.", n = 16
19567, 29285, 27936, 26992, 29557, 27936, 25711, 27759, 29216, 29545, 29728, 24941, 25972, 11296, 25455, 28275, 25955, 29797, 29813, 29216, 24932, 26992, 26995, 25449, 28263, 8293, 27753, 29742, 8272, 25964, 27749, 28276, 25971, 29045, 25888, 30309, 27680, 25971, 29728, 25973, 8310, 25964, 26996, 8300, 24931, 26990, 26977, 8297, 24931, 30060, 26995, 11808, 20085, 27756, 24864, 26209, 25449, 27753, 29545, 11808, 19809, 30066, 26995, 8310, 26996, 24933, 8293, 27753, 29728, 29537, 28777, 25966, 11808, 20085, 27756, 24941, 8303, 25705, 28448, 28277, 27756, 24876, 8300, 24943, 29285, 25972, 8289, 29728, 27759, 29285, 27936, 25973, 11296, 25964, 25965, 25966, 29813, 27936, 30060, 29810, 26979, 26981, 29472, 27753, 25189, 29295, 11808, 20594, 24933, 29541, 28276, 8303, 29283, 26912, 25964, 26996, 11296, 29551, 25697, 27749, 29472, 25455, 28275, 25955, 29797, 29813, 29216, 28001, 26478, 24864, 25959, 25972, 11296, 28789, 27766, 26990, 24946, 8293, 27749, 26982, 25966, 25632, 28009, 11808, 21876, 8293, 30057, 29549, 28516, 8300, 25967, 8309, 29728, 29807, 29300, 28530, 8309, 27764, 29289, 25445, 29472, 25196, 24942, 25705, 29742, 8272, 29281, 25971, 25966, 29728, 25697, 28777, 25205, 29472, 29801, 28259, 26980, 30062, 29728, 30309, 27753, 29728, 30313, 29793, 25888, 30313, 30309, 29298, 24878, 8270, 24941, 8304, 28531, 30053, 29285, 8292, 30057, 8305, 30057, 29472, 26992, 29557, 27936, 26977, 25461, 27753, 29484, 8305, 30057, 29472, 29810, 26995, 29801, 29045, 25888, 28265, 29548, 8308, 26990, 25449, 25717, 28276, 11808, 16748, 26993, 30049, 27936, 24931, 8300, 26983, 30060, 24864, 24864, 25705, 24941, 8291, 28526, 26485, 25888, 29797, 28016, 30067, 8307, 26996, 8289, 28005, 29728, 29045, 26995, 8302, 26995, 27694, 8270, 24941, 8300, 24931, 26990, 26977, 8289, 28276, 25888, 30313, 29793, 25888, 27749, 28448, 25958, 26217, 25449, 29813, 29228, 8293, 29984, 29801, 28259, 26980, 30062, 29728, 28005, 29813, 29472, 25455, 28260, 26989, 25966, 29813, 27950, 8259, 29281, 29472, 25973, 26995, 28015, 25632, 29045, 26995, 8305, 30049, 27936, 30313, 29793, 25888, 26989, 28773, 29284, 26981, 29742, 8277, 29728, 24948, 8293, 29556, 8308, 30066, 28777, 29486
> b = [2,31,73,127,179,233], n = 8
2, 31, 73, 127, 179, 233
n
больше 8? Если так, то как насчет значенийn
больше 64, что больше, чем целочисленная точность большинства языков.char
целое число, которое бывает длиной в один байт.Ответы:
Pyth,
1817 байтСпасибо @lirtosiast за байт!
источник
Желе, 13 байт
Это принимает входные данные в виде списка целых чисел. Попробуйте онлайн!
Как это работает
источник
Юлия, 117 байт
Это функция, которая принимает целочисленный массив и целое число и возвращает целочисленный массив. Это упражнение в злоупотреблении аргументом функции.
Ungolfed:
источник
JavaScript (ES6), 120 байт
Рекурсивное переворачивание битов на целочисленных массивах. Ungolfed:
источник
"(s,n)=>(s.replace(/./g,x=>(256+x.charCodeAt()).toString(2).slice(1))+'0'.repeat(n-1)).match(eval(`/.{${n}}/g`)).map(x=>+`0b${x}`)".length
Python 3, 102 байта
использовать трюк iter для группировки строк
s
: входная строка / буферn
: количество бит в каждом разделенном фрагментеПолученные результаты
источник
n
имеют то же значение, что и вопрос:splits the buffer into chunks of n bits
Рубин, 114 байт
Чуть чище:
источник
Perl 6,
9368 байтисточник
PHP,
262217189 байт(обновлено советами Исмаила Мигеля )
Отформатирован для удобства чтения:
Пример:
источник
str_pad($s,8,'0',STR_PAD_LEFT)
, вы можете использоватьstr_pad($s,8,0,0)
. Вы можете удалить кавычкиbindec
иdecbin
сохранить 4 байта. Чтобы сохранить больше, вы можете сохранитьarray_map
переменную и передать ее взамен. Вот, пожалуйста:function f($b,$n){$M=array_map;return$M(bindec,$M(function($x)use($n){return str_pad($x,$n,0);},str_split($M('',array_map(function($s){return str_pad($s,8,0,0);},$M(decbin,$b))),5)));}
(184 байта).implode
с$M
хотя тоже.CJam, 30 байтов
Попробуйте онлайн!
Это неназванный блок, который ожидает буфер int и количество кусков в стеке и оставляет результат в стеке.
Решил попробовать CJam. Мне потребовалось 2 часа, чтобы сделать это ^^ Это, вероятно, слишком долго, предложения очень приветствуются!
объяснение
источник
2b8T
а не2b8 0
сохранить байты (переменныйT
является preinitialized к0
) 2. Отбросив последний кусок может быть сделан сW<
(переменнымW
инициализируются-1
) или);
(вынуть последний элемент и выбросьте его).JavaScript (ES6) 104
Итеративное возложение,
Редактировать 5 байт сохранить thx @Neil
Меньше гольфа
Тест
источник
x
каждый раз, почему бы не сдвинутьx
правильныеi
биты?c-g?[...s,t<<c]:s
может сэкономить вам еще пару байтов.J, 24 байта
Это анонимная функция, которая принимает в
n
качестве левого аргументаb
число, а в качестве правого аргумента - числа.Тест:
Объяснение:
источник
Haskell,
112109 байтПример использования:
5 # [102,48,111,66,97,82]
->[12,24,24,6,30,16,19,1,10,8]
.Как это работает
источник
Java,
313306322 байтаЯ надеюсь, что это превосходит PHP ... И нет. Глупые длинные имена функций.
-7 спасибо @quartata за избавление от публичного +16, чтобы исправить ошибку, когда раскол был точным, спасибо @TheCoder за его перехват
источник
o[]=new int[b.length()*8/s+1]
- Это назначит неправильный размер, если(b.length()*8)%s==0
Рубин , 66 байт
Попробуйте онлайн!
Принимает входной буфер как строку, так что несколько тестовых строк были построены непосредственно в нижнем колонтитуле, чтобы избежать непечатных.
источник
MATL , 9 байт
Попробуйте онлайн!
Принимает ввод
b
в виде строки, разделенной''
или как массив значений, разделенных запятыми, например[102, 48, 111]
, затемn
.источник
Perl 5
-nl -MData::Dump=pp
, 96 байтПопробуйте онлайн!
Требуется
Data::Dump
модуль.принимает
n
первую строку ввода и цифры в каждой строке после этого.Выходы в STDERR (поле отладки на TIO).
Оспарил и привел в порядок:
источник
Powershell 146 байт
Возьмите в буфер и преобразуйте его в массив char, а затем в массив целых чисел. Для каждого из них преобразуйте в двоичный файл, дополните записи нулями там, где это необходимо, и объедините в одну большую строку. Разделите эту строку на n символов и отбросьте созданные пробелы. Каждый элемент из разбиения дополняется (это действительно нужно только последнему элементу) и преобразуется обратно в целое число. Выход представляет собой массив
источник
Python 3,5 -
312292 байта:Хотя это может быть длинным, насколько мне известно, это самый короткий способ принять и функции, и массивы без ошибок, и при этом сохранять некоторую точность в Python 3.5.
источник
Ява,
253247 байтGolfed
UnGolfed
источник
c, 2
=>c,2
;((l=f.length())%n)>0
=>(l=f.length())%n>0
;Желе , 13 байт
Попробуйте онлайн!
Отличается от ответа Денниса.
Примечание. Входные данные на самом деле представляют собой список неотрицательных целых чисел, но ссылка TIO облегчает вам боль и принимает либо такой список, либо строку.
источник
Stax , 12 байт
Запустите и отладьте его
Это не функция, как указано в вызове, а программа, так как Stax не поддерживает функции. Он поддерживает ввод строк или литералов массива.
источник
Python 2 , 101 байт
Попробуйте онлайн!
источник
Дьялог АПЛ , 36 байт
Попробуйте онлайн!
Это, вероятно, могло бы быть в гольфе больше.
источник
Эликсир ,
6360 байтПопробуйте онлайн!
Принимает ввод как бинарный файл Elixir, выводит список целых чисел.
Этот код использует понимание генератора цепочек битов Elixir для разбиения входного двоичного файла
&1
на битовые блоки размером, предоставленным в качестве аргумента&2
. Чтобы учесть любые оставшиеся биты в конце, мы дополняем двоичный файл&2 - 1
нулевыми битами. Здесь также есть место, где проявляется нежелательная многословность: Elixir жалуется, если мы явно не объявляем&1
как цепочку битов, и также не поддерживает выражения вsize(...)
, следовательно, требуется дополнительное присвоение переменной.Пасхальное яйцо: в сноске, замените
IO.inspect
сIO.puts
, и наша функция магическим образом «переводит» Lorem Ipsum с латыни на китайский - Попробуйте его в Интернете!источник
Japt , 16 байт
После долгого дня встреч я чувствую, что забыл, как играть в гольф! Позже поиграю с этим в поезде домой, посмотрим, смогу ли я улучшить его.
Попытайся
источник
IEC 8859-1
? Это даже законно? Вы нашли лазейку? Разве они не указали, что это должен быть UTF-8? Потому что это 22 байта UTF-8.1.
Каждый язык может использовать свою собственную кодировку / кодовую страницу.2.
ISO-8859-1 является довольно стандартной кодировкой, используемой многими языками и не относящейся к Japt или этому конкретному решению.3.
В вашей спецификации не указано, что мы должны учитывать UTF-8.4.
Если бы это было так, вы бы сильно отговорились от этого.PHP ,
135129124 байтаПопробуйте онлайн!
Реализованный как функция, входной буфер представляет собой массив целых и возвращает массив целых чисел.
Выход
Проверьте все контрольные примеры
источник
APL (NARS), 471 символ, 942 байта
прокомментированный код и тест:
источник