tło
Królewski Holenderski Instytut Meteorologiczny definiuje falę upałów * jako serię co najmniej 5 kolejnych dni o temperaturze ≥25 ° C („pogoda letnia”), tak że co najmniej 3 z tych dni to ≥30 ° C („pogoda tropikalna” ).
Tropikalnej pogody nie trzeba mierzyć kolejno: na przykład: 30, 25, 30, 26, 27, 28, 32, 30
8-dniowa fala upałów z 4 dniami tropikalnej pogody.
* (Cóż, według holenderskich standardów.)
Wyzwanie
Biorąc pod uwagę niepustą listę dodatnich liczb całkowitych reprezentujących pomiary temperatury Celsjusza z kolejnych dni, zdecyduj, czy ta lista zawiera falę upałów (zgodnie z powyższą definicją).
Najkrótsza odpowiedź w bajtach wygrywa.
Przypadki testowe
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]
Prawda:
[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]
Odpowiedzi:
C (gcc) ,
8875 bajtówWypróbuj online!
źródło
h,e,a;t
- miły dotyk!Galaretka , 15 bajtów
Monadyczny link akceptujący listę liczb, który zwraca się w
1
przypadku wykrycia innej fali upałów0
.Wypróbuj online! lub zobacz zestaw testowy .
W jaki sposób?
Kryterium to istnienie serii o więcej niż czterech wartościach większych lub równych 25, z których więcej niż dwie muszą być większe lub równe 30.
Jeśli podzielimy przez pięć, kryteria stają się istnieniem szeregu o więcej niż czterech wartościach większych lub równych pięciu, z których więcej niż dwie muszą być większe lub równe sześciu.
Jeśli odejmiemy pięć od tych wartości, kryteria stają się istnieniem serii więcej niż czterech wartości większych lub równych zero, z których więcej niż dwie muszą być większe lub równe jednej.
Jeśli weźmiemy znak tych wartości (otrzymanie -1, 0 lub 1), kryterium staje się istnieniem szeregu więcej niż czterech wartości nie równych -1, z których więcej niż dwie muszą być równe jednej.
Jeśli dodamy jedną z tych wartości (otrzymanie 0, 1 lub 2), kryterium stanie się ciągiem więcej niż czterech wartości nie równych zeru, z których więcej niż dwie muszą być równe dwóm.
Iloczyn listy zawierającej dowolne zera to zero, a iloczyn listy zawierającej więcej niż dwa dwójki (a reszta to jedynki) to więcej niż cztery. Oznacza to, że kryteria na tej skorygowanej liście stają się tym, że minimum produktu i długość jest większa niż 4.
źródło
Haskell ,
737271696766 66 bajtówDzięki @flawr i @Laikoni za dwa bajty każdy i @xnor za bajt!
Wypróbuj online!
Równa długość:
Wypróbuj online!
źródło
C (brzęk) , 64 bajty
Funkcja o () zwraca 1 dla fali upałów lub 0 innych.
Dzięki magicznej liczbie 864 oraz Udo Borkowskiemu i Mathisowi za ich pomysły.
Jak działa jeśli działa? Każda sekwencja liczb jest iterowana z operacją zmniejszania rozpoczynającą się od wartości zmniejszenia 1. Jeśli zostanie zauważona liczba> = 25, redukcja zostanie pomnożona przez 2. Jeśli liczba> = 30 zostanie zauważona, redukcja zostanie pomnożona przez 2, a przez 3 = 6. Jeśli zostanie wyświetlona liczba <25, redukcja rozpoczyna się ponownie od 1. Jeśli redukcja jest podzielna przez 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3, wówczas zostaje znaleziona fala upałów i wynik Operacja modulo wynosi 0, co powoduje zmniejszenie wartości 0 i zwrócenie wartości true.
Wypróbuj online!
źródło
Python 3 , 79 bajtów
Wypróbuj online!
źródło
APL (Dyalog Classic) ,
2120 bajtówWypróbuj online!
wykorzystuje
⎕io←1
25 30⍸x
wynosi 0, jeśli x <25, 1, jeśli 25 ≤ x <30, lub 2 w innym przypadkuobliczamy skumulowane produkty tych, zaczynając od (lub równoważnie: kończąc na) wszystkich możliwych lokalizacjach, odrzucamy pierwsze 4 produkty i wykrywamy obecność produktów ≥8 (czyli 2 3 )
źródło
Japt ,
1918 bajtówMam nadzieję, że poprawnie wszystkie dyskusje w komentarzach.
Ogolony jeden bajt dzięki Shaggy .
Wypróbuj online!
źródło
漢
byłoby 3 bajty, ale¨
jeden bajt. Symbole użyte powyżej zostały wybrane dla języka golfowego właśnie dlatego, że wszystkie są jednym bajtem.PowerShell , 121 bajtów
Wypróbuj online! lub Zweryfikuj wszystkie przypadki testowe
Program PowerShell nie ma odpowiednika a
.some
lub.every
podobnego, więc jest on rzutowany ręcznie.Pobieramy dane wejściowe
$a
jako tablicę liczb całkowitych. Ustaw zmienną pomocniczą$b
na pusty ciąg. Następnie przejdź przez każdą liczbę całkowitą$a
. Wewnątrz pętli, jeśli liczba całkowita jest-g
reaterthanore
qual, aby25
dodać go do naszego potencjalnego ciąg$b
, inaczej umieścić$b
na rurociągu i ustaw go na pusty ciąg.Po wyjściu z pętli, konkatenuj tablicę wyników potoku
$b
i przeprowadź je przezWhere-Object
klauzulę|?{...}
. Wyciąga to ciągi znaków, które mają długość elementu-ge5
(na podstawie podziału na białe znaki) i liczbę temps większą niż30
istnienie-ge3
. Te ciągi są pozostawione w potoku, więc prawdziwa wartość nie jest pusta (zobacz link „weryfikuj wszystkie przypadki testowe” dla rozróżnienia prawda / falsey).źródło
$args
zamiast tegoparam($a)
i$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}
jakoget-heatWave.ps1
. Skrypt testowy regex101.com/r/lXdvIs/2$b=@();$args|%{if($_-ge25){$b+=$_}else{,$b;$b=@()}}-E{,$b}|?{$_.count-ge5-and($_|?{$_-ge30}).count-ge3}
-E
zrobić? Nie znam tego.Galaretka ,
1716 bajtówWypróbuj online!
Jak to działa
źródło
Python 2 , 86 bajtów
Wypróbuj online!
źródło
JavaScript (ES6),
6351 bajtówZwraca wartość logiczną.
Wypróbuj online!
źródło
05AB1E , 20 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Partia, 119 bajtów
Pobiera dane wejściowe jako argumenty wiersza poleceń i wyjścia 1 dla fali upałów, w przeciwnym razie 0.
źródło
Python , 67 bajtów
Wypróbuj online!
Przekracza dłuższe przypadki testowe z powodu wykładniczego wzrostu. Znajduje ciągłe podlisty, wielokrotnie odcinając pierwszy lub ostatni element. To, że 3 dni są w temperaturze ≥30 ° C, sprawdza się, patrząc na trzecią co do wielkości wartość
sorted(l)[~2]
. Przypadki podstawowe mogą być krótsze, wykorzystując prawdę / falsey lub kończąc się błędem.źródło
JavaScript (Node.js) , 48 bajtów
Wypróbuj online!
całkiem zły
źródło
Haskell , 64 bajty
Wypróbuj online!
źródło
APL (Dyalog Unicode) , 29 bajtów
Wypróbuj online!
∨/
czy są jakieś takie elementy(5≤≢¨a)
5 <suma≢
dni w każdej serii (a
zawiera wszystkie możliwe serie dni)∧
i3≤+/30≤
3 ≤ całkowita+/
liczba elementów, które mają ≥ 30 cali↑a←
matryca utworzona przeze⊆⍨25≤e←⎕
szereg kolejnych elementów, które są ≥ 25źródło
Kotlin , 57 bajtów
(-1 bajt przez zastąpienie jawnego parametru v-> parametrem niejawnym it )
(-16 bajtów przy użyciu dowolnej operacji {}, jak widać w GB Ruby Solution )
(-1 bajtowe dzięki Lynn: zastąpiono r> 0 i& v <25 z r * 25> r * v)
To wyrażenie lambda przyjmuje Listę i zwraca true dla fali upałów lub false w innym przypadku.
Dzięki magicznej liczbie 864 oraz Udo Borkowskiemu i Mathisowi za ich pomysły.
Jak działa jeśli działa? Każda sekwencja liczb jest iterowana dowolną operacją {} rozpoczynającą się od wartości redukcji 1. Redukcja jest mnożona przez 2 i mnożona przez 3 (2 * 3 = 6), jeśli liczba jest większa lub równa 30. Jeśli liczba <25 widać redukcję zaczyna się ponownie od 1. Jeśli redukcja jest podzielna przez 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3, wówczas zostaje znaleziona fala upałów, a wynikiem operacji modulo jest 0, co powoduje prawdziwa wartość zwracana w wewnętrznej lambda wywołanej z dowolnej operacji {} , która następnie przestaje iterować i zwraca wartość true.
Wypróbuj online!
źródło
Cud , 34 bajty
Przykład użycia:
Wyjaśnienie
Pełna wersja:
Weź nakładające się sekwencje 5 kolejnych elementów, a następnie sprawdź, czy którakolwiek z sekwencji ma wszystkie pozycje> 25 i więcej niż 2 pozycje> 30.
źródło
Galaretka , 21 bajtów
Wypróbuj online!
źródło
Stax , 23 bajty
Uruchom i debuguj na staxlang.xyz! Trwa to długo, więc wyłączyłem automatyczne uruchamianie.
Rozpakowano (28 bajtów) i wyjaśnienie
Spowoduje to wydrukowanie wszystkich podpowierzchni, które można zaliczyć do fal upałów, co będzie fałszem, jeśli tylko wtedy, gdy nie będzie.
źródło
Rubinowy , 89 bajtów
Wypróbuj online!
źródło
each_cons
podejściu - Wypróbuj online!Łuska , 19 bajtów
Wypróbuj online!
Użycie filter (
f
) jest o jeden bajt krótsze niż użycie sprawdzania za pomocą logiki i (&
) , również byłoby naprawdę miło pozbyć się±
- kosztującego 2 bajty :(Wyjaśnienie
źródło
Retina , 31 bajtów
Wypróbuj online!
źródło
R ,
111 93 71 6766 bajtówWypróbuj online!
Bezwstydny port Roland Schmitz za odpowiedzi . -4 bajty dzięki Rolandowi i -1 dzięki Giuseppe.
Łącza TIO do wersji funkcjonalnej.
Poprzednia wersja wyodrębniała kolejne dni> 25 za pomocą
rle
i zapisała aż 18 bajtów dzięki Giuseppe!źródło
F
zamiastT
, możesz to zrobić,F=F|"if"(cond,(expr),0)
a następnie powrócić,F
aby zapisać 6-bajtowe bajty. Masz też niepotrzebną parę nawiasów,(1-z[i]):0
ale myślę, że to i1-z[i]:1
tak może uratować kolejną parę bajtów ...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}
jednak ostrożnie wklejać PPCG do TIO, ponieważ czasem w drukach wkrada się ...Swift 4 , 50 bajtów
Wypróbuj online!
Wyrażenie zamknięcia zwraca 0 dla fali upałów lub> 0 jeszcze.
Utworzono we współpracy z Rolandem Schmitzem i Mathisem.
Jak działa jeśli działa? Każda sekwencja liczb jest iterowana z operacją zmniejszania rozpoczynającą się od wartości zmniejszenia 1. Jeśli zostanie zauważona liczba> = 25, redukcja zostanie pomnożona przez 2. Jeśli liczba> = 30 zostanie zauważona, redukcja zostanie pomnożona przez 2, a przez 3 = 6. Jeśli zostanie wyświetlona liczba <25, redukcja rozpoczyna się ponownie od 1. Jeśli redukcja jest podzielna przez 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3, wówczas zostaje znaleziona fala upałów i wynik działanie modulo wynosi 0, co powoduje zmniejszenie wartości o 0. Tylko wtedy, gdy znaleziono falę cieplną, redukcja może stać się 0. Gdy wartość redukcji będzie równa 0, będzie to 0 dla wszystkich przyszłych redukcji, tj. również dla wyniku końcowego.
źródło
Python 2 ,
6663 bajtówWypróbuj online!
-3 bajty dzięki Lynn
Jak działa jeśli działa? Każda sekwencja liczb jest iterowana z operacją zmniejszania rozpoczynającą się od wartości zmniejszenia 1. Jeśli zostanie zauważona liczba> = 25, redukcja zostanie pomnożona przez 2. Jeśli liczba> = 30 zostanie zauważona, redukcja zostanie pomnożona przez 2, a przez 3 = 6. Jeśli zostanie wyświetlona liczba <25, redukcja rozpoczyna się ponownie od 1. Jeśli redukcja jest podzielna przez 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3, wówczas zostaje znaleziona fala upałów i wynik działanie modulo wynosi 0, co powoduje zmniejszenie wartości o 0. Tylko wtedy, gdy znaleziono falę cieplną, redukcja może stać się 0. Gdy wartość redukcji będzie równa 0, będzie to 0 dla wszystkich przyszłych redukcji, tj. również dla wyniku końcowego.
Bardziej czytelna, ale dłuższa wersja wygląda następująco:
Usunięcie dodatkowych spacji / nawiasów i zastąpienie
x if cond else y
przez(y,x)[cond]
dajeLynn zasugerowała skrócenie warunku
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
powodując
źródło
functools
, jest to wbudowane w Python 2 !b*25>b*c
i zapisać 3 bajty; może to dotyczyć wielu rozwiązań przyjmujących takie podejście w różnych językach :)Pyth, 23 bajty
Wypróbuj tutaj
źródło
Befunge-98 , 61 bajtów
Wypróbuj online!
źródło
Perl 6 ,
5452 bajtówWypróbuj online!
źródło