Мы определяем бинарный массив как массив, удовлетворяющий следующим свойствам:
- это не пусто
- первое значение
1
- последнее значение
1
- все остальные значения либо
0
или1
Например, массив [ 1, 1, 0, 1 ]
является допустимым binarray .
Задание
Учитывая непустой массив A неотрицательных целых чисел и положительное целое число N , ваша задача состоит в том, чтобы найти двоичный массив B длины N, который позволяет генерировать A путем суммирования неограниченного числа копий B , сдвинутых на неограниченное число позиции.
пример
A = [ 1, 1, 2, 4, 1, 2, 2, 1, 0, 1, 0, 1, 1, 0, 1 ]
N = 4
Для этого ввода binarray B = [ 1, 1, 0, 1 ]
будет правильным ответом, потому что мы можем сделать:
[ 1, 1, 0, 1 ]
+ [ 1, 1, 0, 1 ]
+ [ 1, 1, 0, 1 ]
+ [ 1, 1, 0, 1 ]
+ [ 1, 1, 0, 1 ]
+ [ 1, 1, 0, 1 ]
-----------------------------------------------
= [ 1, 1, 2, 4, 1, 2, 2, 1, 0, 1, 0, 1, 1, 0, 1 ]
правила
- Входные данные могут быть приняты в любом разумном формате.
- Вывод может быть либо собственным массивом (например
[1, 1, 0, 1]
), либо двоичной строкой с разделителем или без него (например,"1,1,0,1"
или"1101"
) - Вам нужно только распечатать или вернуть один действительный бинарный массив . Кроме того, вы можете распечатать или вернуть их все, когда существует несколько решений.
- Вы не обязаны поддерживать материалы, которые не приводят к какому-либо решению.
- Сумма может включать в себя неявные нули , которые не пересекаются с любой копией B . Второй ноль в приведенной выше сумме является таким неявным нулем.
- Можно предположить, что максимальный размер A равен 100, а максимальный размер B равен 30.
- Это код-гольф, поэтому выигрывает самый короткий ответ в байтах. Стандартные лазейки запрещены.
Контрольные примеры
Input : N = 1 / A = [ 1, 2, 3, 4, 5 ]
Output: [ 1 ]
Input : N = 2 / A = [ 1, 2, 100, 99 ]
Output: [ 1, 1 ]
Input : N = 3 / A = [ 1, 1, 1 ]
Output: [ 1, 1, 1 ]
Input : N = 3 / A = [ 1, 1, 3, 2, 2 ]
Output: [ 1, 1, 1 ]
Input : N = 3 / A = [ 1, 0, 2, 1, 1, 1, 0, 0, 1, 0, 1 ]
Output: [ 1, 0, 1 ]
Input : N = 4 / A = [ 1, 2, 2, 2, 1 ]
Output: [ 1, 1, 1, 1 ]
Input : N = 4 / A = [ 1, 1, 2, 4, 1, 2, 2, 1, 0, 1, 0, 1, 1, 0, 1 ]
Output: [ 1, 1, 0, 1 ]
Input : N = 4 / A = [ 1, 1, 0, 2, 1, 0, 1 ]
Output: [ 1, 0, 0, 1 ] or [ 1, 1, 0, 1 ]
Input : N = 5 / A = [ 1, 3, 6, 9, 8, 6, 3, 4 ]
Output: [ 1, 1, 1, 0, 1 ]
Input : N = 8 / A = [ 2, 1, 0, 2, 3, 3, 1, 2, 1 ]
Output: [ 1, 0, 0, 1, 1, 1, 0, 1 ]
Input : N = 10 / A = [ 1, 2, 1, 2, 2, 1, 3, 3, 3, 2, 3, 0, 2, 1, 1, 0, 1 ]
Output: [ 1, 1, 0, 1, 0, 1, 1, 1, 0, 1 ]
Input : N = 13 / A = [ 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 ]
Output: [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ]
Input : N = 5 / A = [ 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1 ]
Output: [ 1, 1, 1, 1, 1 ]
Input : N = 6 / A = [ 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1 ]
Output: [ 1, 0, 0, 0, 0, 1 ]
Input : N = 7 / A = [ 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1 ]
Output: [ 1, 1, 0, 0, 0, 1, 1 ]
Input : N = 9 / A = [ 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1 ]
Output: [ 1, 0, 1, 0, 1, 0, 1, 0, 1 ]
N
этого должна обоснованно поддерживаться?N=4, A = [ 1, 1, 2, 4, 1, 2, 2, 2, 1, 2, 2, 1, 2, 0, 1 ]
вы получите 30459, который делится на 11 и 13, но только один из них[ 1, 1, 0, 1 ]
и[ 1, 0, 1, 1 ]
является правильным ответом.Ответы:
PHP
105 92 9086 байтРешение Jörg исправлено и отлажено:
берет
N
из первого аргумента командной строки, значения после этого; запустить-r
или проверить это онлайн .печатает двоичное число (формат
10001
); печатает недействительное решение или работает мертвым, если нет действительного решения.первая версия (теперь 97 байт), которая ничего не печатает для неверного ввода: протестируйте его онлайн
сломать
источник
111
где единственным правильным результатом является [1, 0, 1].PHP , 219 байт
Попробуйте онлайн!
-4 байта, используя
[$g,$z]=$_GET
PHP 7.1 вместоlist($g,$z)=$_GET
источник
[1,0,1,0,1,0,1,0,1]
), так и неверный answer ([1,0,0,0,1,0,1,1,1]
) для последнего контрольного примера.while($_GET[0])$s+=2**$i++*array_pop($_GET[0]);
. -5 байт:range(1|.5*$m=2**$_GET[1],$m,2)
.[ 1,0,1,1,1,0,2,2,2,2,2,1 ]
.for($g=$_GET[0];$g;)
.Python, 166 байт
Попробуйте онлайн!
Как это работает
Рассмотрим A и B как цифры базовых k чисел u и v . Например (мы будем использовать k = 1000 для иллюстрации):
A = [1, 2, 1, 3, 2, 1, 2]
B = [1, 0, 0, 1]
u = 1 002 001 003 002 001 002
v = 1 000 000 001
Как заметили многие из других ответчиков, если B - правильный ответ, то u делится на v . В этом случае,
и = 1 002 001 002 ⋅ в
Этот коэффициент, переведенный обратно в массив [1, 2, 1, 2], говорит нам точно, сколько копий B нам нужно переместить в каждую позицию.
(Почему? Потому что именно так долго работает умножение в базе k .)
Другие авторы не заметили, что вышеприведенного условия недостаточно . Например:
A = [1, 2, 1, 3, 2, 1, 2]
B = [1, 1, 1, 1]
u = 1 002 001 003 002 001 002
v = 1 001 001 001
u = 1 000 999 002 ⋅ v
Говоря математически, мы все еще можем перевести этот коэффициент обратно в массив [1, 1, -1, 2], что прекрасно работает, если нам разрешено использовать отрицательные копии B:
но, конечно, вызов не допускает негативных копий. Поэтому нам нужна дополнительная проверка.
С этой целью мы выбираем основание k = 10 e, где k > 10 ⋅ sum (A), и проверяем, чтобы ни одна из цифр base k не перетекла в следующую цифру k базы, когда мы умножаем частное на десять. То есть, каждый е й база десять цифры, начиная с концом, в десятичном представлении раз фактормодулей десять, должно быть 0. Это гарантирует , что фактор переводит обратно в массив с неотрицательными элементами.
источник
PHP, 213 байт
Точно так же немного в гольф
Попробуйте онлайн!
PHP, 344 байт первый рабочий
После моего первого ответа я решил сделать более длинную попытку, чтобы вернуть все правильные решения.
Онлайн версия
Сломать
источник
=
в первом цикле для более короткой версии. В большей версии необходимо удалить четыре байтаPython, 205 байт
Возвращает двоичную строку без разделителя. Как указывает @AndersKaseorg, существуют входные данные, для которых решение @ fəˈnɛtɪk не работает, поскольку деление представляет отрицательный коэффициент, который запрещен. Чтобы обойти это, я использую очень большую базу и проверяю, что в подразделении нет заимствований.
источник
f([1, 1, 1, 0, 0, 0, 1, 1, 1], 3)
неправильно возвращается101
.f([1, 0, 2, 0, 2, 0, 1], 3)
, и прямой и обратный варианты не включаютсяf([1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0], 5)
.i
это нечетно, оба варианта: прямой и обратныйf([1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0]*10, 5)
.(x^kn-1)/(x^k-1)
всегда имеет(x^n-1)/(x-1)
фактор, который обманывает решение @ fəˈnɛtɪk в любой базе.Pyth, 32 байта
Попробуйте онлайн
Как это работает
Стратегия аналогична моему ответу на Python , за исключением того, что, поскольку Pyth имеет встроенные функции для преобразования базы, мы можем использовать более эффективную базу k = 2 ⋅ sum (A) и проверять непосредственно, что каждая цифра частного не больше суммы (A ).
источник
Пари / ГП ,
77749680 байтВозвращает все решения.
Сначала преобразует массив
a
в полиномb
. Затем выбирает из делителей такиеb
многочленыd
, что все коэффициентыd
равны всем1
и0
, а все коэффициентыb / d
неотрицательны, иd(0) = 1
, иdeg(d) = n + 1
. Наконец, преобразует их обратно в массивы.Попробуйте онлайн!
источник