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, 30
handelt 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]
Antworten:
C (GCC) ,
8875 BytesProbieren Sie es online!
quelle
h,e,a;t
- nette Geste!Gelee , 15 Bytes
Ein monadischer Link, der eine Liste von Zahlen akzeptiert, die zurückgegeben werden,
1
wenn eine andere Hitzewelle erkannt wurde0
.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.
quelle
Haskell ,
737271696766 BytesVielen Dank an @flawr und @Laikoni für jeweils zwei Bytes und @xnor für ein Byte!
Probieren Sie es online!
Gleiche Länge:
Probieren Sie es online!
quelle
C (clang) , 64 Bytes
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!
quelle
Python 3 , 79 Bytes
Probieren Sie es online!
quelle
APL (Dyalog Classic) ,
21 bis20 ByteProbieren Sie es online!
Verwendet
⎕io←1
25 30⍸x
ist 0, wenn x <25, 1, wenn 25 ≤ x <30, oder 2, wenn nichtWir 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 ).
quelle
Japt ,
1918 BytesIch hoffe ich habe alle Diskussionen in den Kommentaren richtig verstanden.
Dank Shaggy ein Byte weniger .
Probieren Sie es online!
quelle
漢
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.PowerShell , 121 Byte
Probieren Sie es online! oder Überprüfen Sie alle Testfälle
PowerShell verfügt nicht über das Äquivalent eines
.some
oder.every
dergleichen, daher wird dies von Hand gerollt.Wir nehmen die Eingabe
$a
als Array von ganzen Zahlen. Setzen Sie die Hilfsvariable$b
auf die leere Zeichenfolge. Dann durchlaufen Sie jede ganze Zahl in$a
. Innerhalb der Schleife, wenn die ganze Zahl-g
reaterthanore
qual zu25
, fügen Sie unsere potentiellen Zeichenfolge$b
, sonst setzen$b
an der Pipeline und in die leere Zeichenfolge festgelegt.Sobald Sie sich außerhalb der Schleife befinden, verknüpfen Sie die Pipeline-Ergebnisse mit Array
$b
und setzen Sie diese durch eineWhere-Object
Klausel|?{...}
. 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 das30
Sein-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).quelle
$args
stattdessenparam($a)
und$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}
unterget-heatWave.ps1
. Testskript regex101.com/r/lXdvIs/2$b=@();$args|%{if($_-ge25){$b+=$_}else{,$b;$b=@()}}-E{,$b}|?{$_.count-ge5-and($_|?{$_-ge30}).count-ge3}
-E
das? Das kenne ich nicht.Jelly ,
1716 BytesProbieren Sie es online!
Wie es funktioniert
quelle
Python 2 , 86 Bytes
Probieren Sie es online!
quelle
JavaScript (ES6),
6351 BytesGibt einen Booleschen Wert zurück.
Probieren Sie es online!
quelle
05AB1E , 20 Bytes
Probieren Sie es online!
Erläuterung
quelle
Batch, 119 Bytes
Übernimmt Eingaben als Befehlszeilenargumente und gibt 1 für eine Hitzewelle aus, ansonsten 0.
quelle
Python , 67 Bytes
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.quelle
JavaScript (Node.js) , 48 Byte
Probieren Sie es online!
ziemlich schlecht
quelle
Haskell , 64 Bytes
Probieren Sie es online!
quelle
APL (Dyalog Unicode) , 29 Byte
Probieren Sie es online!
∨/
Gibt es irgendwelche Elemente, so dass(5≤≢¨a)
5 <die Anzahl≢
der Tage in jeder Reihe (a
hat alle möglichen Reihen von Tagen)∧
und3≤+/30≤
3 ≤ die Gesamtzahl+/
der Elemente, die ≥ 30 Zoll sind↑a←
die Matrix gebildet durche⊆⍨25≤e←⎕
die Reihe aufeinanderfolgender Elemente, die ≥ 25 sindquelle
Kotlin , 57 Bytes
(-1 Byte durch Ersetzen des expliziten Parameters v-> durch den impliziten Parameter it )
(-16 Bytes mit der Funktion any {}, wie in der Ruby-Lösung von GB angegeben )
(-1 Byte danke Lynn: r> 0 && v <25 durch r * 25> r * v ersetzt)
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!
quelle
Wunder , 34 Bytes
Anwendungsbeispiel:
Erläuterung
Ausführliche Version:
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.
quelle
Jelly , 21 Bytes
Probieren Sie es online!
quelle
Stax , 23 Bytes
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
Dies druckt alle Subarrays, die als Hitzewellen gezählt werden können, die genau dann falsch sind, wenn keine existieren.
quelle
Ruby , 89 Bytes
Probieren Sie es online!
quelle
each_cons
Ansatz rasieren - Probieren Sie es online!Schale , 19 Bytes
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
quelle
Retina , 31 Bytes
Probieren Sie es online!
quelle
R ,
111 93 71 6766 BytesProbieren 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
rle
und sparte dank Giuseppe satte 18 Bytes!quelle
F
anstelle von verwendenT
, können Sie tunF=F|"if"(cond,(expr),0)
und dann zurückkehrenF
, um 6-ish-Bytes zu speichern. Sie haben auch ein unnötiges Klammerpaar,(1-z[i]):0
aber ich denke, das könnte1-z[i]:1
sowieso sein, um noch ein paar Bytes zu retten ...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 ...Schnelle 4 , 50 Bytes
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.
quelle
Python 2 ,
6663 BytesProbieren 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:
Entfernen Sie zusätzliche Leerzeichen / Klammern und ersetzen Sie diese
x if cond else y
durch(y,x)[cond]
givesLynn 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
quelle
functools
, es ist in Python 2 integriert !b*25>b*c
3 Bytes gespeichert sind. Dies könnte auf viele der Lösungen zutreffen, die diesen Ansatz in verschiedenen Sprachen verfolgen :)Pyth, 23 Bytes
Probieren Sie es hier aus
quelle
Befunge-98 , 61 Bytes
Probieren Sie es online!
quelle
Perl 6 ,
5452 BytesProbieren Sie es online!
quelle