Contexte
L’Institut météorologique royal des Pays-Bas définit une vague de chaleur * comme une série d’ au moins 5 jours consécutifs de temps météorologique égal ou supérieur à 25 ° C ("temps estival"), de sorte qu’au moins 3 de ces jours soient égaux ou supérieurs à 30 ° C ("climat tropical" )
Il n’est pas nécessaire de mesurer le temps tropical de façon consécutive: par exemple, il 30, 25, 30, 26, 27, 28, 32, 30
s’agit d’une vague de chaleur de 8 jours avec 4 jours de climat tropical.
* (Eh bien, selon les normes néerlandaises.)
Défi
À partir d'une liste non vide d'entiers positifs représentant les mesures de température en degrés Celsius de jours successifs, déterminez si cette liste contient une vague de chaleur (selon la définition ci-dessus).
La réponse la plus courte en octets gagne.
Cas de test
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]
Vérité
[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]
Réponses:
C (gcc) ,
88 à75 octetsEssayez-le en ligne!
la source
h,e,a;t
- belle touche!Gelée , 15 octets
Un lien monadique acceptant une liste de nombres qui revient
1
si une vague de chaleur était détectée autrement0
.Essayez-le en ligne! ou voir la suite de tests .
Comment?
Le critère est l'existence d'une série de plus de quatre valeurs supérieures ou égales à 25, dont plus de deux doivent être supérieures ou égales à 30.
Si nous divisons par cinq, le critère devient l'existence d'une suite de plus de quatre valeurs supérieures ou égales à cinq, dont plus de deux doivent être supérieures ou égales à six.
Si l'on soustrait cinq de ces valeurs, le critère devient l'existence d'une suite de plus de quatre valeurs supérieures ou égales à zéro, dont plus de deux doivent être supérieures ou égales à un.
Si nous prenons le signe de ces valeurs (obtenant -1, 0 ou 1), le critère devient l’existence d’une suite de plus de quatre valeurs différentes de -1, dont plus de deux doivent être égales à un.
Si nous ajoutons une à ces valeurs (obtenant 0, 1 ou 2), le critère devient l’existence d’une série de plus de quatre valeurs différentes de zéro, dont plus de deux doivent être égales à deux.
Le produit d'une liste contenant des zéros est zéro et le produit d'une liste contenant plus de deux (le reste étant plus de deux) est supérieur à quatre. Cela signifie que les critères de cette liste ajustée deviennent que le minimum du produit et la longueur sont supérieurs à 4.
la source
Haskell ,
737271696766 octetsMerci à @flawr et @Laikoni pour deux octets chacun et @xnor pour un octet!
Essayez-le en ligne!
Longueur égale:
Essayez-le en ligne!
la source
C (clang) , 64 octets
La fonction o () renvoie 1 pour une vague de chaleur ou 0 sinon.
Merci au nombre magique 864 et à Udo Borkowski et Mathis pour leurs idées.
Comment ça marche? Chaque séquence de nombres est itérée avec une opération de réduction commençant à la valeur de réduction 1. Si un nombre> = 25 est vu, la réduction est multipliée par 2. Si un nombre> = 30 est vu, la réduction est multipliée par 2 et par 3 = 6. Si un nombre <25 est vu, la réduction recommence à 1. Si la réduction est divisible par 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3, une vague de chaleur est trouvée et le résultat de la L'opération modulo est 0, ce qui donne une valeur de réduction de 0 et une valeur de retour de true.
Essayez-le en ligne!
la source
Python 3 , 79 octets
Essayez-le en ligne!
la source
APL (Dyalog Classic) ,
21 à20 octetsEssayez-le en ligne!
les usages
⎕io←1
25 30⍸x
est 0 si x <25, 1 si 25≤x <30 ou 2 sinonnous calculons les produits cumulés de ceux-ci à partir de (ou de manière équivalente: se terminant à) à tous les emplacements possibles, jetons les 4 premiers produits et détectons la présence de produits ≥8 (ce qui correspond à 2 3 )
la source
Japt ,
19 à18 octetsJ'espère que j'ai bien compris toutes les discussions dans les commentaires.
Rasé un octet grâce à Shaggy .
Essayez-le en ligne!
la source
漢
serait 3 octets, mais¨
un octet. Les symboles utilisés ci-dessus ont été choisis pour la langue de golf exactement parce qu'ils sont tous un seul octet.PowerShell , 121 octets
Essayez-le en ligne! ou Vérifier tous les cas de test
PowerShell n'a pas l'équivalent d'un
.some
ou.every
similaire, c'est donc roulé à la main.Nous prenons l'entrée
$a
comme un tableau d'entiers. Définissez la variable d'assistance$b
sur la chaîne vide. Puis, parcourez chaque entier de$a
. Dans la boucle, si l'entier est-g
reaterthanore
qual to25
, ajoutez-le à notre chaîne potentielle$b
, sinon insérez-$b
le dans le pipeline et définissez-le sur la chaîne vide.Une fois en dehors de la boucle, concaténez les résultats du pipeline avec un tableau
$b
et mettez-les à travers uneWhere-Object
clause|?{...}
. Cela extrait les chaînes qui ont une longueur d'élément de-ge5
(basée sur le fractionnement sur des espaces) et un nombre de temps supérieur à l'30
être-ge3
. Ces chaînes sont laissées dans le pipeline, de sorte qu'une valeur de vérité n'est pas vide (voir le lien "Vérifier tous les cas de test" pour connaître la distinction vérité / falsey).la source
$args
placeparam($a)
et$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}
sousget-heatWave.ps1
. Script de test regex101.com/r/lXdvIs/2$b=@();$args|%{if($_-ge25){$b+=$_}else{,$b;$b=@()}}-E{,$b}|?{$_.count-ge5-and($_|?{$_-ge30}).count-ge3}
-E
-il? Je ne suis pas au courant de cela.Gelée ,
17 à16 octetsEssayez-le en ligne!
Comment ça fonctionne
la source
Python 2 , 86 octets
Essayez-le en ligne!
la source
JavaScript (ES6),
6351 octetsRetourne un booléen.
Essayez-le en ligne!
la source
05AB1E , 20 octets
Essayez-le en ligne!
Explication
la source
Lot, 119 octets
Prend l'entrée en tant qu'argument de ligne de commande et génère 1 pour une vague de chaleur, sinon 0.
la source
Python , 67 octets
Essayez-le en ligne!
Dépassement des délais pour les tests plus longs en raison de la croissance exponentielle. Trouve les sous-listes contiguës en coupant à plusieurs reprises le premier ou le dernier élément. On vérifie que 3 jours sont ≥ 30 ° C en regardant la troisième valeur la plus grande
sorted(l)[~2]
. Les cas de base pourraient peut-être être plus courts en tirant parti de vérité / falsey ou en se terminant par une erreur.la source
JavaScript (Node.js) , 48 octets
Essayez-le en ligne!
assez mauvais
la source
Haskell , 64 octets
Essayez-le en ligne!
la source
APL (Dyalog Unicode) , 29 octets
Essayez-le en ligne!
∨/
y at- il des éléments tels que(5≤≢¨a)
5 <le décompte≢
des jours dans chaque série (a
contient toutes les séries de jours possibles)∧
et3≤+/30≤
3 ≤ le+/
nombre total d'éléments ≥ 30 dans↑a←
la matrice formée pare⊆⍨25≤e←⎕
la série d'éléments consécutifs ≥ 25la source
Kotlin , 57 octets
(-1 octet en remplaçant le paramètre explicite v-> par le paramètre implicite it )
(-16 octets utilisant l'opération any {}, comme indiqué dans la solution Ruby par Go )
(-1 octet merci Lynn: a remplacé r> 0 && v <25 par r * 25> r * v)
Cette expression lambda prend une liste et renvoie true pour une vague de chaleur ou false.
Merci au nombre magique 864 et à Udo Borkowski et Mathis pour leurs idées.
Comment ça marche? Chaque séquence de nombres est itérée avec une opération {} quelconque commençant à la valeur de réduction 1. La réduction est multipliée par 2 et multipliée par 3 (2 * 3 = 6) si le nombre est supérieur ou égal à 30. Si un nombre <25 On voit la réduction recommencer à 1. Si la réduction est divisible par 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3, une vague de chaleur est trouvée et le résultat de l'opération modulo est 0, ce qui a pour résultat une valeur de retour vraie dans le lambda interne appelée à partir de l' opération any {} qui arrête alors d'itérer et renvoie la valeur true.
Essayez-le en ligne!
la source
Merveille , 34 octets
Exemple d'utilisation:
Explication
Version verbeuse:
Prenez des séquences qui se chevauchent de 5 éléments consécutifs, puis vérifiez si l’une des séquences contient tous les éléments> 25 et plus de 2 éléments> 30.
la source
Gelée , 21 octets
Essayez-le en ligne!
la source
Stax , 23 octets
Exécutez-le et déboguez-le sur staxlang.xyz! Cela prend beaucoup de temps à courir, alors j’ai désactivé l’exécution automatique.
Décompressé (28 octets) et explication
Ceci imprimera tous les sous-matrices pouvant être comptées comme des vagues de chaleur, ce qui sera faux si et seulement s'il n'en existe pas.
la source
Ruby , 89 octets
Essayez-le en ligne!
la source
each_cons
approche - Essayez-le en ligne!Coque , 19 octets
Essayez-le en ligne!
Utiliser filter (
f
) est un octet plus court que de vérifier avec une logique and (&
) , il serait également très agréable de se débarrasser de±
- coûtant 2 octets :(Explication
la source
Retina , 31 octets
Essayez-le en ligne!
la source
R ,
111 93 71 6766 octetsEssayez-le en ligne!
Port sans vergogne des réponses de Roland Schmitz . -4 octets grâce à Roland et -1 grâce à Giuseppe.
TIO est lié à la version fonctionnelle.
Version précédente extraite jours consécutifs> 25 en utilisant
rle
et sauvé 18 octets grâce à Giuseppe!la source
F
place deT
, vous pouvez le faireF=F|"if"(cond,(expr),0)
, puis revenirF
à la sauvegarde de 6 octets. Vous avez également une paire de parenthèses inutile,(1-z[i]):0
mais je pense que cela pourrait tout aussi bien être1-z[i]:1
de sauver un autre couple d'octets ...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}
faut faire attention quand on colle PPCG dans TIO, car parfois des impossibles à imprimer ...Swift 4 , 50 octets
Essayez-le en ligne!
L'expression de fermeture renvoie 0 pour une vague de chaleur ou> 0 sinon.
Créé en collaboration avec Roland Schmitz et Mathis.
Comment ça marche? Chaque séquence de nombres est itérée avec une opération de réduction commençant à la valeur de réduction 1. Si un nombre> = 25 est vu, la réduction est multipliée par 2. Si un nombre> = 30 est vu, la réduction est multipliée par 2 et par 3 = 6. Si un nombre <25 est vu, la réduction recommence à 1. Si la réduction est divisible par 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3, une vague de chaleur est trouvée et le résultat de la L'opération modulo vaut 0, ce qui donne une valeur de réduction égale à 0. Ce n'est que lorsqu'une vague de chaleur est trouvée que la réduction peut devenir 0. Une fois que la valeur de réduction est 0, ce sera 0 pour toutes les réductions futures, c'est-à-dire aussi pour le résultat final.
la source
Python 2 ,
6663 octetsEssayez-le en ligne!
-3 octets grâce à Lynn
Comment ça marche? Chaque séquence de nombres est itérée avec une opération de réduction commençant à la valeur de réduction 1. Si un nombre> = 25 est vu, la réduction est multipliée par 2. Si un nombre> = 30 est vu, la réduction est multipliée par 2 et par 3 = 6. Si un nombre <25 est vu, la réduction recommence à 1. Si la réduction est divisible par 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3, une vague de chaleur est trouvée et le résultat de la L'opération modulo vaut 0, ce qui donne une valeur de réduction égale à 0. Ce n'est que lorsqu'une vague de chaleur est trouvée que la réduction peut devenir 0. Une fois que la valeur de réduction est 0, ce sera 0 pour toutes les réductions futures, c'est-à-dire aussi pour le résultat final.
Une version plus lisible, mais plus longue, ressemble à ceci:
Suppression des espaces supplémentaires / parenthèses et en remplaçant
x if cond else y
par(y,x)[cond]
donneLynn a suggéré de raccourcir la situation
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
résultant en
la source
functools
, c'est intégré à Python 2 !b*25>b*c
et économiser 3 octets. cela pourrait s’appliquer à de nombreuses solutions adoptant cette approche dans différentes langues :)Pyth, 23 octets
Essayez-le ici
la source
Befunge-98 , 61 octets
Essayez-le en ligne!
la source
Perl 6 ,
5452 octetsEssayez-le en ligne!
la source