Введение
Я хочу построить лестницу. Для этого я вычистил из свалки две длинные доски с отверстиями в них, и я хочу поместить ступени в эти отверстия. Тем не менее, отверстия расположены неравномерно, поэтому шаги будут немного шаткими, и мне сложно оценить количество необходимого для них стержня. Твоя работа - делать расчеты за меня.
вход
Ваш ввод состоит из двух битовых векторов, представленных в виде массивов целых чисел, которые представляют две платы. A 0
представляет сегмент одного aud ( произвольная единица расстояния ) без отверстия, а a 1
представляет сегмент одного aud с одним отверстием. Массивы могут быть разной длины и содержать разное число 1
s, но они не будут пустыми.
Я построю свою лестницу следующим образом. Сначала я размещаю две доски ровно на одной стороне и выравниваю их левые концы. Для каждого индекса i
я измеряю расстояние между i
отверстием первой доски и i
отверстием второй доски, режу кусок стержня и прикрепляю его между двумя отверстиями. Я останавливаюсь, когда у меня кончаются дыры в одной из досок.
Выход
Ваш вывод - это общее количество стержня, которое мне понадобится для шагов, измеренное в ауд. Вывод должен быть не менее шести значащих цифр.
пример
Рассмотрим входы [0,1,1,0,1,1,1,1,0,0]
и [1,0,0,1,1,1,0,0,1]
. Результирующая лестница выглядит так:
Общая длина стержня в этой лестнице составляет 7.06449510224598
ауд.
правила
Вы можете написать либо функцию, либо полную программу. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.
Тестовые случаи
[0] [0] -> 0.0
[0] [1,0] -> 0.0
[1,0,0] [1,1,1,1,1] -> 1.0
[0,1,0,1] [1,0,0,1] -> 2.414213562373095
[0,1,1,0,1,1,1,1,0,0] [1,0,0,1,1,1,0,0,1] -> 7.06449510224598
[1,1,1,1,1] [0,0,1,1,0,1,0,0,1] -> 12.733433128760744
[0,0,0,1,0,1,1,0,0,0,1,1,1,0,0,1,0,1,1,0,0,0,1,0] [0,0,1,1,0,1,1,1,0,0,0,0,0,1,1,0,1,1,0,0,0,1] -> 20.38177416534678
Ответы:
J, 20 байт
Он использует трюк в ответ MickyT в R .
(<0 1)|:
дает диагональ матрицы. Для объяснения других частей, см . Ответ FUZxxl .источник
J, 22 символа
Не вдохновлен ответ Рандомера.
I.
Часть равна , как это сразу же очевидный способ нахождения отверстий.I. y
- все показателиy
повторяются так часто, как соответствующий пунктy
. Между прочим, еслиy
это вектор логических значений,I. y
содержит индексы, на которыхy
есть1
. Например,I. 1 0 0 1 1 1 0 0 1
урожайность0 3 4 5 8
.x u&v y
- так же, как(v x) u (v y)
. Применим какx u&I. y
, мы получим(I. x) u (I. y)
. Давайте продолжим с преобразованным вводом.x <.&# y
- меньшая из длинx
иy
.x -/@,: y
- разница предметовx
иy
. Если один вектор длиннее, он дополняется нулями.x $ y
-y
преобразован в форму, указаннуюx
. В частности, еслиx
это скаляр,x
элементы взяты изy
. В этом случаеx (<.&# $ -/@,:) y
убедитесь, что замыкающие отверстия игнорируются.4 o. y
- функция%: 1 + *: y
, то есть sqrt (1 + y² ). Кстати, эта функция отображает расстояние от отверстия до длины стержней.+/ y
- сумма элементовy
.источник
Python, 85
Это оказалось похоже на решение Mac . Преобразуйте списки 0 и 1 в упорядоченные списки одноиндексных, а затем суммируйте расстояние между соответствующими элементами.
источник
J,
3228 байтГлагол
I.
возвращает позиции1
s в двоичной строке, что очень помогает.Для лучшего решения J проверьте ответ FUZxxl .
источник
Р, 67
Использует внешний, чтобы сделать разницу для индексированных отверстий. Diag возвращает необходимые различия. Затем сложите рассчитанные расстояния
Тестовый прогон в R Fiddle. Я завернул его в печать, чтобы показать, что возврат соответствует спецификации.
источник
a==1
может бытьa>0
или!!a
.Haskell,
7773 байтаИспользование:
[0,1,0,1] # [1,0,0,1]
какие выводы2.414213562373095
Как это работает: функция
r
возвращает список позиций отверстий на доске, напримерr [0,1,0,1]
->[2,4]
.#
сжатие двух из этих списков и превращение его в список расстояний между соответствующими отверстиями и, наконец, суммирование.источник
CJam,
3633 байтаОчень наивный подход ... он ожидает ввода в виде массивов в стиле CJam на STDIN
Вот тестовая схема для всех входов примера. Результаты в поле ввода используются до вызова фактического кода. Вы можете удалить их, если не доверяете мне. ;)
объяснение
источник
Питон, 86
Низкоуровневое и наивное рекурсивное решение без поиска по списку.
Входные списки
a
иb
. Если один из них пуст, вернитесь0
.Иначе, пусть
x
иy
будут их первыми элементами (код на самом деле не присваивает их, потому что вы не можете делать присваивания в alambda
, но это облегчит объяснение). Если оба равны 1, т.е. их произведение равно 1, то они вносят вклад в расстояние между стержнями. Мы отслеживаем расстояние в комплексном числеi
, так что расстояние является абсолютным значением. На самом деле, мы вычисляем это независимо, а затем умножаем наx*y
.Затем мы возвращаемся. Идея состоит в том, чтобы сдвинуть оба списка на один шаг, если только один список не начинается с 0, а другой - с одного, и в этом случае мы сдвигаем только список 0. Таким образом, 1 всегда потребляются в парах. Мы могли бы проверить эти условия с помощью
x<y
иy<x
, но короче использовать сравнение списка какa[:1]<=b
. Наконец, мы корректируем сложное смещение между текущими элементами с помощьюx-y
.источник
a>[]<b
наa>0<b
. Это работает, поскольку оба[]
и0
ложные, поэтому они эквивалентны.a:
?([] > []) != ([] > 0)
а в python3 это ошибка (неупорядоченные типы).a:
Является частью среза[b[:1]<=a:]
.Python,
105102100 байтДовольно простой, просто конвертирует входные списки в списки индексов отверстий, а затем вычисляет расстояние между каждой парой таких индексов.
Прецедент:
Благодарим @FryAmTheEggman за несколько предложений по экономии байтов. Оказывается, это может быть продолжено, как показано в ответе xnor .
источник
enumerate(l)
и0.5
(которые могут быть только .5).l=lambda*a:sum(((a-b)**2+1)**.5for a,b in zip(*map(i,a)))
Pyth, 30 байт
Попробуйте онлайн с вводом
[0,1,1,0,1,1,1,1,0,0], [1,0,0,1,1,1,0,0,1]
.Объяснение:
Я конвертировать списки в списки индексов
[2, 3, 5, 6, 7, 8]
и[1, 4, 5, 6, 9]
и пронестись их вместе[(2,1), (3,4), (5,5), (6,6), (7,9)]
. Затем я вычитаю значения, возводю их в квадрат, добавляю 1 и суммирую по всем квадратным корням.Позор,
sum
который не работает для пустых списков.источник
Python,
116115 байтЭто рекурсивное решение.
Это стало довольно раздражающим, когда я обнаружил, что
index()
просто выдает ошибку, когда значение не найдено, но я заставил его работать. К сожалению, я не могу использовать лямбду. Меня также раздражало, чтоlist.remove()
список не возвращается, а возвращаетсяNone
.Запустите онлайн здесь: http://repl.it/c5L/2
источник
Клип 3 ,
55 4738Для списка с меньшим количеством отверстий программа проходит через него и соединяет каждое отверстие с соответствующим отверстием другого списка. Размеры рассчитываются и суммируются.
объяснение
Если мы очень либерально относимся к формату ввода, мы можем уменьшить его до 36 байтов, удалив каждый
k
. Это требует ввода быть строка символов управляющих символов\0
и\1
.источник
ECMAScript 6, 86 байт
Первоначально это было начато с использованием Reduce (я хотел посмотреть, можно ли это сделать за один цикл, а не на @ edc65).
Но используя @ edc65 для
map
и&&t
для возврата значения, я смог немного его укоротить.источник
reduce
имеет больше смысла семантически, но в остальном это довольно неудобно в использовании. Конечно, с каких это пор гольфисты беспокоятся о семантике.Ява, 151
Это просто ходит в
a
поисках, а затем идет,b
когда находит. Еслиfloat
точность приемлема, я могу сэкономить пару байтов, но я согласился сdouble
результатами теста.С пробелами:
источник
JavaScript (ES6) 108
Основным моментом является функция f, которая отображает входные массивы 0..1 в массивах позиций отверстий. Затем массивы сканируют, вычисляя общую длину стержней, используя теорему Пифагора.
|0
Ближе к концу необходим для преобразования NaNs , которые могут возникнуть в результате , когда массив драйвера (первый) больше , чем второй.Тест в консоли Firefox / FireBug
источник
Октава,
605942источник
Perl 98
Удобочитаемый:
Тестирование:
источник
APL,
3528 байтИспользует алгоритм, аналогичный J-решению, но APL имеет меньше встроенных функций.
Пример ввода:
источник