Вступление:
(Источник: Википедия )
Когда мы смотрим на радугу, она всегда будет иметь цвета сверху вниз:
красный; апельсин; желтый; зеленый; синий; индиго; Фиолетовый
Если мы посмотрим на эти отдельные кольца, красное кольцо, конечно, больше, чем фиолетовое кольцо.
Кроме того, также возможно иметь две или даже три радуги одновременно.
Все это, вместе взятые, будет использовано в этой задаче:
Вызов:
Учитывая список целых чисел с точным размером 7, где каждое значение указывает цветовые частицы, доступные для формирования радуг (где наибольший индекс указывает на красный, а наименьший индекс указывает на фиолетовый), выведите количество радуг, которые могут быть сформированы.
Одна целочисленная радуга должна иметь как минимум 3 фиолетовых, 4 индийских, 5 синих, 6 зеленых, 7 желтых, 8 оранжевых, 9 красных. Вторая радуга на вершине будет даже больше, чем красное кольцо первой радуги (включая один пробел между ними), поэтому для нее потребуется как минимум 11x фиолетовая, 12x индиго, 13x синяя, 14x зеленая, 15x желтая, 16x оранжевая , 17x красный в дополнение к тому, что использует первая радуга. Третья радуга снова начнется с 19x фиолетового цвета.
Пример:
Input-list: [15,20,18,33,24,29,41]
Output:2
Почему? У нас есть 15x фиолетовый, и нам нужно по крайней мере 3 + 11 = 14 для двух радуг. У нас есть 20 индиго, и нам нужно по крайней мере 4 + 12 = 16 для двух радуг. И т.д. У нас достаточно цветов для двух радуг, но недостаточно, чтобы сформировать три радуги, так что получается 2
.
Правила вызова:
- Целые числа во входном массиве гарантированно будут неотрицательными (
>= 0
). - Входной список гарантированно будет иметь размер 7 точно.
- Когда радуги не образуются, мы выводим
0
. - Формат ввода и вывода является гибким. Может быть списком или массивом целых десятичных чисел, может быть взят из STDIN. Вывод может быть возвратом из функции в любом приемлемом типе вывода или распечатываться непосредственно в STDOUT.
Минимальное количество цветов, необходимое для n
количества радуг:
Amount of Rainbows Minimum amount per color
0 [0,0,0,0,0,0,0]
1 [3,4,5,6,7,8,9]
2 [14,16,18,20,22,24,26]
3 [33,36,39,42,45,48,51]
4 [60,64,68,72,76,80,84]
5 [95,100,105,110,115,120,125]
etc...
Основные правила:
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте найти как можно более короткий ответ для «любого» языка программирования. - К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
- По умолчанию лазейки запрещены.
- Если возможно, добавьте ссылку с тестом для вашего кода.
- Кроме того, добавление объяснения для вашего ответа настоятельно рекомендуется.
Тестовые случаи:
Input: [15,20,18,33,24,29,41]
Output: 2
Input: [3,4,5,6,7,8,9]
Output: 1
Input: [9,8,7,6,5,4,3]
Output: 0
Input: [100,100,100,100,100,100,100]
Output: 4
Input: [53,58,90,42,111,57,66]
Output: 3
Input: [0,0,0,0,0,0,0]
Output: 0
Input: [95,100,105,110,115,120,125]
Output: 5
Input: [39525,41278,39333,44444,39502,39599,39699]
Output: 98
0,0,0,0,0,0,0
Край случай , хотя :( (это не вяжется с логикой 1-разрыва)Ответы:
Pyth , 14 байт
Тестирование!
Как?
Algortihm
Прежде всего, давайте выведем формулу, на которой основан этот ответ. Давайте назовем функцию, которая дает необходимое количество цветных частиц , где - количество слоев, а - индекс цвета на основе 0. Во-первых, отметим, что только для слоя (где индексируется 1, в данном случае) нам нужны цветных частиц , Имея это в виду, мы суммируем результаты каждого для каждого слоя :С( п , я ) N я Nго N L ( n , i ) = i + 3 + 8 ( n - 1 ) L ( k , i ) К
Поэтому теперь мы знаем, что максимальное число возможных слоев, называемое его , должно удовлетворять неравенству , где - входного списка.k C(k,i)≤Ii Ii ith
Реализация
Это реализует функцию и iterates ( ) по списку ввода, где - индекс (на основе 0), а - элемент. Для каждого значения программа ищет первое положительное целое число для которого (логическое отрицание , условие, которое мы вывели ранее), затем находит минимальный результат и уменьшает это. Таким образом, вместо того , чтобы искать для целого числа , что делает удовлетворяет условие, мы ищем самое низкое , что не и вычитать один из него , чтобы компенсировать смещение 1.k b T b < C ( T , i ) C ( T , i ) ≤ bC k b T b<C(T,i) C(T,i)≤b
.e
источник
Python 2 ,
6461 байтПопробуйте онлайн!
Каждый цвет радуги использует
(3+i)+n*8
для слояn
и цветаi
(0 = фиолетовый и т. Д.)Общее для й слоев, следовательно:
(3*i)*x + 8*x*(x+1)
.Мы просто решаем для n и принимаем минимальное значение.
Добавлено:
источник
05AB1E ,
181716 байтов-1 байт благодаря волшебной урне осьминога
Попробуйте онлайн!
Количество цветов, необходимых для n радуг, равно n (4n + [-1, 0, 1, 2, 3, 4, 5]) .
источник
[ND4*6Ý<+*¹›1å#N
работает, но я не знаю почему. Хотя -1 байт.N>
хотя - потому что ты имел¾>
прежде.JavaScript (ES6), 49 байт
Попробуйте онлайн!
Как?
Число цветных частиц, необходимое для создания раз цвета: n kP(n,k) n k
Мы рекурсивно пробуем все значения пока хотя бы одна запись во входном массиве не станет меньше .v k P ( n , k )n vk P(n,k)
Но для целей игры в гольф мы начинаем с
n === undefined
и используем отрицательные значенияn
впоследствии. Первая итерация всегда успешна, потому что правая часть неравенства оценивается какNaN
. Поэтому первый значимый тест - это второй сn == -1
.источник
Желе , 18 байт
Попробуйте онлайн!
Использует объяснение в ответе 05x1E от Okx.
источник
Excel VBA, 78 байт
Анонимная функция, которая принимает данные из диапазона
[A1:G1]
и выводит их в непосредственное окно VBE.источник
Древесный уголь , 21 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение: Непосредственно вычисляет число возможных радуг с каждым цветом по формуле I, полученной независимо, но оказывается такой же, как формула @ TField.
источник
JavaScript (Node.js) , 54 байта
Порт ответа @TFeld
Попробуйте онлайн!
источник
Желе , 14 байт
Это было сложно!
Монадическая ссылка, принимающая список из семи целых чисел, который дает целое число, количество возможных радуг.
Попробуйте онлайн! Или посмотрите набор тестов .
Как?
К сожалению, любой наивный метод, кажется, занимает 16 байтов, один такой метод
Ṃɓ_J×¥H÷‘H<¬Ȧð€S
, однако оказывается, что используемый здесь метод гораздо эффективнее и короче!Этот метод создает более чем достаточно стеков радуги в виде количества частиц, включая ультрафиолетовые полосы , и добавляет 1 для каждого стека, что возможно.
Проверка на то, что это возможно, состоит в том, чтобы проверить, что существует только одна полоса, НЕ возможная, учитывая, что нам нужны частицы ультрафиолетовой полосы, но были предоставлены ноль.
источник
§ỊS
!05AB1E , 14 байтов
Попробуйте онлайн!
Алгоритм Pyth th 05AB1E алгоритм
Есть много методов, которые можно попробовать решить в 05AB1E, поэтому я попробовал пару из них, и это оказалось самым коротким. Адаптируя вышеупомянутую формулу из моего ответа Pyth, помня, что 05AB1E использовал 1-индексирование, мы можем построить нашу функцию следующим образом:
Обратите внимание, что это равенство не является точным (но я в настоящее время не знаю, как это сформулировать более формально), и что решения этого уравнения будут давать числа с плавающей запятой, но мы исправляем это, используя деление по полу, а не точное деление позже. В любом случае, чтобы продолжить наш аргумент, большинство из вас, вероятно, очень хорошо знакомы с решениями такого уравнения , поэтому здесь у нас это есть:
Это именно то отношение, которое реализует этот ответ.
источник
C ++,
127125 байтСкинул 2 байта благодаря Кевину Круйссену.
Попробуйте онлайн!
Функция принимает массив в стиле C из семи int и возвращает int.
Объяснение:
источник
for(int c=0;c<7;c++){int q=c-1;q=(std::sqrt(q*q+16*x[c])-q)/8;o=o>q?q:o;}
к этому:for(int c=0,q;c<7;c++,o=o>q?q:o)q=(std::sqrt(--c*c-c+16*x[++c]))/8;
. Кроме того, не могли бы вы предоставить TIO-ссылку с тестовым кодом?