Ваша задача состоит в том, чтобы, учитывая целое число без знака n
, найти наибольшее число, которое можно создать, удалив один байт (8 последовательных битов) данных.
пример
Учитывая число 7831
, мы сначала конвертируем его в двоичный код (удаляя все начальные нули):
1111010010111
Затем мы находим последовательную группу из 8 битов, которая при удалении даст наибольший новый результат. В этом случае есть 3 решения, показанные ниже
1111010010111
^ ^
^ ^
^ ^
Удаление этого любого из этих выходов 11111
, которые мы тогда преобразовываем назад к его десятичному значению 31
для ответа.
Тестовые случаи
256 -> 1
999 -> 3
7831 -> 31
131585 -> 515
7854621 -> 31261
4294967295 -> 16777215 (if your language can handle 32 bit integers)
правила
- Гарантируется, что длина в битах
n
будет больше 8. - Ваше решение теоретически должно работать для любой длины бита
n
больше 8, но на практике нужно работать только для целых чисел 255 <n <2 16 - Ввод / вывод должен быть в десятичном формате.
- Вы можете отправить полную программу или функцию.
- Это код-гольф , поэтому выигрывает самая короткая (в байтах) программа!
Ответы:
Желе , 6 байт
Монадическая ссылка, принимающая число и возвращающая число.
Попробуйте онлайн!
Как?
Использует хороший быстрый ,
Ƥ
, разработанный миль ...источник
J , 12 байт
Попробуйте онлайн!
источник
&.
; это идеальная проблема для него.Python 2 , 41 байт
Попробуйте онлайн!
источник
JavaScript (ES6), 54 байта
Работает до 2 ** 31-1. Потому что кто-то спросил немного сложный ответ ...
источник
Pyth , 21 байт
Это рекурсивная функция (должна вызываться с помощью
y
или смотреть ссылку).Попробуй это здесь!
источник
Mathematica, 69 байт
Попробуйте онлайн!
Это решение работает для больших количеств. Попробуйте онлайн!
-3 байта от KellyLowder
источник
Max[c=#~RealDigits~2;Array[Drop[c[[1]],#;;#+7]~FromDigits~2&,Last@c-7]]&
Python 3 ,
686660 байт-2 байта благодаря мистеру Xcoder!
-4 байта благодаря овсам!
-2 байта благодаря Эрику Аутгольферу!
Попробуйте онлайн!
источник
n.bit_length()-8
эквивалентноlen(bin(n))-10
.Wolfram Language (Mathematica) , 46 байтов
Попробуйте онлайн!
Эта версия может обрабатывать только входы до 2 518 -1, в противном случае мы столкнемся с ограничением размера стека Mathematica. (Граница может варьироваться в зависимости от установки Mathematica.) Второе решение в этом ответе позволяет избежать этого.
Как это работает
Рекурсивный подход, основанный на следующей логике:
0
для любого входного значения меньше, чем256
, так как вы берете байт из числа съедает целое число. Это наш базовый случай, поэтому он включен, хотя спецификации обещают нам, что нам не придется обрабатывать такие входные данные.Max
из двух вариантов: съесть младший байт (давая нам входное значение, разделенное на256
) или отрубить младший бит, рекурсировать оставшееся целое число и добавить младший бит обратно, когда мы закончим.Wolfram Language (Mathematica) , 55 байтов
Попробуйте онлайн!
Альтернативная версия, которая строит таблицу вместо рекурсии, поэтому она работает для чисел любого размера, которые может обрабатывать Mathematica.
источник
Retina ,
716764 байтаПопробуйте онлайн! Ссылка включает только более быстрые тестовые случаи, чтобы не перегружать сервер Денниса. Редактировать: 3 байта сохранены благодаря @MartinEnder. Объяснение:
Преобразовать из десятичной в двоичную.
Составьте список строк, полученных путем удаления 8 последовательных цифр всеми возможными способами.
Отсортируйте их в обратном порядке и возьмите первое (наибольшее).
Конвертировать обратно в десятичную. (См @ MartinEnder по мотивам .)
источник
Java (OpenJDK 8) ,
138134 байтаПопробуйте онлайн!
источник
i.toBinaryString(i)
может бытьi.toString(i,2)
.ReRegex ,
294275 байтСохранено 19 байт, используя лучшие определения 'function'
Я бы сказал, что это очень хорошо для языка Regex.
Базовая библиотека допускает преобразование между унарным и десятичным (что необходимо, поскольку в спецификации вызова явно указывается десятичное число), но не поддерживает двоичный код; Поэтому мне пришлось написать это как часть скрипта, добавив в него 120 байтов.
Попробуйте онлайн!
По отдельным регулярным выражениям.
меры
Во-первых, мы импортируем «базовую» библиотеку, которая дает два регулярных выражения. Тот, который превращается
u<numbers>
в одинарный. И тот, который преобразуетd<unary_underlines>
обратно в десятичную. Это потому, что проблема требует ввода-вывода в base10.Затем мы определяем несколько регулярных выражений, которые преобразуют унарные в двоичные.
Первый из них -
b(\d*):(_*)\2_b/b1$1:$2b/
поиск, за которымb
, возможно, следуют несколько двоичных цифр, затем a:
, затем любое количество подчеркиваний, за которым следует точно такое же количество подчеркиваний плюс один и, наконец, еще одинb
.Затем мы заменяем
b1
его на следующие двоичные цифры:
и только первую половину подчеркивания и, наконец, последнююb
.Таким образом, это проверяет, не является ли унарное число делимым на два, и если это так, добавляет 1 к двоичным цифрам, а затем делит его на минус один на два.
Второй
b(\d*):(_+)\2b/b0$1:$2b/
почти идеальный, но не проверяет лишнее_
, что означает, что он совпадает только в том случае, если он делится на два, и в этом случае0
вместо него добавляется символ .Третий проверяет, нет ли у нас одинарных цифр, и, если это так, удаляет отступы, чтобы просто оставить двоичные цифры.
Последний проверяет, не было ли когда-либо предоставлено двоичных цифр, и в этом случае просто уходит
0
.Следующая группа регулярных выражений, которую мы определили, должна преобразовать двоичный код обратно в унарный и немного более простой.
Первая из этой группы, так же
B(_*):1/B$1$1_:/
, как и ее антитеза, обнаруживает aB
, затем следует любое количество унарных цифр:1
. ВB
этом случае он не проверяет соответствие , так как ищет только одну цифру за раз. Если это соответствует, это удваивает ранее сопоставленное количество унарных цифр и добавляет один, а затем удаляет один.Второй,
B(_*):0/B$1$1:/
почти идеальный к первому, за исключением совпадений0
а1
, а не добавляет дополнительную унарную цифру.Последний из них,
B(_*):B/$1/
проверяет, нет ли больше двоичных цифр и разворачивает ли унарный символ. В отличие от своей противоположности, для этого не требуется особый случай.Далее мы определяем
j
регулярные выражения, которые действуют как функция расщепления.Первое,
j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
делает большую часть тяжелой работы. Он выполняет поискj
, за которым могут следовать двоичные цифры, которые являются «инкрементами», затем запятая, за которой следует инкрементатор, затем ровно 8 двоичных цифр, за которыми следует остальная часть двоичного числа, а затем a:
. Первая из 8 цифр добавляется к инкременту, увеличивая его, затем все, кроме этих 8 цифр из двоичного входа, добавляется после:
следующего a,
. Так что (если бы мы использовали 2 цифры вместо 8)j,1001:
стало быj1:1001:,01
тогдаj10:1001,01,11
. Кроме того, добавленные элементы массива заключаются вB
s, чтобы преобразовать их обратно в унарный.Другой -
j(\d*),\1\d{0,7}:,?(.*)/,$2,/
проверяет, осталось ли менее 8 двоичных цифр для проверки после инкремента, и, если это так, удаляет все, кроме массива, заключенного в,
s. Например.,_,___,
Во время и после создания массива мы определяем регулярные выражения сравнения.
В первом случае
,((_+)_+),(\2),/,$1,/
проверяется запятая, за которой следует некоторое количество подчеркиваний, затем еще несколько, за которыми следует запятая, затем первое количество подчеркиваний, а не запятая. Затем он заменяет его на общее количество подчеркиваний в первом элементе, окруженном символом,
s.Последний,
,(_+),(\1_*),/,$2,/
проверяет запятую, за которой следует некоторое количество подчеркиваний, за которыми следует еще одна запятая, затем то же количество или более подчеркиваний и последняя запятая. Это вместо этого оставит правильный элемент.Наконец, когда есть соответствующий элемент слева
^,(_*),$
, мы удаляем окружающие запятые и преобразуем обратно в десятичную форму с помощьюd<>
. Тогда больше не может регулярных выражений, и выходные данные представлены.Входные данные изначально помещаются в шаблон
j,b:u<(?#input)>b:
, который сначала преобразует десятичный ввод в унарный, например,5
->j,b:_____b:
, затем получающийся унарный в двоичный,j,101:
затем разбивает двоичный файл (что не работает для примера), получает самый большой элемент, преобразует вернуться к десятичной дроби, и готово.источник
C (gcc),
91байт-23 байта от Колеры Су
Поддерживает до
2**31-1
Попробуйте онлайн!
Начинается с младших 8 битов
(j=0)
, затем идет вверх, изменяя выход, если число с[j,j+8)
вырезанными битами больше нашего тока, и продолжается до тех пор, пока у x не будет битов вышеj+8
источник
x>>j+8
иx>>j+8<<j|x%(1<<j)
в переменной (скобки удалены) уменьшит ее до 68 байт .Желе , 12 байт
Попробуйте онлайн!
Сохраненные байты благодаря Джонатану Аллану !
источник
JavaScript (ES6),
9491 байт-3 байта благодаря Джастину Маринеру
Просто выбрасываю решение на основе строк JavaScript, но я надеюсь, что кто-то опубликует отдельное решение на основе битов, чтобы я мог кое-что узнать.
Мое решение рекурсивно получает 8-битный фрагмент из строки, принимая максимальное найденное значение.
Показать фрагмент кода
источник
+(...)
что преобразует'0b'+c[1]+c[2]
в число, потому чтоMath.max
уже делает это. Попробуйте онлайн! ( спецификация для будущего использования )C # (.NET Core) ,
122 + 13 = 135,120 + 13 = 133 байтаПопробуйте онлайн!
+13 за
using System;
Я думаю, что есть способ сделать это без использования
Convert
. В любом случае, я уверен, что это может быть уменьшено.Подтверждения
-2 байта благодаря Кевину Круйссену
UnGolfed
источник
while
кfor
и положивvar b
в нем:for(var b=Convert.ToString(n,2);i<b.Length-7;)
,t
и не используя ееMath.Max
, а вместо этого проверите вручную:n=>{int m=0,i=0,t;for(var b=Convert.ToString(n,2);i<b.Length-7;m=t>m?t:m)t=Convert.ToInt32(b.Remove(i++,8),2);return m;}
( 120 + 13 байт )PHP, 67 + 1 байт
Запустите как трубу с
-nR
или попробуйте онлайн .источник
Pyth, 19 байт
Альтернативный ответ:
Объяснение:
Другой ответ использует аналогичный подход, за исключением того, что он вращается вправо первым и получает все биты, кроме последних 8.
источник
MATL ,
2321 байтПопробуйте онлайн!
К сожалению,
Bn8-:8:!+q&)
производит только те фрагменты, которые нужно удалить, а не те, которые мы хотели бы оставить.источник
Bn8-:"GB[]@8:q+(XBvX>
(присвойте[]
с(
вместо того , чтобы использовать&)
, и заменить&:
на:
и дополнение)Java (OpenJDK 8) , 73 байта
Попробуйте онлайн!
источник
Октава ,
8180 байтПопробуйте онлайн!
Это другое решение для моей первоначальной попытки - сохранение еще 14 байтов.
Код разбит следующим образом:
В шестой строке число групп рассчитывается путем нахождения показателя следующей степени двух, большего, чем вход (число бит во входном номере), и вычитания 7, поскольку мы удаляем 8 бит из каждой группы - результирующее число равно хранится
b
на потом.Затем мы вычисляем массив степеней двух в пятой строке, который является достаточно большим для всех возможных групп, которые могут быть удалены. Мы сохраним это в переменной
c
на потом.В следующей строке вверх (четвертая строка) мы умножаем входные данные на массив степеней двух (по существу, сдвигая биты на каждое число вверх) и преобразовываем результат в двоичный код. Если мы возьмем пример 7831, это приведет к созданию двумерного массива, содержащего:
Если мы затем отрубим 8 центральных битов, это эквивалентно удалению каждой из 8-битных групп. Это делается третьей строкой.
Полученный массив конвертируется обратно в десятичное во второй строке. Мы также должны разделить,
c
чтобы отменить масштабирование, которое было сделано для каждой группы первоначально.Наконец, в первой строке объявляется анонимная функция и вычисляется максимальное значение из всех групп.
nextpow2(x+1)
вместоnnz(bin2dec(x))
Исходная попытка -
120 9895 байтПопробуйте онлайн!
Код разделен следующим образом:
По сути, он вычисляет матрицу, содержащую возможные группы значений, которые могут быть удалены, а затем вычисляет, в результате чего получается наибольшее число.
Работая построчно, пятая строка вычисляет группы, которые можно удалить. Например, возьмите 7831. Это 13-битное число, дающее группам:
Результатом пятой строки является двумерный логический массив, который можно использовать для индексации.
Четвертая строка кода преобразует входные данные в массив битов (представленных в виде символов «0» и «1»), а затем копирует его
n
-7 раз (гдеn
в количестве битов), давая одну строку для каждой возможной группировки. Маска группы выше используется для удаления каждой из возможных групп.В третьей строке результат затем изменяется, чтобы отменить нежелательное выравнивание, которое возникло в результате применения маски группы. Вторая строка преобразует обратно в массив результирующих десятичных чисел. И первая строка определяет анонимную функцию как максимальное значение массива возможных групп.
источник
Perl 5 , 78 + 1 (
-p
) = 79 байтПопробуйте онлайн!
источник
Рубин , 55 байт
Попробуйте онлайн!
источник
Perl, 53 байта
(
use 5.10.1
перевод на Perl до уровня языка 5.10.1 бесплатный)Дайте входной номер на STDIN. Недостаточно памяти для больших чисел, но 32-разрядное число на входе пока не является проблемой
источник