Terinspirasi oleh Kami memiliki unit test satu kali yang hanya gagal pada hari Minggu , menulis sebuah program atau fungsi yang tidak melakukan apa-apa selain melemparkan kesalahan ketika hari Minggu, dan keluar dengan anggun di hari lain.
Aturan:
- Tidak menggunakan input atau menampilkan output melalui metode IO yang biasa , kecuali untuk mencetak ke STDERR atau yang setara dengan bahasa Anda. Anda diizinkan mencetak ke STDOUT jika itu merupakan produk sampingan dari kesalahan Anda.
- Suatu fungsi dapat mengembalikan nilai pada non-Minggu selama itu tidak mencetak apa pun
- Program Anda dapat menggunakan hari Minggu dari zona waktu mana pun, atau zona waktu setempat, selama konsisten.
- Kesalahan adalah sesuatu yang membuat program berhenti secara tidak normal , seperti kesalahan dibagi dengan nol atau menggunakan variabel yang tidak diinisialisasi. Ini berarti bahwa jika ada kode yang ditambahkan setelah bagian kesalahan, itu tidak akan dieksekusi pada hari Minggu.
- Anda juga dapat menggunakan pernyataan yang secara manual membuat kesalahan, setara dengan Python
raise
. - Ini termasuk kesalahan runtime, kesalahan sintaksis dan kesalahan saat kompilasi (semoga berhasil!)
- Anda juga dapat menggunakan pernyataan yang secara manual membuat kesalahan, setara dengan Python
- Pada kesalahan harus ada beberapa tanda yang membedakannya dari tidak ada kesalahan
- Ini adalah kode-golf , jadi bytecount terpendek di setiap bahasa menang!
Saya harus menunggu sampai hari Minggu untuk memeriksa jawabannya;)
code-golf
date
error-message
Jo King
sumber
sumber
print "error"
kesalahan? Paragraf yang ditambahkan tidak benar-benar menjelaskan apa pun.Jawaban:
Bash + coreutils,
1514 byteCobalah online!
sumber
PHP 7, 12 byte
Pada PHP 7 itu melempar pengecualian
DivisionByZero
pada hari Minggu. Hal yang sama terjadi jika ditafsirkan menggunakan HHVM .Pada PHP 5 ini menampilkan peringatan (aktif
stderr
) pada hari Minggu:Pada versi PHP apa pun, itu tidak menampilkan apa pun pada hari-hari lain dalam seminggu.
Jalankan menggunakan CLI:
atau coba online!
Dua byte lagi dapat diperas oleh pengupasan tanda kutip (
1%date(w);
) tapi pemicu ini pemberitahuan (yang dapat ditekan dengan benar mengaturerror_reporting = E_ALL & ~E_NOTICE
diphp.ini
).sumber
1%date("w");echo "Alive!"
, itu akan berhenti di PHP7 + dan HHVM, tetapi tidak di semua versi lain sejak PHP 4.PHP, 15 byte
Mengasumsikan pengaturan default .
Output pada hari Minggu
Cobalah online!
sumber
||\n
bukan?:\n
.Java 8,
694334 byte-26 byte terima kasih kepada @ OlivierGrégoire .
-9 byte terima kasih @Neil .
Penjelasan:
Coba di sini.
v->{...}
( parameter yang tidak digunakanVoid
null
) lebih pendek satu byte dari()->{...}
(tidak ada parameter).new java.util.Date().getDay()
akan mengembalikan 0-6 untuk hari Minggu-Sabtu, jadi1/...
akan memberikanjava.lang.ArithmeticException: / by zero
kesalahan jika nilainya 0, yang hanya terjadi pada hari Minggu.sumber
v->{int i=1/new java.util.Date().getDay();}
(43 byte).java.util.Date()
memang punya metode untuk mendapatkan hari dalam seminggu .. Dan bahkan 0 untuk hari Minggu .. Tidak yakin bagaimana saya melewatkan itu. : SPython 3 , 33 byte
Cobalah online!
Python 3 , 50 byte
Cobalah online!
Disimpan ~ 3 byte berkat Rod .
sumber
"Su"in time.ctime()>q
(saya mengedit dengan yang ini)?"Su"in time.ctime()
memeriksa apakah hari ini adalah hari Minggu. Jika ini salah,>q
bagian itu tidak dievaluasi sama sekali dan semuanya keluar dengan lancar. Tetapi jika itu benar, maka bagian kedua dari ketidaksetaraan dievaluasi, dan karenaq
tidak didefinisikan, ini akan membuang aNameError
.("Su" in time.ctime()) and (time.ctime() > q)
.Pyth ,
87 byteCobalah online!
Penjelasan
sumber
1.0
tidak dihasilkan oleh kesalahan ). OP mengatakan secara eksplisit bahwa mereka tidak mengizinkan itu. Anda dapat memperbaikinya dengan menambahkan satu spasi ke kode Anda,Haskell + Data.Dates , 55 byte
Cobalah online!
Ini menggunakan fakta bahwa hari Minggu adalah hari terakhir dalam seminggu.
dateWeekDay
mengembalikan hari dalam seminggu sebagaiWeekDay
jenis, yang hanya didefinisikan sebagaiWeekDay
adalah contoh dariEnum
, dengan demikian kita dapat menggunakansucc
danpred
untuk mendapatkan penerus atau pendahulu dari hari kerja, misalnyasucc Monday
hasilTuesday
.Namun,
Sunday
adalah entri enum terakhir, jadi panggilansucc Sunday
menghasilkan kesalahan berikut:Sunting 1: Terima kasih kepada nimi untuk -3 byte!
Edit 2: -11 byte sekarang karena fungsi diizinkan.
Program lengkap:
8881746966 byteCobalah online!
pure
diperlukan untuk mengangkat hasilnyaWeekDay
kembali ke IO Monad. Namun, Haskell melihat bahwa nilai tidak dihasilkan dengan cara apa pun oleh program, sehingga malas, ekspresi tidak dievaluasi, sehingga bahkan pada hari Minggu program tidak akan gagal. Inilah mengapa$!
diperlukan, yang memaksa evaluasi bahkan jika Haskell biasanya tidak mengevaluasi ekspresi.Pendekatan sebelumnya dengan
Data.Time
:127124 byteCobalah online! Ini adalah beberapa impor yang mengesankan. Perubahan
d<7
ke misalnyad/=5
untuk menguji kegagalan pada hari Jumat. Gagal dengan pengecualian berikut:Non-exhaustive patterns in function c
.sumber
main=pure$!succ.dateWeekDay<$>getCurrentDateTime
. Dan, karena fungsi dibolehkan, Anda dapat menjatuhkanmain=
.No using input or showing output through the usual IO methods
aturannya. Sejauh yang saya lihat, menggunakan fungsi akan menghasilkan output untuk non-Minggu, meskipun dibungkus dengan aksi IO.05AB1E ,
4544 byteKarena 05AB1E tidak memiliki bawaan untuk mendapatkan hari dalam seminggu, saya telah menggunakan Aturan Zeller untuk menghitungnya.
Mencetak baris baru ke stderr jika hari Minggu (dapat dilihat pada tampilan debug pada TIO)
Cobalah online!
Penjelasan
Rumus umum yang digunakan adalah
DoW = d + [(13*(m+1))/5] + y + [y/4] + [c/4] - 2*c
Dimana
DoW=day of week
,d=day
,m=month
,y=last 2 digits of year
,c=century
dan dan ekspresi dalam kurung ([]
) adalah bulat ke bawah.Setiap bulan yang digunakan dalam rumus berhubungan dengan angka, di mana
Jan=13,Feb=14,Mar=3,...,Dec=12
Seperti kita memiliki bulan saat ini dalam format yang lebih umum,
Jan=1,...,Dec=12
kita mengonversi bulan menggunakan rumusm = (m0 + 11) % 14 + 1
Sebagai biproduct Maret menjadi bulan pertama, Januari dan Februari termasuk tahun sebelumnya, sehingga perhitungan untuk menentukan
y
menjadiy = (year - (m0 < 3)) % 100
Nilai akhir untuk
DoW
kita dapatkan adalah int di mana0=Sat,1=Sun,...,6=Fri
.Sekarang kita dapat secara eksplisit melempar kesalahan jika hasilnya benar.
sumber
JavaScript, 23 Bytes
Program lengkap.
Variabel
k
tidak boleh didefinisikan.JavaScript, 20 byte oleh Rick Hitchcock
JavaScript, 19 byte oleh apsillers
sumber
_=>
; tanpanya ini adalah cuplikan yang tidak diizinkan secara default. 2) Ini outputfalse
pada setiap hari ketika seharusnya tidak menghasilkan apa-apa./Su/.test(Date())&&k
selama 20 byte.new Date
versi 25 byte(new Date/864e5%7|0)-3||p
match
sebagai gantinya:Date().match`Su`&&k
VBA / VBScript,
2220 byteDisimpan 2 byte berkat Taylor Scott.
Ini harus dijalankan di Jendela Segera.
Weekday()
mengembalikan 1 (Minggu) hingga 7 (Sabtu) sehingga ini menciptakan pembagian dengan kesalahan nol pada hari Minggu. Kalau tidak, tidak ada output.sumber
?1/(Weekday(Now)-1)
Now
valid tanpa()
di VBA tapi saya tidak bisa menggunakan cetak karena saya pikir semua output tidak diizinkan kecuali kesalahan keluar.No using input or showing output through the usual IO methods, except to print to STDERR
. Tetap saja, tersimpan 2 byte.Ruby, 15 byte
wday
akan mengembalikan 0 pada hari Minggu yang menyebabkan ZeroDivisionError: dibagi dengan 0 kesalahan. Sebagai contoh:1/Time.new(2018,1,7).wday
.sumber
Perl 5 , 13 byte
Cobalah online!
Ported, jawab biketire
dihapus 3 byte dengan pengingat @ mik
sumber
gmtime
alih-alihlocaltime
juga akan memenuhi aturan, dan lebih pendek 3 bytejq, 42 karakter
(39 karakter kode + 3 opsi opsi baris perintah)
Hanya mencoba pendekatan yang berbeda di sini: parse angka hari minggu (0..6) sebagai angka hari bulan (1..31).
Contoh dijalankan:
Perhatikan bahwa jq hanya menangani tanggal UTC.
Cobalah online!
sumber
C,
35, 3427 byte-7 byte dengan terima kasih kepada @MartinEnder dan @Dennis
Cobalah online!
sumber
VBA 18 byte
Ini bergantung pada fungsi inbuilt
date()
mengembalikan nomor hari yang tersisa 1 jika dibagi 7, jadi mungkin OS dan / atau CPU spesifik.Ini berjalan di jendela proyek VBA Immediate.
sumber
R ,
31 byte,30 byteCobalah online!
Tidak ada output pada non-Minggu,
Error: object 'a' not found
pada hari Minggu.format(Sys.Date(),'%u')
adalah cara terpendek yang dapat saya temukan untuk mendapatkan hari kerja, itu menghasilkan nomor kelas karakter untuk hari dalam seminggu, dengan 7 untuk hari Minggu. Kita dapat membandingkan dengan angka 7, dan jika benar mencoba menggunakan objek yang tidak terdefinisi.Menyimpan satu byte berkat Giuseppe!
sumber
>6
byte lebih pendek.Ocaml, 46 byte
dan di ocaml REPL, kita dapat mencapai yang lebih baik dengan menghapus
let
dan final:()
:yaitu 41 byte (termasuk 1 byte untuk carriage return).
sumber
SAS, 36 byte
sumber
TI-Basic 84+, 23 byte
Membutuhkan perintah tanggal & waktu, yang hanya 84+ dan lebih tinggi.
sumber
MATL , 12 byte
Kesalahan yang dihasilkan pada hari Minggu adalah:
Berjalan di Oktaf:
Berjalan di Matlab:
Untuk membalikkan perilaku (kesalahan pada hari apa pun kecuali pada hari Minggu), tambahkan
~
setelah>
.Cobalah secara Online!
Penjelasan
Ini mengeksploitasi fakta itu
pengindeksan ke dalam array kosong dengan indeks logis
false
adalah valid (dan hasilnya adalah array kosong, yang tidak menghasilkan output); sedangkanpengindeksan dengan
true
menyebabkan kesalahan karena array tidak memiliki entri pertama.Kode yang dikomentari:
sumber
Q, 20 Bytes
.zd mengembalikan tanggal saat ini. mod melakukan modulo dari tanggal saat ini, yang mengembalikan int. Jika tanggal adalah hari Minggu, .zd mod 7 mengembalikan 1. Jika 1 = 1, (pada hari Minggu), dan kesalahan dimunculkan menggunakan operator 'Untuk singkatnya, kesalahannya hanya karakter e.
sumber
C # (.NET Core) ,
555448 byteCobalah online!
Disimpan 1 byte berkat Shaggy
Disimpan 5 byte berkat Emigna
Disimpan 1 byte berkat Kevin Cruijssen
Beruntung bahwa hari Minggu diindeks 0 di enum atau kalau tidak perlu
(System.DayOfWeek)7
sumber
using System
gratis dalam C #? Jika demikian saya pikir Anda bisa melakukannya()=>{var k=1/(int)DateTime.Now.DayOfWeek;}
untuk 42 . Kalau tidak 49 dengan eksplisitSystem.
()=>{var k=1/(int)System.DateTime.Now.DayOfWeek;}
lebih pendek. Dan Anda dapat menyimpan satu byte lagi dengan menggunakan parameter kosong yang tidak digunakan alih-alih tanpa parameter (mis.v->{...}
Alih-alih()->{...}
)()=>1/(int)System.DateTime.Now.DayOfWeek
. Coba di sini .Groovy , 16 byte
Cobalah online!
sumber
C,
6855 byteTerima kasih kepada @Ken YN karena telah menghemat 13 byte!
Cobalah online!
sumber
d
untuk mendapatkann/=gmtime(&n)->tm_wday;
54 byte (tapi saya tidak yakin saya suka semua peringatan kompiler ini ...)R , 40 byte
Cobalah online!
weekdays
mengembalikan hari kerja dari tanggal, dengan argumen opsionalabbreviate
, yang memendekSunday
untukSun
, menyimpan satu byte.stopifnot
melempar kesalahan jika, untuk setiap argumen, tidakall
adaTRUE
, dan melempar kesalahan dengan pesan yang menunjukkan elemen pertama yang tidakTRUE
, sehingga kesalahannya adalahError: "Sun" is not TRUE
sumber
APL (Dyalog) , 23 byte
Cobalah online!
sumber
Gema , 40 karakter
Harus menentukan pesan kesalahan, jadi pilih yang pendek: "S".
Contoh dijalankan:
sumber
Funky , 21 byte
os.date"%w"
mengembalikan hari ini dalam seminggu dalam format 0-6, di mana 0 adalah minggu. Mendapatkan logika bukan hanya berlaku ketika hari kerja adalah 0, begitu juga hari Minggu. Maka hanya dasarif(a){error()}
akan memastikan bahwa program ini hanya kesalahan pada hari MingguCobalah online!
sumber
Perl 6 ,
2921 byteCobalah
Cobalah
sumber
Julia 0,5 , 28 byte
Cobalah online!
Ini tidak bekerja dengan 0,6, tetapi bekerja dengan 0,4.
sumber