Wykryj fale upałów


48

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, 308-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]

2
Czy temperatura jest gwarantowana poniżej 100 stopni Celsjusza?
FryAmTheEggman

3
@FryAmTheEggman Cóż, w Holandii, tak :), ale nie chcę, aby twoja odpowiedź nadużywała tego faktu, więc nie.
Lynn

1
@HatWizard Tak, w porządku. Na przykład „Crash / Don't crash” też jest w porządku.
Lynn

2
Hej @ Lynn to było wielkie wyzwanie i nadal jest :-)
Roland Schmitz

1
@RolandSchmitz Dziękujemy! Jestem szczęśliwy zaskoczony kreatywnymi odpowiedziami, które pojawiły się tak późno w życiu. 🎉
Lynn,

Odpowiedzi:



19

Galaretka , 15 bajtów

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

Monadyczny link akceptujący listę liczb, który zwraca się w 1przypadku wykrycia innej fali upałów 0.

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.

: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

9

Haskell , 73 72 71 69 67 66 66 bajtów

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

Dzięki @flawr i @Laikoni za dwa bajty każdy i @xnor za bajt!

Wypróbuj online!

Równa długość:

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

Wypróbuj online!


9

C (brzęk) , 64 bajty

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

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!


Witamy w PPCG.
Muhammad Salman

Witamy w PPCG! Bardzo ładna pierwsza odpowiedź wraz z zestawem przypadków testowych! Czy możesz dodać wyjaśnienie, abyśmy rozumieli magię?
JayCe

To naprawdę eleganckie rozwiązanie, dobra robota :)
Lynn,


7

APL (Dyalog Classic) , 21 20 bajtów

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

Wypróbuj online!

wykorzystuje ⎕io←1

25 30⍸x wynosi 0, jeśli x <25, 1, jeśli 25 ≤ x <30, lub 2 w innym przypadku

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


6

Japt , 19 18 bajtów

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

Mam nadzieję, że poprawnie wszystkie dyskusje w komentarzach.
Ogolony jeden bajt dzięki Shaggy .

Wypróbuj online!


Myślałem, że to zadziała krócej, gdy czytałem, ale udało mi się obsłużyć tylko 18 bajtów .
Kudłaty

@Shaggy Też tak myślałem, ale nie mogłem też znaleźć krótszej wersji. Wielkie dzięki za wskaźnik!
Nit

1
Wygląda na to, że w tej chwili wygrywamy :)
Kudłaty

Czy znaki spoza ASCII nie liczą się jako wiele bajtów?
sudo

1
@sudo Wszystkie te symbole są jednobajtowe. Na przykład 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.
Nit

5

PowerShell , 121 bajtów

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

Wypróbuj online! lub Zweryfikuj wszystkie przypadki testowe

Program PowerShell nie ma odpowiednika a .somelub .everypodobnego, więc jest on rzutowany ręcznie.

Pobieramy dane wejściowe $ajako tablicę liczb całkowitych. Ustaw zmienną pomocniczą $bna pusty ciąg. Następnie przejdź przez każdą liczbę całkowitą $a. Wewnątrz pętli, jeśli liczba całkowita jest -greaterthanor equal, aby 25dodać go do naszego potencjalnego ciąg $b, inaczej umieścić $bna rurociągu i ustaw go na pusty ciąg.

Po wyjściu z pętli, konkatenuj tablicę wyników potoku $bi przeprowadź je przez Where-Objectklauzulę |?{...}. 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ż 30istnienie -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).


spróbuj użyć $args zamiast tego param($a)i$a
mazzy

-2 bajty...{$a=-split$_;$a.count-ge5-and($a|?{$_-ge30}).count-ge3}
mazzy

109 bajtów z tablicami. zapisz $args|%{if($_-ge25){$b+=$_}else{,$b;$b=@()}}-E{,$b}-B{,($b=@())}|?{$_.count-ge5-and($_|?{$_-ge30}).count-ge3}jako get-heatWave.ps1. Skrypt testowy regex101.com/r/lXdvIs/2
mazzy

103 bajty$b=@();$args|%{if($_-ge25){$b+=$_}else{,$b;$b=@()}}-E{,$b}|?{$_.count-ge5-and($_|?{$_-ge30}).count-ge3}
mazzy

Co ma -Ezrobić? Nie znam tego.
AdmBorkBork

5

Galaretka , 17 16 bajtów

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

Wypróbuj online!

Jak to działa

: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).



4

05AB1E , 20 bajtów

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

Wypróbuj online!

Wyjaśnienie

Œ                     # 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

4

Partia, 119 bajtów

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

Pobiera dane wejściowe jako argumenty wiersza poleceń i wyjścia 1 dla fali upałów, w przeciwnym razie 0.


4

Python , 67 bajtów

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

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.




4

APL (Dyalog Unicode) , 29 bajtów

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

Wypróbuj online!

∨/czy są jakieś takie elementy

(5≤≢¨a)5 <suma dni w każdej serii ( azawiera wszystkie możliwe serie dni)

i

3≤+/30≤3 ≤ całkowita +/liczba elementów, które mają ≥ 30 cali

↑a← matryca utworzona przez

e⊆⍨25≤e←⎕ szereg kolejnych elementów, które są ≥ 25


Twój pierwszy test został niepotrzebnie skomentowany - działa.
ngn

@ngn Dzięki za wykrycie tego, naprawiono
Kritixi Lithos

4

Kotlin , 57 bajtów

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

(-1 bajt przez zastąpienie jawnego parametru v-> parametrem niejawnym it )

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

(-16 bajtów przy użyciu dowolnej operacji {}, jak widać w GB Ruby Solution )

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

(-1 bajtowe dzięki Lynn: zastąpiono r> 0 i& v <25 z 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}

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!


Ładne wyjaśnienie :)
JayCe,

Myślę, że twoja liczba bajtów powinna odzwierciedlać całą deklarację funkcji, a nie tylko jej treść. Tak jak jest teraz, wydaje mi się, że to urywek.
Jonathan Frech

@ jonathan-frech, zmieniłem ciało funkcji na nieco dłuższe wyrażenie lambda, w tym nawiasy klamrowe, które nie są opcjonalne, jak w Javie. Czy to jest sprawiedliwe?
Roland Schmitz,

@RolandSchmitz Patrząc na inne przesłania Kotlina i Java funkcji lambda, wydaje się, że nie uwzględniono licznika bajtów deklaracji funkcji; co oznacza, że ​​Twoje oryginalne zgłoszenie jest najprawdopodobniej ważne. Przepraszam za mój komentarz, po prostu wydawało mi się to dziwne, ponieważ uważam, że wygląda bardzo snippet-esk, ponieważ nie jest prawidłową konstrukcją językową bez deklaracji typu.
Jonathan Frech

3

Cud , 34 bajty

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

Przykład użycia:

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

Wyjaśnienie

Pełna wersja:

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

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.


Hej, to nie ma związku, ale link do facebooka na twojej stronie jest martwy.
mbomb007


3

Stax , 23 bajty

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

Uruchom i debuguj na staxlang.xyz! Trwa to długo, więc wyłączyłem automatyczne uruchamianie.

Rozpakowano (28 bajtów) i wyjaśnienie

: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

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.



3

Łuska , 19 bajtów

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

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

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


3

R , 111 93 71 67 66 bajtów

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

Wypró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ą rlei zapisała aż 18 bajtów dzięki Giuseppe!


jeśli użyjesz Fzamiast T, możesz to zrobić, F=F|"if"(cond,(expr),0)a następnie powrócić, Faby zapisać 6-bajtowe bajty. Masz też niepotrzebną parę nawiasów, (1-z[i]):0ale myślę, że to i 1-z[i]:1tak może uratować kolejną parę bajtów ...
Giuseppe,

^ Już miałem przesłać powyższy komentarz, gdy przyszedł mi do głowy inny pomysł i udało mi się znaleźć rozwiązanie poniżej 100 bajtów! Należy 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ę ...
Giuseppe

To jest fantastyczne! Prawdopodobnie jest jeszcze krótsza droga wykorzystująca matematykę Jonathana Allana ...
JayCe

Fajnie, możesz nawet zaoszczędzić trochę więcej bajtów, jeśli uprościsz wewnętrzną część od (i * 2 * (1+ (2 * (j> 29)))) do (i * (2 + 4 * (j> 29)) ))
Roland Schmitz,

@RolandSchmitz bardzo prawda!
JayCe,

3

Swift 4 , 50 bajtów

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

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.


3

Python 2 , 66 63 bajtów

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

Wypró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:

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

Usunięcie dodatkowych spacji / nawiasów i zastąpienie x if cond else yprzez (y,x)[cond]daje

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

Lynn 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

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

Musisz także dołączyć instrukcję importu :)
Muhammad Salman

1
W rzeczywistości nie musisz importować redukcji z functools, jest to wbudowane w Python 2 !
Lynn,

1
Możesz sprawdzić, czy b*25>b*ci zapisać 3 bajty; może to dotyczyć wielu rozwiązań przyjmujących takie podejście w różnych językach :)
Lynn

@Lynn Wielkie dzięki. Odpowiednio zaktualizowałem rozwiązanie.
Udo Borkowski

2

Pyth, 23 bajty

f&glT5&>T]25gePPT30SM.:

Wypróbuj tutaj

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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.