Latar Belakang
Beberapa hari libur memiliki tanggal yang tetap dan mudah diingat, seperti 31 Oktober, 25 Desember, dll. Beberapa, bagaimanapun, ingin menyusahkan. Mereka ditentukan sebagai hal-hal seperti "Senin pertama pada bulan September" atau "Kamis keempat pada bulan November". Bagaimana saya bisa tahu kapan itu terjadi?
Yang saya tahu adalah bahwa Thanksgiving mendekat dengan cepat, jadi saya perlu program untuk membantu saya mencari tahu kapan itu. Beberapa orang bahkan mengatakan bahwa ini besok , jadi program Anda harus sesingkat mungkin untuk memastikan saya dapat mengetik ulang tepat waktu.
Tantangan
Buat program atau fungsi yang, diberi tahun hingga empat digit (misalnya 2015 atau 1984), menampilkan atau mengembalikan tanggal Thanksgiving Amerika Serikat pada tahun itu. Hari Thanksgiving didefinisikan sebagai hari Kamis keempat bulan November menurut halaman Wikipedia . (Petunjuk: halaman itu juga menyertakan beberapa informasi menarik tentang pola tanggal.)
Input : angka desimal dengan maksimum empat digit mewakili satu tahun di Common Era (CE). Contoh: 987, 1984, 2101
Keluaran : tanggal, termasuk bulan dan hari, di mana Thanksgiving jatuh, atau akan jatuh jika ada, di tahun itu. Ini mungkin dalam format yang wajar; gunakan penilaian terbaikmu. Gunakan Kalender Gregorian dalam semua kasus, meskipun itu tidak digunakan pada saat itu.
(Catatan: Pastikan untuk menangani tahun kabisat dengan benar!)
Masukan kasus input 1:
2015
Output 1:
Nov 26
Input 2:
1917
Output 2:
Nov 22
Mencetak gol
Pengajuan akan dicetak dalam byte . Saya merekomendasikan situs web ini untuk melacak jumlah byte Anda, meskipun Anda dapat menggunakan penghitung yang Anda suka.
Bonus
-25% dari skor Anda jika Anda menangani tanggal BCE sebagai angka negatif (misalnya -480 akan menjadi tahun pertempuran Thermopylae).
Masukan kasus tes negatif:
-480
Output yang sesuai:
Nov 25
Ini kode-golf , jadi skor terendah menang!
Sunting: Saya menandai pengajuan TI-BASIC Thomas Kwa sebagai diterima. Jangan biarkan ini menghalangi Anda untuk mengirimkan entri baru!
Papan peringkat
Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.
Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
# Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:
# Perl, 43 + 2 (-p flag) = 45 bytes
Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=64785,OVERRIDE_USER=45162;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?([\d.]+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
Jawaban:
TI-BASIC, 15 byte * 0,75 = 11,25
Diuji pada kalkulator TI-84 + saya
Ucapan terima kasih adalah tanggal 29 November, dikurangi hari pada tanggal 1 September, di mana 1 adalah hari Minggu dan 7 adalah hari Sabtu. Ini menghasilkan dalam format
MMDD
.Kasus uji:
2015
->1126
,1917
->1122
,-480
->1125
telah diverifikasi. TI-BASIC tampaknya menggunakan kalender Gregorian untuk semua tanggal.TI-BASIC tidak mendukung tahun negatif, tetapi ini mendapat bonus karena kami menambahkan 10.000 ke input. Karena kalender Gregorian memiliki periode 400 tahun, ini tidak mengubah hari dalam seminggu.
sumber
dayofWK(
danAns
masing-masing 2 dan 1 byte.PHP,
6548424136 (+2 untuk-F
) = 38 byteMengambil input sebagai argumen baris perintah pertama. Dijalankan dengan peringatan, yang dapat diterima oleh aturan kami. Cetakan
NovDD
, di manaDD
hari Thanksgiving.Tidak ada tautan online karena ideone tidak mendukung argumen baris perintah dan saya tidak tahu ada penerjemah online yang mendukung.
Terima kasih kepada Alexander O'Mara karena mengajari saya trik baru, dan terutama untuk pengurangan yang signifikan
sumber
"4thuXI"
. Anda bahkan dapat menjatuhkan ruang antara tahun"4thuXI2015"
.-F
, input dapat disingkat menjadi"4thuXI$argn"
.Md
tidak perlu penawaran, denganE_NOTICE
cacat.Mathematica,
5938 bytesumber
WolframAlpha["Thanksgiving " <> #] &
tempat tanggal dimasukkan sebagai string.JavaScript (ES6),
424031 byte - 25% = 23,25Karena tanggal "mungkin dalam format yang masuk akal", fungsi ini digunakan
DD.MM
. Saya menulis jawaban TeaScript dengan teknik yang berbeda, tetapi rumus ini lebih pendek.Penjelasan
Karena bulan berbasis nol,
new Date(a,10)
mengembalikanDate
objek yang mewakili 1 November tahun yang ditentukan.Karena
getDay()
mengembalikan angka yang mewakili hari dalam seminggu dari yang0..6
ingin kami petakanlalu tambahkan 22. Ternyata
(11 - new Date(a,10).getDay()) % 7
akan melakukan trik. Seperti @Thomas Kwa tunjukkan, ini sama dengan28-new Date(a,8).getDay()
yang 28 dikurangi hari minggu 1 September.sumber
Japt ,
4337363529 byte - 25% = 21,75Japt adalah versi singkat dari Ja vaScri pt .
Hahaha, saya menemukan trik yang benar - benar curang: penafsir mengabaikan tanda kurung di dalam string (digunakan untuk memasukkan kode) saat mendekompresinya, sehingga kita dapat mengompres seluruh kode sumber untuk menyimpan byte>: D
Keduanya
?
haruslah Unicode unintables U + 0098 dan U + 0085, masing-masing. Cobalah online!Setelah dekompresi, kode dievaluasi untuk ini:
Yang mengevaluasi ke:
Yang memberikan output yang tepat.
Menggunakan teknik intrepidcoder , menghasilkan dalam format
dd.mm
. Mendukung tahun-tahun negatif dengan benar. Saran diterima!Sunting: Pada 2 Desember, Anda sekarang dapat menggunakan kode 11-byte ini (mencetak 8,25 poin ):
(Saya sangat berharap saya telah menerapkan ini lebih cepat!)
sumber
Vitsy , 44 byte
Saya menghitung dengan matematika murni !
Golf:
Tidak Digubah (memindahkan pemanggilan metode ke baris pertama agar dapat dibaca):
Mungkin ada algoritma yang lebih baik untuk ini (dan ini kemungkinannya adalah golf yang mengerikan), tetapi bagi mereka yang bertanya-tanya, algoritma saya berasal dari sini .
Cobalah online!
Apakah saya mendapatkan poin bonus untuk menghitungnya dan memiliki tepat 42 byte?Mimpi hancur.Terima kasih kepada @ Hosch250 untuk menunjukkan bahwa saya melakukan kesalahan. : D Diperbaiki.
sumber
Python, 38 * 0,75 = 28,5 byte
Ini bekerja dengan tahun-tahun negatif dengan cara yang ditentukan dalam pertanyaan, meskipun menarik perhatian saya bahwa tidak ada tahun 0 dalam kalender Gregorian sehingga perilaku ini agak mencurigakan.
sumber
f=
."Nov "+`...`
-40%7==2
tapi-40%-7==-5
JavaScript (ES6), 43.5
Hitungan byte aktual adalah 58. Bonus -25% berlaku => 58 * 0,75 = 43,5
Cara yang cukup lurus
dan konyol, tanpa penyelesaian atau perhitungan yang rumit.De-golf (ES5) + demo:
Perhatikan, bahwa memasuki tahun 0-100 menghasilkan 1900-2000 tahun. Padahal, sepertinya 0-100 tahun memberikan tanggal yang sama dengan 1900-2000, dilihat dari jawaban lainnya.
Mengganti
a+18
dengan22
, karena itu disebut hanya dalam "lain", dan "lain" hanya terjadi jika a tidak lebih besar atau kurang dari 4, yaitu tepat 4.Mengganti
a<4?26-a:a>4?a+21:22
dengana<=4?26-a:a+21
sumber
a<4?x:a>4?y:a+18
setara dengana<4?x:a>4?y:22
?TeaScript,
353324 byte - 25% = 18Ini adalah metode yang sama dengan jawaban JavaScript saya , yang menggunakan rumus pintar Thomas Kwa .
Versi Alternatif dengan Penjelasan
sumber
Jython,
141155 BytesMenggunakan kelas Kalender Java dan Pemindai dengan sintaksis Python.
Sunting: Masalah sintaksis minor, ditambahkan 14 byte.
Lihat juga versi Brainfuck .
sumber
Python,
838178 bytesumber
import datetime as d
dan kemudian Anda dapat menggunakannyad
untuk setiap kali Anda gunakandatetime
dalam program Anda.import pandas;print'Nov '+`((10-pandas.datetime(input(),11,1).weekday())%7)+22`
from datetime import*
bahkan sedikit lebih pendek, karena Anda tidak perlud.
lagiExcel,
36715453 - 25% = 39,75 byteAsumsikan tahun diadakan di sel A1, dalam format Tanggal. Mengembalikan bilangan bulat hari pada bulan November di mana Thanksgiving diadakan.
Ini hanya menyumbang tahun kabisat normal. Itu tidak menjelaskan fakta bahwa tahun-tahun, 2100, 2200, 2300 bukan tahun kabisat.
Ini hanya dirancang untuk bekerja pada tahun 1621 dan seterusnya - yaitu sejak Thanksgiving mulai diadakan. (Meskipun pasti akan bekerja sepanjang jalan kembali ke 0 AD).
Cukup dicetak:
Gah! Alih-alih menghitung berdasarkan tanggal 1 Januari, kemudian melakukan banyak perhitungan tahun kabisat untuk mengatasi tanggal 29 Februari, saya seharusnya mendasarkan perhitungan pada tanggal 1 November. Nb Ini sekarang berhubungan dengan tahun 2100, 2200 dan 2300 dengan benar. , tetapi membuat implementasinya tergantung pada format tanggal default instalasi Excel Anda. Versi ini dirancang untuk dd / mm / yyyy:
Dan sekarang setelah melakukan pfaffing untuk mendapatkan perhitungan singkat di Smalltalk, membuat backport ke Excel menghasilkan:
(dengan tahun masih di A1, tetapi sebagai bilangan bulat). Ini bekerja bahkan untuk tahun 2100, 2200 dan 2300, untuk semua tanggal dari 7700BC / E dan seterusnya, menggunakan trik pengulangan tanggal Thomas Kwa.
sumber
PowerShell,
676484725845 BytesKami mengambil integer input kami sebagai
$a
, dan segera mengeluarkanNov
dan baris baru. Lalu kami mengambil$a
dan menambahkannya dengan nol dan 1 September dengan00$a/9/1
sebelum menghasilkan yang barudate
dan menentukan apaDayOfWeek
itu. Jika 1 September adalah pada hari Minggu (.DayOfWeek
sama dengan0
), Thanksgiving pada tanggal 28. Jika 1 September adalah pada hari Senin (.DayOfWeek
sama dengan1
), Thanksgiving pada tanggal 27. Dan seterusnya. Jadi, kita kurangi hari itu dalam seminggu28
untuk mengeluarkan jawaban kita.Mempertahankan dengan nol ganda menyumbang tahun tunggal dan dua digit tanpa mengganggu penguraian selama tiga atau empat digit tahun. Tidak berfungsi untuk angka negatif, karena .NET
datetime
tidak mendukung tahun kurang dari0
.Terima kasih kepada TessellatingHeckler dan Toby Speight untuk bantuannya.
sumber
"{0:D3}/Nov/$_" -f $a
lebih pendek dari"$($a.ToString("000"))/Nov/$_"
dan menghasilkan hasil yang sama, dan saya pikir Anda bisa menggunakan11
bukannyaNov
Nov
itu adalah sisa dari ketika saya mencoba untuk membuatnya mengenali dua digit tahun dengan benar, jadi saya akan menukar itu juga. Terima kasih!date "11/1/$a"
hasilThursday, November 1, 2007 12:00:00 AM
. Ini karena kita tidak sedang mengedit properti Calendar.TwoDigitYearMax , jadi ketika ia mem - parsing , kita terjebak dengan double-zero-padding untuk menyiasatinya.Golfscript, 25 * 0,75 = 18,75 byte
Ini menggunakan rumus Sakamoto untuk hari dalam seminggu. Karena ada orang yang melakukan ini, hasilnya adalah dalam bentuk
dd-mm
. Kiriman saya sebelumnya dapat ditemukan di bawah:sumber
TSQL,
478296 byteHanya untuk bersenang-senang. Biasanya, Anda akan memiliki tabel dimensi tanggal untuk membuatnya menjadi sederhana
select * from dimDate where [Year] = @Year and [Holiday] = 'Thanksgiving'
namun tanpa adanya ...Tidak Disatukan:
sumber
(28 - ( x - 2 + floor(x / 4) - floor(x / 100) + floor(x / 400) ) % 7
) Ya, membaca jawaban lain cenderung banyak membantu.Pyth,
3028 * 75% = 21 byteSaya 100% positif bahwa ini bisa dibuat lebih pendek, tapi hei, ini program Pyth pertama saya! \Hai/
Suite uji
Keluaran tanggal dalam
dd.mm
format.Tolong sarankan cara untuk bermain golf ini jika Anda bisa! Saya ingin belajar lebih banyak tentang Pyth.
sumber
Unggul,
6448Tahun dalam A1
= DATE (A1,11, PILIH (WEEKDAY (DATE (A1,11,1)), 26,25,24,23,22,28,27))sumber
13
byteTEXT
dari=TEXT(DATE(A1,11,MOD(12-WEEKDAY(DATE(A1,11,1)),7)+22),"d mmm")
- output adalah bilangan bulat tanpa memformat.Befunge, 41 Bytes
Jalankan penerjemah ini .
Penjelasan: Tahun biasa adalah 365 = 1 mod 7 hari, jadi tahun ditambah setiap tahun ke- 4 , minus setiap tahun ke- 100 (
d
dalam ascii), ditambah setiap tahun ke- 400 menyumbang setiap hari kabisat (termasuk tahun ini). Hasil:::4"d"*/\"d"/-\4/++
kemudian dapat dianggap sebagai 5 Mar th , hari pertama setelah Februari jatuh pada hari yang sama dengan hari pertama tahun di tahun yang sama. Setelah itu kita mengkalibrasi untuk pola dengan5+7%-
mengurangkan jumlah hari dalam seminggu dari 28 th (yang47*
disimpan sebelumnya) November. Lalu cetak.Versi yang mengoreksi untuk BC tahun saat ini lebih lama dari yang diberikan bonus, pada 59 -25% = 44,25 byte:
sumber
Matlab, 78 byte
sumber
Ruby,
605857 * 0,75 = 42,75 byte58 byte
60 byte
Tidak Disatukan:
Pemakaian:
sumber
VBA, 124 byte * 75% = 93 byte
Saya tidak yakin jika spasi dihitung, ada di antara 102 dan 124, jangan ragu untuk mengedit.
Jika bilangan bulat adalah output yang valid, saya lebih dari senang untuk menghapus
Format
bagian.sumber
PHP 5.3+, 59 byte
Ini menggunakan fungsi PHP bawaan
strtotime
untuk mengurai tanggal.Ini mengharapkan nilai yang akan melewati parameter GET
Y
ATAU lebihphp-cli Y=<year>
.Mencoba untuk menemukan Kamis berikutnya setelah 19 November.
Sejauh ini, dengan tes yang saya buat, itu berfungsi dengan baik.
Sadarilah bahwa tahun 2 digit dapat ditafsirkan berbeda.
Saya menggunakan
gmdate
untuk menghindari masalah zona waktu, tetapi berfungsi sama baiknya menggunakandate
(setidaknya, tempat saya tinggal).sumber
T-SQL
215 byte248 * 0,75 = 186 byteTidak disatukan
yang dengan perancah tes ini
hasil yang diinginkan
sumber
Pike ,
87 91 107 7776 byte - 25% = 57meninggalkan yang lama untuk perbandingan karena saya merasa lebih pintar dalam hal memanfaatkan modul Kalender, tetapi cara di atas jauh lebih pendek.
sumber
string t(int y){object n=Calendar.Month(y,11);return"Nov "+(n->weeks()->day(4)&n->days())[3]->month_day();}
maka saya menghitungnya sebagai 107 byte.Smalltalk - Squeak and Pharo ,
6957544935343332 - 25% = 24 byte"Nov nn":
69B49B (-25% = 36,75B)11nn (anInt):
575432B (-25% = 24B)Versi sebelumnya
Output 11nn
Nov nn output
dalam keluaran
nb Ini disediakan sebagai program - khususnya ekspresi Workspace - bukan sebagai metode.
Diasumsikan input diberikan (sesuai dengan frasa "diberikan tahun hingga empat digit".
Termasuk menyatakan dan memberi input akan menambah 11 karakter lainnya:
|y|y:=2015.(12-(Date y:y m:11 d:1)w)\\7+1122
Terima kasih kepada eMBee, karena menunjukkan cara menghapus satu karakter lagi - spasi putih sebelum tanda 'w'.
Sebenarnya, itu mengilhami saya untuk mencoba menghapus spasi putih sebelum 'd:':
|y|y:=2015.(12-(Date y:y m:11d:1)w)\\7+1122
Yang berhasil!
sumber
GNU coreutils, 35 byte
Cukup cari pada minggu 22-28 November untuk hari Kamis. Jalankan di C atau POSIX lokal, karena saya bergantung pada Kamis menjadi satu-satunya singkatan hari yang mengandung 'h'.
Inilah jawaban yang lebih pintar, meskipun satu byte lebih lama:
Kami mengambil nomor hari-minggu dari tanggal dalam minggu yang cukup sewenang-wenang antara Maret dan September (jadi hari dan bulan masing-masing satu digit, dan kami tidak terpengaruh oleh kemungkinan hari kabisat). Kami memilih hari sehingga hari Minggu (
%w==0
) saat Thanksgiving tanggal 28. Kami kemudian dapat mengurangi nilai itu dari 28 untuk mendapatkan Kamis yang sesuai.sumber
TSQL,
5352 byteBiola
Menghitung senin sebelum atau pada 2 september dan menambahkan 59 hari
(lebih baik daripada menghitung Senin sebelum atau pada 4 Oktober dan menambahkan 31 hari karena Oktober adalah bulan ke 10 sehingga menghemat 1 byte)
sumber
Perl, 92 byte
EDIT: Memperbaiki format output, memperbaiki bug misalnya hasil 2012, menggunakan format "untuk" yang lebih pendek. Berkat msh210.
sumber
use Time::Local;(localtime(timelocal 0,0,0,$_,10,$ARGV[0]))[6]==4?print:0for 22..29
. Tetapi kedua skrip menderita dari kesalahan yang sama: (1) mereka tidak mencetak representasi bulan seperti yang dipersyaratkan; (2) mereka memiliki output yang salah untuk mis 2012.