Напишите программу или функцию, которая принимает непустой список натуральных чисел. Вы можете предположить, что это ввод в разумном удобном формате, таком как "1 2 3 4"
или [1, 2, 3, 4]
.
Числа в списке ввода представляют срезы полной круговой диаграммы, где каждый размер среза пропорционален соответствующему номеру, а все срезы расположены вокруг диаграммы в указанном порядке.
Например, пирог для 1 2 3 4
это:
Вопрос, на который должен ответить ваш код: является ли круговая диаграмма пополам ? То есть существует ли когда-нибудь идеально прямая линия от одной стороны круга к другой, симметрично разделив ее на две части?
Вам нужно вывести истинное значение, если есть хотя бы один биссектрису, и вывести ложное значение, если их нет .
В 1 2 3 4
примере есть бисекция между 4 1
и 2 3
поэтому выходом будет truthy.
Но для ввода 1 2 3 4 5
нет биссектрисы, поэтому результат будет ложным:
Дополнительные примеры
Расположение чисел по-разному может удалить биссектрисы.
например 2 1 3 4
→ ложь:
Если во входном списке только одно число, круг не разделен пополам.
например 10
→ ложь:
Там может быть несколько биссектрисы. Пока их больше нуля, вывод правдив.
например, 6 6 12 12 12 11 1 12
→ правдивый: (здесь есть 3 биссектрисы)
Бисекции могут существовать, даже если они не являются визуально очевидными.
например 1000000 1000001
→ ложь:
например, 1000000 1000001 1
→ правдиво:
(Спасибо nces.ed.gov за создание круговых диаграмм.)
Тестовые случаи
Truthy
1 2 3 4
6 6 12 12 12 11 1 12
1000000 1000001 1
1 2 3
1 1
42 42
1 17 9 13 2 7 3
3 1 2
10 20 10
Falsy
1 2 3 4 5
2 1 3 4
10
1000000 1000001
1
1 2
3 1 1
1 2 1 2 1 2
10 20 10 1
счет
Самый короткий код в байтах побеждает. Tiebreaker - более ранний ответ.
источник
Ответы:
J, 18 байт
5 байтов благодаря Денису.
@HelkaHomba : Нет.
использование
Ungolfed
Предыдущая 23-байтовая версия:
использование
Ungolfed
объяснение
Сумма всех подстрок рассчитывается по black_magic.
+/\
Вычисления частичных сумм.Например,
a b c d
становитсяa a+b a+b+c a+b+c+d
.-/~
Затем создает таблицу вычитания , основанный на входе, так чтоx y z
становится:Применительно к
a a+b a+b+c a+b+c+d
результат будет:Это вычислило суммы всех подстрок, которые не содержат
a
.Это гарантирует, что этого будет достаточно, так как, если один бисек содержит
a
, другой бисек не будет содержать,a
а также не будет обернуть вокруг.источник
+/e.&,2*+/\\.
Желе ,
98 байтВернуть непустой список (правда) или пустой список (ложь). Попробуйте онлайн! или проверьте все контрольные примеры .
Как это работает
источник
Юлия,
343029 байтСпасибо @GlenO за отыгрывание 1 байта!
Попробуйте онлайн!
Как это работает
После сохранения накопленной суммы 2x в x мы вычитаем вектор строки x ' из вектора столбца x , получая матрицу всех возможных различий. По сути, это вычисляет суммы всех смежных подмассивов x, которые не содержат первое значение, их негативы и 0 в диагонали.
Наконец, мы проверяем, принадлежит ли сумма исходного массива x к сгенерированной матрице. Если это так, то сумма, по крайней мере, одного из соседних подсписков равна ровно половине суммы всего списка, что означает, что есть, по крайней мере, один биссектрис.
источник
Python 2, 64 байта
Рекурсивно пытается удалить элементы с начала или до конца, пока сумма того, что остается, равна сумме того, что было удалено, и сохранено
s
. Занимает экспоненциальное время в длине списка.Деннис сохранил 3 байта с
pop
.источник
f=lambda l,s=0:l and(sum(l)==s)*l+f(l[1:],s+l[0])+f(l,s+l.pop())
Haskell, 41 байт
Идея состоит в том, чтобы проверить, существует ли подсписок,
l
чья сумма равнаsum l/2
. Мы генерируем суммы этих подсписков какscanr(:)[]l>>=scanl(+)0
. Давайте посмотрим, как это работает сl=[1,2,3]
Старые 43 байта:
Формирует список
c
кумулятивных сумм. Затем проверяет, отличаются ли любые две из этих суммsum l/2
, проверяя, является ли это элементом списка различий(-)<$>c<*>c
.источник
Pyth,
109 байтовПроверьте это в компиляторе Pyth .
Как это работает
источник
На самом деле, 21 байт
Попробуйте онлайн!
Эта программа распечатывает
0
для ложных случаев и положительное целое для истинных случаев.Объяснение:
Неконкурентная версия, 10 байт
Попробуйте онлайн!
Эта программа выводит пустой список для ложных случаев и непустой список в противном случае. Это по сути порт Дениса Желе ответ . Это не конкурирует, потому что накопленная сумма и векторизованная разность функционируют позже проблемы.
Объяснение:
источник
Python 2,
76747066 байтСпасибо @xnor за
48 байтов!Проверьте это на Ideone . (большие тестовые случаи исключены)
источник
n=sum(x)
чтобы сделатьn in ...
; не больно использовать большее значение дляn
.MATL , 10 байт
На выходе получается количество биссектрис.
Попробуйте онлайн!
объяснение
Тот же подход, что и у Дениса Джулии .
источник
Рубин,
6053 байтаСоздает все возможные разбиения, беря каждый оборот входного массива, а затем беря все срезы длиной 1 ..
n
, гдеn
размер входного массива. Затем проверяет, существует ли какой-либо раздел с суммой, равной половине общей суммы входного массива.источник
JavaScript (ES6), 83 байта
Генерирует все возможные суммы, затем проверяет, появляется ли половина последней суммы (которая является суммой всего списка) в списке. (Генерация сумм в несколько неудобном порядке, чтобы определить сумму, которую я должен был сделать в последний раз, экономит 4 байта.)
источник
Дьялог АПЛ, 12 байт
Проверьте это с TryAPL .
Как это работает
источник
Python 2 , 47 байт
Попробуйте онлайн!
Я вернулся через 2,75 года, чтобы победить мое старое решение более чем на 25%, используя новый метод.
Эта 1-байтовая более длинная версия немного понятнее.
Попробуйте онлайн!
Идея состоит в том, чтобы сохранить набор накопленных сумм в
t
виде битовk
, установив бит,2*t
чтобы указать, чтоt
это накопительная сумма. Затем мы проверяем, отличаются ли какие-либо две кумулятивные суммы на половину суммы списка (окончательнойt
), сдвигая битыk
так сильно и выполняя битовую обработку&
с оригиналом, чтобы увидеть результат, отличный от нуля (истинный).источник
APL, 25 символов
Предполагая, что список дан вX ← 1 2 3 4
.Объяснение:
Сначала обратите внимание, что APL оценивает форму справа налево. Затем:
X←⎕
принимает пользовательский ввод и сохраняет его вX
⍴X
дает длинуX
⍳⍴X
цифры от 1 до⍴X
⍺
И⍵
в{2×+/⍺↑⍵↓X,X}
левый и правый аргумент диадического функции мы определяем в фигурных скобках.⍺↑⍵↓X,X
части:X,X
просто соединяем X с собой;↑
и↓
взять и бросить.+/
уменьшает / сгибает+
список справаИтак
2 {2×+/⍺↑⍵↓X,X} 1
=2×+/2↑1↓X,X
=2×+/2↑1↓1 2 3 4 1 2 3 4
==
2×+/2↑2 3 4 1 2 3 4
=2×+/2 3
=2×5
=10
.∘.brace⍨idx
это простоidx ∘.brace idx
. (⍨
это диагональная карта;∘.
является внешним произведением)Таким образом , это дает нам
⍴X
на⍴X
матрицу , которая содержит в два раза больше суммы всех подключенных подсписков.Последнее, что нам нужно сделать, это проверить, находится ли сумма
X
где-то внутри этой матрицы.(+/X)∊matrix
.источник
Брахилог , 6 байт
Попробуйте онлайн!
Выводится через успех или неудачу, печать
true.
илиfalse.
запуск в качестве программы.источник
C
161145129 байтUngolfed попробуйте онлайн
источник
i<n;i++
наi++<n
(хотя вам, возможно, придется иметь дело с некоторыми смещениями.Haskell, 68 байт
Функция
f
сначала создает список сумм всех возможных срезов данного списка. Затем он сравнивается с общей суммой элементов списка. Если мы получим в какой-то момент половину общей суммы, то мы знаем, что у нас есть пополам. Я также использую тот факт, что если выtake
илиdrop
больше элементов, чем есть в списке, Haskell не выдает ошибку.источник
Mathematica, 48 байтов
Анонимная функция, похожая в действии на многочисленные другие ответы.
Outer[Plus, #, -#]
при действииAccumulate@#
(которое, в свою очередь, воздействует на входной список, давая список последовательных итогов) генерирует по существу ту же таблицу, что и в нижней части ответа Лаки Нун.!FreeQ[..., Last@#/2]
проверяет, если(Last@#)/2
является не отсутствуют в результирующей таблице, иLast@#
является последним из последовательных сумм, то есть сумма всех элементов списка ввода.Если этот ответ несколько интересен, то это не из-за нового алгоритма, а скорее о хитростях, характерных для Mathematica; Например,
!FreeQ
это хорошо, по сравнению с темMemberQ
, что он не требует уплощения проверяемой таблицы и сохраняет байт.источник
!FreeQ[2Tr/@Subsequences@#,Tr@#]&
должно работать, но у меня не будет 10.4 для тестирования в течение следующих 10 дней или около того.APL (NARS), символы 95, байты 190
Рассмотрим один массив ввода из 4 элементов: 1 2 3 4. Как мы можем выбрать полезный для этого упражнения раздел этого набора? После того, как некоторые считают, что разделение этих четырех элементов, которые мы можем использовать, описывается двоичным числом слева:
(1001 или 1011 ecc может быть в этом наборе, но у нас уже есть 0110 и 0100 ecc), поэтому одна шляпа просто написать одну функцию, которая из числа элементов входного массива строит эти двоичные числа ... это будет:
что из ввода 1 2 4 8 [2 ^ 0..lenBytesArgument-1] найдите 3 6 12, 7 14, 15; поэтому найдите двоичные числа из этих чисел и, используя их, найдите правильные разделы входного массива ... Я протестировал функцию c только для этих входных 4 элементов, но, похоже, это нормально для другого числа элементов ...
тест:
источник