Phát hiện sóng nhiệt


48

Lý lịch

Viện Khí tượng Hoàng gia Hà Lan định nghĩa một đợt nắng nóng * là một chuỗi ít nhất 5 ngày liên tục của thời tiết ≥25 ° C ( thời tiết mùa hè mùa hè), sao cho ít nhất 3 trong số đó là ≥30 ° C (thời tiết nhiệt đới ).

Thời tiết nhiệt đới không cần phải đo liên tục: ví dụ: 30, 25, 30, 26, 27, 28, 32, 30là một đợt nắng nóng kéo dài 8 ngày với 4 ngày thời tiết nhiệt đới.

* (Vâng, theo tiêu chuẩn Hà Lan.)

Thử thách

Đưa ra một danh sách không có các số nguyên dương biểu thị các phép đo nhiệt độ Celsius từ những ngày kế tiếp, quyết định xem danh sách đó có chứa sóng nhiệt hay không (theo định nghĩa trên).

Câu trả lời ngắn nhất trong byte thắng.

Các trường hợp thử nghiệm

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]

Sự thật:

[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
Nhiệt độ có được đảm bảo dưới 100 độ C không?
FryAmTheEggman

3
@FryAmTheEggman Vâng, ở Hà Lan, vâng :), nhưng tôi không muốn câu trả lời của bạn lạm dụng thực tế này, nên không.
Lynn

1
@HatWizard Vâng, không sao đâu. Ví dụ như Crash / không gặp sự cố.
Lynn

2
Này @Lynn đây là một thử thách lớn và vẫn là :-)
Roland Schmitz

1
@RolandSchmitz Cảm ơn bạn! Tôi hạnh phúc ngạc nhiên bởi những câu trả lời sáng tạo xuất phát từ quá muộn trong cuộc đời của thử thách. 🎉
Lynn

Câu trả lời:



19

Thạch , 15 byte

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

Một liên kết đơn âm chấp nhận một danh sách các số sẽ trả về 1nếu phát hiện sóng nhiệt khác 0.

Hãy thử trực tuyến! hoặc xem bộ thử nghiệm .

Làm sao?

Tiêu chí là sự tồn tại của một chuỗi hơn bốn giá trị lớn hơn hoặc bằng 25, trong đó nhiều hơn hai phải lớn hơn hoặc bằng 30.

Nếu chúng ta chia cho năm tiêu chí sẽ trở thành sự tồn tại của một chuỗi hơn bốn giá trị lớn hơn hoặc bằng năm, trong đó nhiều hơn hai phải lớn hơn hoặc bằng sáu.

Nếu chúng ta trừ năm từ các giá trị này, các tiêu chí sẽ trở thành sự tồn tại của một chuỗi hơn bốn giá trị lớn hơn hoặc bằng 0, trong đó nhiều hơn hai phải lớn hơn hoặc bằng một.

Nếu chúng ta lấy dấu của các giá trị này (lấy -1, 0 hoặc 1), các tiêu chí sẽ trở thành sự tồn tại của một chuỗi hơn bốn giá trị không bằng -1, trong đó nhiều hơn hai phải bằng một.

Nếu chúng ta thêm một vào các giá trị này (nhận 0, 1 hoặc 2), tiêu chí sẽ trở thành sự tồn tại của một chuỗi hơn bốn giá trị không bằng 0, trong đó nhiều hơn hai phải bằng hai.

Sản phẩm của danh sách chứa bất kỳ số 0 nào là 0 và sản phẩm của danh sách chứa nhiều hơn hai twos (và phần còn lại là số không) có hơn bốn. Điều này có nghĩa là các tiêu chí trong danh sách được điều chỉnh này trở thành mức tối thiểu của sản phẩm và độ dài lớn hơn 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

C (tiếng kêu) , 64 byte

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

Hàm o () trả về 1 cho sóng nhiệt hoặc 0 khác.

Cảm ơn số ma thuật 864 và Udo Borkowski và Mathis cho ý tưởng của họ.

Làm thế nào nếu làm việc? Mỗi dãy số được lặp lại với thao tác giảm bắt đầu từ giá trị giảm 1. Nếu thấy một số> = 25, số giảm được nhân với 2. Nếu một số> = 30 được nhìn thấy mức giảm được nhân với 2 và 3 = 6. Nếu một số <25 được nhìn thấy, mức giảm bắt đầu lại ở mức 1. Nếu mức giảm chia hết cho 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3 thì sẽ tìm thấy sóng nhiệt và kết quả của hoạt động modulo là 0 dẫn đến giá trị giảm là 0 và giá trị trả về là true.

Hãy thử trực tuyến!


Chào mừng đến với PPCG.
Muhammad Salman

Chào mừng đến với PPCG! Rất tốt đẹp câu trả lời đầu tiên hoàn thành với bộ trường hợp thử nghiệm! Bạn có thể thêm một lời giải thích để chúng tôi hiểu phép thuật?
JayCe

Đó là một giải pháp thực sự tao nhã, được thực hiện tốt :)
Lynn


7

APL (Dyalog Classic) , 21 20 byte

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

Hãy thử trực tuyến!

sử dụng ⎕io←1

25 30⍸x là 0 nếu x <25, 1 nếu 25≤x <30 hoặc 2 nếu không

chúng tôi tính toán các sản phẩm tích lũy của những sản phẩm này bắt đầu từ (hoặc tương đương: kết thúc tại) tất cả các vị trí có thể, loại bỏ 4 sản phẩm đầu tiên và phát hiện sự hiện diện của các sản phẩm ≥8 (là 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.

Tôi hy vọng tôi đã nhận được tất cả các cuộc thảo luận trong các ý kiến ​​chính xác.
Cạo sạch một byte nhờ Shaggy .

Hãy thử trực tuyến!


Nghĩ rằng việc này sẽ diễn ra ngắn hơn khi tôi đọc qua nó nhưng chỉ có thể quản lý 18 byte .
Xù xì

@Shaggy Tôi cũng nghĩ vậy, nhưng tôi cũng không thể tìm thấy một phiên bản ngắn hơn. Cảm ơn rất nhiều cho con trỏ!
Nit

1
Có vẻ như chúng tôi đang giành chiến thắng này vào lúc này :)
Shaggy

Các ký tự không phải ASCII không được tính là nhiều byte?
sudo

1
@sudo Những ký hiệu đó đều là byte đơn. Ví dụ, sẽ là 3 byte, nhưng ¨là một byte. Các biểu tượng được sử dụng ở trên đã được chọn cho ngôn ngữ chơi gôn chính xác vì lý do tất cả chúng chỉ là một byte.
Nit

5

PowerShell , 121 byte

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

Hãy thử trực tuyến! hoặc Xác minh tất cả các trường hợp kiểm tra

PowerShell không có tương đương với một .somehoặc .everytương tự, vì vậy điều này được cuộn bằng tay.

Chúng tôi lấy đầu vào $alà một mảng các số nguyên. Đặt biến helper $bthành chuỗi rỗng. Sau đó, lặp qua mọi số nguyên trong $a. Trong vòng lặp, nếu số nguyên là -greaterthanor đủ eđiều kiện 25, hãy thêm nó vào chuỗi tiềm năng của chúng tôi $b, nếu không hãy đặt $bvào đường ống và đặt nó vào chuỗi trống.

Khi ở bên ngoài vòng lặp, nối các kết quả đường ống với $bvà đặt chúng thông qua một Where-Objectmệnh đề |?{...}. Đây rút ra những chuỗi có chiều dài yếu tố -ge5(dựa trên tách trên khoảng trắng) và một số của temps lớn hơn 30-ge3. Các chuỗi đó được để lại trên đường ống, do đó, một giá trị trung thực là không trống (xem liên kết "xác minh tất cả các trường hợp kiểm tra" để phân biệt trung thực / falsey).


cố gắng sử dụng $args thay thế param($a)$a
mazzy

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

109 byte với mảng. tiết kiệm $args|%{if($_-ge25){$b+=$_}else{,$b;$b=@()}}-E{,$b}-B{,($b=@())}|?{$_.count-ge5-and($_|?{$_-ge30}).count-ge3}như get-heatWave.ps1. Kịch bản thử nghiệm 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

Không gì -Elàm gì? Tôi không quen với điều đó.
admBorkBork

5

Thạch , 17 16 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

: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

Hãy thử trực tuyến!

Giải trình

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

Mẻ, 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%

Lấy đầu vào làm đối số dòng lệnh và đầu ra 1 cho sóng nhiệt khác 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])

Hãy thử trực tuyến!

Lần ra các trường hợp thử nghiệm dài hơn do tăng trưởng theo cấp số nhân. Tìm danh sách phụ liền kề bằng cách liên tục cắt phần tử đầu tiên hoặc cuối cùng. 3 ngày đó là ≥30 ° C được kiểm tra bằng cách xem giá trị lớn thứ ba sorted(l)[~2]. Các trường hợp cơ sở có lẽ có thể ngắn hơn bằng cách lợi dụng sự thật / falsey hoặc chấm dứt với lỗi.




4

APL (Dyalog Unicode) , 29 byte

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

Hãy thử trực tuyến!

∨/có cái nào không yếu tố nào

(5≤≢¨a)5 <tổng số ngày trong mỗi chuỗi (a có tất cả các chuỗi ngày có thể)

3≤+/30≤ 3 tổng số +/ số phần tử ≥ 30 in

↑a← ma trận hình thành bởi

e⊆⍨25≤e←⎕ chuỗi các phần tử liên tiếp là ≥ 25


Thử nghiệm đầu tiên của bạn được nhận xét không cần thiết - nó hoạt động.
ngn

@ngn Cảm ơn vì đã phát hiện ra điều đó, đã sửa
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 bằng cách thay thế Thông số rõ ràng v-> bằng tham số ẩn đó )

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

(-16 byte sử dụng bất kỳ hoạt động {} nào như đã thấy trong Giải pháp Ruby theo 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 cảm ơn Lynn: đã thay thế r> 0 && v <25 bằng 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}

Biểu thức lambda này nhận một Danh sách và trả về giá trị true cho sóng nhiệt hoặc sai khác.

Cảm ơn số ma thuật 864 và Udo Borkowski và Mathis cho ý tưởng của họ.

Làm thế nào nếu làm việc? Mỗi dãy số được lặp lại với một bất kỳ thao tác {} nào bắt đầu từ giá trị giảm 1. Mức giảm được nhân với 2 và nhân với 3 (2 * 3 = 6) nếu số lớn hơn hoặc bằng 30. Nếu một số <25 được thấy mức giảm bắt đầu lại ở mức 1. Nếu mức giảm chia hết cho 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3 thì sẽ tìm thấy sóng nhiệt và kết quả của hoạt động modulo là 0 dẫn đến một giá trị trả về thực trong lambda bên trong được gọi từ bất kỳ hoạt động {} nào sau đó dừng lặp và trả về giá trị true.

Hãy thử trực tuyến!


Lời giải thích hay :)
JayCe

Tôi nghĩ rằng số byte của bạn sẽ phản ánh toàn bộ khai báo hàm, không chỉ thân của hàm. Vì nó là ngay bây giờ, nó dường như là một đoạn trích.
Jonathan Frech

@ jonathan-frech, tôi đã thay đổi thân hàm thành biểu thức lambda dài hơn một chút bao gồm cả các dấu ngoặc không phải là tùy chọn như trong Java. Điều này có công bằng không?
Roland Schmitz

@RolandSchmitz Nhìn vào các đệ trình khác của Kotlin và các đệ trình hàm lambda Java, tôi đoán không bao gồm số byte khai báo hàm được chấp nhận; có nghĩa là trình ban đầu của bạn rất có thể hợp lệ. Xin lỗi vì nhận xét của tôi, nó có vẻ kỳ lạ đối với tôi vì tôi thấy nó trông rất snippet-esk, vì nó không phải là một cấu trúc ngôn ngữ hợp lệ mà không có khai báo kiểu.
Jonathan Frech

3

Kỳ quan , 34 byte

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

Ví dụ sử dụng:

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

Giải trình

Phiên bản dài dòng:

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

Thực hiện các chuỗi trùng lặp của 5 mục liên tiếp, sau đó kiểm tra xem có bất kỳ trình tự nào có tất cả các mục> 25 và hơn 2 mục> 30 không.


Này, điều này không liên quan, nhưng liên kết facebook trên trang web của bạn đã chết.
mbomb007


3

Stax , 23 byte

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

Chạy và gỡ lỗi nó tại staxlang.xyz!Điều này mất nhiều thời gian để chạy, vì vậy tôi đã tắt tự động chạy.

Giải nén (28 byte) và giải thích

: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

Điều này sẽ in tất cả các tập hợp con có thể được tính là sóng nhiệt, sẽ sai lệch khi và chỉ khi không tồn tại.



3

Husk , 19 byte

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

Hãy thử trực tuyến!

Sử dụng bộ lọc ( f) ngắn hơn một byte so với sử dụng kiểm tra với logic và ( &) , cũng sẽ rất tốt nếu thoát khỏi± - 2 byte tốn kém :(

Giải trình

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)

Hãy thử trực tuyến!

Không biết xấu hổ về câu trả lời của Roland Schmitz . -4 byte nhờ Roland và -1 nhờ Giuseppe.

TIO liên kết đến phiên bản chức năng.

Phiên bản trước đã trích xuất ngày liên tiếp> 25 bằng cách sử dụng rlevà tiết kiệm được 18 byte nhờ Giuseppe!


nếu bạn sử dụng Fthay vì T, bạn có thể thực hiện F=F|"if"(cond,(expr),0)và sau đó quay lại Fđể lưu các byte 6-ish. Bạn cũng có một cặp dấu ngoặc đơn không cần thiết xung quanh (1-z[i]):0nhưng tôi nghĩ rằng 1-z[i]:1dù sao đi nữa cũng có thể lưu một vài byte khác ...
Giuseppe

^ Tôi chuẩn bị gửi bình luận ở trên thì một ý tưởng khác xảy ra với tôi và tôi đã tìm được giải pháp phụ 100 byte! Đó là 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}nhưng được dán cẩn thận từ PPCG vào TIO vì leo đôi khi unprintables trong ...
Giuseppe

Cái này thật tuyệt! Có lẽ có một cách thậm chí còn ngắn hơn tận dụng toán học của Jonathan Allan ...
JayCe

Thật tuyệt, bạn thậm chí có thể lưu thêm một số byte, nếu bạn đơn giản hóa phần bên trong từ (i * 2 * (1+ (2 * (j> 29))))) (i * (2 + 4 * (j> 29) ))
Roland Schmitz

@RolandSchmitz rất đúng!
JayCe

3

Swift 4 , 50 byte

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

Hãy thử trực tuyến!

Biểu thức đóng trả về 0 cho sóng nhiệt hoặc> 0 khác.

Được tạo ra với sự hợp tác của Roland Schmitz và Mathis.

Làm thế nào nếu làm việc? Mỗi dãy số được lặp lại với thao tác giảm bắt đầu từ giá trị giảm 1. Nếu thấy một số> = 25, số giảm được nhân với 2. Nếu một số> = 30 được nhìn thấy mức giảm được nhân với 2 và 3 = 6. Nếu một số <25 được nhìn thấy, mức giảm bắt đầu lại ở mức 1. Nếu mức giảm chia hết cho 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3 thì sẽ tìm thấy sóng nhiệt và kết quả của hoạt động modulo là 0 dẫn đến giá trị giảm là 0. Chỉ khi tìm thấy sóng nhiệt, mức giảm có thể trở thành 0. Một khi giá trị giảm là 0, nó sẽ là 0 cho tất cả các lần giảm trong tương lai, tức là cho kết quả cuối cùng.


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)

Hãy thử trực tuyến!

-3 byte nhờ Lynn

Làm thế nào nếu làm việc? Mỗi dãy số được lặp lại với thao tác giảm bắt đầu từ giá trị giảm 1. Nếu thấy một số> = 25, số giảm được nhân với 2. Nếu một số> = 30 được nhìn thấy mức giảm được nhân với 2 và 3 = 6. Nếu một số <25 được nhìn thấy, mức giảm bắt đầu lại ở mức 1. Nếu mức giảm chia hết cho 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3 thì sẽ tìm thấy sóng nhiệt và kết quả của hoạt động modulo là 0 dẫn đến giá trị giảm là 0. Chỉ khi tìm thấy sóng nhiệt, mức giảm có thể trở thành 0. Một khi giá trị giảm là 0, nó sẽ là 0 cho tất cả các lần giảm trong tương lai, tức là cho kết quả cuối cùng.

Một phiên bản dễ đọc hơn, nhưng dài hơn trông như thế này:

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

Loại bỏ khoảng trắng thừa / dấu ngoặc đơn và thay thế x if cond else ybằng cách (y,x)[cond]cho

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

Lynn đề nghị rút ngắn điều kiện 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

dẫn đến

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

Bạn cũng phải bao gồm báo cáo nhập khẩu :)
Muhammad Salman

1
Bạn thực sự không cần phải nhập giảm functools, đó là một Python 2 tích hợp !
Lynn

1
Bạn có thể kiểm tra nếu b*25>b*cvà lưu 3 byte; điều này có thể áp dụng cho nhiều giải pháp sử dụng phương pháp này bằng các ngôn ngữ khác nhau :)
Lynn

@Lynn Rất cám ơn. Tôi cập nhật giải pháp cho phù hợp.
Udo Borkowski

2

Bình thường, 23 byte

f&glT5&>T]25gePPT30SM.:

Hãy thử nó ở đây

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.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.