Tentukan Musim

11

Pengantar:

Di belahan bumi utara (yaitu Eropa, Amerika Utara, dll.), Musim dibagi seperti ini:
- Musim semi: Maret, April, Mei
- Musim panas: Juni, Juli, Agustus
- Musim Gugur: September, Oktober, November
- Musim Dingin: Desember , Januari Februari

Di belahan bumi selatan namun (yaitu Australia, Amerika Selatan, dll), musim dibagi seperti ini:
- Spring: September, Oktober, November
- Musim Panas: Desember, Januari, Februari
- Autumn: Maret, April, Mei
- Musim Dingin: Juni Juli Agustus

Perbedaan ini disebabkan oleh posisi matahari mengenai ekuator, di mana belahan utara dan selatan memiliki musim yang berlawanan.

Memasukkan:

Dalam tantangan ini, kami akan mengambil dua input:

  • Satu untuk bulan ( 1 <= m <= 12atau 0 <= m <= 11) (contoh dan kasus uji semuanya diindeks 1).
  • Dan satu untuk lima 'posisi-kelompok' di garis lintang Bumi ( -2 <= p <= 2), di mana -2Antartika, -1adalah belahan bumi selatan tidak termasuk Antartika, 0adalah daerah tropis di dekat khatulistiwa, 1adalah belahan bumi utara tidak termasuk Arktik, dan 2merupakan kutub Utara.
    Meskipun Arktik, Antartika dan Tropis tentu saja masih memiliki musim, untuk tantangan ini kita akan mengatakan Arktik dan Antartika dalam keadaan konstan Winter, dan Tropis dalam keadaan konstan Summer.

Di sini representasi visual dari lima kelompok ini, di mana -2Lingkaran Antartika; -1antara Tropic of Capricorn dan Lingkaran Antartika; 0antara Tropic of Capricorn dan Tropic of Cancer; 1antara Lingkaran Arktik dan Tropic of Cancer; dan -2Lingkaran Arktik.

masukkan deskripsi gambar di sinimasukkan deskripsi gambar di sini Sumber: COSMOS - Ensiklopedia Astronomi SAO

Keluaran:

Salah satu Spring, Summer, Autumn, atau Winter, berikut aturan-aturan ini:

  • Apakah posisi input 2atau -2(Arktik atau Antartika), selalu keluaran Winter.
  • Apakah posisi input 0(Tropics), selalu keluaran Summer.
  • Apakah input posisi 1(belahan bumi utara), output salah satu dari empat musim berdasarkan input bulan: Spring( m = [3,5]); Summer( m = [6,8]); Autumn( m = [9,11]); Winter( m = 12 or m = [1,2]).
  • Apakah input posisi -1(belahan bumi selatan), output salah satu dari empat musim berdasarkan input bulan: Spring( m = [9,11]); Summer( m = 12 or m = [1,2]); Autumn( m = [3,5]); Winter( m = [6,8]).

Aturan tantangan:

  • Output apapun empat nilai yang berbeda pilihan Anda menunjukkan Spring, Summer, Autumn, atau Winter(sebutkan apa yang telah Anda digunakan dalam jawaban Anda).
    -15 byte bonus jika Anda keluaran Spring, Summer, Autumn, atau Wintersebagai teks (case-sensitive, sehingga dapat sepenuhnya huruf kecil atau sepenuhnya huruf besar juga, bukan judul-kasus digunakan).
  • Input bulan dapat dalam format apa pun yang masuk akal. Dapat berupa bilangan bulat 0-indexed atau 1-indexed, Date-object, Month-String, dll.
  • Masukan posisi akan selalu menjadi salah satu dari ini mungkin lima input -2, -1, 0, 1, 2.

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa pun'.
  • Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program penuh. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
  • Juga, silakan tambahkan penjelasan jika perlu.

Kasus uji:

Position    1-indexed Month    Output

-2          8  (August)        Winter
-2          12 (December)      Winter
-1          3  (March)         Autumn
-1          5  (May)           Autumn
-1          8  (August)        Winter
-1          12 (December)      Summer
0           1  (January)       Summer
0           7  (July)          Summer
1           1  (January)       Winter
1           4  (April)         Spring
1           7  (July)          Summer
1           12 (December)      Winter
2           2  (February)      Winter
2           9  (September)     Winter
Kevin Cruijssen
sumber
Mengapa kita tidak bisa hanya menggunakan empat nilai berbeda untuk musim?
Erik the Outgolfer
Saya memang membaca aturan itu, itu sebabnya saya bertanya. Juga, mengapa Anda takut dengan "perhitungan bilangan bulat ajaib"?
Erik the Outgolfer
Saya tidak melihat hal buruk dengan hanya melihat perhitungan, mereka kemungkinan besar akan digunakan untuk mengindeks. Ini tantangan Anda, tetapi saya akan mengatakan ini adalah komplikasi yang tidak perlu. EDIT: tentang menyalin, yah, itu tidak benar-benar dapat dihindari.
Erik the Outgolfer
2
Saya tidak berpikir ada bonus yang diperlukan, program masih berfungsi jika tidak mengubah output ke string tersebut.
Erik the Outgolfer
1
Saya pikir bonus byte untuk mengimbangi ukuran byte teks sama sekali baik-baik saja. Ini bukan salah satu dari "Poin X bonus jika Anda juga melakukan tugas ini". Tantangannya berpusat di sekitar musim, jadi masuk akal untuk memberi insentif saat mencetak musim.
Nathan Merrill

Jawaban:

10

Ruby , 33 27 25 byte

->m,l{[6,m,0,m+6][l]/3%4}

Cobalah online!

Nilai pengembalian adalah:

0 -> musim dingin

1 -> pegas

2 -> musim panas

3 -> musim gugur

GB
sumber
6

Python 2 , 29 byte

lambda p,m:[0,m+6,6,m][p]/3%4

Cobalah online!

Port pendekatan Ruby GB , yang ternyata beberapa byte lebih pendek dari milik saya:

32 byte

lambda p,m:(p%2*(p+m/3+5)or p)%4

Cobalah online!

Fungsi anonim yang mengembalikan musim sebagai angka 0 hingga 3, di mana mereka mewakili Musim Panas, Musim Gugur, Musim Dingin dan Musim Semi dalam urutan itu.

Adapun untuk mencetak nama musim yang sebenarnya:

63 - 15 = 48 byte

lambda p,m:"SAWSuuipmtnrmutiemenrnrg"[(p%2*(p+m/3+5)or p)%4::4]

Cobalah online!

Ada string gabungan jika ada yang menginginkannya.

Jo King
sumber
3

C (gcc) , 78 75 (-15 bonus) = 60 byte

Menggunakan bulan berbasis 1.

Sunting: Operator matematika ulang dan dikurangi.

f(m,a){puts("Summer\0Autumn\0Winter\0Spring"+7*(a*a&1?(++a+m/3)%4:2*!!a));}

Cobalah online!

ErikF
sumber
1
Anda dapat menyimpan dua byte dengan (++a+m/3)%4++a+m/3&3. Juga, a*aaneh kapan tepatnya a, jadi memeriksa a&1harus baik-baik saja, bukan?
Lynn
2

05AB1E , 26 - 15 = 11 byte

Menggunakan pendekatan yang ditemukan oleh GB

6¹¾¹6+)sè3÷4%“–„Ž¹Ž€È±“#sè

Cobalah online! atau sebagai Test suite

Emigna
sumber