Mendeteksi gelombang panas


48

Latar Belakang

The Royal Netherlands Meteorological Institute mendefinisikan gelombang panas * sebagai rangkaian setidaknya 5 hari berturut-turut dari cuaca ≥25 ° C ("cuaca musim panas"), sehingga setidaknya 3 dari hari-hari itu adalah ≥30 ° C ("cuaca tropis" ).

Cuaca tropis tidak harus diukur secara berurutan: misalnya: 30, 25, 30, 26, 27, 28, 32, 30adalah gelombang panas selama 8 hari dengan 4 hari cuaca tropis.

* (Ya, menurut standar Belanda.)

Tantangan

Diberikan daftar bilangan bulat positif yang tidak kosong yang mewakili pengukuran suhu Celcius dari hari-hari berturut-turut, putuskan apakah daftar itu mengandung gelombang panas (sesuai definisi di atas).

Jawaban terpendek dalam byte menang.

Uji kasus

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]

Benar:

[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
Apakah suhu dijamin di bawah 100 Celcius?
FryAmTheEggman

3
@FryAmTheEggman Ya, di Belanda, ya :), tapi saya tidak ingin jawaban Anda menyalahgunakan fakta ini, jadi tidak.
Lynn

1
@HatWizard Ya, tidak apa-apa. "Crash / don't crash" juga baik-baik saja, misalnya.
Lynn

2
Hei @ Lynn ini adalah tantangan besar dan masih :-)
Roland Schmitz

1
@RolandSchmitz Terima kasih! Saya sangat senang dengan jawaban kreatif yang keluar begitu terlambat sepanjang hidup tantangan. 🎉
Lynn

Jawaban:



19

Jelly , 15 byte

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

Tautan monadik yang menerima daftar angka yang kembali 1jika gelombang panas terdeteksi 0.

Cobalah online! atau lihat test-suite .

Bagaimana?

Kriteria tersebut adalah adanya serangkaian lebih dari empat nilai yang lebih besar atau sama dengan 25, di mana lebih dari dua harus lebih besar dari atau sama dengan 30.

Jika kita membaginya dengan lima kriteria menjadi keberadaan menjalankan lebih dari empat nilai lebih besar dari atau sama dengan lima, dimana lebih dari dua harus lebih besar dari atau sama dengan enam.

Jika kita mengurangi lima dari nilai-nilai ini kriteria menjadi keberadaan menjalankan lebih dari empat nilai lebih besar dari atau sama dengan nol, dimana lebih dari dua harus lebih besar dari atau sama dengan satu.

Jika kita mengambil tanda dari nilai-nilai ini (mendapatkan -1, 0, atau 1) kriteria menjadi keberadaan lari lebih dari empat nilai tidak sama dengan -1, dimana lebih dari dua harus sama dengan satu.

Jika kita menambahkan satu ke nilai-nilai ini (mendapatkan 0, 1, atau 2) kriteria menjadi keberadaan lari lebih dari empat nilai tidak sama dengan nol, dimana lebih dari dua harus sama dengan dua.

Produk dari daftar yang berisi angka nol adalah nol dan produk dari daftar yang berisi lebih dari dua pasangan (dan yang lainnya) lebih dari empat. Ini berarti bahwa kriteria pada daftar yang disesuaikan ini menjadi minimum produk dan panjangnya lebih besar dari 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 byte

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

Terima kasih kepada @ flawr dan @Laikoni untuk masing-masing dua byte dan @xnor untuk satu byte!

Cobalah online!

Panjang yang sama:

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

Cobalah online!


9

C (dentang) , 64 byte

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

Fungsi o () mengembalikan 1 untuk gelombang panas atau 0 lainnya.

Berkat nomor ajaib 864 dan untuk Udo Borkowski dan Mathis untuk ide-ide mereka.

Bagaimana jika bekerja? Setiap urutan angka diulangi dengan operasi pengurangan dimulai dari nilai pengurangan 1. Jika angka> = 25 terlihat pengurangan dikalikan dengan 2. Jika angka> = 30 terlihat pengurangan dikurangi dikalikan dengan 2 dan dengan 3 = 6. Jika angka <25 terlihat pengurangan mulai lagi pada 1. Jika pengurangan habis dibagi 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3 maka gelombang panas ditemukan, dan hasil dari operasi modulo adalah 0 yang menghasilkan pengurangan nilai 0 dan nilai balik true.

Cobalah online!


Selamat datang di PPCG.
Muhammad Salman

Selamat datang di PPCG! Jawaban pertama yang sangat bagus lengkap dengan test case suite! Bisakah Anda menambahkan penjelasan sehingga kami memahami keajaibannya?
JayCe

Itu solusi yang sangat elegan, bagus :)
Lynn


7

APL (Dyalog Classic) , 21 20 byte

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

Cobalah online!

menggunakan ⎕io←1

25 30⍸x adalah 0 jika x <25, 1 jika 25≤x <30, atau 2 sebaliknya

kami menghitung produk kumulatif ini mulai dari (atau yang setara: berakhir pada) semua lokasi yang mungkin, membuang 4 produk pertama, dan mendeteksi keberadaan produk ≥8 (yaitu 2 3 )


6

Japt , 19 18 byte

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

Saya harap saya mendapatkan semua diskusi di komentar dengan benar.
Dicukur satu byte berkat Shaggy .

Cobalah online!


Pikir ini akan berhasil lebih pendek ketika saya membacanya tetapi hanya bisa mengelola 18 byte .
Shaggy

@ Shaggy saya juga berpikir begitu, tetapi saya juga tidak dapat menemukan versi yang lebih pendek. Terima kasih banyak untuk penunjuknya!
Nit

1
Sepertinya kita memenangkan yang ini saat ini :)
Shaggy

Apakah karakter non-ASCII tidak dihitung sebagai banyak byte?
sudo

1
@sudo Simbol-simbol itu semuanya bita tunggal. Misalnya, akan menjadi 3 byte, tetapi ¨satu byte. Simbol-simbol yang digunakan di atas telah dipilih untuk bahasa golf karena alasan bahwa mereka semua adalah byte tunggal.
Nit

5

PowerShell , 121 byte

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

Cobalah online! atau Verifikasi semua kasus uji

PowerShell tidak memiliki yang setara dengan .someatau .everyatau sejenisnya, jadi ini digulung dengan tangan.

Kami mengambil input $asebagai array bilangan bulat. Setel variabel pembantu $bke string kosong. Kemudian, loop melalui setiap integer di $a. Di dalam loop, jika integer adalah -greaterthanor equal to 25, tambahkan ke string potensial kami $b, jika tidak letakkan $bdi pipeline dan atur ke string kosong.

Setelah di luar loop, array-concatenate hasil pipeline dengan $b, dan meletakkannya melalui Where-Objectklausa |?{...}. Ini tarikan keluar mereka string yang memiliki panjang elemen -ge5(berdasarkan membelah pada spasi) dan hitungan temps lebih besar dari 30menjadi -ge3. String-string tersebut dibiarkan di atas pipa, sehingga nilai kebenarannya tidak kosong (lihat tautan "verifikasi semua kasus uji" untuk perbedaan kebenaran / falsey).


coba gunakan $args sebagai gantinya param($a)dan$a
mazzy

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

109 byte dengan array. simpan $args|%{if($_-ge25){$b+=$_}else{,$b;$b=@()}}-E{,$b}-B{,($b=@())}|?{$_.count-ge5-and($_|?{$_-ge30}).count-ge3}sebagai get-heatWave.ps1. Skrip uji regex101.com/r/lXdvIs/2
mazzy

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

Apa yang -Eharus dilakukan Saya tidak terbiasa dengan itu.
AdmBorkBork

5

Jelly , 17 16 byte

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

Cobalah online!

Bagaimana itu bekerja

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

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

Cobalah online!

Penjelasan

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

Batch, 119 byte

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

Mengambil input sebagai argumen command-line dan menghasilkan 1 untuk gelombang panas sebaliknya 0.


4

Python , 67 byte

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

Cobalah online!

Waktu habis pada kasus uji lagi karena pertumbuhan eksponensial. Temukan sublist yang berdekatan dengan memotong elemen pertama atau terakhir secara berulang. 3 hari itu ≥30 ° C diperiksa dengan melihat nilai terbesar ketiga sorted(l)[~2]. Basis kasus mungkin bisa lebih pendek dengan mengambil keuntungan dari truey / falsey atau mengakhiri dengan kesalahan.




4

APL (Dyalog Unicode) , 29 byte

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

Cobalah online!

∨/ada setiap elemen seperti yang

(5≤≢¨a)5 <penghitungan hari di setiap seri ( amemiliki semua seri hari yang mungkin)

dan

3≤+/30≤3 ≤ +/jumlah total elemen yang ≥ 30 in

↑a← matriks yang dibentuk oleh

e⊆⍨25≤e←⎕ rangkaian elemen berurutan yang ≥ 25


Tes pertama Anda dikomentari tidak perlu - itu berfungsi.
ngn

@ ngn Terima kasih telah melihatnya, diperbaiki
Kritixi Lithos

4

Kotlin , 57 byte

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

(-1 Byte dengan mengganti Parameter eksplisit v-> dengan parameter implisit itu )

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

(-16 byte menggunakan operasi {} apa pun seperti yang terlihat di Ruby Solution by GB )

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

(-1 byte terima kasih Lynn: diganti r> 0 && v <25 dengan 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}

Ekspresi lambda ini mengambil Daftar dan mengembalikan true untuk gelombang panas atau yang lain.

Berkat nomor ajaib 864 dan untuk Udo Borkowski dan Mathis untuk ide-ide mereka.

Bagaimana jika bekerja? Setiap urutan angka diulang dengan operasi {} apa pun yang dimulai dengan nilai pengurangan 1. Pengurangan dikalikan dengan 2 dan dikalikan dengan 3 (2 * 3 = 6) jika jumlahnya lebih besar atau sama dengan 30. Jika angka <25 terlihat pengurangan dimulai lagi pada 1. Jika pengurangan dibagi oleh 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3 maka gelombang panas ditemukan, dan hasil operasi modulo adalah 0 yang menghasilkan nilai pengembalian sejati dalam lambda batin dipanggil dari operasi {} apa pun yang kemudian berhenti iterasi dan mengembalikan nilai true.

Cobalah online!


Penjelasan yang bagus :)
JayCe

Saya pikir jumlah byte Anda harus mencerminkan seluruh deklarasi fungsi, bukan hanya fungsi tubuh. Seperti sekarang ini, bagi saya sepertinya potongan.
Jonathan Frech

@ jonathan-frech, saya mengubah fungsi body menjadi ekspresi lambda yang sedikit lebih panjang termasuk kawat gigi yang tidak opsional seperti di Jawa. Apakah ini adil?
Roland Schmitz

@RolandSchmitz Melihat pengajuan Kotlin lainnya dan pengajuan fungsi lambda Java, saya kira tidak termasuk fungsi byte byte deklarasi diterima; yang berarti bahwa kiriman asli Anda kemungkinan besar valid. Maaf untuk komentar saya, itu terasa aneh bagi saya karena saya merasa ini sangat snippet-esk, karena ini bukan konstruksi bahasa yang valid tanpa tipe deklarasi.
Jonathan Frech

3

Bertanya-tanya , 34 byte

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

Contoh penggunaan:

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

Penjelasan

Versi verbal:

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

Ambil urutan yang tumpang tindih dari 5 item berturut-turut, lalu periksa apakah ada urutan yang memiliki semua item> 25 dan lebih dari 2 item> 30.


Hei, ini tidak ada hubungannya, tetapi tautan facebook di situs web Anda sudah mati.
mbomb007


3

Stax , 23 byte

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

Jalankan dan debug di staxlang.xyz! Ini membutuhkan waktu lama untuk dijalankan, jadi saya menonaktifkan jalankan otomatis.

Dibongkar (28 byte) dan penjelasan

: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

Ini akan mencetak semua subarrays yang dapat dihitung sebagai gelombang panas, yang akan menjadi salah jika dan hanya jika tidak ada.


3

Ruby , 89 byte

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

Cobalah online!


Saya percaya itu gagal karena dalam kasus kebenaran kedua, +30 hari tidak semuanya dalam lima hari.
Stewie Griffin

Sangat bagus. Anda dapat mengurangi beberapa byte dengan each_conspendekatan - Cobalah online!
benj2240

3

Sekam , 19 byte

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

Cobalah online!

Menggunakan filter ( f) lebih pendek satu byte daripada menggunakan memeriksa dengan logis dan ( &) , juga akan sangat bagus untuk menyingkirkan ±- biaya 2 byte :(

Penjelasan

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 byte

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

Cobalah online!

Port yang tak tahu malu jawaban Roland Schmitz . -4 byte terima kasih untuk Roland dan -1 terima kasih kepada Giuseppe.

TIO menghubungkan ke versi fungsional.

Versi sebelumnya diekstraksi berturut-turut> 25 menggunakan rledan menyimpan 18 byte kekalahan berkat Giuseppe!


jika Anda menggunakan Falih-alih T, Anda bisa melakukannya F=F|"if"(cond,(expr),0)dan kemudian kembali Funtuk menyimpan byte 6-ish. Anda juga memiliki sepasang tanda kurung yang tidak perlu di sekitar, (1-z[i]):0tapi saya pikir itu bisa saja 1-z[i]:1menyelamatkan beberapa byte lagi ...
Giuseppe

^ Saya akan mengirimkan komentar di atas ketika ide lain muncul pada saya, dan saya berhasil menemukan solusi sub-100 byte! Ini 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}tapi paste-hati dari PPCG ke TIO karena merayap kadang-kadang unprintables di ...
Giuseppe

Ini fantastis! Mungkin ada cara yang lebih pendek memanfaatkan matematika Jonathan Allan ...
JayCe

Bagus, Anda bahkan dapat menyimpan beberapa byte lagi, jika Anda menyederhanakan bagian dalam dari (i * 2 * (1+ (2 * (j> 29)))) ke (i * (2 + 4 * (j> 29) ))
Roland Schmitz

@RolandSchmitz sangat benar!
JayCe

3

Cepat 4 , 50 byte

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

Cobalah online!

Ekspresi penutupan menghasilkan 0 untuk gelombang panas atau> 0 lainnya.

Dibuat bekerja sama dengan Roland Schmitz dan Mathis.

Bagaimana jika bekerja? Setiap urutan angka diulangi dengan operasi pengurangan dimulai dari nilai pengurangan 1. Jika angka> = 25 terlihat pengurangan dikalikan dengan 2. Jika angka> = 30 terlihat pengurangan dikurangi dikalikan dengan 2 dan dengan 3 = 6. Jika angka <25 terlihat pengurangan mulai lagi pada 1. Jika pengurangan habis dibagi 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3 maka gelombang panas ditemukan, dan hasil dari operasi modulo adalah 0 yang menghasilkan nilai pereduksi 0. Hanya ketika gelombang panas ditemukan, pereduksi dapat menjadi 0. Setelah nilai pereduksi adalah 0 maka akan menjadi 0 untuk semua pengurangan di masa mendatang, yaitu juga untuk hasil akhir.


3

Python 2 , 66 63 byte

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

Cobalah online!

-3 byte terima kasih kepada Lynn

Bagaimana jika bekerja? Setiap urutan angka diulangi dengan operasi pengurangan dimulai dari nilai pengurangan 1. Jika angka> = 25 terlihat pengurangan dikalikan dengan 2. Jika angka> = 30 terlihat pengurangan dikurangi dikalikan dengan 2 dan dengan 3 = 6. Jika angka <25 terlihat pengurangan mulai lagi pada 1. Jika pengurangan habis dibagi 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3 maka gelombang panas ditemukan, dan hasil dari operasi modulo adalah 0 yang menghasilkan nilai pereduksi 0. Hanya ketika gelombang panas ditemukan, pereduksi dapat menjadi 0. Setelah nilai pereduksi adalah 0 maka akan menjadi 0 untuk semua pengurangan di masa mendatang, yaitu juga untuk hasil akhir.

Versi yang lebih mudah dibaca, tetapi lebih panjang terlihat seperti ini:

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

Menghapus spasi ekstra / tanda kurung dan mengganti x if cond else ydengan (y,x)[cond]memberi

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

Lynn menyarankan untuk mempersingkat kondisi 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

yang menghasilkan

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

Anda harus memasukkan pernyataan impor juga :)
Muhammad Salman

1
Anda sebenarnya tidak perlu mengimpor pengurangan dari functools, ini adalah bawaan di Python 2 !
Lynn

1
Anda dapat memeriksa apakah b*25>b*cdan menyimpan 3 byte; ini mungkin berlaku untuk banyak solusi yang menggunakan pendekatan ini dalam berbagai bahasa :)
Lynn

@ Lynn Banyak terima kasih. Saya memperbarui solusinya.
Udo Borkowski

2

Pyth, 23 byte

f&glT5&>T]25gePPT30SM.:

Coba di sini

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.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.