Есть два куска дерева. Оба состоят из прямого тела и некоторых дополнительных блоков ниже тела. Пример фрагмента с дополнительными блоками в (0-индексированных) позициях 0,4,7,9,10:
XXXXXXXXXXX
X X X XX
Часть может быть представлена в виде 01
двоичной последовательности с i
символом th, показывающим, есть ли блок в i
позиции th. Верхний пример может быть представлен как10001001011
.
Мы можем собрать две части, перевернув вторую по вертикали (и, возможно, перевернув ее по горизонтали). После переворачивания (ей) мы можем найти выравнивание, где две части могут быть соединены, чтобы иметь высоту 3.
Two example pieces:
XXXXXXXXXXX XXXXXXXX
X X X XX XXX
Second piece flipped vertically and horizontally:
XXXXXXXXXXX
X X X XX
XXX
XXXXXXXX
Pieces put together:
XXXXXXXXXXX
XXXXX X XX
XXXXXXXX
В результате мы получили общую ширину 12 блоков.
Вы должны написать программу или функцию, которая получает две строки в качестве входных данных, представляющих две части, и выводит целое число минимально достижимой ширины с высотой 3.
вход
- Две строки, состоящие из символов
0
и1
. - Обе строки содержат как минимум один символ.
- Вы можете получить две строки как одну, соединенную одним пробелом.
Выход
- Единственное положительное целое число, минимальная общая достижимая ширина.
Примеры
0 0 => 1
1 0 => 1
1 1 => 2
11 111 => 5
010 0110 => 5
0010 111 => 5
00010 11011 => 6
01010 10101 => 5
1001 100001 => 6
1110001100001 1100100101 => 14
001101010000101 100010110000 => 16
0010110111100 001011010101001000000 => 21
0010110111100 001011010101001001100 => 28
100010100100111101 11100101100010100100000001 => 27
0010 10111 => 5
0100 10111 => 5
0010 11101 => 5
0100 11101 => 5
10111 0010 => 5
10111 0100 => 5
11101 0010 => 5
11101 0100 => 5
Это код гольф, поэтому выигрывает самый короткий вход.
Ответы:
Pyth,
3735343231 байтВводит новую строку отдельно.
Демонстрация , Испытательный жгут .
Объяснение:
На высоком уровне для каждой комбинации обычных и обращенных строк мы сдвигаем вторую строку влево на заданное количество позиций и проверяем совпадения с первой строкой. Это повторяется до тех пор, пока не будет найдена величина смены без наложений. Эта величина сдвига добавляется к первой длине строки, а результат сравнивается со второй длиной строки. Более высокое значение печатается.
источник
Пип ,
727048 байтПринимает две строки в качестве аргументов командной строки. Отформатировано, с комментариями:
Мы рассчитываем только перекрытия, когда нижняя часть выступает влево, поэтому мы должны попробовать ее с перевернутыми верхней и нижней частями. Каждый раз, когда в сумме нет 2-х по внутренней петле, это подходит; затем мы добавляем еще один ноль в конец нижней части и пытаемся снова.
Чтобы найти общую ширину, мы разбиваем элементы
p
на списки символов и суммы. Поэтапные операции над списками неравной длины сохраняют длину более длинных, поэтому длина этой суммы - именно то, что нам нужно. (Разделение необходимо, потому что простое суммирование в виде чисел исключит начальные нули:,$+[0101 10] = 111
но$+^[0101 10] = [0 1 1 1]
.)источник
Ruby 127
130Это оказалось так долго ... :(
Тесты: http://ideone.com/te8XWk
Читаемый Рубин:
источник
[[m,n],[m,n.reverse],[n,m],[n,m.reverse]]
Часть может быть неправильной. (Я не уверен, но я сделал аналогичную ошибку.)[n.reverse,m]
вместо,[n,m.reverse]
но я не знаю Руби.'0010110111100', '001011010101001001100'
говорящий Ожидаемый: 28, Фактический: 30 . Все остальные тесты проходят. Итак, вы проделали хорошую работу по тестированию угловых случаев. :)JavaScript ( ES6 ) 160
Не могу сделать короче ...
источник