Просматривать двоичные значения, напечатанные в виде овалов и палочек, не так просто ... Чтобы помочь с этим, вы должны написать функцию (или программу), которая печатает числа в пользовательском двоичном представлении.
Поэтому я хочу взять число, скажем 3 ( 00000011
), и вывести биты в определенном пользователем формате, например, с разделенными пробелом парами:
00 00 00 11
или, скажем, в обратном порядке и с некоторыми декораторами, например:
11_00_00_00
Кроме того, должна быть возможность показывать «0» и «1» в качестве пользовательских символов, чтобы лучше их различать, например:
XX oo oo oo
Поэтому задача состоит в том, чтобы написать код, который делает все это в соответствии со следующей спецификацией.
Спецификация
Функция принимает входные данные следующим образом: f (A, маска, нули, единицы)
Параметры:
A - номер входа - любое (без знака) целое число в диапазоне 0-255.
маска - строковый параметр, который определяет структуру вывода.
нули - строка одинаковой длины, определяющая «нулевые» глифы для каждого выходного слота.
ones - строка одинаковой длины, определяющая символы «один» для каждого выходного слота.
Правила оформления выхода:
Посмотрите на это изображение с примером внимательно, чтобы понять, как генерируется вывод:
Таким образом, только отдельные цифры в маске анализируются и заменяются соответствующими битами A, остальные символы остаются как есть . Кроме того, если значение взятого бита равно 1, то в конечном выводе оно отображается как «X», а если оно равно 0, то оно отображается как «o». В приведенном выше примере все четыре взятых бита равны «1», поэтому мы видим «X» во всех слотах.
Если бы входное число было 128, то, по логике, выходной будет X foo bar ooo
. Символы в параметрах «нули» и «единицы»: любые печатные символы ASCII, если они всегда выровнены по маске с маской.
Примечания :
- Биты с 0 индексами: 0-й бит - это MSB.
- Предположим, что цифры 8,9 не допускаются в строке маски.
- Входные строки включают любые печатные символы ASCII.
- «Нули» и «единицы» выровнены по маске с маской.
- Для специальных символов / модификаторов на вашем языке: мы можем предположить, что они не появятся во входной строке.
Для наглядности смотрите другие примеры.
Вход -> Примеры вывода
Выведите все 8 битов в общем порядке с разделителем пробела, в общепринятых обозначениях овала и ручки:
mask = "0123 4567"
zeros = "0000 0000"
ones = "1111 1111"
A=1 -> 0000 0001
Вывести в обратном порядке, в тире-и-глифах:
mask = "| 7654 3210 |"
zeros= " ---- ---- "
ones = " ssss ssss "
A=1 -> | s--- ---- |
A=3 -> | ss-- ---- |
A=128-> | ---- ---s |
Различные обозначения в одном выводе, например, для упакованных данных:
mask = "0 | 123 4567"
zeros= " --- ----"
ones = "X kkk ssss"
A= 15 -> | --- ssss
A= 16 -> | --k ----
A= 32 -> | -k- ----
A= 128 -> X | --- ----
A= 255 -> X | kkk ssss
Повторяющиеся шаблоны:
mask = "| 7 66 555 4444 |"
zeros= " . .. ... .... "
ones = " 0 00 000 0000 "
A= 0 -> | . .. ... .... |
A= 1 -> | 0 .. ... .... |
A= 2 -> | . 00 ... .... |
A= 3 -> | 0 00 ... .... |
A= 4 -> | . .. 000 .... |
Обновить
Правила были немного упрощены - программа должна печатать только одно число (не массив / список чисел, как было предложено изначально).
A
делает, так как это одинаково во всех тестовых случаяхОтветы:
JavaScript (ES6), 57 байт
Показать фрагмент кода
источник
Рубин , 48 байтов
Параметры с нулями и единицами обрабатываются как array (
*b
), а параметр с нулями сохраняется в,b[0]
а параметр none - вb[1]
.В параметре маски
f
каждая цифра (/\d/
) заменяется символом из соответствующего массива. Специальная переменная$`
, которая содержит текст, ведущий к текущему совпадению, - это (ab), используемая здесь для отслеживания положения.Индексирование битов в Ruby вызывает 0 младший значащий бит, но вызов вызывает 0 самый старший бит. Вычитание ASCII из 55 (символ '7') дает пригодный для использования индексный бит Ruby.
Попробуйте онлайн!
источник
Perl 6 , 60 байт
источник
Python, 97 байт
источник
Mathematica, 131 байт
источник
Length[x]
может бытьLength@x
и{#2,#3,#4}
может быть{##2}
.StringJoin@@
может быть простоStringJoin@
и#1
просто#
q / kdb +,
8664 байтаРешение:
Примеры:
Объяснение:
Вытащите индексы, где входная маска
M
является цифрой, назовите ее,m
где мы будем изменять входную маску. Возьмите цифры из строки, приведите к целым числам, а затем внесите указатель в наш 8-битный массив, чтобы получить правильный порядок. Используйте этот 8-битный массив для индексации либоO
(если установлено 1), либоZ
(если установлено 0), а затем внесите их в эти списки по индексам, заданным вm
. Наконец примените (:
) этот новый список к исходной маске по индексамm
.Ноты:
Можно было бы сбрить еще 14 байтов, если бы нам было разрешено приводить аргументы в форме:
[A;M;(Z;O)]
а д позволяет до 3 -х аргументов следует уделить функции без явного имени (они
x
,y
иz
соответственно):источник