Diberikan satu tahun dan satu bulan, cari tahu persentase hari kerja di bulan tersebut. Hari kerja adalah Senin hingga Jumat tanpa mempertimbangkan hari libur atau hal-hal khusus lainnya. Kalender Gregorian digunakan.
Memasukkan
Setahun dan bulan dalam format ISO 8601 (YYYY-MM). Tahun selalu memiliki empat digit, bulan selalu memiliki dua digit. Tahun yang diberikan tidak akan sebelum 1582.
Keluaran
Output adalah persentase hari kerja (sesuai dengan definisi di atas) pada bulan yang diberikan, dibulatkan menjadi bilangan bulat. Tidak ada tanda persen atau angka fraksional yang mengikuti.
Contoh 1
Input Output
2010-05 68
Contoh 2
Input Output
2010-06 73
Contoh 3
Input Output
1920-10 68
Contoh 4
Input Output
2817-12 68
Seminggu telah berlalu, jawaban telah diterima. Untuk yang penasaran, ukuran pengiriman yang kami dapatkan di kontes kami:
129 - Z shell
174 - VB.NET
222 - C
233 - C
300 - C
Serta solusi kami sendiri (tidak disimpan):
75 - PowerShell
93 - Ruby
112 - Shell Bourne
echo 100
Jawaban:
64-bit Perl, 67
68Perl 5.10 atau lebih baru, jalankan dengan
perl -E 'code here'
atauperl -M5.010 filename
Konsesi ke ukuran kode:
date
outputnya tidak dimulai dengan huruf kapital S. JalankanLC_ALL=C
jika ragu.2> /dev/null
jika kesal.untuk beberapa alasan, versi sayaMembutuhkan build 64 bitdate
menganggap 2817-12 bulan tidak valid. Siapa tahu, kiamat baru GNU sudah waktunya!date
untuk tanggal setelah 2038. (Terima kasih Joey)sumber
PHP - 135
Saya membuatnya di PHP karena saya punya masalah yang sama dengan perawatan beberapa hari yang lalu.
(Agak) Lebih jelas, dan tanpa pemberitahuan tentang konstanta yang digunakan sebagai string:
Ini dimungkinkan oleh algoritma yang sangat sederhana untuk menghitung jumlah hari kerja dalam sebulan: periksa untuk hari kerja tanggal 29, 30 dan 31 (jika ada tanggal), dan tambahkan 20.
sumber
-R
, pendekatan ini dapat diturunkan hingga 86 byte (63,7%):$a="2333211";echo.5+min(-8+$m=date(t,$t=strtotime($argn)),20+$a[date(w,$t)])/$m*100|0;
Lihat langkah-langkah golf.<?=.5+min(-8+$m=date(t,$t=strtotime($argn)),20+(5886>>date(w,$t)*2&3))/$m*100|0;
Python 152 Karakter
sumber
Bash + coreutils, 82 byte
sumber
Windows PowerShell, 80
sumber
[int]
benar-benar bulat? Saya cenderung percaya itu lantai.[int]1.5
dan[int]2.5
hasilkan2
. Perilaku yang tepat ini sering menyebabkan masalah dalam tugas-tugas di mana pembagian lantai diperlukan (yang kemudian membutuhkan tambahan[Math]::Floor()
), tetapi dalam kasus ini tidak sakit dan »berputar sampai genap« hanya berlaku untuk angka yang berakhir di.5
mana tidak dapat terjadi di sini.[int]
di PowerShell biasanya lebih berupa konversi daripada pemain :-). Hal-hal seperti[int[]][char[]]'abc'
juga berfungsi yang Anda tidak bisa bekerja dalam banyak bahasa lain.$input
->$args
menyimpan satu byte.D: 186 Karakter
Lebih Jelas:
sumber
Python - 142
Terima kasih kepada fR0DDY untuk bit kalender.
sumber
Ruby,
124119111Memerlukan Ruby 1.9 karena melakukan splatting tahun dan bulan sebelum argumen -1 "hari" dan
?-
untuk"-"
. Untuk Ruby 1.8, kita harus menambahkan 2 karakter:Sunting : Cukur lima karakter berdasarkan bantuan @ Dogbert.
Sunting : Cukur delapan karakter lagi berdasarkan bantuan @ steenslag.
sumber
'-'
dapat ditulis?-
dalam Ruby 1.9PHP 5.2, 88 byte
Meskipun saya sudah memasukkan solusi zneak ke 85 byte (saya hanya menemukan satu lagi), ini milik saya:
Saya ragu bahwa saya dapat memeras tiga byte lagi di sini.
mengambil input dari STDIN: Jalankan dengan
echo <yyyy>-<mm> | php -nR '<code>'
.String
$a
memetakan hari per bulan (date(t)
) dan hari minggu pada hari pertama bulan itu (date(N)
: Senin = 1, Minggu = 7) ke persentase hari kerja-67;strtotime
mengonversi input ke cap waktu UNIX; sisa kode melakukan hashing.+1 byte untuk PHP 5 yang lebih lama: Ganti
N
denganw
dan$a=_...;
dengan$a="..."
.+3 byte lain untuk PHP 4: masukkan
.-1
setelah$argn
.-5 byte untuk PHP 5.5 atau lebih baru (tantangan postdates):
Hapus semuanya sebelum
echo
dan ganti$a
dengan"4444444255555236666304777411"
.sumber
%7
bukan%28
.Rebol -
118113Tidak Disatukan:
sumber
C #, 158 byte
Metode anonim yang mengembalikan persentase yang diperlukan.
Program lengkap dengan metode ungolfed, komentar dan kasus uji:
Fungsi alternatif, yang menambahkan nilai negatif ke jumlah hari kerja, mengubah tanda dalam pengembalian tanpa biaya byte tambahan:
sumber
Oracle SQL, 110 byte
Ini bekerja dengan asumsi bahwa input data disimpan dalam sebuah tabel dalam menggunakan
date
tipe data, misalnyasumber
APL (Dyalog Unicode) , 55 byte SBCS
Fungsi awalan diam-diam anonim.
⊂
lampirkan tanggal untuk memperlakukannya secara keseluruhan(2 5)2{
...}¨
terapkan fungsi berikut untuk itu, tetapi dengan argumen kiri[2,5]
dan2
:⎕CY'dfns'
salin perpustakaan "dfns"⍵⊣
buang laporan yang mendukung tanggal tersebut' '@5⊢
ganti karakter ke-5 (-
) dengan spasi⍎
jalankan itu untuk mendapatkan daftar dua elemencal
panggil fungsi kalender itu' ',
tambahkan kolom spasi ke situ¯2⌽
putar dua kolom terakhir (Sabtu) ke depan⍺↓
drop-argumen jumlah baris (2, header) dan kolom (jika ditentukan; 5 = Sat + Sun)↓
membagi matriks menjadi daftar garis⍕
format (rata dengan penyisipan spasi ganda)⍎
mengeksekusi (mengubah angka hari yang tersisa menjadi daftar angka datar)≢
menghitung itu2÷/
bagi setiap pasangan (hanya ada satu)100×
kalikan dengan seratus.5+
tambahkan setengah⌊
lantaiCobalah online!
sumber
Perl 6 , 78 byte
Cobalah online!
sumber