Antecedentes
El Instituto Meteorológico Real de los Países Bajos define una ola de calor * como una serie de al menos 5 días consecutivos de clima ≥25 ° C ("clima veraniego"), de modo que al menos 3 de esos días son ≥30 ° C ("clima tropical" )
El clima tropical no tiene que medirse consecutivamente: por ejemplo: 30, 25, 30, 26, 27, 28, 32, 30
es una ola de calor de 8 días de duración con 4 días de clima tropical.
* (Bueno, para los estándares holandeses).
Desafío
Dada una lista no vacía de enteros positivos que representan mediciones de temperatura Celsius de días sucesivos, decida si esa lista contiene una ola de calor (según la definición anterior).
La respuesta más corta en bytes gana.
Casos de prueba
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]
Verdad:
[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]
Respuestas:
C (gcc) ,
8875 bytesPruébalo en línea!
fuente
h,e,a;t
- ¡buen toque!Jalea , 15 bytes
Un enlace monádico que acepta una lista de números que regresa
1
si se detecta una ola de calor más0
.Pruébalo en línea! o ver el conjunto de pruebas .
¿Cómo?
El criterio es la existencia de una serie de más de cuatro valores mayores o iguales a 25, de los cuales más de dos deben ser mayores o iguales a 30.
Si dividimos entre cinco, el criterio se convierte en la existencia de una serie de más de cuatro valores mayores o iguales a cinco, de los cuales más de dos deben ser mayores o iguales a seis.
Si restamos cinco de estos valores, el criterio se convierte en la existencia de una serie de más de cuatro valores mayores o iguales a cero, de los cuales más de dos deben ser mayores o iguales a uno.
Si tomamos el signo de estos valores (obteniendo -1, 0 o 1) el criterio se convierte en la existencia de una serie de más de cuatro valores no iguales a -1, de los cuales más de dos deben ser iguales a uno.
Si agregamos uno a estos valores (obteniendo 0, 1 o 2), el criterio se convierte en la existencia de una serie de más de cuatro valores no iguales a cero, de los cuales más de dos deben ser iguales a dos.
El producto de una lista que contiene ceros es cero y el producto de una lista que contiene más de dos dos (y el resto son unos) es más de cuatro. Esto significa que el criterio en esta lista ajustada se convierte en que el mínimo del producto y la longitud es mayor que 4.
fuente
Haskell ,
737271696766 bytes¡Gracias a @flawr y @Laikoni por dos bytes cada uno y a @xnor por un byte!
Pruébalo en línea!
Misma longitud:
Pruébalo en línea!
fuente
C (clang) , 64 bytes
La función o () devuelve 1 para una ola de calor o 0 más.
Gracias al número mágico 864 y a Udo Borkowski y Mathis por sus ideas.
¿Cómo funciona si funciona? Cada secuencia de números se repite con una operación de reducción que comienza en el valor de reducción 1. Si se ve un número> = 25, la reducción se multiplica por 2. Si se ve un número> = 30, la reducción se multiplica por 2 y por 3 = 6. Si se ve un número <25, la reducción comienza nuevamente en 1. Si la reducción es divisible por 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3, se encuentra una ola de calor y el resultado de la reducción la operación del módulo es 0, lo que da como resultado un valor reducido de 0 y un valor de retorno de verdadero.
Pruébalo en línea!
fuente
Python 3 , 79 bytes
Pruébalo en línea!
fuente
APL (Dyalog Classic) ,
2120 bytesPruébalo en línea!
usos
⎕io←1
25 30⍸x
es 0 si x <25, 1 si 25≤x <30, o 2 de lo contrariocalculamos los productos acumulativos de estos a partir de (o de manera equivalente: terminando en) todas las ubicaciones posibles, descartamos los primeros 4 productos y detectamos la presencia de productos ≥8 (que es 2 3 )
fuente
Japt ,
1918 bytesEspero haber entendido todas las discusiones en los comentarios correctamente.
Afeitado un byte gracias a Shaggy .
Pruébalo en línea!
fuente
漢
serían 3 bytes, pero¨
es un byte. Los símbolos utilizados anteriormente se han elegido para el idioma de golf exactamente por el hecho de que todos son de un solo byte.PowerShell , 121 bytes
Pruébalo en línea! o Verificar todos los casos de prueba
PowerShell no tiene el equivalente de
.some
ao.every
o similar, por lo que se enrolla a mano.Tomamos la entrada
$a
como una matriz de enteros. Establezca la variable auxiliar$b
en la cadena vacía. Luego, recorra cada número entero$a
. Dentro del bucle, si el entero es-g
reaterthanore
qual a25
, añadirlo a nuestra cadena de potencial$b
, puesto de otro modo$b
en la tubería y la puso en la cadena vacía.Una vez fuera del ciclo, concatene la matriz con los resultados de la canalización
$b
y colóquelos en unaWhere-Object
cláusula|?{...}
. Esto extrae aquellas cadenas que tienen una longitud de elemento de-ge5
(basada en la división en espacios en blanco) y un recuento de temperaturas mayores que30
ser-ge3
. Esas cadenas se dejan en la tubería, por lo que un valor de verdad no está vacío (vea el enlace "verificar todos los casos de prueba" para la distinción de verdad / falsey).fuente
$args
en su lugarparam($a)
y$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}
comoget-heatWave.ps1
. Script de prueba regex101.com/r/lXdvIs/2$b=@();$args|%{if($_-ge25){$b+=$_}else{,$b;$b=@()}}-E{,$b}|?{$_.count-ge5-and($_|?{$_-ge30}).count-ge3}
-E
hacer? No estoy familiarizado con eso.Jalea ,
1716 bytesPruébalo en línea!
Cómo funciona
fuente
Python 2 , 86 bytes
Pruébalo en línea!
fuente
JavaScript (ES6),
6351 bytesDevuelve un booleano.
Pruébalo en línea!
fuente
05AB1E , 20 bytes
Pruébalo en línea!
Explicación
fuente
Lote, 119 bytes
Toma la entrada como argumentos de línea de comando y las salidas 1 para una ola de calor, de lo contrario 0.
fuente
Python , 67 bytes
Pruébalo en línea!
Se agota el tiempo de espera en los casos de prueba más largos debido al crecimiento exponencial. Encuentra sublistas contiguas cortando repetidamente el primer o el último elemento. Los 3 días son ≥30 ° C se verifica mirando el tercer valor más grande
sorted(l)[~2]
. Los casos base tal vez podrían ser más cortos aprovechando la verdad / falsa o terminando con un error.fuente
JavaScript (Node.js) , 48 bytes
Pruébalo en línea!
bastante malo
fuente
Haskell , 64 bytes
Pruébalo en línea!
fuente
APL (Dyalog Unicode) , 29 bytes
Pruébalo en línea!
∨/
¿hay algún elemento tal que(5≤≢¨a)
5 <el recuento≢
de días en cada serie (a
tiene todas las series posibles de días)∧
y3≤+/30≤
3 ≤ el+/
número total de elementos que son ≥ 30 en↑a←
la matriz formada pore⊆⍨25≤e←⎕
la serie de elementos consecutivos que son ≥ 25fuente
Kotlin , 57 bytes
(-1 Byte reemplazando el parámetro explícito v-> con el parámetro implícito it )
(-16 bytes usando la operación any {} como se ve en la Solución Ruby de GB )
(-1 byte gracias Lynn: reemplazó r> 0 && v <25 con r * 25> r * v)
Esta expresión lambda toma una Lista y devuelve verdadero para una ola de calor o falso más.
Gracias al número mágico 864 y a Udo Borkowski y Mathis por sus ideas.
¿Cómo funciona si funciona? Cada secuencia de números se repite con cualquier operación {} que comience en el valor de reducción 1. La reducción se multiplica por 2 y se multiplica por 3 (2 * 3 = 6) si el número es mayor o igual a 30. Si un número <25 se ve que la reducción comienza nuevamente en 1. Si la reducción es divisible por 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3, entonces se encuentra una ola de calor, y el resultado de la operación del módulo es 0, lo que resulta en un valor de retorno verdadero en el lambda interno llamado desde la operación any {} que luego deja de iterar y devuelve el valor verdadero
Pruébalo en línea!
fuente
Maravilla , 34 bytes
Ejemplo de uso:
Explicación
Versión detallada:
Tome secuencias superpuestas de 5 elementos consecutivos, luego verifique si alguna de las secuencias tiene todos los elementos> 25 y más de 2 elementos> 30.
fuente
Jalea , 21 bytes
Pruébalo en línea!
fuente
Stax , 23 bytes
¡Ejecútelo y depúrelo en staxlang.xyz! Esto tarda mucho tiempo en ejecutarse, por lo que desactivé la ejecución automática.
Desempaquetado (28 bytes) y explicación
Esto imprimirá todas las submatrices que se pueden contar como ondas de calor, lo que será falso si solo existe.
fuente
Ruby , 89 bytes
Pruébalo en línea!
fuente
each_cons
enfoque: ¡ Pruébelo en línea!Casco , 19 bytes
Pruébalo en línea!
Usar filter (
f
) es un byte más corto que usar check con un lógico y (&
) , también sería realmente bueno deshacerse de los±
2 bytes que cuestan :(Explicación
fuente
Retina , 31 bytes
Pruébalo en línea!
fuente
R ,
111 93 71 6766 bytesPruébalo en línea!
El puerto descarado de las respuestas de Roland Schmitz . -4 bytes gracias a Roland y -1 gracias a Giuseppe.
TIO enlaces a la versión funcional.
¡La versión anterior extrajo días consecutivos> 25 usando
rle
y guardó la friolera de 18 bytes gracias a Giuseppe!fuente
F
lugar deT
, puede hacerloF=F|"if"(cond,(expr),0)
y luego regresarF
para guardar 6 bytes ish. También tiene un par de paréntesis innecesarios,(1-z[i]):0
pero creo que eso podría ser de1-z[i]:1
todos modos para guardar otro par de bytes ...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}
pero tenga cuidado de pegar desde PPCG en TIO debido a la fluencia a veces unprintables en ...Swift 4 , 50 bytes
Pruébalo en línea!
La expresión de cierre devuelve 0 para una ola de calor o> 0 más.
Creado en colaboración con Roland Schmitz y Mathis.
¿Cómo funciona si funciona? Cada secuencia de números se repite con una operación de reducción que comienza en el valor de reducción 1. Si se ve un número> = 25, la reducción se multiplica por 2. Si se ve un número> = 30, la reducción se multiplica por 2 y por 3 = 6. Si se ve un número <25, la reducción comienza nuevamente en 1. Si la reducción es divisible por 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3, se encuentra una ola de calor y el resultado de la reducción la operación del módulo es 0, lo que da como resultado un valor de reducción de 0. Solo cuando se encuentra una ola de calor, la reducción puede convertirse en 0. Una vez que el valor de reducción es 0, será 0 para todas las reducciones futuras, es decir, también para el resultado final.
fuente
Python 2 ,
6663 bytesPruébalo en línea!
-3 bytes gracias a Lynn
¿Cómo funciona si funciona? Cada secuencia de números se repite con una operación de reducción que comienza en el valor de reducción 1. Si se ve un número> = 25, la reducción se multiplica por 2. Si se ve un número> = 30, la reducción se multiplica por 2 y por 3 = 6. Si se ve un número <25, la reducción comienza nuevamente en 1. Si la reducción es divisible por 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3, se encuentra una ola de calor y el resultado de la reducción la operación del módulo es 0, lo que da como resultado un valor de reducción de 0. Solo cuando se encuentra una ola de calor, la reducción puede convertirse en 0. Una vez que el valor de reducción es 0, será 0 para todas las reducciones futuras, es decir, también para el resultado final.
Una versión más legible pero más larga se ve así:
Quitar espacio extra / paréntesis y la sustitución
x if cond else y
por(y,x)[cond]
daLynn sugirió acortar la condición
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
Resultando en
fuente
functools
, ¡es un Python 2 incorporado !b*25>b*c
y guardar 3 bytes; esto podría aplicarse a muchas de las soluciones que adoptan este enfoque en diferentes idiomas :)Pyth, 23 bytes
Pruébalo aquí
fuente
Befunge-98 , 61 bytes
Pruébalo en línea!
fuente
Perl 6 ,
5452 bytesPruébalo en línea!
fuente