Isı dalgalarını algıla


48

Arka fon

Hollanda Kraliyet Meteoroloji Enstitüsü , bir sıcaklık dalgasını * arka arkaya en az 5 °25 ° C hava günü (“yazlık hava”) dizisi olarak tanımlar ; öyle ki , o günlerin en az 3 ≥30 ° C (“tropikal hava”) olduğu ).

Tropik havanın art arda ölçülmesi gerekmez: örneğin: 30, 25, 30, 26, 27, 28, 32, 304 günlük tropikal hava ile 8 günlük uzun bir sıcaklık dalgasıdır.

* (Hollanda standartlarına göre.)

Meydan okuma

Art arda günlerden itibaren Celsius sıcaklık ölçümlerini temsil eden boş olmayan bir pozitif tamsayı listesi göz önüne alındığında, bu listenin bir ısı dalgası içerip içermediğine karar verin (yukarıdaki tanımlamaya göre).

Bayt cinsinden en kısa cevap kazanır.

Test durumları

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]

Doğru:

[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
Sıcaklığın 100 Santigrat'ın altında olması mı garanti ediliyor?
FryAmTheEggman

3
@FryAmTheEggman Hollanda'da, evet :), ama cevabınızın bu gerçeği kötüye kullanmasını istemiyorum, bu yüzden hayır.
Lynn,

1
@HatWizard Evet, tamam. Örneğin “çarpışma / çökme” de iyidir.
Lynn

2
Hey @ Lynn, bu büyük bir zorluktu ve hala :-)
Roland Schmitz

1
@RolandSchmitz Teşekkürler! Mücadelenin ömrünün sonlarına çok geç gelen yaratıcı cevaplar beni şaşırttı. 🎉
Lynn

Yanıtlar:



19

Jöle , 15 bayt

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

Bir 1ısı dalgası tespit edildiğinde dönen bir sayı listesini kabul eden bir monadik bağlantı 0.

Çevrimiçi deneyin! veya test odasına bakın .

Nasıl?

Kriterler, 25'den büyük veya 30'a eşit veya daha büyük olması gereken dört değerden daha büyük bir değerin varlığıdır.

Beşe bölünürsek, ölçüt beşe eşit veya ondan büyük dört değerden oluşan bir çalışmanın varlığına dönüşür; bu değerin ikiden fazlasının altıya eşit veya daha büyük olması gerekir.

Beşi bu değerlerden çıkarırsak, ölçüt, sıfıra eşit veya sıfırdan büyük dört değerden oluşan bir değerin varlığı olur; bu değerin ikiden fazlasının bire eşit veya büyük olması gerekir.

Bu değerlerin işaretini alırsak (-1, 0 veya 1'i alırsak) ölçüt -1 değerine eşit olmayan dört değerden oluşan bir değerin varlığı olur; bu değerin ikiden fazlasına eşit olması gerekir.

Bu değerlere bir tane eklersek (0, 1 veya 2'yi alırsak) ölçüt, sıfıra eşit olmayan dört değerden daha büyük bir değerin varlığı olur; bu değerin ikiden fazlasının ikiye eşit olması gerekir.

Herhangi bir sıfır içeren bir listenin ürünü sıfırdır ve ikiden fazla ikiye sahip bir listenin ürünü (ve gerisi olanlar) dörtten fazladır. Bu, bu düzeltilmiş listedeki kriterlerin ürünün minimum ve uzunluğunun 4'ten büyük olduğu anlamına gelir.

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

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

@Flawr ve @Laikoni'ye her biri iki bayt, bir de bayt için @xnor!

Çevrimiçi deneyin!

Eşit uzunluk:

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

Çevrimiçi deneyin!


9

C (clang) , 64 bayt

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

O () işlevi bir sıcak hava dalgası için 1 veya başka 0 döndürür.

864 numaralı sihire ve fikirleri için Udo Borkowski ve Mathis'e teşekkürler.

Nasıl çalışırsa? Her sayı dizisi, azaltma değeri 1'den başlayan bir azaltma işlemiyle yinelenir. Bir sayı> = 25 görülürse, azaltma 2 ile çarpılır. Bir sayı> = 30 görülürse, azalma 2 ile 3 ile çarpılır = 6. Eğer <25 sayısı görülürse, azalma tekrar 1'de başlar. Eğer azalma 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3 * 3 ile bölünebilirse, o zaman bir sıcak hava dalgası bulunur ve bunun sonucu modulo işlemi, 0 değerinde ve true değerinde bir düşüş değeri ile sonuçlanan 0'dır.

Çevrimiçi deneyin!


PPCG'ye Hoşgeldiniz.
Muhammed Salman,

PPCG'ye Hoşgeldiniz! Test çantası paketi ile birlikte çok güzel ilk cevap! Bir açıklama ekler misin, böylece sihri anlayalım mı?
JayCe

Bu gerçekten şık bir çözüm, aferin :)
Lynn


7

APL (Dyalog Klasik) , 21 20 bayt

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

Çevrimiçi deneyin!

kullanımları ⎕io←1

25 30⍸x eğer x <25, 1 ise 25≤x <30 ise, 2 ise 2’dir.

Tüm olası yerleri (biten veya eşdeğer) ilk 4 ürünler atmak ve (2 ürünlerin ≥8 varlığını tespit biz bu başlangıç kümülatif ürünleri hesaplamak 3 )


6

Japt , 19 18 bayt

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

Umarım yorumlardaki tüm tartışmaları doğru yapmışımdır. Shaggy
sayesinde bir bayttan traş oldu .

Çevrimiçi deneyin!


Okuduğumda bunun daha kısa olacağını düşünmüştüm, ancak yalnızca 18 byte başarabildi .
Shaggy

@Shaggy Ben de öyle düşündüm, ama daha kısa bir sürüm bulamadım. İşaretçi için çok teşekkürler!
Nit

1
Şu anda bunu kazanıyor gibiyiz :)
Shaggy

ASCII olmayan karakterler çoklu bayt olarak sayılmaz mı?
sudo

1
@sudo Bu sembollerin hepsi tek bayttır. Örneğin, 3 bayt olur, ancak ¨bir bayttır. Yukarıda kullanılan semboller, tamamen tek bir bayt olmaları nedeniyle golf dili için seçilmiştir.
Nit

5

PowerShell , 121 bayt

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

Çevrimiçi deneyin! veya Tüm test durumlarını doğrula

PowerShell bir eşdeğer yok .someya .everybu elle sarılır, böylece gibi ya.

Bir $atamsayı dizisi olarak girdi alıyoruz . Yardımcı değişkeni $bboş dizeye ayarlayın . Ardından, içindeki her tamsayı ile döngü $a. Tamsayı ise döngü içinde, -greaterthanor equal için 25, potansiyel dizeye ekleyin $b, aksi koymak $bboru hattı üzerinde ve boş bir dizeye ayarlayın.

Döngü dışına çıktıktan sonra, dizi eşleşmesi boru hattının sonucunu verir $bve bunları bir Where-Objectcümleye koyar |?{...}. Bu, eleman uzunluğuna -ge5(boşlukta bölünmeye bağlı olarak) ve 30olmasından daha büyük bir temps sayısına sahip olan dizeleri çıkarır -ge3. Bu dizgiler boru hattında bırakılır, bu nedenle bir truthy değeri boş değildir (truthy / falsey ayrımı için "tüm test durumlarını doğrula" bağlantısına bakın).


$args yerine kullanmaya çalışın param($a)ve$a
mazzy

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

Dizileri ile 109 bayt. tasarruf $args|%{if($_-ge25){$b+=$_}else{,$b;$b=@()}}-E{,$b}-B{,($b=@())}|?{$_.count-ge5-and($_|?{$_-ge30}).count-ge3}olarak get-heatWave.ps1. Test komut dosyası regex101.com/r/lXdvIs/2
mazzy

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

Ne yapar -E? Buna aşina değilim.
AdmBorkBork

5

Jöle , 17 16 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

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

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

Çevrimiçi deneyin!

açıklama

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

Toplu, 119 bayt

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

Komut satırı argümanları olarak girdiyi alır ve bir ısı dalgası için 1 çıkışını, aksi takdirde 0.


4

Python , 67 bayt

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

Çevrimiçi deneyin!

Üstel büyüme nedeniyle uzun test vakalarında zaman aşımına uğradı. İlk veya son öğeyi art arda keserek bitişik alt listeleri bulur. Bu 3 günün ≥30 ° C olduğu üçüncü en büyük değere bakarak kontrol edilir sorted(l)[~2]. Temel durumlar, truthy / falsey'den faydalanarak veya hatayla son vererek belki daha kısa olabilir.




4

APL (Dyalog Unicode) , 29 bayt

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

Çevrimiçi deneyin!

∨/orada bir elemanlarının, örneğin

(5≤≢¨a)5 < her serideki günlerin toplamı ( atüm olası günler dizisine sahip)

ve

3≤+/30≤3, içinde toplam +/number 30 olan toplam eleman sayısı

↑a← tarafından oluşturulan matris

e⊆⍨25≤e←⎕ 25 ardışık elemanların serisi


İlk testiniz gereksiz yere yorumlandı - işe yarıyor.
ngn

@ngn Bunu tespit ettiğiniz için teşekkür ederiz, düzeltildi
Kritixi Lithos

4

Kotlin , 57 bayt

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

(-1 açık parametre değiştirerek Bayt v-> örtülü parametresi ile bu )

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

( Ruby Çözümü’nde GB tarafından görüldüğü gibi herhangi bir {} işlemini kullanarak -16 bayt )

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

(-1 bayt teşekkürler Lynn: r> 0 && v <25 yerine 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}

Bu lambda ifadesi bir Listeyi alır ve bir heatwave veya false için true değerini döndürür.

864 numaralı sihire ve fikirleri için Udo Borkowski ve Mathis'e teşekkürler.

Nasıl çalışırsa? Her sayı dizisi , azaltma değeri 1'den başlayan herhangi bir {} işlemle yinelenir . Sayı 2 ile çarpılır ve sayı 30'dan büyük veya eşitse 3 (2 * 3 = 6) ile çarpılır. azalmanın tekrar 1'de başladığı görülür. Eğer azalma 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3 ile bölünebilirse, o zaman bir sıcak hava dalgası bulunur ve modulo işleminin sonucu 0 olur. iç lambda içindeki herhangi bir {} işleminden çağrılan ve sonra yinelemeyi durduran ve true değerini veren gerçek bir dönüş değeri.

Çevrimiçi deneyin!


Güzel açıklama :)
JayCe

Bayt sayınızın, yalnızca fonksiyonun gövdesini değil, tüm fonksiyon bildirimini yansıtması gerektiğini düşünüyorum. Şu anda olduğu gibi, bana snippet gibi geliyor.
Jonathan Frech

@ jonathan-frech, fonksiyon gövdesini Java'da olduğu gibi isteğe bağlı olmayan parantezler de dahil olmak üzere biraz daha uzun bir lambda ifadesiyle değiştirdim. Bu adil mi?
Roland Schmitz

@RolandSchmitz Diğer Kotlin başvuruları ve Java lambda fonksiyon başvuruları incelendiğinde, işlev bildirimi bayt sayısı kabul edilmez; Bu, asıl gönderinizin büyük olasılıkla geçerli olduğu anlamına gelir. Yorumum için üzgünüm, sadece çok pasajı göründüğü için tuhaf görünüyordu, çünkü tür bildirgesi olmadan geçerli bir dil kurgusu değildi.
Jonathan Frech

3

Wonder , 34 bayt

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

Kullanım örneği:

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

açıklama

Ayrıntılı sürüm:

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

Ardışık 5 öğenin üst üste binen dizilerini alın, sonra dizilerin herhangi birinin> 25'ten büyük ve 2'den fazla öğenin> 30'dan fazla olup olmadığını kontrol edin.


Hey, bu alakasız, ama web sitendeki facebook bağlantısı kesildi.
mbomb007


3

Stax , 23 bayt

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

Koşun ve staxlang.xyz de hata ayıklayın! Bu işlemin uzun sürmesi nedeniyle otomatik çalışmayı devre dışı bıraktım.

Ambalajsız (28 bayt) ve açıklama

: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

Bu, ısı dalgaları olarak sayılabilecek tüm alt dizileri yazdıracak ve eğer varsa ve hiç olmadığında sahte olacaktır.



3

Kabuğu , 19 bayt

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

Çevrimiçi deneyin!

Filter ( f) kullanmak , bir mantıksal kontrol& kullanarak kullanmaktan bir bayttan daha kısadır ve ( ) , ayrıca kurtulmak gerçekten de iyi olur ±- costing 2 byte :(

açıklama

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 bayt

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

Çevrimiçi deneyin!

Roland Schmitz'in cevaplarının utanmaz limanı . Roland sayesinde -4 bayt ve Giuseppe sayesinde -1.

TIO işlevsel versiyona bağlanır.

Önceki sürüm ardışık günler> 25'i rleçıkardı ve Giuseppe sayesinde 18 bayt sürdü !


Fyerine kullanırsanız T, 6-bayt bayt kaydetmek için F=F|"if"(cond,(expr),0)geri dönebilir ve sonra geri dönebilirsiniz F. Ayrıca etrafta gereksiz bir parantez çifti var (1-z[i]):0ama bence bu 1-z[i]:1başka bir çift
Giuseppe

^ Bana başka bir fikir çıktığında yukarıdaki yorumu göndermek üzereydim ve 100-baytlık bir çözüm bulmayı başardım! Bu var 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}ama TIO içine PPCG itibaren dikkatli yapıştırarak olmak çünkü ... bazen unprintables sürünme
Giuseppe

Bu fantastik! Jonathan Allan'ın matematiğinden yararlanmak için muhtemelen daha kısa bir yol var ...
JayCe

Güzel, eğer iç kısmı basitleştirirseniz (i * 2 * (1+ (2 * (j> 29)))) 'den (i * (2 + 4 * (j> 29)) daha da fazla tasarruf sağlayabilirsiniz. ))
Roland Schmitz

@RolandSchmitz çok doğru!
JayCe

3

Swift 4 , 50 bayt

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

Çevrimiçi deneyin!

Kapatma ifadesi bir sıcak hava dalgası için 0 veya> 0 döndürür.

İşbirliğiyle düzenlendi Roland Schmitz ve Mathis.

Nasıl çalışırsa? Her sayı dizisi, azaltma değeri 1'den başlayan bir azaltma işlemiyle yinelenir. Bir sayı> = 25 görülürse, azalma 2 ile çarpılır. Bir sayı> = 30 görülürse, azalma 2 ile 3 ile çarpılır 6. Eğer <25 sayısı görülürse, azaltma tekrar 1'de başlar. Eğer azaltma 864 ile bölünebilirse = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3 * 3 ise bir sıcak hava dalgası bulunur modulo işlemi 0 değerinde 0 değerine yol açar. Sadece bir sıcaklık dalgası bulunduğunda bu değer 0 olur. Düşme değeri 0 olduğunda, gelecekteki tüm indirimler için 0 olur, yani sonuç için de.


3

Python 2 , 66 63 bayt

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

Çevrimiçi deneyin!

Lynn sayesinde -3 bayt

Nasıl çalışırsa? Her sayı dizisi, azaltma değeri 1'den başlayan bir azaltma işlemiyle yinelenir. Bir sayı> = 25 görülürse, azalma 2 ile çarpılır. Bir sayı> = 30 görülürse, azalma 2 ile 3 ile çarpılır 6. Eğer <25 sayısı görülürse, azaltma tekrar 1'de başlar. Eğer azaltma 864 ile bölünebilirse = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3 * 3 ise bir sıcak hava dalgası bulunur modulo işlemi 0 değerinde 0 değerine yol açar. Sadece bir sıcaklık dalgası bulunduğunda bu değer 0 olur. Düşme değeri 0 olduğunda, gelecekteki tüm indirimler için 0 olur, yani sonuç için de.

Daha okunaklı, ancak daha uzun bir sürüm şöyle görünür:

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

Fazladan boşluk / parantezi Çıkarma ve değiştirme x if cond else yyoluyla (y,x)[cond]verir

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

Lynn durumu kısaltmayı önerdi 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

sonuçlanan

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

İthalat bildirimini de
Muhammad Salman

1
Aslında azaltma yöntemini almanıza gerek yok , Python 2'de yerleşikfunctools bir ürün !
Lynn

1
b*25>b*c3 bayt olup olmadığını kontrol edebilirsiniz ; bu, farklı dillerde bu yaklaşımı benimseyen çözümlerin çoğu için geçerli olabilir :)
Lynn

@ Lynn Çok teşekkürler. Çözümü buna göre güncelledim.
Udo Borkowski

2

Pyth, 23 bayt

f&glT5&>T]25gePPT30SM.:

Burada dene

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.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.