ตรวจจับคลื่นความร้อน


48

พื้นหลัง

สถาบันอุตุนิยมวิทยาแห่งเนเธอร์แลนด์กำหนดคลื่นความร้อน * เป็นชุดอย่างน้อย 5 วันติดต่อกันที่ weather25 ° C สภาพอากาศ ("ฤดูร้อนอากาศ") เช่นอย่างน้อย 3 วันนั้นคือ≥30° C ("สภาพอากาศร้อนชื้น") )

สภาพอากาศในเขตร้อนชื้นไม่จำเป็นต้องวัดอย่างต่อเนื่องตัวอย่างเช่น: 30, 25, 30, 26, 27, 28, 32, 30เป็นคลื่นความร้อน 8 วันที่มี 4 วันของสภาพอากาศเขตร้อน

* (ดีตามมาตรฐานดัตช์)

ท้าทาย

ให้รายการที่ไม่ว่างของจำนวนเต็มบวกที่เป็นตัวแทนของการวัดอุณหภูมิเซลเซียสจากวันที่ต่อเนื่องกันตัดสินใจว่ารายการนั้นมีคลื่นความร้อน (ตามคำจำกัดความข้างต้น)

คำตอบที่สั้นที่สุดเป็นไบต์ชนะ

กรณีทดสอบ

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]

Truthy:

[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
อุณหภูมิรับประกันว่าจะต่ำกว่า 100 องศาเซลเซียสหรือไม่?
FryAmTheEggman

3
@FryAmTheEggman อืมในประเทศเนเธอร์แลนด์ใช่ :) แต่ฉันไม่ต้องการคำตอบของคุณที่จะละเมิดความจริงข้อนี้ดังนั้นไม่
ลินน์

1
@ HatWizard ใช่ไม่เป็นไร ตัวอย่างเช่น“ Crash / Don't crash” ก็ใช้ได้เช่นกัน
ลินน์

2
เฮ้ @Lynn นี่เป็นความท้าทายที่ยิ่งใหญ่และยังคงเป็น :-)
Roland Schmitz

1
@RolandSchmitz ขอบคุณ! ฉันประหลาดใจอย่างมีความสุขกับคำตอบที่สร้างสรรค์ที่ออกมาในช่วงเวลาที่ท้าทาย 🎉
Lynn

คำตอบ:



19

เยลลี่ 15 ไบต์

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

การเชื่อมโยงเอกยอมรับรายการของหมายเลขที่ส่งกลับถ้าร้อนได้รับการตรวจพบที่อื่น10

ลองออนไลน์! หรือดูการทดสอบในตัว

อย่างไร?

เกณฑ์คือการมีอยู่ของการรันมากกว่าสี่ค่าที่มากกว่าหรือเท่ากับ 25 ซึ่งมากกว่าสองต้องมากกว่าหรือเท่ากับ 30

หากเราหารด้วยห้าเกณฑ์จะกลายเป็นการมีค่ามากกว่าสี่ค่ามากกว่าหรือเท่ากับห้าซึ่งมากกว่าสองต้องมากกว่าหรือเท่ากับหก

หากเราลบห้าค่าจากค่าเหล่านี้เกณฑ์จะกลายเป็นค่าการรันมากกว่าสี่ค่าที่มากกว่าหรือเท่ากับศูนย์ซึ่งมากกว่าสองค่าต้องมากกว่าหรือเท่ากับหนึ่ง

หากเราใช้สัญลักษณ์ของค่าเหล่านี้ (รับ -1, 0 หรือ 1) เกณฑ์จะกลายเป็นการมีอยู่ของการรันมากกว่าสี่ค่าไม่เท่ากับ -1 ซึ่งมากกว่าสองจะต้องเท่ากับหนึ่ง

ถ้าเราเพิ่มหนึ่งค่าเหล่านี้ (รับ 0, 1 หรือ 2) เกณฑ์จะกลายเป็นการมีอยู่ของการรันมากกว่าสี่ค่าไม่เท่ากับศูนย์ซึ่งมากกว่าสองต้องเท่ากับสอง

ผลิตภัณฑ์ของรายการที่มีศูนย์ใด ๆ เป็นศูนย์และผลิตภัณฑ์ของรายการที่มีมากกว่าสอง twos (และส่วนที่เหลือเป็นรายการ) มากกว่าสี่ ซึ่งหมายความว่าเกณฑ์ในรายการที่ปรับปรุงนี้กลายเป็นว่าผลิตภัณฑ์ขั้นต่ำและความยาวมากกว่า 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 (เสียงดังกราว) 64 ไบต์

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

ฟังก์ชัน o () ส่งคืน 1 สำหรับคลื่นความร้อนหรือ 0

ขอบคุณเวทมนตร์หมายเลข 864 และUdo Borkowskiและ Mathis สำหรับแนวคิดของพวกเขา

ถ้าทำงานอย่างไร แต่ละลำดับของตัวเลขถูกวนซ้ำด้วยการดำเนินการลดเริ่มต้นที่ค่าลด 1 หากเห็นตัวเลข> = 25 การลดจะถูกคูณด้วย 2 หากเห็นตัวเลข> = 30 การลดจะถูกคูณด้วย 2 และ 3 = 6. หากเห็นตัวเลข <25 การลดจะเริ่มอีกครั้งที่ 1 หากการลดหารด้วย 864 = 2 * 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3 จะพบคลื่นความร้อนและผลลัพธ์ของ การดำเนินการ modulo เป็น 0 ซึ่งส่งผลให้ค่าลดลงเป็น 0 และในค่าตอบแทนของจริง

ลองออนไลน์!


ยินดีต้อนรับสู่ PPCG
มูฮัมหมัดซัลมาน

ยินดีต้อนรับสู่ PPCG! คำตอบแรกที่ดีมากพร้อมชุดทดสอบเคส! คุณสามารถเพิ่มคำอธิบายเพื่อให้เราเข้าใจเวทมนตร์ได้หรือไม่?
JayCe

นั่นเป็นทางออกที่สวยงามจริงๆทำดี :)
ลินน์


7

APL (Dyalog Classic) , 21 20 ไบต์

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

ลองออนไลน์!

การใช้งาน ⎕io←1

25 30⍸x คือ 0 ถ้า x <25, 1 ถ้า25≤x <30, หรือ 2 เป็นอย่างอื่น

เราคำนวณผลิตภัณฑ์สะสมของเหล่านี้เริ่มต้นจาก (หรือเทียบเท่า: สิ้นสุดที่) สถานที่ที่เป็นไปได้ทั้งหมดทิ้งผลิตภัณฑ์ 4 รายการแรกและตรวจจับการมีอยู่ของผลิตภัณฑ์≥8 (ซึ่งคือ 2 3 )


6

Japt , 19 18 ไบต์

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

ฉันหวังว่าฉันจะได้รับการอภิปรายทั้งหมดในความคิดเห็นได้อย่างถูกต้อง
โกนหนึ่งขอบคุณไบต์ปุย

ลองออนไลน์!


คิดว่ามันจะสั้นกว่านี้เมื่อฉันอ่านมัน แต่ทำได้แค่18 ไบต์เท่านั้น
ปุย

@Shaggy ฉันก็คิดเช่นกัน แต่ฉันก็ไม่สามารถหารุ่นที่สั้นกว่านี้ได้เช่นกัน ขอบคุณมากสำหรับตัวชี้!
นิตย์

1
ดูเหมือนว่าเรากำลังชนะหนึ่งที่นี้ :)
ปุย

อักขระที่ไม่ใช่ ASCII ไม่นับเป็นหลายไบต์หรือไม่
sudo

1
@sudo สัญลักษณ์เหล่านั้นเป็นไบต์เดียวทั้งหมด ตัวอย่างเช่นจะเป็น 3 ไบต์ แต่¨เป็นหนึ่งไบต์ สัญลักษณ์ที่ใช้ด้านบนได้รับการเลือกสำหรับภาษากอล์ฟอย่างแม่นยำด้วยเหตุผลว่าพวกเขาทั้งหมดเป็นไบต์เดียว
นิด

5

PowerShellขนาด 121 ไบต์

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

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

PowerShell ไม่มีสิ่งใดเทียบเท่า.someหรือ.everyคล้ายคลึงกันดังนั้นจึงถูกรีดด้วยมือ

เรารับค่า$aเป็นอาร์เรย์ของจำนวนเต็ม ตั้งค่าตัวแปรตัวช่วย$bเป็นสตริงว่าง $aจากนั้นห่วงผ่านทุกจำนวนเต็มใน ภายในลูปถ้าจำนวนเต็มนั้นมี-gคุณสมบัติตรงตามที่eต้องการให้25เพิ่มเข้าไปในสตริงที่เป็นไปได้ของเรา$bมิฉะนั้นวาง$bบนไพพ์ไลน์และตั้งเป็นสตริงว่าง

เมื่ออยู่นอกวงอาร์เรย์ concatenate ผลท่อด้วย$bและนำผู้ที่ผ่านประโยคWhere-Object |?{...}นี้ดึงออกสตริงที่มีความยาวองค์ประกอบของ-ge5(ขึ้นอยู่กับการแยกในช่องว่าง) และนับจากอุณหภูมิสูงกว่าเป็น30 -ge3สตริงเหล่านั้นจะถูกทิ้งไว้ที่ไพพ์ไลน์ดังนั้นค่าความจริงจึงไม่ว่างเปล่า (ดูที่ลิงค์ "ตรวจสอบกรณีทดสอบทั้งหมด" เพื่อดูความแตกต่างระหว่างความจริง / เท็จ)


ลองใช้$args แทนparam($a)และ$a
mazzy

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

109 ไบต์พร้อมอาร์เรย์ บันทึกเป็น$args|%{if($_-ge25){$b+=$_}else{,$b;$b=@()}}-E{,$b}-B{,($b=@())}|?{$_.count-ge5-and($_|?{$_-ge30}).count-ge3} get-heatWave.ps1ทดสอบสคริปต์regex101.com/r/lXdvIs/2
mazzy

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

อะไร-Eทำอย่างไร ฉันไม่คุ้นเคยกับสิ่งนั้น
AdmBorkBork

5

เยลลี่ , 17 16 ไบต์

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

ลองออนไลน์!

มันทำงานอย่างไร

: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 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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

แบตช์ 119 ไบต์

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

รับอินพุตเป็นอาร์กิวเมนต์บรรทัดรับคำสั่งและเอาต์พุต 1 สำหรับ heatwave เป็นอย่างอื่น 0


4

Pythonขนาด 67 ไบต์

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

ลองออนไลน์!

หมดเวลาสำหรับกรณีทดสอบที่ยาวนานขึ้นเนื่องจากการเติบโตแบบเลขชี้กำลัง ค้นหารายการย่อยที่ต่อเนื่องโดยการสับองค์ประกอบแรกหรือองค์ประกอบสุดท้ายซ้ำ ๆ นั่น 3 วันจะ≥30° C sorted(l)[~2]จะถูกตรวจสอบโดยดูที่สามที่ใหญ่ที่สุดคุ้มค่า กรณีฐานอาจสั้นลงโดยการใช้ประโยชน์จากความจริง / เท็จหรือยุติด้วยข้อผิดพลาด




4

APL (Dyalog Unicode) , 29 ไบต์

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

ลองออนไลน์!

∨/มีองค์ประกอบอะไรบ้างที่

(5≤≢¨a)5 <จำนวนวันในแต่ละซีรีย์ ( aมีซีรีย์ที่เป็นไปได้ทั้งหมด)

และ

3≤+/30≤3 ≤จำนวนรวม+/ขององค์ประกอบที่≥ 30 นิ้ว

↑a← เมทริกซ์ที่เกิดขึ้นจาก

e⊆⍨25≤e←⎕ ชุดขององค์ประกอบต่อเนื่องที่ are 25


การทดสอบครั้งแรกของคุณแสดงความคิดเห็นโดยไม่จำเป็น - ทำงานได้
ngn

@ngn ขอบคุณที่ทราบว่าได้รับการแก้ไขแล้ว
Kritixi Lithos

4

Kotlin , 57 ไบต์

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

(-1 ไบต์โดยการเปลี่ยนพารามิเตอร์อย่างชัดเจนV->มีพารามิเตอร์นัยมัน )

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

(-16 ไบต์ใช้การดำเนินการ {} ใด ๆ ที่เห็นใน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 ไบต์ขอบคุณลินน์: แทนที่ r> 0 && v <25 ด้วย 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}

การแสดงออกแลมบ์ดานี้ใช้รายการและส่งคืนค่าจริงสำหรับ heatwave หรือ false อย่างอื่น

ขอบคุณเวทมนตร์หมายเลข 864 และUdo Borkowskiและ Mathis สำหรับแนวคิดของพวกเขา

ถ้าทำงานอย่างไร ลำดับของตัวเลขแต่ละตัวมีการวนซ้ำด้วยการดำเนินการ{} ใด ๆเริ่มต้นที่การลดค่า 1 การลดจะถูกคูณด้วย 2 และคูณด้วย 3 (2 * 3 = 6) หากจำนวนมากกว่าหรือเท่ากับ 30 หากตัวเลข <25 จะเห็นว่าการลดเริ่มต้นอีกครั้งที่ 1 หากการลดหารด้วย 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3 จะพบคลื่นความร้อนและผลลัพธ์ของการดำเนินการ modulo คือ 0 ซึ่งส่งผลให้ ค่าตอบแทนที่แท้จริงในแลมบ์ดาภายในเรียกจากการดำเนินการ{} ใด ๆซึ่งจะหยุดการวนซ้ำและส่งคืนค่าของจริง

ลองออนไลน์!


คำอธิบายที่ดี :)
JayCe

ฉันคิดว่าจำนวนไบต์ของคุณควรสะท้อนถึงการประกาศฟังก์ชั่นทั้งหมดไม่ใช่แค่เนื้อหาของฟังก์ชัน ตามที่เป็นอยู่ในตอนนี้ดูเหมือนว่าฉันจะเป็นตัวอย่าง
Jonathan Frech

@ jonathan-frech ฉันเปลี่ยนส่วนของฟังก์ชั่นเป็นนิพจน์แลมบ์ดาที่ยาวกว่าเล็กน้อยรวมถึงวงเล็บปีกกาที่ไม่จำเป็นเหมือนใน Java ยุติธรรมหรือไม่
Roland Schmitz

@RolandSchmitz มองไปที่การส่ง Kotlin อื่น ๆ และการส่งฟังก์ชั่น Java แลมบ์ดาฉันเดาว่าไม่รวมถึงการนับจำนวนไบต์ที่ประกาศฟังก์ชั่นเป็นที่ยอมรับ หมายความว่าเอกสารต้นฉบับของคุณน่าจะใช้ได้จริง ขออภัยสำหรับความคิดเห็นของฉันมันดูเหมือนแปลกสำหรับฉันเพราะฉันพบว่ามันดูเกร็ดเล็กเกร็ดน้อย -EK เพราะมันไม่ได้เป็นภาษาสร้างที่ถูกต้องโดยไม่ต้องประกาศประเภท
Jonathan Frech

3

สงสัย 34 ไบต์

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

ตัวอย่างการใช้งาน:

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

คำอธิบาย

เวอร์ชัน verbose:

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

ใช้ลำดับที่ทับซ้อนกันของ 5 รายการติดต่อกันจากนั้นตรวจสอบว่าลำดับใด ๆ มีรายการทั้งหมด> 25 และมากกว่า 2 รายการ> 30


เฮ้นี่ไม่เกี่ยวข้อง แต่ลิงค์ facebook บนเว็บไซต์ของคุณตายแล้ว
mbomb007


3

Stax , 23 ไบต์

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

เรียกใช้และแก้ไขปัญหาได้ที่ staxlang.xyz! การดำเนินการนี้ใช้เวลานานดังนั้นฉันจึงปิดใช้งานการทำงานอัตโนมัติ

คลายการแพค (28 ไบต์) และคำอธิบาย

: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

นี่จะพิมพ์ subarrays ทั้งหมดที่สามารถนับเป็นคลื่นความร้อนซึ่งจะเป็นเท็จถ้าหากไม่มีอยู่จริงเท่านั้น


3

Ruby , 89 ไบต์

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

ลองออนไลน์!


ฉันเชื่อว่ามันล้มเหลวเพราะในกรณีความจริงที่สอง +30 วันไม่ได้ทั้งหมดภายในห้าวัน
Stewie Griffin

ดีมาก. คุณสามารถโกนหนวดออกไปได้ไม่กี่ไบต์ด้วยeach_consวิธีการ - ลองออนไลน์!
benj2240

3

Husk , 19 ไบต์

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

ลองออนไลน์!

การใช้ตัวกรอง ( f) คือหนึ่งไบต์ที่สั้นกว่าการตรวจสอบด้วยตรรกะและ ( &)นอกจากนี้ยังเป็นการดีมากที่จะกำจัด±- การคิดต้นทุน 2 ไบต์ :(

คำอธิบาย

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 66 ไบต์

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

ลองออนไลน์!

พอร์ตหน้าด้านของRoland Schmitz ของ คำตอบ ขอบคุณไบต์ที่ -4 ถึง Roland และ -1 ขอบคุณ Giuseppe

TIO ลิงก์ไปยังรุ่นที่ใช้งานได้

รุ่นก่อนหน้าสกัดวันติดต่อกัน> 25 การใช้rleและบันทึกขนาดมหึมา 18 ไบต์ขอบคุณ Giuseppe!


ถ้าคุณใช้FแทนคุณTสามารถทำได้F=F|"if"(cond,(expr),0)แล้วกลับFไปบันทึก 6-ish bytes คุณยังมีคู่ที่ไม่จำเป็นของวงเล็บรอบ(1-z[i]):0แต่ผมคิดว่าก็อาจจะ1-z[i]:1ต่อไปเพื่อบันทึกไบต์คู่อื่น ...
จูเซปเป้

ฉันกำลังจะส่งความคิดเห็นข้างต้นเมื่อมีความคิดอื่นเกิดขึ้นกับฉันและฉันพยายามหาวิธีแก้ปัญหาย่อย 100 ไบต์! มันเป็น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}แต่ระวังการวางจาก PPCG ใน TIO เพราะบางครั้ง unprintables คืบใน ...
Giuseppe

มันยอดเยี่ยมมาก! อาจเป็นวิธีที่แม้สั้นใช้ประโยชน์จากคณิตศาสตร์โจนาธานอัลลัน ...
Jayce

ดีมากคุณสามารถบันทึกไบต์ได้มากขึ้นถ้าคุณทำให้ส่วนด้านในง่ายขึ้นจาก (i * 2 * (1+ (2 * (j> 29)))) ถึง (i * (2 + 4 * (j> 29) ))
Roland Schmitz

@RolandSchmitz จริงมาก!
JayCe

3

Swift 4 , 50 bytes

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

ลองออนไลน์!

นิพจน์การปิดส่งคืนค่า 0 สำหรับ heatwave หรือ> 0 อื่น

สร้างโดยความร่วมมือกับRoland Schmitzและ Mathis

ถ้าทำงานอย่างไร แต่ละลำดับของตัวเลขถูกวนซ้ำด้วยการดำเนินการลดเริ่มต้นที่ค่าลด 1 หากเห็นตัวเลข> = 25 การลดจะถูกคูณด้วย 2 หากเห็นตัวเลข> = 30 การลดจะถูกคูณด้วย 2 และ 3 = 6. หากเห็นตัวเลข <25 การลดจะเริ่มอีกครั้งที่ 1 หากการลดหารด้วย 864 = 2 * 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3 จะพบคลื่นความร้อนและผลลัพธ์ของ การทำงานแบบโมดูโลคือ 0 ซึ่งส่งผลให้ค่าลดลงเป็น 0 เฉพาะเมื่อพบคลื่นความร้อนการลดสามารถกลายเป็น 0 ได้เมื่อค่าการลดเป็น 0 มันจะเป็น 0 สำหรับการลดในอนาคตทั้งหมดเช่นสำหรับผลลัพธ์สุดท้าย


3

Python 2 , 66 63 ไบต์

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

ลองออนไลน์!

-3 ไบต์ด้วย Lynn

ถ้าทำงานอย่างไร แต่ละลำดับของตัวเลขถูกวนซ้ำด้วยการดำเนินการลดเริ่มต้นที่ค่าลด 1 หากเห็นตัวเลข> = 25 การลดจะถูกคูณด้วย 2 หากเห็นตัวเลข> = 30 การลดจะถูกคูณด้วย 2 และ 3 = 6. หากเห็นตัวเลข <25 การลดจะเริ่มอีกครั้งที่ 1 หากการลดหารด้วย 864 = 2 * 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3 จะพบคลื่นความร้อนและผลลัพธ์ของ การทำงานแบบโมดูโลคือ 0 ซึ่งส่งผลให้ค่าลดลงเป็น 0 เฉพาะเมื่อพบคลื่นความร้อนการลดสามารถกลายเป็น 0 ได้เมื่อค่าการลดเป็น 0 มันจะเป็น 0 สำหรับการลดในอนาคตทั้งหมดเช่นสำหรับผลลัพธ์สุดท้าย

รุ่นที่อ่านได้ แต่มีความยาวกว่าจะมีลักษณะดังนี้:

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

การลบช่องว่างพิเศษ / วงเล็บและการแทนที่x if cond else yด้วยการ(y,x)[cond]ให้

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

Lynn แนะนำให้ย่อให้สั้นลงเงื่อนไข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

ที่เกิดขึ้นใน

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

คุณจะต้องรวมถึงคำสั่งนำเข้ามากเกินไป :)
มูฮัมหมัดซัลมาน

1
จริงๆแล้วคุณไม่จำเป็นต้องนำเข้าการลดลงfunctoolsเพราะเป็นPython 2 ในตัว !
Lynn

1
คุณสามารถตรวจสอบว่าb*25>b*cและบันทึก 3 ไบต์; นี้อาจจะนำไปใช้กับหลายของการแก้ปัญหาการใช้วิธีนี้ในภาษาที่แตกต่างกัน :)
ลินน์

@ ลินน์ขอบคุณมาก ฉันอัปเดตโซลูชันตาม
Udo Borkowski



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.