Фон
Королевский нидерландский метеорологический институт определяет волну жары * как серию не менее 5 последовательных дней с погодой ≥25 ° C («летняя погода»), так что по крайней мере 3 из этих дней составляют ≥30 ° C («тропическая погода») ).
Тропическая погода не должна измеряться последовательно: например, 30, 25, 30, 26, 27, 28, 32, 30
это 8-дневная волна тепла с 4 днями тропической погоды.
* (Ну, по голландским меркам.)
Вызов
Учитывая непустой список натуральных чисел, представляющих измерения температуры по Цельсию за последующие дни, решите, содержит ли этот список волну тепла (согласно приведенному выше определению).
Самый короткий ответ в байтах побеждает.
Контрольные примеры
Falsey:
[30]
[29, 29, 29, 47, 30]
[31, 29, 29, 28, 24, 23, 29, 29, 26, 27, 33, 20, 26, 26, 20, 30]
[23, 31, 29, 26, 30, 24, 29, 29, 25, 27, 24, 28, 22, 20, 34, 22, 32, 24, 33]
[23, 24, 25, 20, 24, 34, 28, 32, 22, 20, 24]
[24, 28, 21, 34, 34, 25, 24, 33, 23, 20, 32, 26, 29, 29, 25, 20, 30, 24, 23, 21, 27]
[26, 34, 21, 32, 32, 30, 32, 21, 34, 21, 34, 31, 23, 27, 26, 32]
[29, 24, 22, 27, 22, 25, 29, 26, 24, 24, 20, 25, 20, 20, 24, 20]
[23, 33, 22, 32, 30]
[28, 21, 22, 33, 22, 26, 30, 28, 26, 23, 31, 22, 31, 25, 27, 27, 25, 28]
[27, 23, 42, 23, 22, 28]
[25, 20, 30, 29, 32, 25, 22, 21, 31, 22, 23, 25, 22, 31, 23, 25, 33, 23]
Truthy:
[30, 29, 30, 29, 41]
[1, 1, 25, 30, 25, 30, 25, 25, 25, 25, 25, 25, 25, 25, 40, 1, 1]
[31, 34, 34, 20, 34, 28, 28, 23, 27, 31, 33, 34, 29, 24, 33, 32, 21, 34, 30, 21, 29, 22, 31, 23, 26, 32, 29, 32, 24, 27]
[26, 29, 22, 22, 31, 31, 27, 28, 32, 23, 33, 25, 31, 33, 34, 30, 23, 26, 21, 28, 32, 22, 30, 34, 26, 33, 20, 27, 33]
[20, 31, 20, 29, 29, 33, 34, 33, 20]
[25, 26, 34, 34, 41, 28, 32, 30, 34, 23, 26, 33, 30, 22, 30, 33, 24, 20, 27, 23, 30, 23, 34, 20, 23, 20, 33, 20, 28]
[34, 23, 31, 34, 34, 30, 29, 31, 29, 21, 25, 31, 30, 29, 29, 28, 21, 29, 33, 25, 24, 30]
[22, 31, 23, 23, 26, 21, 22, 20, 20, 28, 24, 28, 25, 31, 31, 26, 33, 31, 27, 29, 30, 30]
[26, 29, 25, 30, 32, 28, 26, 26, 33, 20, 21, 32, 28, 28, 20, 34, 34]
[34, 33, 29, 26, 34, 32, 27, 26, 22]
[30, 31, 23, 21, 30, 27, 32, 30, 34, 29, 21, 31, 31, 31, 32, 27, 30, 26, 21, 34, 29, 33, 24, 24, 32, 27, 32]
[25, 33, 33, 25, 24, 27, 34, 31, 29, 31, 27, 23]
Ответы:
C (gcc) ,
8875 байтовПопробуйте онлайн!
источник
h,e,a;t
- приятное прикосновение!Желе , 15 байт
Монадическая ссылка, принимающая список чисел, который возвращается,
1
если бы еще была обнаружена тепловая волна0
.Попробуйте онлайн! или посмотрите набор тестов .
Как?
Критерием является наличие серии из более чем четырех значений, больших или равных 25, из которых более двух должны быть больше или равных 30.
Если мы разделим на пять, то критериями станет наличие серии из более чем четырех значений, больших или равных пяти, из которых более двух должны быть больше или равны шести.
Если мы вычтем пять из этих значений, критерием станет наличие серии из более чем четырех значений, больших или равных нулю, из которых более двух должны быть больше или равны единице.
Если мы возьмем знак этих значений (получая -1, 0 или 1), критериями станет наличие серии из более чем четырех значений, не равных -1, из которых более двух должны быть равны одному.
Если мы добавим одно к этим значениям (получим 0, 1 или 2), критериями станет наличие серии из более чем четырех значений, не равных нулю, из которых более двух должны быть равны двум.
Произведение списка, содержащего любые нули, равно нулю, а произведение списка, содержащего более двух двойок (и остальных), больше четырех. Это означает, что критериями в этом скорректированном списке становится то, что минимум продукта и длина больше 4.
источник
Haskell ,
737271696766 байтСпасибо @flawr и @Laikoni за два байта каждый и @xnor за байт!
Попробуйте онлайн!
Равная длина:
Попробуйте онлайн!
источник
C (лязг) , 64 байта
Функция o () возвращает 1 для тепловой волны или 0 еще.
Спасибо магическому номеру 864, а также Удо Борковски и Матису за их идеи.
Как работает, если? Каждая последовательность чисел повторяется с операцией уменьшения, начинающейся с уменьшающего значения 1. Если число> = 25 видно, уменьшение умножается на 2. Если видно число> = 30, уменьшение умножается на 2 и на 3 = 6. Если видно, что число <25, уменьшение начинается снова с 1. Если уменьшение делится на 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3, то обнаруживается тепловая волна, и результат Операция по модулю 0, что приводит к уменьшению значения 0 и возвращаемому значению true.
Попробуйте онлайн!
источник
Python 3 , 79 байт
Попробуйте онлайн!
источник
APL (Dyalog Classic) ,
2120 байтПопробуйте онлайн!
использования
⎕io←1
25 30⍸x
0, если x <25, 1, если 25≤x <30, или 2 в противном случаемы вычисляем кумулятивные продукты из них, начиная (или эквивалентно: заканчивая) во всех возможных местах, отбрасываем первые 4 продукта и выявляем наличие продуктов ≥8 (что составляет 2 3 )
источник
Japt ,
1918 байтЯ надеюсь, что все обсуждения в комментариях были сделаны правильно.
Побрился на один байт благодаря Шегги .
Попробуйте онлайн!
источник
漢
будет 3 байта, но¨
это один байт. Используемые выше символы были выбраны для языка игры в гольф именно по той причине, что все они представляют собой один байт.PowerShell , 121 байт
Попробуйте онлайн! или проверить все контрольные примеры
PowerShell не имеет эквивалента a
.some
или.every
подобного, поэтому это происходит вручную.Мы принимаем входные данные
$a
как массив целых чисел. Установите в качестве вспомогательной переменной$b
пустую строку. Затем переберите все целые числа$a
. Внутри цикла, если целое число является-g
reaterthanore
qual25
, добавьте его в нашу потенциальную строку$b
, в противном случае поместите$b
в конвейер и установите его в пустую строку.Выйдя из цикла, объедините результаты массива с конвейером
$b
и поместите их вWhere-Object
предложение|?{...}
. Это вытягивает те строки, которые имеют длину элемента-ge5
(основанную на расщеплении по пробелам) и количество временных переменных больше, чем30
существующее-ge3
. Эти строки остаются в конвейере, поэтому истинное значение непусто (см. Ссылку «проверить все контрольные примеры» для определения истинности / ложности).источник
$args
вместоparam($a)
и$a
...{$a=-split$_;$a.count-ge5-and($a|?{$_-ge30}).count-ge3}
$args|%{if($_-ge25){$b+=$_}else{,$b;$b=@()}}-E{,$b}-B{,($b=@())}|?{$_.count-ge5-and($_|?{$_-ge30}).count-ge3}
какget-heatWave.ps1
. Тестовый скрипт regex101.com/r/lXdvIs/2$b=@();$args|%{if($_-ge25){$b+=$_}else{,$b;$b=@()}}-E{,$b}|?{$_.count-ge5-and($_|?{$_-ge30}).count-ge3}
-E
? Я не знаком с этим.Желе ,
1716 байтПопробуйте онлайн!
Как это устроено
источник
Python 2 , 86 байт
Попробуйте онлайн!
источник
JavaScript (ES6),
6351 байтВозвращает логическое значение.
Попробуйте онлайн!
источник
05AB1E , 20 байтов
Попробуйте онлайн!
объяснение
источник
Пакет, 119 байт
Принимает input как аргументы командной строки и выводит 1 для тепловой волны, иначе 0.
источник
Python , 67 байт
Попробуйте онлайн!
Тайм-аут на более длинных тестовых случаях из-за экспоненциального роста. Находит смежные подсписки, многократно прерывая первый или последний элемент. То, что 3 дня составляют ≥30 ° C, проверяется путем рассмотрения третьего по величине значения
sorted(l)[~2]
. Базовые случаи могут быть короче, если использовать в своих интересах правду / ложь или завершиться с ошибкой.источник
JavaScript (Node.js) , 48 байт
Попробуйте онлайн!
довольно плохой
источник
Haskell , 64 байта
Попробуйте онлайн!
источник
APL (Dyalog Unicode) , 29 байт
Попробуйте онлайн!
∨/
есть ли такие элементы, которые(5≤≢¨a)
5 <количество≢
дней в каждой серии (a
содержит все возможные серии дней)∧
а также3≤+/30≤
3 ≤ общая+/
количество элементов, которые ≥ 30 в↑a←
матрица, образованнаяe⊆⍨25≤e←⎕
серия последовательных элементов, которые ≥ 25источник
Котлин , 57 байт
(-1 байт, заменяя явный параметр v-> неявным параметром it )
(-16 байт с использованием операции any {}, как видно из решения Ruby от GB )
(-1 байт, спасибо Линн: заменил r> 0 && v <25 на r * 25> r * v)
Это лямбда-выражение принимает List и возвращает true для тепловой волны или false в противном случае.
Благодаря волшебному номеру 864 и Удо Борковски и Матису за их идеи.
Как работает, если? Каждая последовательность чисел повторяется с любой операцией {}, начинающейся с уменьшенного значения 1. Уменьшение умножается на 2 и умножается на 3 (2 * 3 = 6), если число больше или равно 30. Если число <25 видно, что уменьшение начинается снова с 1. Если уменьшение делится на 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3, то обнаруживается тепловая волна, и результат операции по модулю равен 0, что приводит к истинное возвращаемое значение во внутренней лямбде, вызванное операцией any {}, которая затем останавливает итерацию и возвращает значение true.
Попробуйте онлайн!
источник
Чудо , 34 байта
Пример использования:
объяснение
Подробная версия:
Возьмите перекрывающиеся последовательности из 5 последовательных элементов, затем проверьте, имеет ли любая из последовательностей все элементы> 25 и более 2 элементов> 30.
источник
Желе , 21 байт
Попробуйте онлайн!
источник
Stax , 23 байта
Запустите и отладьте его на staxlang.xyz!Это занимает много времени, поэтому я отключил автозапуск.
Распакованный (28 байт) и пояснения
Это напечатает все подмассивы, которые можно считать тепловыми волнами, которые будут ложными, если и только если их не будет.
источник
Рубин , 89 байт
Попробуйте онлайн!
источник
each_cons
подходом - попробуйте онлайн!Шелуха , 19 байт
Попробуйте онлайн!
Использование filter (
f
) на один байт короче, чем использование проверки с помощью логических и (&
) , также было бы очень хорошо избавиться от±
- стоящих 2 байта :(объяснение
источник
Сетчатка , 31 байт
Попробуйте онлайн!
источник
R ,
111 93 71 6766 байтПопробуйте онлайн!
Бесстыдный порт ответов Ролана Шмитца . -4 байта благодаря Роланду и -1 благодаря Джузеппе.
TIO ссылки на функциональную версию.
Предыдущая версия извлекала последовательные дни> 25, используя
rle
и сохраняя колоссальные 18 байтов благодаря Giuseppe!источник
F
вместоT
, вы можете сделать,F=F|"if"(cond,(expr),0)
а затем вернуться,F
чтобы сохранить 6-байтовые байты. У вас также есть пара ненужных круглых скобок,(1-z[i]):0
но я думаю, что это может быть в1-z[i]:1
любом случае, чтобы сохранить еще пару байтов ...function(x,z=rle(x>24)$l){for(i in 1:sum(z|1))F=F|z[i]>4&sum(x[sum(z[1:i])+1-z[i]:1]>29)>2;F}
но будьте осторожны , вставляя из PPCG в TIO , потому что иногда непечатная ползучесть ...Swift 4 , 50 байт
Попробуйте онлайн!
Выражение замыкания возвращает 0 для тепловой волны или> 0 в противном случае.
Создано в сотрудничестве с Роландом Шмитцем и Матисом.
Как работает, если? Каждая последовательность чисел повторяется с операцией уменьшения, начинающейся с уменьшающего значения 1. Если число> = 25 видно, уменьшение умножается на 2. Если видно число> = 30, уменьшение умножается на 2 и на 3 = 6. Если видно, что число <25, уменьшение начинается снова с 1. Если уменьшение делится на 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3, то обнаруживается тепловая волна, и результат Операция по модулю 0, что приводит к уменьшению значения 0. Только когда тепловая волна была обнаружена, уменьшение может стать 0. Когда значение уменьшения равно 0, оно будет 0 для всех будущих сокращений, т.е. также для конечного результата.
источник
Python 2 ,
6663 байтаПопробуйте онлайн!
-3 байта благодаря Линн
Как работает, если? Каждая последовательность чисел повторяется с операцией уменьшения, начинающейся с уменьшающего значения 1. Если число> = 25 видно, уменьшение умножается на 2. Если видно число> = 30, уменьшение умножается на 2 и на 3 = 6. Если видно, что число <25, уменьшение начинается снова с 1. Если уменьшение делится на 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3, то обнаруживается тепловая волна, и результат Операция по модулю 0, что приводит к уменьшению значения 0. Только когда тепловая волна была обнаружена, уменьшение может стать 0. Когда значение уменьшения равно 0, оно будет 0 для всех будущих сокращений, т.е. также для конечного результата.
Более читаемая, но более длинная версия выглядит так:
Удаление лишних пробелов / скобок и замена
x if cond else y
на(y,x)[cond]
даетЛинн предложила сократить условие
b>0and c<25
:b>0and c<25
->b*25>0 and b*c<b*25
->b*25>0 and b*25>b*c
->b*25>b*c
в результате чего
источник
functools
, это встроенный в Python 2 !b*25>b*c
и сохранить 3 байта; это может относиться ко многим решениям, использующим этот подход на разных языках :)Pyth, 23 байта
Попробуй здесь
источник
Befunge-98 , 61 байт
Попробуйте онлайн!
источник
Perl 6 ,
5452 байтаПопробуйте онлайн!
источник