fundo
O Instituto Meteorológico Real da Holanda define uma onda de calor * como uma série de pelo menos 5 dias consecutivos com tempo ≥25 ° C (“clima de verão”), de modo que pelo menos três desses dias sejam ≥30 ° C (“clima tropical” )
O clima tropical não precisa ser medido consecutivamente: por exemplo: 30, 25, 30, 26, 27, 28, 32, 30
é uma onda de calor de 8 dias com 4 dias de clima tropical.
* (Bem, pelos padrões holandeses.)
Desafio
Dada uma lista não vazia de números inteiros positivos representando medições de temperatura Celsius de dias sucessivos, decida se essa lista contém uma onda de calor (conforme a definição acima).
A resposta mais curta em bytes vence.
Casos de teste
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]
Verdade:
[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]
Respostas:
C (gcc) ,
8875 bytesExperimente online!
fonte
h,e,a;t
- bom toque!Gelatina , 15 bytes
Um link monádico que aceita uma lista de números que retorna
1
se outra onda de calor foi detectada0
.Experimente online! ou veja a suíte de testes .
Quão?
O critério é a existência de uma execução com mais de quatro valores maiores ou iguais a 25, dos quais mais de dois devem ser maiores ou iguais a 30.
Se dividirmos por cinco, o critério se torna a existência de uma execução com mais de quatro valores maiores ou iguais a cinco, dos quais mais de dois devem ser maiores ou iguais a seis.
Se subtrairmos cinco desses valores, o critério se tornará a existência de uma execução com mais de quatro valores maiores ou iguais a zero, dos quais mais de dois devem ser maiores ou iguais a um.
Se tomarmos o sinal desses valores (obtendo -1, 0 ou 1), o critério se tornará a existência de uma execução de mais de quatro valores diferentes de -1, dos quais mais de dois devem ser iguais a um.
Se adicionarmos um a esses valores (obtendo 0, 1 ou 2), o critério se tornará a existência de uma execução de mais de quatro valores diferentes de zero, dos quais mais de dois devem ser iguais a dois.
O produto de uma lista que contém zeros é zero e o produto de uma lista que contém mais de dois pares (sendo o restante) é maior que quatro. Isso significa que os critérios nessa lista ajustada passam a ser o mínimo do produto e o comprimento maior que 4.
fonte
Haskell ,
737271696766 bytesObrigado a @flawr e @Laikoni por dois bytes cada e @xnor por um byte!
Experimente online!
Comprimento igual:
Experimente online!
fonte
C (clang) , 64 bytes
A função o () retorna 1 para uma onda de calor ou 0 mais.
Graças ao número mágico 864 e a Udo Borkowski e Mathis por suas idéias.
Como funciona se? Cada sequência de números é iterada com uma operação de redução iniciando no valor de redução 1. Se um número> = 25 for visto, a redução será multiplicada por 2. Se um número> = 30 for visto, a redução será multiplicada por 2 e por 3 = 6. Se um número <25 for visto, a redução será iniciada novamente em 1. Se a redução for divisível por 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3, uma onda de calor será encontrada e o resultado da A operação do módulo é 0, o que resulta em um valor reduzido de 0 e em um valor de retorno verdadeiro.
Experimente online!
fonte
Python 3 , 79 bytes
Experimente online!
fonte
APL (Dyalog Classic) ,
2120 bytesExperimente online!
usa
⎕io←1
25 30⍸x
é 0 se x <25, 1 se 25≤x <30 ou 2 caso contráriocalculamos produtos cumulativos a partir de (ou equivalente: terminando em) todos os locais possíveis, descartamos os 4 primeiros produtos e detectamos a presença de produtos ≥8 (que é 2 3 )
fonte
Japonês ,
1918 bytesEspero ter conseguido todas as discussões nos comentários corretamente.
Raspou um byte graças a Shaggy .
Experimente online!
fonte
漢
seria 3 bytes, mas¨
é um byte. Os símbolos usados acima foram escolhidos para o idioma do golfe exatamente pelo motivo de serem todos um único byte.PowerShell , 121 bytes
Experimente online! ou Verifique todos os casos de teste
O PowerShell não tem o equivalente a
.some
ou.every
ou algo parecido, portanto, isso é feito manualmente.Tomamos entrada
$a
como uma matriz de números inteiros. Defina a variável auxiliar$b
como a sequência vazia. Em seguida, percorra todos os números inteiros em$a
. Dentro do loop, se o número inteiro for de-g
acordo com ae
qualidade25
, adicione-o à nossa cadeia de caracteres em potencial$b
, caso contrário, coloque$b
no pipeline e defina-o como a string vazia.Uma vez fora do loop, concatene os resultados do pipeline com array
$b
e coloque-os em umaWhere-Object
cláusula|?{...}
. Isso extrai as strings que possuem um comprimento de elemento-ge5
(com base na divisão em espaço em branco) e uma contagem de temperaturas acima do que30
é-ge3
. Essas cadeias são deixadas no pipeline, portanto, um valor de verdade não está vazio (consulte o link "verificar todos os casos de teste" para obter a distinção de verdade / falsey).fonte
$args
vez dissoparam($a)
e$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 teste regex101.com/r/lXdvIs/2$b=@();$args|%{if($_-ge25){$b+=$_}else{,$b;$b=@()}}-E{,$b}|?{$_.count-ge5-and($_|?{$_-ge30}).count-ge3}
-E
faz? Eu não estou familiarizado com isso.Geléia ,
1716 bytesExperimente online!
Como funciona
fonte
Python 2 , 86 bytes
Experimente online!
fonte
JavaScript (ES6),
6351 bytesRetorna um booleano.
Experimente online!
fonte
05AB1E , 20 bytes
Experimente online!
Explicação
fonte
Lote, 119 bytes
Recebe a entrada como argumentos da linha de comando e gera 1 para uma onda de calor, caso contrário, 0.
fonte
Python , 67 bytes
Experimente online!
Tempo limite nos casos de teste mais longos devido ao crescimento exponencial. Localiza sublistas contíguas cortando repetidamente o primeiro ou o último elemento. A verificação dos 3 dias ≥30 ° C é feita com o terceiro maior valor
sorted(l)[~2]
. Os casos base podem talvez ser mais curtos, aproveitando a verdade / falsey ou terminando com erro.fonte
JavaScript (Node.js) , 48 bytes
Experimente online!
muito ruim
fonte
Haskell , 64 bytes
Experimente online!
fonte
APL (Dyalog Unicode) , 29 bytes
Experimente online!
∨/
existe algum elementos de tal modo que(5≤≢¨a)
5 <a contagem≢
de dias em cada série (a
tem todas as séries possíveis de dias)∧
e3≤+/30≤
3 ≤ o total+/
número de elementos que são ≥ 30 em↑a←
a matriz formada pore⊆⍨25≤e←⎕
a série de elementos consecutivos ≥ 25fonte
Kotlin , 57 bytes
(-1 byte substituindo o parâmetro explícito v-> pelo parâmetro implícito it )
(-16 bytes usando a operação any {}, como visto na Ruby Solution por GB )
(-1 byte graças a Lynn: substituído r> 0 && v <25 por r * 25> r * v)
Essa expressão lambda pega uma lista e retorna true para uma onda de calor ou false.
Graças ao número mágico 864 e a Udo Borkowski e Mathis por suas idéias.
Como funciona se? Cada sequência de números é iterada com qualquer operação {} iniciando no valor de redução 1. A redução é multiplicada por 2 e multiplicada por 3 (2 * 3 = 6) se o número for maior ou igual a 30. Se um número <25 é visto que o redutor começa novamente em 1. Se o redutor é divisível por 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3, uma onda de calor é encontrada e o resultado da operação do módulo é 0, o que resulta em um valor de retorno verdadeiro no lambda interno chamado a partir de qualquer operação {} , que para de iterar e retorna o valor true.
Experimente online!
fonte
Maravilha , 34 bytes
Exemplo de uso:
Explicação
Versão detalhada:
Faça sequências sobrepostas de 5 itens consecutivos e verifique se alguma das sequências tem todos os itens> 25 e mais de 2 itens> 30.
fonte
Gelatina , 21 bytes
Experimente online!
fonte
Stax , 23 bytes
Execute e depure-o em staxlang.xyz!Como demora muito para executar, desabilitei a execução automática.
Descompactado (28 bytes) e explicação
Isso imprimirá todos os subarrays que podem ser contados como ondas de calor, que serão falsas se e somente se não existirem.
fonte
Ruby , 89 bytes
Experimente online!
fonte
each_cons
abordagem - Experimente on-line!Casca , 19 bytes
Experimente online!
O uso de filter (
f
) é um byte mais curto do que o de verificação com um lógico e (&
) , também seria muito bom se livrar do±
2 bytes :(Explicação
fonte
Retina , 31 bytes
Experimente online!
fonte
R ,
111 93 71 6766 bytesExperimente online!
Porto desavergonhado de Roland Schmitz respostas . -4 bytes graças a Roland e -1 graças a Giuseppe.
Links do TIO para a versão funcional.
A versão anterior extraiu dias consecutivos> 25, usando
rle
e salvando 18 bytes, graças a Giuseppe!fonte
F
vez deT
, poderá fazerF=F|"if"(cond,(expr),0)
e retornarF
para salvar bytes de 6 ish. Você também tem um par desnecessária de parênteses em torno(1-z[i]):0
mas eu acho que poderia ser apenas1-z[i]:1
uma maneira de salvar um outro 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}
, mas tenha cuidado colar a partir PPCG em TIO porque fluência às vezes unprintables em ...Swift 4 , 50 bytes
Experimente online!
A expressão de fechamento retorna 0 para uma onda de calor ou> 0 mais.
Criado em colaboração com Roland Schmitz e Mathis.
Como funciona se? Cada sequência de números é iterada com uma operação de redução iniciando no valor de redução 1. Se um número> = 25 for visto, a redução será multiplicada por 2. Se um número> = 30 for visto, a redução será multiplicada por 2 e por 3 = 6. Se um número <25 for visto, a redução será iniciada novamente em 1. Se a redução for divisível por 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3, uma onda de calor será encontrada e o resultado da A operação do módulo é 0, o que resulta em um valor reduzido de 0. Somente quando uma onda de calor foi encontrada, a redução pode se tornar 0. Quando o valor reduzido for 0, será 0 para todas as reduções futuras, ou seja, também para o resultado final.
fonte
Python 2 ,
6663 bytesExperimente online!
-3 bytes graças a Lynn
Como funciona se? Cada sequência de números é iterada com uma operação de redução iniciando no valor de redução 1. Se um número> = 25 for visto, a redução será multiplicada por 2. Se um número> = 30 for visto, a redução será multiplicada por 2 e por 3 = 6. Se um número <25 for visto, a redução será iniciada novamente em 1. Se a redução for divisível por 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3, uma onda de calor será encontrada e o resultado da A operação do módulo é 0, o que resulta em um valor reduzido de 0. Somente quando uma onda de calor foi encontrada, a redução pode se tornar 0. Quando o valor reduzido for 0, será 0 para todas as reduções futuras, ou seja, também para o resultado final.
Uma versão mais legível, mas mais longa, tem a seguinte aparência:
A remoção adicional espaços / parêntese e substituindo
x if cond else y
por(y,x)[cond]
dáLynn sugeriu reduzir a condição
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 em
fonte
functools
, é um recurso incorporado no Python 2 !b*25>b*c
e salvar 3 bytes; este pode aplicar-se a muitas das soluções que tomam esta abordagem em diferentes línguas :)Pitão, 23 bytes
Experimente aqui
fonte
Befunge-98 , 61 bytes
Experimente online!
fonte
Perl 6 ,
5452 bytesExperimente online!
fonte