Menulis fungsi atau program yang mengambil input string penuh dieja, nama-nama bulan bahasa Inggris dalam kasus judul: January
, February
, March
, dll (null / CR / LF dihentikan OK, dibatasi dengan beberapa karakter non-alpha jika Anda memilih demikian) dan baik
membandingkan dua input, mengembalikan nilai Kebenaran jika input kedua lebih besar (dalam urutan bulan) dari yang pertama. Nilai yang sama menghasilkan nilai Falsey
atau mengurutkan urutan acak (daftar, string terbatas, dll.) dari mereka dalam urutan kronologis
(Inti dari tantangan adalah mendefinisikan metode / ekspresi yang memberikan jenis leksikografi yang benar. Beberapa bahasa mungkin memiliki jawaban yang lebih pendek dengan satu atau yang lain)
Anda tidak dapat menggunakan metode penguraian waktu internal (mis. strptime
) Untuk menerjemahkan nama bulan menjadi angka atau pemetaan nama bulan yang sudah dilakukan sebelumnya. Gunakan properti dari string itu sendiri, tabel pencarian pelit yang Anda tentukan, atau sesuatu yang pintar.
Contoh
Contoh-contoh yang berfungsi, meskipun yang pertama dilarang oleh aturan ...
import datetime
def is_later_month(a, b):
'''
Example of prohibited code because it relies on language
features about how to parse month names
'''
return datetime.strptime(a, '%B') < datetime.strptime(b, '%B')
Versi di bawah ini OK, karena kami memberi kode informasi itu
months = {
'January': 1, 'February': 2, 'March': 3,
'April': 4, 'May': 5, 'June': 6,
'July': 7, 'August': 8, 'September': 9,
'October': 10, 'November': 11, 'December': 12,
}
def is_later_month(a, b):
"""
Returns True/False when comparing two months.
"""
return months[a] < months[b]
Atau Anda bisa melakukan fungsi sortir
months = {'as above...'}
def sort_months(l):
"""
Sorts list and returns it. Different input and output than the above,
but equally valid. Sorting versus comparing might be shorter in your
favorite language.
"""
return sorted(l, key=lambda x: months[x])
Contoh tes
assert is_later_month('January', 'February')
assert is_later_month('January', 'December')
assert is_later_month('November', 'December')
assert not is_later_month('July', 'July')
assert not is_later_month('October', 'September')
months
yang merupakan daftar semua nama Bulan, saya ingin melarangmonths[x] < months[y]
sebagai jawaban. Daftar nama bulan memiliki beberapa fitur yang lebih aneh (panjang bervariasi, kesamaan) yang membuat tantangan lebih mudah / lebih sulit daripada string yang dihasilkan secara acak.Jawaban:
Jelly , 19 byte
Ini adalah tautan monadik yang menjadikan daftar sebagai argumen dan mengurutkannya. Cobalah online!
Latar Belakang
Jelly menggunakan pengindeksan berbasis 1 modular. Jika kami cukup sering mengulangi nama bulan untuk mendapatkan 11 karakter, kami mendapatkan array berikut.
Di kolom ke- 11 (terakhir), semua karakter berbeda, sehingga kita dapat menggunakannya untuk mengidentifikasi urutan bulan.
Bagaimana itu bekerja
sumber
kode mesin x86,
2625 byteHexdump:
Kode perakitan:
Fungsi hash berikut terjadi untuk menempatkan nama bulan dalam urutan yang benar (ditemukan oleh brute force):
Ini diterapkan pada 4 byte pertama (32 bit) dari string input, disusun dalam urutan little-endian. Kemudian membandingkan hasilnya dan menggunakan
SALC
untuk mengatur register hasil:sumber
Jelly , 15 byte
Tidak ada tautan juru bahasa online di sini karena ini adalah satu pengiriman lambat . Program menggunakan fungsi hashing
354^(input interpreted as base 32 int) % 991
sebagai kunci sortir, yang terjadi untuk memberikan output dalam urutan yang benar. Program ini tidak akan selesai dalam waktu dekat karena hasil dari eksponensial itu sangat besar - untuk "September", angka dengan 0,24 kuadriliun digit perlu dihitung!Penjelasan jelly:
Bukti skrip konsep Python - perhatikan penggunaan
pow
untuk eksponensial modular, yang jauh lebih efisien:sumber
Python,
646157 byteLambda membutuhkan waktu dua bulan sebagai masukan dan membandingkannya. Uji di Ideone .
Terima kasih kepada @ljeabmreosn untuk bermain golf 3 byte dan membuka jalan untuk 3 lagi!
sumber
s[10%len(s)]
akan(4*s)[10]
berhasil?Python,
8171 bytehttps://repl.it/CluN/1
Membandingkan indeks dalam
m
huruf kedua dan ketiga dalam dua bulan.Versi 83 byte untuk mengurutkan daftar bulan:
sumber
Ruby, 58 byte
Menggunakan trik penyortiran bulan dari jawaban @ atlasologist .
Fungsi perbandingan sedikit lebih lama, yaitu 63 byte
sumber
J,
6665 byteMenggunakan fakta bahwa f (m) = 2 * (ord (m [0]) + ord (m [-1])) // len (m) adalah fungsi yang valid dalam domain terbatas 12 bulan:
Pemakaian:
(Tidak berarti ini ide terbaik, tapi aku tidak ingin mencuri trik peringkat siapa pun!)
Ini adalah versi yang lebih pendek menggunakan metode @ atlasologist :
J, 63 byte
Pemakaian:
Dan versi yang jauh lebih pendek menggunakan metode pintar @ Dennis :
J, 34 byte
sumber
Haskell, 74 byte
Golf kode pertamaku, yay! Gagasan umum yang satu ini diilhami oleh jawaban teratas di Jelly, dan fakta bahwa ketika nama bulan di-siklus, karakter ke-11 selalu unik.
Berikut adalah versi yang tidak diklik untuk melihat cara kerjanya:
The
e
Fungsi merupakan fungsi eleventhChar (sayangnya tidak bisa menanggalkan 4 byte karena pembatasan monomorphism saya pikir) dan#
berkorespondensi fungsi infiks keinOrder
fungsi.Solusi kecil yang rapi, tetapi mungkin ada cara untuk memotong lebih banyak byte (saya menemukan beberapa saat menulis ini!)
sumber
e s=head.drop 10$cycle s
seperti yang Anda lakukan dalam penjelasan Anda dengan menggunakan.
bukan$
:e=head.drop 10.cycle
. Namun menggunakan daftar indeks operator!!
bahkan lebih pendek:e=(!!10).cycle
Jawa,
133123Golf:
Saya sedang mencari teknik yang pintar seperti pada jawaban assembler, tetapi butuh waktu terlalu lama untuk mencari tahu jadi saya pergi dengan teknik yang sama yang digunakan orang lain.
Tidak Disatukan:
sumber
substring
sebagai gantinya jikacharAt
"" +
karena tidak ada bahan bakuchar
lagi.Bahasa mesin ARM di Linux
4440 byteSaya menggunakan fungsi hash yang berbeda dari anatolyg 's solusi dan mencoba untuk petunjuk penggunaan praktis untuk menyimpan beberapa byte (meskipun saya meniup 8 byte memasuki modus ibu jari).
Anda dapat mencobanya di Raspberry Pi atau perangkat Android dengan GNURoot.
Untuk menjalankan, masukkan sesuatu seperti
Versi saat ini sekarang menangani kasus kesetaraan (dan lainnya) dengan benar.
sumber
bfac
?ite ge
kondisional menjalankan instruksi berikutnya (movge r0, #0
) jikar3 >= r0
, jika tidak, instruksi berikut ini dijalankan (movlt r0, #1
). Saya pikir ada ruang untuk membuat beberapa byte di sini, tetapi saya belum punya waktu untuk mengerjakan ini :-)Perl 6 , 55 byte
Dibutuhkan beberapa byte lagi untuk versi perbandingan:
Uji:
sumber
Haskell, 118 karakter
Menggunakan fakta bahwa setiap nama bulan unik dalam karakter pertama dan keempatnya (atau 3 untuk Mei) untuk menentukan tipe data yang dapat diurai secara otomatis dan dibandingkan dengan bahasa. Fungsi 'r' mengubah string dengan meraih empat karakter pertama (atau lebih sedikit), lalu hanya memilih yang pertama dan terakhir. Maka 'a # b' adalah operator untuk membandingkan nilai:
Mungkin bisa dilakukan dengan cara yang lebih efisien, tetapi saya ingin mencoba melakukannya menggunakan tipe data yang berguna untuk mewakili bulan.
sumber
PowerShell,
968863 bytemisalnya
Sekarang, lakukan tantangan kedua untuk menyortir daftar ke dalam urutan; versi sebelumnya melakukan perbandingan tes dua bulan:
Berdasarkan dua karakter kedua dalam nama bulan.
sumber
Python
8382 byteUji: https://repl.it/repls/TimelyDecimalBrowsers
Mendapat jumlah dari 3 karakter pertama dan membuat satu karakter untuk pencarian.
sumber
Javascript, 118 byte
Bisa bermain golf lebih banyak, mungkin dengan menyingkirkan
c
dan menggunakanarray.map
, tapi inilah yang saya miliki untuk saat ini ...sumber
for(i=0;i<12;)c.push(p[[4,3,7,0,8,6,5,1,11,10,9,2][i++]]);
Bash, 101 byte
ini berfungsi seperti is_later
uji
sumber
k4, 29
Port jawaban @ Dennis's Jelly .
Ini adalah tukang sortir, bukan pembanding; Menariknya, komparator sepele diterapkan dengan algoritma yang sama, dan hanya satu byte lebih lama:
sumber
Bash + coreutils,
94 byte93 byteIni adalah upaya untuk menghasilkan transformasi yang agak leksikografis. Jika Anda melihat dekat pada tombol transformasi
FMAyulgSOND
Anda dapat melihat bulan Februari hingga Desember (Januari menjadi kosong setelah transformasi; itu ditarik ke atas dengan menggunakan 'B' sebagai pemisah). Membalik, memotong, dan menghapus huruf yang tidak dikunci memungkinkan trik ini dibatalkan.90 byte menggunakan C Lokal
... dimana ␉ adalah karakter tab.
80 byte menggunakan C Lokal
... menggunakan metode @ atlasolog. Terikat menjadi cara untuk menggunakan pendekatan ini untuk bekerja dengan lebih banyak lokal.
Tes / Penggunaan
output:
sumber