Détecter les vagues de chaleur

48

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, 30s’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]
Lynn
la source
2
La température est-elle garantie inférieure à 100 ° C?
FryAmTheEggman le
3
@FryAmTheEggman Eh bien, aux Pays-Bas, oui :), mais je ne veux pas que votre réponse abuse de ce fait, alors non.
Lynn
1
@ HatWizard Oui, c'est bon. "Crash / Don't crash" convient également, par exemple.
Lynn
2
Hé @ Lynn, c’était un beau défi et le reste :-)
Roland Schmitz le
1
@RolandSchmitz Merci! Je suis agréablement surpris par les réponses créatives apportées si tard dans la vie du défi. 🎉
Lynn

Réponses:

31

C (gcc) , 88 à 75 octets

h,e,a;t(int*_){for(h=e=a=0;*_;h+=e>4&a>2)e+=*_>24||(e=a=0),a+=*_++>29;e=h;}

Essayez-le en ligne!

Jonathan Frech
la source
24
h,e,a;t- belle touche!
user9549915
19

Gelée , 15 octets

:5_5Ṡ‘ẆP«LƊ€>4Ṁ

Un lien monadique acceptant une liste de nombres qui revient 1si une vague de chaleur était détectée autrement 0.

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.

:5_5Ṡ‘ẆP«LƊ€>4Ṁ - Link: list of numbers
:5              - integer divide by five (vectorises)
  _5            - subtract five (vectorises)
    Ṡ           - sign {negatives:-1, zero:0, positives:1} (vectorises)
     ‘          - increment (vectorises)
      Ẇ         - all sublists
          Ɗ€    - last three links as a monad for €ach:
       P        -   product
         L      -   length
        «       -   minimum
            >4  - greater than four? (vectorises) -- 1 if so, else 0
              Ṁ - maximum -- 1 if any are 1, else 0
Jonathan Allan
la source
9

Haskell , 73 72 71 69 67 66 octets

any(\a->sum[1|x<-a,x>29,take 4a<a]>2).scanl(\a t->[0|t>24]>>t:a)[]

Merci à @flawr et @Laikoni pour deux octets chacun et @xnor pour un octet!

Essayez-le en ligne!

Longueur égale:

any(\a->take 4a<a&&sum a>2).scanl(\a t->[0|t>24]>>sum[1|t>29]:a)[]

Essayez-le en ligne!

Angs
la source
9

C (clang) , 64 octets

h;o(*t){for(h=1;*t;++t)h=h&&*t<25?1:h*(*t<30?2:6)%864;return!h;}

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!

Roland Schmitz
la source
Bienvenue chez PPCG.
Muhammad Salman
Bienvenue chez PPCG! Très belle première réponse complète avec suite de cas de test! Pourriez-vous ajouter une explication pour que nous comprenions la magie?
JayCe
C'est une solution vraiment élégante, bien faite :)
Lynn
7

APL (Dyalog Classic) , 21 à 20 octets

184↓⍉×\25 30⍸↑,⍨\⎕

Essayez-le en ligne!

les usages ⎕io←1

25 30⍸x est 0 si x <25, 1 si 25≤x <30 ou 2 sinon

nous 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 )

ngn
la source
6

Japt , 19 à 18 octets

ô<25 d_ʨ5©3§Zè¨30
ô                  // Partition the input at every item
 <25               // where the value is less than 25.
     d_            // Then, return whether any resulting subarray
       ʨ5         // is at least five items long
          ©        // and
           3§      // has at least three items
             Zè¨30 // with a value of at least 30.

J'espère que j'ai bien compris toutes les discussions dans les commentaires.
Rasé un octet grâce à Shaggy .

Essayez-le en ligne!

Lente
la source
Je pensais que cela marcherait plus vite lorsque je le lirais, mais je ne pouvais gérer que 18 octets .
Shaggy
@ Shaggy, je le pensais aussi, mais je ne pouvais pas en trouver une version plus courte non plus. Merci beaucoup pour le pointeur!
Nit
1
On dirait que nous sommes en train de gagner celui-ci pour le moment :)
Shaggy
Les caractères non-ASCII ne comptent-ils pas comme plusieurs octets?
sudo
1
@sudo Ces symboles sont tous à un octet. Par exemple, 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.
Nit
5

PowerShell , 121 octets

param($a)$b="";($a|%{if($_-ge25){$b+="$_ "}else{$b;$b=""}})+$b|?{(-split$_).count-ge5-and(-split$_|?{$_-ge30}).count-ge3}

Essayez-le en ligne! ou Vérifier tous les cas de test

PowerShell n'a pas l'équivalent d'un .someou .everysimilaire, c'est donc roulé à la main.

Nous prenons l'entrée $acomme un tableau d'entiers. Définissez la variable d'assistance $bsur la chaîne vide. Puis, parcourez chaque entier de $a. Dans la boucle, si l'entier est -greaterthanor equal to 25, ajoutez-le à notre chaîne potentielle $b, sinon insérez- $ble 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 $bet mettez-les à travers une Where-Objectclause |?{...}. 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).

AdmBorkBork
la source
essayez d'utiliser à la $args place param($a)et$a
mazzy
-2 octets...{$a=-split$_;$a.count-ge5-and($a|?{$_-ge30}).count-ge3}
mazzy
109 octets avec des tableaux. enregistrer $args|%{if($_-ge25){$b+=$_}else{,$b;$b=@()}}-E{,$b}-B{,($b=@())}|?{$_.count-ge5-and($_|?{$_-ge30}).count-ge3}sous get-heatWave.ps1. Script de test regex101.com/r/lXdvIs/2
mazzy
103 octets$b=@();$args|%{if($_-ge25){$b+=$_}else{,$b;$b=@()}}-E{,$b}|?{$_.count-ge5-and($_|?{$_-ge30}).count-ge3}
mazzy
Que fait -E-il? Je ne suis pas au courant de cela.
AdmBorkBork
5

Gelée , 17 à 16 octets

:5_5Ṡṣ-ḤS«LƊ€Ṁ>4

Essayez-le en ligne!

Comment ça fonctionne

:5_5Ṡṣ-ḤS«LƊ€Ṁ>4  Main link. Argument: T (array of temperatures)

:5                Divide each item of T by 5 (integer division).
  _5              Subtract 5 from each quotient.
    Ṡ             Take the signs.
                  This maps (-oo,25) to -1, [25,30) to 0, and [30,+oo) to 1.
     ṣ-           Split at occurrences of -1.
       Ḥ          Double, replacing 1's with 2's.
           Ɗ€     Map the three links to the left over each chunk.
        S             Take the sum.
          L           Take the length.
         «            Take the minimum of the results.
             Ṁ    Take the maximum.
              >4  Test if it's larger than 4.
                  Note that the sum is larger than 4 if and only if there are more
                 than two 2's, which correspond to temperatures in [30,+oo).
Dennis
la source
5

Python 2 , 86 octets

lambda l:any(2<s.count('2')*(len(s)>14)for s in`[(t>24)+(t>29)for t in l]`.split('0'))

Essayez-le en ligne!

Barre
la source
4

JavaScript (ES6), 63 51 octets

Retourne un booléen.

a=>a.some(n=>(n>24?y+=++x&&n>29:x=y=0)>2&x>4,x=y=0)

Essayez-le en ligne!

Arnauld
la source
4

05AB1E , 20 octets

Œʒ24›DPsO4›*}29›O2›Z

Essayez-le en ligne!

Explication

Œ                     # push sublists of input
 ʒ          }         # filter, keep the lists where:
           *          # the product of:
     DP               # the product and
       sO4›           # the sum compared using greater-than to 4
  24›                 # for the elements greater than 24
                      # is true
                      # the result is:
                   Z  # the maximum from the remaining lists where
                O     # the sum of 
             29›      # the elements greater than 29
                 2›   # is greater than 2
Emigna
la source
4

Lot, 119 octets

@set h=0
@for %%t in (0 %*)do @if %%t lss 25 (set/as=5,t=3)else set/a"t+=!!t*(29-%%t)>>9,s-=!!s,h+=!(s+t+h)
@echo %h%

Prend l'entrée en tant qu'argument de ligne de commande et génère 1 pour une vague de chaleur, sinon 0.

Neil
la source
4

Python , 67 octets

f=lambda l:l>l[:4]and(min(l)>24<sorted(l)[~2]-5)|f(l[1:])|f(l[:-1])

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.

Xnor
la source
4

APL (Dyalog Unicode) , 29 octets

∨/(5≤≢¨a)∧3≤+/30≤↑ae⊆⍨25e←⎕

Essayez-le en ligne!

∨/y at- il des éléments tels que

(5≤≢¨a)5 <le décompte des jours dans chaque série ( acontient toutes les séries de jours possibles)

et

3≤+/30≤3 ≤ le +/nombre total d'éléments ≥ 30 dans

↑a← la matrice formée par

e⊆⍨25≤e←⎕ la série d'éléments consécutifs ≥ 25

Kritixi Lithos
la source
Votre premier test est commenté inutilement - cela fonctionne.
NDGN le
@ngn Merci d'avoir remarqué cela, corrigé
Kritixi Lithos le
4

Kotlin , 57 octets

{var r=1;it.any{r*=2;if(it>29)r*=3;if(it<25)r=1;r%864<1}}

(-1 octet en remplaçant le paramètre explicite v-> par le paramètre implicite it )

{var r=1;it.any{v->r*=2;if(v>29)r*=3;if(v<25)r=1;r%864<1}}

(-16 octets utilisant l'opération any {}, comme indiqué dans la solution Ruby par Go )

{it.stream().reduce(1){r,v->if(r*25>r*v)1 else(r*if(v<30)2 else 6)%864}<1}

(-1 octet merci Lynn: a remplacé r> 0 && v <25 par r * 25> r * v)

{it.stream().reduce(1){r,v->if(r>0&&v<25)1 else(r*if(v<30)2 else 6)%864}<1}

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!

Roland Schmitz
la source
Belle explication :)
JayCe
Je pense que votre nombre d'octets devrait refléter la déclaration de fonction entière, pas seulement le corps de la fonction. Dans l'état actuel des choses, cela me semble être un extrait.
Jonathan Frech
@ jonathan-frech, j'ai changé le corps de la fonction en une expression lambda légèrement plus longue incluant les accolades qui ne sont pas facultatives, contrairement à Java. Est-ce juste?
Roland Schmitz
@RolandSchmitz En regardant d'autres soumissions Kotlin et soumissions de fonctions lambda Java, j'imagine que l'inclusion du nombre d'octets de déclaration de fonctions est acceptée; ce qui signifie que votre soumission originale est probablement valide. Désolé pour mon commentaire, cela me semblait étrange car je trouve que ça a l'air très snippet-esk, car ce n'est pas une construction de langage valide sans la déclaration de type.
Jonathan Frech
3

Merveille , 34 octets

(/>@(& <2!> '<29#0)*> '<24#0).cns5

Exemple d'utilisation:

((/>@(& <2!> '<29#0)*> '<24#0).cns5) [25 33 33 25 24 27 34 31 29 31 27 23]

Explication

Version verbeuse:

(some x\\(and <2 (fltr <29) x) (every <24) x) . (cns 5)

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.

Maman Fun Roll
la source
Hé, cela n'a aucun lien, mais le lien facebook sur votre site Web est mort.
mbomb007
3

Stax , 23 octets

Æ7)║▄░Ä╟═╙hⁿ╧\ßY8÷K▌µ½x

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

:efc%4>nc{24>f=a{29>f%2>|&|&
:e                              Set of all contiguous subarrays
  f                             Filter, using the rest of the program as a predicate:
   c                              Copy subarray on the stack
    %4>                           Five or more elements?
                        |&        AND
       nc                         Copy subarray twice to top
         {   f                    Filter:
          24>                       Greater than 24?
              =                   Equals the original subarray?
                          |&      AND
               a                  Move subarray to top
                {   f             Filter:
                 29>                Greater than 30?
                     %2>          Length greater than two?
                                  Implicit print if all three conditions are met

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.

Khuldraeseth na'Barya
la source
3

Ruby , 89 octets

->a{(0..a.size).map{|i|(b=a[i..-1].take_while{|t|t>24}).size>4&&b.count{|t|t>29}>2}.any?}

Essayez-le en ligne!

lfvt
la source
Je crois que cela échoue parce que dans le deuxième cas, les +30 jours ne sont pas tous dans les cinq jours.
Stewie Griffin
Très agréable. Vous pouvez supprimer quelques octets avec une each_consapproche - Essayez-le en ligne!
benj2240
3

Coque , 19 octets

Vo≥3#≥30fo≥5Lġ(±≥25

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

V(≥3#≥30)f(≥5L)ġ(±≥25)  -- example input: [12,25,26,27,28,29,18,24,32]
               ġ(    )  -- group by
                ( ≥25)  -- | greater or equal to 25: [0,1,2,3,4,5,6,0,0,8]
                (±   )  -- | sign: [0,1,1,1,1,1,1,0,0,1]
                        -- : [[12],[25,26,27,28,29,30],[18,24],[32]]
         f(   )         -- filter by
          (  L)         -- | length: [1,6,2,1]
          (≥5 )         -- | greater or equal to 5: [0,2,0,0]
                        -- : [[25,26,27,28,29,30]]
V(      )               -- does any element satisfy
 (  #   )               -- | count occurences where
 (   ≥30)               -- | | elements greater or equal to 30
 (      )               -- | : [1]
 (≥3    )               -- | greater or equal to 3: [0]
                        -- : 0
ბიმო
la source
3

R , 111 93 71 67 66 octets

!Reduce(function(i,j)"if"(j<25,!!i,(i*(2+4*!j<30))%%864),scan(),1)

Essayez-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 rleet sauvé 18 octets grâce à Giuseppe!

JayCe
la source
si vous utilisez à la Fplace de T, vous pouvez le faire F=F|"if"(cond,(expr),0), puis revenir Fà la sauvegarde de 6 octets. Vous avez également une paire de parenthèses inutile, (1-z[i]):0mais je pense que cela pourrait tout aussi bien être 1-z[i]:1de sauver un autre couple d'octets ...
Giuseppe
^ J'étais sur le point de soumettre le commentaire ci-dessus quand une autre idée m'est venue à l'esprit et j'ai réussi à trouver une solution inférieure à 100 octets! Il 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 ...
Giuseppe
C'est fantastique! Il y a probablement un moyen encore plus court d'
utiliser
Bien, vous pouvez même économiser quelques octets supplémentaires si vous simplifiez la partie interne de (i * 2 * (1+ (2 * (j> 29)))) à (i * (2 + 4 * (j> 29) ))
Roland Schmitz
@RolandSchmitz très vrai!
JayCe
3

Swift 4 , 50 octets

{$0.reduce(1){$0>0&&$1<25 ?1:$0*($1<30 ?2:6)%864}}

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.

Udo Borkowski
la source
3

Python 2 , 66 63 octets

lambda a:reduce(lambda b,c:(b*(6,2)[c<30]%864,1)[b*25>b*c],a,1)

Essayez-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:

lambda a:reduce((lambda b,c: 1 if b>0 and c<25 else b*(2 if c<30 else 6)%864), a, 1)

Suppression des espaces supplémentaires / parenthèses et en remplaçant x if cond else ypar (y,x)[cond]donne

lambda a:reduce(lambda b,c:(b*(6,2)[c<30]%864,1)[b>0and c<25],a,1)

Lynn 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

lambda a:reduce(lambda b,c:(b*(6,2)[c<30]%864,1)[b*25>b*c],a,1)
Udo Borkowski
la source
Vous devez également inclure la déclaration d'importation :)
Muhammad Salman Le
1
En fait, vous n'avez pas besoin d'importer réduire functools, c'est intégré à Python 2 !
Lynn
1
Vous pouvez vérifier b*25>b*cet économiser 3 octets. cela pourrait s’appliquer à de nombreuses solutions adoptant cette approche dans différentes langues :)
Lynn
@ Lynn Merci beaucoup. J'ai mis à jour la solution en conséquence.
Udo Borkowski
2

Pyth, 23 octets

f&glT5&>T]25gePPT30SM.:

Essayez-le ici

f&glT5&>T]25gePPT30SM.:
f                  SM.:Q   Get the sorted subsequences of the (implicit) input...
 &qlT5                     ... with at least 5 elements...
      &>T]25               ... all at least 25...
            gePPT30        ... where the third to last is at least 30.
Mnémonique
la source