Erkennen Sie Hitzewellen

48

Hintergrund

Das Royal Netherlands Meteorological Institute definiert eine Hitzewelle * als eine Reihe von mindestens 5 aufeinander folgenden Tagen mit ≥25 ° C („sommerliches Wetter“), so dass mindestens 3 dieser Tage ≥30 ° C („tropisches Wetter“) sind. ).

Das tropische Wetter muss nicht nacheinander gemessen werden: Beispiel: Es 30, 25, 30, 26, 27, 28, 32, 30handelt sich um eine 8 Tage lange Hitzewelle mit 4 Tagen tropischem Wetter.

* (Nun, für niederländische Verhältnisse.)

Herausforderung

Entscheiden Sie anhand einer nicht leeren Liste positiver Ganzzahlen, die Celsius-Temperaturmessungen von aufeinanderfolgenden Tagen darstellen, ob diese Liste eine Hitzewelle enthält (gemäß der obigen Definition).

Die kürzeste Antwort in Bytes gewinnt.

Testfälle

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]

Wahrheit:

[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
quelle
2
Liegt die Temperatur garantiert unter 100 Grad Celsius?
FryAmTheEggman
3
@FryAmTheEggman Nun, in den Niederlanden, ja :), aber ich möchte nicht, dass Ihre Antwort diese Tatsache missbraucht, also nein.
Lynn
1
@ HatWizard Ja, das ist okay. "Crash / Don't Crash" ist zum Beispiel auch in Ordnung.
Lynn
2
Hey @Lynn, das war eine große Herausforderung und ist es immer noch :-)
Roland Schmitz
1
@ RolandSchmitz Danke! Ich bin glücklich über die kreativen Antworten, die so spät im Leben der Herausforderung herausgekommen sind. 🎉
Lynn

Antworten:

31

C (GCC) , 88 75 Bytes

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

Probieren Sie es online!

Jonathan Frech
quelle
24
h,e,a;t- nette Geste!
user9549915
19

Gelee , 15 Bytes

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

Ein monadischer Link, der eine Liste von Zahlen akzeptiert, die zurückgegeben werden, 1wenn eine andere Hitzewelle erkannt wurde 0.

Probieren Sie es online! oder sehen Sie sich die Testsuite an .

Wie?

Das Kriterium ist die Existenz eines Laufs mit mehr als vier Werten größer oder gleich 25, von denen mehr als zwei größer oder gleich 30 sein müssen.

Wenn wir durch fünf dividieren, wird das Kriterium zur Existenz eines Durchlaufs von mehr als vier Werten größer oder gleich fünf, von denen mehr als zwei größer oder gleich sechs sein müssen.

Wenn wir fünf von diesen Werten subtrahieren, wird das Kriterium zur Existenz eines Durchlaufs von mehr als vier Werten größer oder gleich Null, von denen mehr als zwei größer oder gleich Eins sein müssen.

Wenn wir das Vorzeichen dieser Werte nehmen (-1, 0 oder 1), wird das Kriterium zur Existenz eines Durchlaufs von mehr als vier Werten ungleich -1, von denen mehr als zwei gleich eins sein müssen.

Wenn wir diesen Werten eins hinzufügen (0, 1 oder 2), wird das Kriterium zur Existenz eines Durchlaufs von mehr als vier Werten ungleich Null, von denen mehr als zwei gleich zwei sein müssen.

Das Produkt einer Liste mit Nullen ist Null, und das Produkt einer Liste mit mehr als zwei Zweien (und den übrigen Einsen) ist mehr als vier. Dies bedeutet, dass das Kriterium in dieser angepassten Liste lautet, dass das Minimum des Produkts und die Länge größer als 4 sind.

: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
quelle
9

Haskell , 73 72 71 69 67 66 Bytes

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

Vielen Dank an @flawr und @Laikoni für jeweils zwei Bytes und @xnor für ein Byte!

Probieren Sie es online!

Gleiche Länge:

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

Probieren Sie es online!

Angs
quelle
9

C (clang) , 64 Bytes

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

Die Funktion o () gibt 1 für eine Hitzewelle oder 0 für eine andere zurück.

Danke an die magische Nummer 864 und an Udo Borkowski und Mathis für ihre Ideen.

Wie funktioniert es? Jede Folge von Zahlen wird mit einer Verkleinerungsoperation iteriert, beginnend mit dem Verkleinerungswert 1. Wenn eine Zahl> = 25 gesehen wird, wird die Verkleinerung mit 2 multipliziert. Wenn eine Zahl> = 30 gesehen wird, wird die Verkleinerung mit 2 und mit 3 multipliziert 6. Wenn eine Zahl <25 angezeigt wird, beginnt die Reduzierung erneut bei 1. Wenn die Reduzierung durch 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3 teilbar ist, wird eine Hitzewelle gefunden und das Ergebnis von Modulo-Operation ist 0, was zu einem reduzierten Wert von 0 und einem Rückgabewert von true führt.

Probieren Sie es online!

Roland Schmitz
quelle
Willkommen bei PPCG.
Muhammad Salman
Willkommen bei PPCG! Sehr schöne erste Antwort komplett mit Testfallsuite! Könnten Sie eine Erklärung hinzufügen, damit wir die Magie verstehen?
JayCe
Das ist eine wirklich elegante Lösung, gut gemacht :)
Lynn
7

APL (Dyalog Classic) , 21 bis 20 Byte

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

Probieren Sie es online!

Verwendet ⎕io←1

25 30⍸x ist 0, wenn x <25, 1, wenn 25 ≤ x <30, oder 2, wenn nicht

Wir berechnen kumulative Produkte ausgehend von (oder gleichwertig: endend an) allen möglichen Positionen, verwerfen die ersten 4 Produkte und erkennen das Vorhandensein von Produkten ≥8 (das sind 2 3 ).

ngn
quelle
6

Japt , 19 18 Bytes

ô<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.

Ich hoffe ich habe alle Diskussionen in den Kommentaren richtig verstanden.
Dank Shaggy ein Byte weniger .

Probieren Sie es online!

Nit
quelle
Dachte, dies würde kürzer ausfallen, als ich es las, konnte aber nur 18 Bytes verwalten .
Shaggy
@ Shaggy habe ich mir auch gedacht, aber ich konnte auch keine kürzere Version finden. Vielen Dank für den Hinweis!
Nit
1
Sieht so aus, als würden wir diesen Moment gewinnen :)
Shaggy
Zählen die Nicht-ASCII-Zeichen nicht als mehrere Bytes?
sudo
1
@sudo Diese Symbole sind alle Einzelbytes. Zum Beispiel würde 3 Bytes sein, ist aber ¨ein Byte. Die oben verwendeten Symbole wurden für die Golfsprache genau aus dem Grund ausgewählt, dass sie alle ein einzelnes Byte sind.
Nit
5

PowerShell , 121 Byte

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

Probieren Sie es online! oder Überprüfen Sie alle Testfälle

PowerShell verfügt nicht über das Äquivalent eines .someoder .everydergleichen, daher wird dies von Hand gerollt.

Wir nehmen die Eingabe $aals Array von ganzen Zahlen. Setzen Sie die Hilfsvariable $bauf die leere Zeichenfolge. Dann durchlaufen Sie jede ganze Zahl in $a. Innerhalb der Schleife, wenn die ganze Zahl -greaterthanor equal zu 25, fügen Sie unsere potentiellen Zeichenfolge $b, sonst setzen $ban der Pipeline und in die leere Zeichenfolge festgelegt.

Sobald Sie sich außerhalb der Schleife befinden, verknüpfen Sie die Pipeline-Ergebnisse mit Array $bund setzen Sie diese durch eine Where-ObjectKlausel |?{...}. Dadurch werden die Zeichenfolgen herausgezogen, die eine Elementlänge von -ge5(basierend auf der Aufteilung auf Leerzeichen) und eine Anzahl von Temps haben, die größer sind als das 30Sein -ge3. Diese Zeichenfolgen verbleiben in der Pipeline, sodass ein Wahrheitswert nicht leer ist (siehe den Link "Alle Testfälle überprüfen" für die Unterscheidung zwischen Wahrheiten und Falschheiten).

AdmBorkBork
quelle
versuchen Sie $args stattdessen param($a)und$a
mazzy
-2 Bytes...{$a=-split$_;$a.count-ge5-and($a|?{$_-ge30}).count-ge3}
mazzy
109 Bytes mit Arrays. speichern $args|%{if($_-ge25){$b+=$_}else{,$b;$b=@()}}-E{,$b}-B{,($b=@())}|?{$_.count-ge5-and($_|?{$_-ge30}).count-ge3}unter get-heatWave.ps1. Testskript regex101.com/r/lXdvIs/2
mazzy
103 Bytes$b=@();$args|%{if($_-ge25){$b+=$_}else{,$b;$b=@()}}-E{,$b}|?{$_.count-ge5-and($_|?{$_-ge30}).count-ge3}
mazzy
Was macht -Edas? Das kenne ich nicht.
AdmBorkBork
5

Jelly , 17 16 Bytes

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

Probieren Sie es online!

Wie es funktioniert

: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
quelle
5

Python 2 , 86 Bytes

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

Probieren Sie es online!

Stange
quelle
4

JavaScript (ES6), 63 51 Bytes

Gibt einen Booleschen Wert zurück.

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

Probieren Sie es online!

Arnauld
quelle
4

05AB1E , 20 Bytes

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

Probieren Sie es online!

Erläuterung

Π                    # 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
quelle
4

Batch, 119 Bytes

@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%

Übernimmt Eingaben als Befehlszeilenargumente und gibt 1 für eine Hitzewelle aus, ansonsten 0.

Neil
quelle
4

Python , 67 Bytes

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

Probieren Sie es online!

Zeitüberschreitung bei längeren Testfällen durch exponentielles Wachstum. Findet zusammenhängende Unterlisten, indem das erste oder letzte Element wiederholt abgehackt wird. Dass 3 Tage ≥ 30 ° C sind, wird anhand des drittgrößten Wertes überprüft sorted(l)[~2]. Die Basisfälle könnten möglicherweise kürzer sein, indem Wahrhaftigkeit / Falschheit ausgenutzt oder mit Fehler beendet wird.

xnor
quelle
4

APL (Dyalog Unicode) , 29 Byte

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

Probieren Sie es online!

∨/Gibt es irgendwelche Elemente, so dass

(5≤≢¨a)5 <die Anzahl der Tage in jeder Reihe ( ahat alle möglichen Reihen von Tagen)

und

3≤+/30≤3 ≤ die Gesamtzahl +/der Elemente, die ≥ 30 Zoll sind

↑a← die Matrix gebildet durch

e⊆⍨25≤e←⎕ die Reihe aufeinanderfolgender Elemente, die ≥ 25 sind

Kritixi Lithos
quelle
Dein erster Test wird unnötig kommentiert - es funktioniert.
ngn
@ngn Danke, dass
du das entdeckt hast
4

Kotlin , 57 Bytes

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

(-1 Byte durch Ersetzen des expliziten Parameters v-> durch den impliziten Parameter it )

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

(-16 Bytes mit der Funktion any {}, wie in der Ruby-Lösung von GB angegeben )

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

(-1 Byte danke Lynn: r> 0 && v <25 durch r * 25> r * v ersetzt)

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

Dieser Lambda-Ausdruck nimmt eine Liste und gibt true für eine Hitzewelle oder false zurück.

Danke an die magische Nummer 864 und an Udo Borkowski und Mathis für ihre Ideen.

Wie funktioniert es? Jede Folge von Zahlen wird mit einer beliebigen {} -Operation iteriert, beginnend mit dem Reduktionswert 1. Die Reduktion wird mit 2 multipliziert und mit 3 (2 * 3 = 6) multipliziert, wenn die Zahl größer oder gleich 30 ist. Wenn eine Zahl <25 ist wird gesehen, dass die Reduzierung wieder bei 1 beginnt. Wenn die Reduzierung durch 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3 teilbar ist, wird eine Hitzewelle gefunden, und das Ergebnis der Modulo-Operation ist 0, was ergibt Ein wahrer Rückgabewert im inneren Lambda, der von einer beliebigen {} -Operation aufgerufen wird, die dann die Iteration stoppt und den Wert true zurückgibt.

Probieren Sie es online!

Roland Schmitz
quelle
Nette Erklärung :)
JayCe
Ich denke, Ihre Byteanzahl sollte die gesamte Funktionsdeklaration widerspiegeln, nicht nur den Körper der Funktion. Es scheint mir so, als wäre es ein Ausschnitt.
Jonathan Frech
@ jonathan-frech, ich habe den Funktionskörper in einen etwas längeren Lambda-Ausdruck geändert, einschließlich der geschweiften Klammern, die wie in Java nicht optional sind. Ist das fair?
Roland Schmitz,
@RolandSchmitz Wenn ich andere Kotlin-Übermittlungen und Java-Lambda-Funktionsübermittlungen betrachte, schätze ich, dass die Byteanzahl der Funktionsdeklaration nicht berücksichtigt wird. was bedeutet, dass Ihre ursprüngliche Einreichung höchstwahrscheinlich gültig ist. Entschuldigung für meinen Kommentar, es schien mir nur seltsam, da ich finde, dass es sehr ausschnittsweise aussieht, da es kein gültiges Sprachkonstrukt ohne Typdeklaration ist.
Jonathan Frech
3

Wunder , 34 Bytes

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

Anwendungsbeispiel:

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

Erläuterung

Ausführliche Version:

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

Nehmen Sie sich überlappende Sequenzen von 5 aufeinanderfolgenden Elementen und prüfen Sie, ob in einer der Sequenzen alle Elemente> 25 und mehr als 2 Elemente> 30 vorhanden sind.

Mama Fun Roll
quelle
Hey, das hat nichts mit dir zu tun, aber der Facebook-Link auf deiner Website ist tot.
mbomb007
3

Stax , 23 Bytes

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

Führen Sie es aus und debuggen Sie es unter staxlang.xyz! Die Ausführung dauert sehr lange, daher habe ich die automatische Ausführung deaktiviert.

Entpackt (28 Bytes) und Erklärung

: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

Dies druckt alle Subarrays, die als Hitzewellen gezählt werden können, die genau dann falsch sind, wenn keine existieren.

Khuldraeseth na'Barya
quelle
3

Ruby , 89 Bytes

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

Probieren Sie es online!

lfvt
quelle
Ich glaube, es schlägt fehl, weil im zweiten Fall die + 30 Tage nicht alle innerhalb von fünf Tagen sind.
Stewie Griffin
Sehr schön. Sie können ein paar Bytes mit einem each_consAnsatz rasieren - Probieren Sie es online!
benj2240
3

Schale , 19 Bytes

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

Probieren Sie es online!

Die Verwendung von filter ( f) ist ein Byte kürzer als die Verwendung von check mit einem logischen und ( &) , außerdem wäre es sehr schön, die ±- Kosten von 2 Bytes loszuwerden :(

Erläuterung

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
ბიმო
quelle
3

R , 111 93 71 67 66 Bytes

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

Probieren Sie es online!

Schamloser Hafen der Antworten von Roland Schmitz . -4 Bytes dank Roland und -1 dank Giuseppe.

TIO-Links zur Funktionsversion.

Die vorherige Version extrahierte aufeinanderfolgende Tage> 25 mit rleund sparte dank Giuseppe satte 18 Bytes!

JayCe
quelle
Wenn Sie Fanstelle von verwenden T, können Sie tun F=F|"if"(cond,(expr),0)und dann zurückkehren F, um 6-ish-Bytes zu speichern. Sie haben auch ein unnötiges Klammerpaar, (1-z[i]):0aber ich denke, das könnte 1-z[i]:1sowieso sein, um noch ein paar Bytes zu retten ...
Giuseppe
^ Ich wollte den obigen Kommentar einreichen, als mir eine andere Idee einfiel, und es gelang mir, eine Sub-100-Byte-Lösung zu finden! Es ist 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}aber vorsichtig, wenn Sie PPCG in TIO einfügen, da sich manchmal nicht druckbare Dateien einschleichen ...
Giuseppe
Das ist fantastisch! Es gibt wahrscheinlich einen noch kürzeren Weg, Jonathan Allans Mathematik zu nutzen ...
JayCe
Schön, dass Sie noch ein paar Bytes sparen können, wenn Sie den inneren Teil von (i * 2 * (1+ (2 * (j> 29))) nach (i * (2 + 4 * (j> 29)) vereinfachen. ))
Roland Schmitz
@ RolandSchmitz sehr wahr!
JayCe
3

Schnelle 4 , 50 Bytes

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

Probieren Sie es online!

Der Abschlussausdruck gibt 0 für eine Hitzewelle oder> 0 zurück.

Erstellt in Zusammenarbeit mit Roland Schmitz und Mathis.

Wie funktioniert es? Jede Folge von Zahlen wird mit einer Verkleinerungsoperation iteriert, beginnend mit dem Verkleinerungswert 1. Wenn eine Zahl> = 25 gesehen wird, wird die Verkleinerung mit 2 multipliziert. Wenn eine Zahl> = 30 gesehen wird, wird die Verkleinerung mit 2 und mit 3 multipliziert 6. Wenn eine Zahl <25 angezeigt wird, beginnt die Reduzierung erneut bei 1. Wenn die Reduzierung durch 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3 teilbar ist, wird eine Hitzewelle gefunden und das Ergebnis von Modulo-Betrieb ist 0, was zu einem Reduktionswert von 0 führt. Erst wenn eine Hitzewelle gefunden wurde, kann die Reduktion zu 0 werden. Wenn der Reduktionswert 0 ist, wird sie für alle zukünftigen Reduktionen, dh auch für das Endergebnis, 0 sein.

Udo Borkowski
quelle
3

Python 2 , 66 63 Bytes

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

Probieren Sie es online!

-3 Bytes dank Lynn

Wie funktioniert es? Jede Folge von Zahlen wird mit einer Verkleinerungsoperation iteriert, beginnend mit dem Verkleinerungswert 1. Wenn eine Zahl> = 25 gesehen wird, wird die Verkleinerung mit 2 multipliziert. Wenn eine Zahl> = 30 gesehen wird, wird die Verkleinerung mit 2 und mit 3 multipliziert 6. Wenn eine Zahl <25 angezeigt wird, beginnt die Reduzierung erneut bei 1. Wenn die Reduzierung durch 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3 teilbar ist, wird eine Hitzewelle gefunden und das Ergebnis von Modulo-Betrieb ist 0, was zu einem Reduktionswert von 0 führt. Erst wenn eine Hitzewelle gefunden wurde, kann die Reduktion zu 0 werden. Wenn der Reduktionswert 0 ist, wird sie für alle zukünftigen Reduktionen, dh auch für das Endergebnis, 0 sein.

Eine lesbarere, aber längere Version sieht so aus:

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

Entfernen Sie zusätzliche Leerzeichen / Klammern und ersetzen Sie diese x if cond else ydurch (y,x)[cond]gives

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

Lynn schlug vor, die Bedingung zu verkürzen 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

ergebend

lambda a:reduce(lambda b,c:(b*(6,2)[c<30]%864,1)[b*25>b*c],a,1)
Udo Borkowski
quelle
Sie müssen auch die Import-Anweisung enthalten :)
Muhammad Salman
1
Sie müssen eigentlich kein Reduce aus importieren functools, es ist in Python 2 integriert !
Lynn
1
Sie können überprüfen, ob b*25>b*c3 Bytes gespeichert sind. Dies könnte auf viele der Lösungen zutreffen, die diesen Ansatz in verschiedenen Sprachen verfolgen :)
Lynn
@Lynn Vielen Dank. Ich habe die Lösung entsprechend aktualisiert.
Udo Borkowski
2

Pyth, 23 Bytes

f&glT5&>T]25gePPT30SM.:

Probieren Sie es hier aus

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.
Gedächtnisstütze
quelle
2

Perl 6 , 54 52 Bytes

{$_>5&.grep(*>29)>2}o{any kv classify $+=25>*,0,|$_}

Probieren Sie es online!

nwellnhof
quelle
2
Ich würde gerne eine Erklärung zu diesem Code lesen!
Lynn