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, 30
adalah 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]
Jawaban:
C (gcc) ,
8875 byteCobalah online!
sumber
h,e,a;t
- sentuhan yang bagus!Jelly , 15 byte
Tautan monadik yang menerima daftar angka yang kembali
1
jika gelombang panas terdeteksi0
.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.
sumber
Haskell ,
737271696766 byteTerima kasih kepada @ flawr dan @Laikoni untuk masing-masing dua byte dan @xnor untuk satu byte!
Cobalah online!
Panjang yang sama:
Cobalah online!
sumber
C (dentang) , 64 byte
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!
sumber
Python 3 , 79 byte
Cobalah online!
sumber
APL (Dyalog Classic) ,
2120 byteCobalah online!
menggunakan
⎕io←1
25 30⍸x
adalah 0 jika x <25, 1 jika 25≤x <30, atau 2 sebaliknyakami 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 )
sumber
Japt ,
1918 byteSaya harap saya mendapatkan semua diskusi di komentar dengan benar.
Dicukur satu byte berkat Shaggy .
Cobalah online!
sumber
漢
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.PowerShell , 121 byte
Cobalah online! atau Verifikasi semua kasus uji
PowerShell tidak memiliki yang setara dengan
.some
atau.every
atau sejenisnya, jadi ini digulung dengan tangan.Kami mengambil input
$a
sebagai array bilangan bulat. Setel variabel pembantu$b
ke string kosong. Kemudian, loop melalui setiap integer di$a
. Di dalam loop, jika integer adalah-g
reaterthanore
qual to25
, tambahkan ke string potensial kami$b
, jika tidak letakkan$b
di pipeline dan atur ke string kosong.Setelah di luar loop, array-concatenate hasil pipeline dengan
$b
, dan meletakkannya melaluiWhere-Object
klausa|?{...}
. Ini tarikan keluar mereka string yang memiliki panjang elemen-ge5
(berdasarkan membelah pada spasi) dan hitungan temps lebih besar dari30
menjadi-ge3
. String-string tersebut dibiarkan di atas pipa, sehingga nilai kebenarannya tidak kosong (lihat tautan "verifikasi semua kasus uji" untuk perbedaan kebenaran / falsey).sumber
$args
sebagai gantinyaparam($a)
dan$a
...{$a=-split$_;$a.count-ge5-and($a|?{$_-ge30}).count-ge3}
$args|%{if($_-ge25){$b+=$_}else{,$b;$b=@()}}-E{,$b}-B{,($b=@())}|?{$_.count-ge5-and($_|?{$_-ge30}).count-ge3}
sebagaiget-heatWave.ps1
. Skrip uji regex101.com/r/lXdvIs/2$b=@();$args|%{if($_-ge25){$b+=$_}else{,$b;$b=@()}}-E{,$b}|?{$_.count-ge5-and($_|?{$_-ge30}).count-ge3}
-E
harus dilakukan Saya tidak terbiasa dengan itu.Jelly ,
1716 byteCobalah online!
Bagaimana itu bekerja
sumber
Python 2 , 86 byte
Cobalah online!
sumber
JavaScript (ES6),
6351 byteMengembalikan boolean.
Cobalah online!
sumber
05AB1E , 20 byte
Cobalah online!
Penjelasan
sumber
Batch, 119 byte
Mengambil input sebagai argumen command-line dan menghasilkan 1 untuk gelombang panas sebaliknya 0.
sumber
Python , 67 byte
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.sumber
JavaScript (Node.js) , 48 byte
Cobalah online!
yang sangat buruk
sumber
Haskell , 64 byte
Cobalah online!
sumber
APL (Dyalog Unicode) , 29 byte
Cobalah online!
∨/
ada setiap elemen seperti yang(5≤≢¨a)
5 <penghitungan≢
hari di setiap seri (a
memiliki semua seri hari yang mungkin)∧
dan3≤+/30≤
3 ≤+/
jumlah total elemen yang ≥ 30 in↑a←
matriks yang dibentuk olehe⊆⍨25≤e←⎕
rangkaian elemen berurutan yang ≥ 25sumber
Kotlin , 57 byte
(-1 Byte dengan mengganti Parameter eksplisit v-> dengan parameter implisit itu )
(-16 byte menggunakan operasi {} apa pun seperti yang terlihat di Ruby Solution by GB )
(-1 byte terima kasih Lynn: diganti r> 0 && v <25 dengan r * 25> r * v)
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!
sumber
Bertanya-tanya , 34 byte
Contoh penggunaan:
Penjelasan
Versi verbal:
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.
sumber
Jelly , 21 byte
Cobalah online!
sumber
Stax , 23 byte
Jalankan dan debug di staxlang.xyz! Ini membutuhkan waktu lama untuk dijalankan, jadi saya menonaktifkan jalankan otomatis.
Dibongkar (28 byte) dan penjelasan
Ini akan mencetak semua subarrays yang dapat dihitung sebagai gelombang panas, yang akan menjadi salah jika dan hanya jika tidak ada.
sumber
Ruby , 89 byte
Cobalah online!
sumber
each_cons
pendekatan - Cobalah online!Sekam , 19 byte
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
sumber
Retina , 31 byte
Cobalah online!
sumber
R ,
111 93 71 6766 byteCobalah 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
rle
dan menyimpan 18 byte kekalahan berkat Giuseppe!sumber
F
alih-alihT
, Anda bisa melakukannyaF=F|"if"(cond,(expr),0)
dan kemudian kembaliF
untuk menyimpan byte 6-ish. Anda juga memiliki sepasang tanda kurung yang tidak perlu di sekitar,(1-z[i]):0
tapi saya pikir itu bisa saja1-z[i]:1
menyelamatkan beberapa byte lagi ...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 ...Cepat 4 , 50 byte
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.
sumber
Python 2 ,
6663 byteCobalah 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:
Menghapus spasi ekstra / tanda kurung dan mengganti
x if cond else y
dengan(y,x)[cond]
memberiLynn 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
sumber
functools
, ini adalah bawaan di Python 2 !b*25>b*c
dan menyimpan 3 byte; ini mungkin berlaku untuk banyak solusi yang menggunakan pendekatan ini dalam berbagai bahasa :)Pyth, 23 byte
Coba di sini
sumber
Befunge-98 , 61 byte
Cobalah online!
sumber
Perl 6 ,
5452 byteCobalah online!
sumber