এক বছরে 13 তম শুক্রবার কত?


28

আপনার চ্যালেঞ্জটি হ'ল এমন একটি প্রোগ্রাম লিখুন যা এক বছর দেওয়া হয়, এতে "শুক্রবার 13 তম" সংখ্যা বেরিয়ে যায়।

বিধি ও বিশদ:

  • আপনি ইনপুট নিতে পারেন STDIN, বা আপনার প্রোগ্রামে যুক্তি হিসাবে।
  • আপনি ফলাফল আউটপুট করা উচিত STDOUT
  • আপনি ধরে নিতে পারেন যে ইনপুটটি বৈধ বছর হবে, এবং গ্রেগরিয়ান ক্যালেন্ডারের প্রাক-তারিখ দেয় না (এই ক্ষেত্রে অপরিজ্ঞাত আচরণের অনুমতি রয়েছে)।
  • ক্যালেন্ডার / তারিখ লাইব্রেরি অনুমোদিত।

এটি একটি , তাই সংক্ষিপ্ততম কোডটি (বাইটে) জিতে যায়।

(সম্পর্কিত চ্যালেঞ্জ লিঙ্ক)


7
ইনপুট প্রয়োজনীয় পরিসর কি? যদি এটি 1800 এর আগে চলে যায় তবে জুলিয়ান থেকে গ্রেগরিয়ান ক্যালেন্ডারে সুইচওভার সম্পর্কে কী অনুমান করা উচিত?
পিটার টেলর

@ পিটারটেলর আমি এটি সম্পর্কে ভাবি নি। যদি কোনও তারিখ গ্রেগরিয়ানের প্রাক-তারিখ হয় তবে আপনার অনির্ধারিত আচরণ থাকতে পারে।
ক্রંચার

1
গ্রেগরিয়ান ক্যালেন্ডার গ্রহণকারী প্রথম দেশগুলি স্বয়ং গ্রেগরির ষাঁড় অনুসরণ করে 1582 অক্টোবর মাসে এটি করেছিল। নতুন ক্যালেন্ডার দেরিতে গ্রহণকারী দেশগুলি বিশ শতকের আগ পর্যন্ত পরিবর্তিত হয়নি, উদাহরণস্বরূপ গ্রীস এটি
১৯৩৩

@ জেপ্পস্টিগনিয়েলসন আমি ক্যালেন্ডার এবং এ জাতীয় সম্পর্কে খুব বেশি জানি না। তারা এগুলি গ্রহণ করেছে বা না গ্রেগরিয়ান তারিখগুলি পরিবর্তন করে না। আমার ধারণা অনুসারে গ্রন্থাগারগুলি তারিখগুলি গণনা করতে সক্ষম হবে?
ক্রুঙ্কার

3
আমি এখানে অফটোপিক হচ্ছি, আমার ধারণা। অ্যাংলো-আমেরিকান প্রোগ্রামারদের দ্বারা রচিত অনেকগুলি গ্রন্থাগার সেপ্টেম্বর 1752 কে ক্যালেন্ডার পরিবর্তনের "সঠিক" সময় হিসাবে ব্যবহার করে। ব্রিটিশ সাম্রাজ্যের পরিবর্তন ঘটেছিল এটাই ছিল। মার্কিন যুক্তরাষ্ট্রে প্রতিষ্ঠিত হওয়ার পরে অবশ্যই নতুন ক্যালেন্ডারটি রাখা হয়েছিল। (কৌতূহল হিসাবে, কিছু এসকিউএল সফ্টওয়্যার ন্যূনতম বছর হিসাবে 1753 রয়েছে যেহেতু তারা সেপ্টেম্বরের 1752 ইস্যুটি মোকাবেলা করতে চায় না।) তবে, সেপ্টেম্বর 1752 ব্যবহার করা অত্যন্ত অ্যাংলোসেন্ট্রিক। আপনি ঠিক বলেছেন গ্রেগরিয়ান তারিখগুলি historতিহাসিকভাবে ব্যবহৃত হয়েছিল কিনা সেগুলি একই। এটি তথাকথিত প্রলেপটিক গ্রেগরিয়ান ক্যালেন্ডার।
জেপ্পে স্টিগ নীলসন

উত্তর:


3

APL (Dyalog APL) সঙ্গে ক্যাল থেকে dfns , 29 বাইট

+/{13∊⍎,⍉3↑¯5↑⍉2cal⍵}¨⎕,¨⍳12

এটি অনলাইন চেষ্টা করুন!

⍳ 12 পূর্ণসংখ্যা এক বারো মাধ্যমে

⎕ ,¨ সংখ্যার ইনপুট নিন এবং বারো সংখ্যার প্রত্যেকটিতে প্রিপেন্ড করুন

{ প্রতিটি জোড়ায়, ফাংশনটি প্রয়োগ করুন…

cal⍵ সেই বছর-মাসের জন্য একটি ক্যালেন্ডার পান

2 ↓ দুটি সারি ড্রপ (ক্যাপশন এবং দিন)

 স্থানান্তর (যাতে আমরা সারিগুলির পরিবর্তে কলামগুলি সম্বোধন করতে পারি)

¯5 ↑ শেষ পাঁচটি নিন (শুক্রবার এবং শনিবারের জন্য দুটি সংখ্যার সাথে একটি স্থানের জন্য দুটি অঙ্ক)

3 ↑ প্রথম দুটি নিন (শুক্রবারের জন্য দুটি অঙ্কের পাশাপাশি একটি স্থান)

 স্থানান্তর (যাতে আমরা পড়ার ক্রম পাই)

, পাক পড়া

 এপিএল এক্সপ্রেশন হিসাবে চালিত করুন (শুক্রবারের তারিখের তালিকা দেয়)

13 ∊ ত্রিশ জন কি সেই তালিকার সদস্য?

+/ 12 বুলিয়ান যোগফল


@ Wrzlprmft এর অ্যালগরিদম ব্যবহার করে , আমরা 53 বাইটের জন্য লাইব্রেরি ছাড়াই এটি করতে পারি:

'21232211321211'⊃⍨14|2 3 ¯1+.×⊢,0≠.=400 100 4∘.|-∘0 1

-∘0 1 শূন্য এবং এক বিয়োগ করুন

400 100 4 ∘.| এই সংখ্যা দ্বারা বিভক্ত দুই বছর (জুড়ে) বিভাগ বাকী টেবিল

0 ≠.= অভ্যন্তরীণ "পণ্য" 0 সহ, তবে। এবং = এর পরিবর্তে +। × ব্যবহার করুন ×

⊢ , অশোধিত যুক্তি বছর প্রিপেন্ড করুন

2 3 ¯1 +.× এই সংখ্যা সহ অভ্যন্তরীণ পণ্য

14 | চৌদ্দ দ্বারা ভাগ যখন বিভাগ অবশিষ্ট

'21232211321211' ⌷⍨ এই স্ট্রিং মধ্যে সূচক


এটি 29 টি অক্ষর, তবে এগুলি কি 1 বাইট অক্ষরের বেশি?
ক্রুঙ্কার

@ ক্রুনচার আমি শিরোনামে একটি ব্যাখ্যামূলক লিঙ্ক যুক্ত করেছি। আপনি যদি টিআইও লিঙ্কটি খোলেন, আপনি দেখতে পাবেন যে এটি ডানদিকে "29 অক্ষর, 29 বাইটস (এসবিসিএস)", অর্থাৎ একক বাইট চরিত্র সেট বলে।
অ্যাডাম

ঠিক আছে, আমি অনুমান করি যে এটি তখনই নতুন বিজয়ী, এই এসই এর স্ট্যান্ডার্ড অনুশীলন কি প্রশ্নের দীর্ঘকাল পরে গ্রহণযোগ্য উত্তরটি পরিবর্তন করতে পারে?
ক্রুঙ্কার

পছন্দ করুন এমনকি ওপেনের অনেক পরে গ্রহণযোগ্যতার জন্য এমন ব্যাজগুলিও রয়েছে।
অ্যাডাম

12

গণিত 49 49 45 44 42

খাঁটি ফাংশন হিসাবে : 42 টি অক্ষর

DayName@{#,m,6}~Table~{m,12}~Count~Friday&

উদাহরণ

DayName@{#,m,6}~Table~{m,12}~Count~Friday&[2013]

2


নামযুক্ত ফাংশন হিসাবে : 44 টি অক্ষর

f=DayName@{#,m,6}~Table~{m,12}~Count~Friday&

উদাহরণ

f[1776]
f[2012]
f[2013]
f[2014]

2
3
2
1


একটি চরিত্র সংক্ষিপ্ত:f=DayName@{#,m,6}~Table~{m,12}~Count~Friday&
মিঃ উইজার্ড

@ মিঃ উইজার্ড হ্যাঁ এটি আমাকে অবাক করে দিয়েছিল যে ম্যাথমেটিকা ​​ইনফিক্স স্বরলিপিটির একাধিক ক্ষেত্রে পার্স করতে পারে।
ডেভিডসি

ডেভিড এটি আমাকে অবাক করে দিয়েছিল যে আপনি এই সংযুক্ত স্বরলিপিটি আমার (ওভার) ব্যবহার দেখেন নি। : ^) (উদাহরণ: (1) , (2) )
Mr.Wizard

8

রুবি, 49 48 47 46

f=->m{(1..12).count{|i|Time.gm(m,i,6).friday?}}

সম্পাদনা: এক সপ্তাহ পিছনে গিয়ে একটি চরিত্র শেভ করেছেন, জানকে ধন্যবাদ এবং অন্য একজন টাইম.নিউ থেকে টাইম.এম-এ স্যুইচ করে

সম্পাদনা করুন: এটিকে আরও কিছুটা অবলম্বন করার ব্যয়ে আমি 46 দিয়ে উঠতে পারি

f=->m{(1..12).count{|i|Time.gm(m,i,8).wday<1}}

5
এক-চরিত্রের সঞ্চয় যদি আপনি iday ষ্ঠ শুক্রবারের সংখ্যা গণনা করেন
জন ডিভোরাক

2
@ জনডভোরাক চালাক!
হিস্টোক্র্যাট

6 কেন? আমি পেলাম না।
নারকোজ


যদি 8 ম রবিবার হয়, তবে 1 ম এছাড়াও হয়, এবং তাই আপনি ব্যবহার করতে পারেন Time.gm(m,i).wday<1। এছাড়াও, কেন আপনি ফাংশনটির নাম দিচ্ছেন তা আমি জানি না।
লি ডব্লিউ

8

পাওয়ারশেল, 68 63 58 52 50

টিপসের জন্য ধন্যবাদ ইসজি।

$n=$args;(1..12|?{!+(date $n-$_).DayOfWeek}).Count

এই সত্যটি ব্যবহার করে যে মাসে 1 ম দিন যদি রবিবার হয় তবে 13 তম শুক্রবার হবে।

আমি চেষ্টা করেছি:

(1..12|?{!+(date $args-$_).DayOfWeek}).Count

তবে এটি $argsস্ক্রিপ্ট ব্লকের মধ্যে একই নয় ।


1
আমি মাসের প্রথম দিনটি ব্যবহার করার ধারণাটি পছন্দ করি।
ক্রুঙ্কার

ভাল কৌশল, আছে। যদিও @ অপ্রয়োজনীয়।
ইসজি

আরেকটি বিষয়, যদিও আমি আমার প্রচুর স্ক্রিপ্টে এর জন্য দোষী। চ্যালেঞ্জটি নির্দিষ্ট করে যে ইনপুটটি কোনও যুক্তি হতে পারে। লুপের $nসাথে প্রতিস্থাপন করুন $argsএবং আপনি $n=read-host;সম্পূর্ণরূপে ছাড়া করতে পারেন । 8. সংরক্ষণ করুন 8, উপরে উল্লিখিত হিসাবে সরান, এবং আপনি 54 এ নেমে
গেছেন

সংশোধন: নেমে আসে 52!
ইসজি

আপনার দ্বিতীয় স্ক্রিপ্টটি কেন কাজ করবে না তা জানার চেষ্টা করা হচ্ছে এবং আমি লোকসানে এসেছি। মজার বিষয় হ'ল আমি পরিবর্তনের $argsজন্য $inputএইভাবে পাইপলাইন থেকে বছরটি
খাওয়াইতে

5

আর 76 72 57

sum(format(as.Date(paste(scan(),1:12,1,sep="-")),"%w")<1)

সহজেই আপনার প্রতিস্থাপন করে এই নিচে 4 পেতে পারি "%a %d")=="Fri 13"সঙ্গে "%w%d)=="513")Dow একটি সংখ্যা হিসাবে ব্যবহার করে, এবং স্পেস সরিয়ে।
chmullig

অনেক প্রশংসিত!
ফ্লোডেল

+1 যদিও মাসে seqএকমাত্র করা এখানে আসলে খাটো! sum(format(as.Date(paste(scan(),1:12,13,sep="-")),"%w%d")=="513")মাত্র 65 টি চরিত্র!
প্ল্যানাপাস

বাহ আমি অনুমান করতাম না যে <এটি একটি পূর্ণসংখ্যার সাথে একটি চরিত্রকে বাধ্য করবে। দুর্দান্ত কৌশল!
প্ল্যানাপাস

@ প্লানাপাস এটি বরং সাধারণ। যেহেতু অক্ষর কোডগুলি সমস্ত সংখ্যা। এমনকি জাভা ইনট এবং
চারের

5

পাইথন 2.7 90 86

from datetime import*
s=c=0
exec's+=1;c+=date(%d,s,9).weekday()<1;'%input()*12
print c

সোমবার 9 ই এর সাথে এটির মতো একই রিং নাও থাকতে পারে তবে ঠিক ঠিক কাজ করে।

সম্পাদনা করুন: দেড় বছর লক্ষ্য করুন যে :) এর dateচেয়ে কমdatetime


সত্যিই দুর্দান্ত সমাধান!
leancz

2
আপনি কাজ করে একটি চর সংরক্ষণ করতে পারেনfrom datetime import*
ব্যবহারকারী 80551

নিস! আমি কার্যকরভাবে অভিন্ন কিছু দিয়ে শেষ করেছি, তবে এক্সিকিউট এড়ানো: f=lambda y:sum([date(y,m,13).weekday()==4 for m in range(1,13)]).... যদিও আমদানি (86 বাইট) এর সাথে একই আকারের সমাধান।
iwaseatenbyagrue

5

কোনও লাইব্রেরি বা অন্তর্নির্মিত তারিখ ফাংশন ব্যবহার না করা:

গল্ফস্ক্রিপ্ট - 51

~..({4/.25/.4/--@}2*2*\3*+-
14%' [3/=RI[)a%:*.'\=5%

' [3/=RI[)a%:*.' পাশাপাশি হতে পারে 'feefefgeeffgfe'

পাইথন - 82 79

মূলত একই অ্যালগরিদম।

l=lambda y:y/4-y/100+y/400
i=input()
print"21232211321211"[(2*i+3*l(i)-l(i-1))%14]

এই কৌশলটি ব্যবহার করে , এটি আরও নীচে গল্ফ করা যেতে পারে:

l=lambda y:y/4-y/100+y/400
i=input()
print 94067430>>(4*i+6*l(i)-2*l(i-1))%28&3

এটি সত্য যে ক্যালেন্ডার-ভিত্তিতে, 14 টি পৃথক বছর রয়েছে, যা তাদের শেষ দিন এবং তারা লাফিয়ে যাচ্ছে কিনা তা দ্বারা আলাদা। lতার যুক্তি অবধি লিপ বছরের সংখ্যা গণনা করে (গ্রেগরিয়ান ক্যালেন্ডারটি পিছনে পিছনে বছর 1 পর্যন্ত প্রসারিত হলে)। (2*i+3*l(i)-l(i-1))%14সংক্ষিপ্ত l(i)-l(i-1)+(i+l(i))%7*2, যেখানে l(i)-l(i-1)যুক্তিটি একটি লিপ বছর কিনা এবং i+l(i)শেষ দিনের শিফটগুলি যোগ করে (একটি সাধারণ বছরে একটি, একটি লিপ বছরে দুটি) যোগ করে।


যেহেতু এটি আমার প্রথম গল্ফস্ক্রিপ্ট গল্ফ, তাই আরও গল্ফ করে দেওয়ার বিষয়ে আমি কোনও ইঙ্গিতকে প্রশংসা করব।
Wrzlprmft

আমি এমন একটি সমাধান সম্পর্কে ভাবছিলাম যা সত্য যে কেবলমাত্র ১৪ টি অনন্য বছর রয়েছে তা ব্যবহার করে, তবে এটি প্রতিযোগিতামূলক করার পক্ষে সেরা ভাষা নিশ্চিত ছিল না। আমি মনে করি এটি কোনও লাইব্রেরি সহ সংক্ষিপ্ত উত্তর। লিপ বছরগুলি যদি প্রতি 4 বছরে
সমান হয় তবে আপনি এটির

4

সি 301+ 287

main(int x,char**v){char p[400],*a[]={"abbababbacaacbac","bacabbb","baabbaca","abbb","aabbacaac","abbbbcaac","abbbbaabb"},*b="adcadcadcaebcadcadcafbcadcadcagbcadcadcadc";int c=0,i,y=atoi(v[0]);for(i=0;i<42;i++)strcpy(&p[c],a[b[i]-'a']),c+=strlen(a[b[i]-'a']);printf("%d",p[y%400]-'`');}

সংক্ষিপ্ত উত্তর নয়, তবে কোনও লাইব্রেরি ব্যবহার করে না।


আরে, আপনি কি বিবৃত উত্তর দেওয়ার জন্য একটি ব্যাখ্যা দিয়ে রাজি হবেন? আপনি ঠিক কী করেছেন তাতে আমি আগ্রহী
ক্রંચার

1
@ ক্রুনচার, গ্রেগরিয়ান ক্যালেন্ডার ৪০০-বছরের চক্র অনুসরণ করে এই ভিত্তিতে এটি একটি সারণী।
পিটার টেলর

1
আরো স্পষ্টভাবে (এবং আর), সি #: static char GetNumberOfFriday13s(int year) { const string perpetualCalendar = "1221212213113213122221122131122121221311321312222112213112212122131132131222211221311221212213113213112213113213122221122131122121221311321312222112213112212122131132131222211221311221212213113213122213113213122221122131122121221311321312222112213112212122131132131222211221311221212213113213122221122213122221122131122121221311321312222112213112212122131132131222211221311221212213113213122221122131"; return perpetualCalendar[year % 400];। নেতিবাচক বছর ধরে কাজ করবে না।
জেপ্পে স্টিগ নীলসন

চতুর! একটি ছোট বাগ হিসাবে, v[0]হওয়া উচিত v[1]। আপনি এই কিছুটা গল্ফ করতে পারেন; strcatসরাসরি মুদ্রণ করতে অক্ষরগুলি ব্যবহার , সংরক্ষণ a[]এবং চরিত্রের ধ্রুবকের পরিবর্তে সংখ্যার ধ্রুবককে বিয়োগের বিষয়ে বিবেচনা করুন। :)
user1354557

1
আমি সংকোচনের পাশাপাশি উন্নতি করেছি: main(int x,char**v){char p[400],*a[]={"1221212213113213","2131222","21122131","1222","112213113","122223113","122221122"},*b="adcadcadcaebcadcadcafbcadcadcagbcadcadcadc";*p=0;for(;*b;b++)strcat(p,a[*b-97]);putchar(p[atoi(v[1])%400]);}(215 অক্ষর)
ব্যবহারকারীর 1354557

4

সি ( 151 145 137 131 130 চর)

আমি অবাক হয়ে দেখলাম যে অন্য একটি সমাধান রয়েছে যা অন্তর্নির্মিত ক্যালেন্ডার সরঞ্জামগুলি ব্যবহার করে না। এখানে একটি সি (সি) তেও (অত্যন্ত অবলম্বিত) গাণিতিক পদ্ধতি রয়েছে:

f(x){return(x+(x+3)/4-(x+99)/100+!!x)%7;}main(int x,char**v){int y=atoi(v[1])%400,a=f(y+1);putchar('1'+((f(y)&3)==1)+(a>2&&a-5));}

(কোনও ত্রুটি ছাড়াই জিসিসিতে উপরের সংকলনগুলি)

বিকল্প সমাধান: সি (287-> 215 অক্ষর)

আমি বরং উইলিয়াম টটল্যান্ডের সমাধান এবং তার সংকোচনের ব্যবহার উপভোগ করেছি । আমি দুটি ছোট বাগ স্থির করেছি এবং এর দৈর্ঘ্য হ্রাস করার জন্য কোডটি টুইট করেছি:

main(int x,char**v){char p[400],*a[]={"1221212213113","213122221122131","12213113","22213113","22221122","2131"},*b="abababafcbababafdbababafebababab";*p=0;for(;*b;b++)strcat(p,a[*b-97]);putchar(p[atoi(v[1])%400]);}

4

পিএইচপি, 82

<?for($i=1,$c=0;$i<13;$i++)$c+=(date("N",mktime(0,0,0,$i,1,$argv[1]))==7);echo $c;

ভিত্তিক

"রবিবার শুরু হওয়া যে কোনও মাসে ১৩ ই শুক্রবার শুক্রবার থাকে এবং প্রতি ক্যালেন্ডারে বছরে কমপক্ষে একটি শুক্রবার থাকে"।

Http://en.wikedia.org/wiki/Frday_the_13 তম থেকে


4

বাশ 47 36

seq -f$1-%g-6 12|date -f-|grep -c ^F

ব্যবহার করে 10 অক্ষর সংরক্ষণ করার জন্য ধন্যবাদ @DigitalTrauma seqডিফল্ট শুরু সঙ্গে 1

date -f<(printf "%s\n" $1-{1..12}-6)|grep -c ^F

(ব্যবহার পূর্ববর্তী সংস্করণ echoখালি লাইনের কারণ বর্তমান একটি বাগ যখন <(echo $1-{1..12}-6$'\n')। তাই এই ফাংশন জরিমানা কাজ আজ পর্যন্ত হয় শুক্রবার।

দেখা যাক:

set -- 2013
seq -f$1-%g-6 1 12|date -f-|grep -c ^F
2

date -f<(printf "%s\n" $1-{1..12}-13)|grep -c ^F
2

এটি লোকাল নির্ভর, যদি এটি কাজ না করে তবে আপনার হতে পারে

export LANG=C

অথবা

LANG=C date -f<(printf "%s\n" $1-{1..12}-13)|grep -c ^F

একটি ফাংশন মধ্যে; +7 -> 43

f(){ seq -f$1-%g-6 12|date -f-|grep -c ^F;}

f 2013
2

for i in {2010..2017};do echo $i $(f $i) ;done
2010 1
2011 1
2012 3
2013 2
2014 1
2015 3
2016 1
2017 2

বোনাস: +78 -> 121

সেখান থেকে, যদি আমার ফাংশন হয়ে যায়:

f(){ o=();for t in $(seq -f$1-%g-6 12|date -f- +%a,%b);do [ "${t:0:1}" = "F" ]&&o+=(${t#*,});done;echo ${#o[@]} ${o[@]};}

অথবা

f(){ o=();
     for t in $(seq -f$1-%g-6 1 12|date -f- +%a,%b);do
         [ "${t:0:1}" = "F" ]&&o+=(${t#*,})
       done
     echo ${#o[@]} ${o[@]}
}

for i in {2010..2017};do echo $i $(f $i) ;done
2010 1 Aug
2011 1 May
2012 3 Jan Apr Jul
2013 2 Sep Dec
2014 1 Jun
2015 3 Feb Mar Nov
2016 1 May
2017 2 Jan Oct

এটি স্থানীয়-নির্ভর বলে মনে হচ্ছে।
পিটার টেলর

হ্যাঁ, এটি ডিফল্ট ভিত্তিক C। তবে একটি বাগ আছে ...
এফ হৌরি

আপনার প্রিন্টফ ফর্ম্যাট স্ট্রিংটি উদ্ধৃত করে এবং তার পরিবর্তে escap এড়িয়ে একটি চর সংরক্ষণ করুন:%s\\n
ডিজিটাল ট্রমা

1
বা seq8 টি অক্ষর পড়তে ব্যবহার করুন :date -f<(seq -f$1-%g-6 1 12)|grep -c ^F
ডিজিটাল ট্রমা

1
আসলে, আপনি আরও 2 টি অক্ষর শেভ করতে পারেন। আপনি যদি সূচনা ক্রমিক সংখ্যাটি বাদ দেন, সিক ডিফল্ট হিসাবে 1 থেকে শুরু হবে যা এটি আপনি চান:seq -f$1-%g-6 12|date -f-|grep -c ^F
ডিজিটাল ট্রমা

4

জাভাস্ক্রিপ্ট, 70

f=function(a){b=0;for(c=12;c--;)b+=!new Date(a,c,1).getDay();return b}


1
ভাল লাগছে! আপনি আরো কয়েকটি বাইট সংরক্ষণ করতে পারবেন সরিয়ে ,b,cফাংশন ঘোষণা থেকে (! এটা লিক করা ঠিক গলফ জন্য Vars), এছাড়াও হিসাবে bনিক্ষেপ করা হয় একটি Numberআপনি যা করতে পারেন +=পরিবর্তে পরীক্ষার ফলাফলের &&b++: b+=/^F/.test(new Date(a,c,6))। তবে, আপনি অন্য বাইট ব্যবহার করে সংরক্ষণ করতে পারেন !new Date(a,c,1).getDay()(এটি কাজ করে কারণ getDayরবিবারের জন্য 0 ফেরত দেয়, এবং 13 তম শুক্রবার হয় তবে 1 ম রবিবার হবে) এর পরিবর্তে testযা সামগ্রিকভাবে আপনাকে 7 বাইট সংরক্ষণ করবে!
ডম হেস্টিংস

@ ডোমহাস্টিংস: আপনার টিপসের জন্য !!!
777

3

64 টি অক্ষর

{+/6={x-7*x div 7}(.:')x,/:(".",'"0"^-2$'$:1+!:12),\:".13"}[0:0]

স্টিডিনের কাছ থেকে পড়ে


ঠিক আছে, এখানে কি চলছে? : পি
উইলিয়াম টটল্যান্ড

বছরে পড়ুন, প্রতি মাসের ১৩ তম দিনের তারিখের তালিকা তৈরি করুন, সপ্তাহের পরীক্ষার দিন = শুক্রবার, বুলিয়ানদের যোগফলের তালিকা
স্কিভি

3

কমন লিস্প (সিএলআইএসপি), 149

(print 
    (loop for i from 1 to 12 count 
        (= 4 (nth-value 6 
            (decode-universal-time
                (encode-universal-time 0 0 0 13 i
                    (parse-integer (car *args*)) 0))))))

ওহ ,শ্বর, আমি কখনই লিসপ পড়তে পারি নি ..
ক্রাঙ্কার

2

সি শার্প 110 101 93 92

int f(int y){int c=0;for(int i=1;i<13;i++)c+=new DateTime(y,i,8).DayOfWeek>0?0:1;return c;}

সি # লিন্ক 88

int g(int y){return Enumerable.Range(1,12).Count(m=>new DateTime(y,m,8).DayOfWeek==0);}

লিঙ্কের জন্য জেপ্পে স্টিগ নীলসেনকে ধন্যবাদ এবং 8 ই রবিবার রবিবার অনুসন্ধানের পরামর্শ দেওয়া হয়েছে।

>পরিবর্তে পরামর্শ দেওয়ার জন্য ড্যাঙ্কো দুর্বিকে ধন্যবাদ ==


পরিবর্তে c+=(int)new DateTime(y,i,13).DayOfWeek==5?1:0;, সমতুল্য ব্যবহার করুন c+=new DateTime(y,i,8).DayOfWeek==0?1:0;। কৌশলটি বিয়োগ করা 5, কারণ এরপরে আপনি theালাই থেকে মুক্তি পেতে পারেন int, এবং সংখ্যার 8চেয়ে সংখ্যার একটি সংখ্যাও কম 13। রবিবার অষ্টমী!
জেপ্প স্টিগ নীলসন

Linq সঙ্গে: int g(int y){return Enumerable.Range(1,12).Count(m=>new DateTime(y,m,8).DayOfWeek==0);}। অবশ্যই ল্যাম্বডা হিসাবে এটি y=>Enumerable.Range(1,12).Count(m=>new DateTime(y,m,8).DayOfWeek==0)
জেপ্পে স্টিগ নীলসেন

তুলনা করে আপনি একটি অক্ষর সংরক্ষণ করতে পারেন .DayOfWeek<1
ডানকো দুর্বিć

@ ড্যাঙ্কোডুরবিć এটি c#উত্তরের ক্ষেত্রে প্রয়োগ করতে পারে তবে কীভাবে এটি প্রয়োগ করতে হবে তা নিশ্চিত নয় linq
কামি

আমার ভুল; স্পষ্টতই আপনি - এর DayOfWeekচেয়ে অন্য কোনও পূর্ণসংখ্যার সাথে তুলনা করতে পারবেন না । 0error CS0019: Operator '<' cannot be applied to operands of type 'System.DayOfWeek' and 'int'
ডানকো দুর্বিć

2

পিএইচপি, 55 বাইট

for(;++$i<13;)$c+=!date(w,strtotime($argn.-$i));echo$c;

সাথে চালাও echo <year> | php -nR '<code>'

মূলত ওলেগ যা চেষ্টা করেছিল এবং দামির ক্যাসিপোভিচ ঠিক আরও ভাল গল্ফ দিয়েছিল:
প্রতি মাসে যে রবিবার থেকে শুরু হয়, তার শুক্রবার ১৩ ই শুক্রবার আছে।
তাই আমি কয়েক মাস লুপ করেছিলাম এবং রবিবারের প্রথম দিনগুলি গণনা করি।

ভাঙ্গন

for(;++$i<13;)          // loop $i from 1 to 12
    $c+=!                   // 4. if result is not truthy (weekday==0), increment $c
        date(w,             // 3. get weekday (0 stands for Sunday)
            strtotime(      // 2. convert to timestamp (midnight 1st day of the month)
                $argn.-$i   // 1. concatenate year, "-" and month
            )
        )
    ;
echo$c;                 // output

1

কে, 42

{+/1={x-7*x div 7}"D"$"."/:'$+(x;1+!12;1)}

k){+/1={x-7*x div 7}"D"$"."/:'$+(x;1+!12;1)}'1776 2012 2013 2014
2 3 2 1

1

বাশ ( 52 47 টি অক্ষর)

for m in {1..12};do cal $m $Y;done|grep -c ^15

1

রেবোল, 63

f: 0 repeat m 12[d: do ajoin["6-"m"-"y]if d/weekday = 5[++ f]]f

রেবোল কনসোলে ব্যবহারের উদাহরণ:

>> y: 2012
== 2012

>> f: 0 repeat m 12[d: do ajoin["6-"m"-"y]if d/weekday = 5[++ f]]f
== 3

বিকল্প সমাধান যা প্রদত্ত বছরের 13 তম শুক্রবার সংগ্রহ করে তা হ'ল:

>> collect[repeat m 12[d: do ajoin["13-"m"-"y]if d/weekday = 5[keep d]]]
== [13-Jan-2012 13-Apr-2012 13-Jul-2012]

1

বাশ এবং সেড, 39

ncal $1|sed '/F/s/13/\
/g'|grep -c ^\ 2

ncal বাম দিকে নীচে সপ্তাহের দিনগুলি দিয়ে প্রদত্ত বছরের জন্য একটি ক্যালেন্ডার মুদ্রণ করে।

sedএকটি /gনিউজলাইন সহ 13 এর দশকে একটি পতাকা জমা দেয়

grep -c "2" দিয়ে শুরু হওয়া রেখাগুলি গণনা করে (20 টি সর্বদা 13 টি অনুসরণ করে)

আমার পুরানো সংস্করণে একটি বাগ খুঁজে পেতে এবং সমাধানের প্রস্তাব দেওয়ার জন্য @ ডিজিটালট্রুমাকে ধন্যবাদ!


আমার পক্ষে পুরোপুরি কাজ করে না - শুক্রবারের লাইনগুলি একবারে একবারে মুদ্রিত হয় এমনকি যদি এতে একের বেশি থাকে 13
ডিজিটাল ট্রমা

1
আমি মনে করি এরকম কিছু দিয়ে আমি সবচেয়ে ভাল করতে পারি 38:ncal $1|sed /F/s/13/\\n/g|grep -c ^\ 2
ডিজিটাল ট্রমা

1
@ ডিজিটালট্রামা আপনি ঠিক বলেছেন এক পর্যায়ে এই স্ক্রিপ্টটি কাজ করছিল। আমাকে এটি ঠিক করতে দিন।
চার্লস

1
@ ডিজিটালট্রামা দেখে মনে হচ্ছে বেশ কিছু দীর্ঘ সংস্করণ কাজ করছে। ঠিক করার জন্য ধন্যবাদ!
চার্লস

মজার বিষয়, আমি প্রস্তাবিত অকেজো সেড এক্সপ্রেশন জিএনইউ সেড (লিনাক্স) এর সাথে কাজ করে তবে বিএসডি সেড (ওএসএক্স) এর সাথে নয়। আমার ধারণা, আপনি জিএনইউ সংস্করণটি বেছে নিলে বহনযোগ্যতার ব্যয়ে আপনি 1 টি অর্জন করতে পারেন।
ডিজিটাল ট্রমা

1

স্কালা, 76 68 টি অক্ষর

78 টি অক্ষরে:

def f(y:Int)=0 to 11 count(new java.util.GregorianCalendar(y,_,6).get(7)==6)

সাধারণের বাইরে কিছুই নয়, DAY_OF_WEEK = 7এবং এর জন্য যাদুকরী সংখ্যা ব্যবহার করা ব্যতীত FRIDAY = 6

68 অক্ষর সংস্করণ:

def f(y:Int)=0 to 11 count(new java.util.Date(y-1900,_,6).getDay==5)

হ্যাঁ, জাভা API এর মধ্যে সপ্তাহের ধ্রুবকের দিনের মান পরিবর্তন করেছে।


এটি new java.util.GregorianCalendarএত লজ্জাজনক হতে হবে :(
ক্রাঙ্কার

1

পাইথন 195/204

শুধুমাত্র পূর্ববর্তী বছরগুলিতে কাজ করে, কারণ এখনmonthdatescalendar পর্যন্ত প্রদত্ত বছরের জন্য একটি ক্যালেন্ডার প্রদান করে । আমি মনে করি সম্ভাব্য বামদিকে প্রচুর অপ্টিমাইজ করার দরকার আছে :)।

import calendar, sys
c=calendar.Calendar()
f=0
for m in range(1,12):
 for w in c.monthdatescalendar(int(sys.argv[1]),m):
  for d in w:
   if d.weekday() == 4 and d.day == 13:
    f=f+1
print(f)

আরেকটি সমাধান, প্রতিটি তারিখের জন্য কাজ করে তবে এটি ছোট নয়:

import datetime,sys
y=int(sys.argv[1])
n=datetime.date
f=n(y,1,1)
l=n(y,12,31)
i=0
for o in range(f.toordinal(), l.toordinal()):
 d=f.fromordinal(o)
 if d.day == 13 and d.weekday() == 4:
  i=i+1
print(i)

আপনার প্রথম উদাহরণে পরিসীমাটি হওয়া উচিত (1,13) অন্যথায় আপনি 2013 এর মতো
ল্যানক্জ

1
আপনি গল্ফিংও বিরক্ত করেন নি। সেই জায়গাগুলির কিছু সরান।
mbomb007


0

পাইথন (v2) 120

import datetime as d,sys
s=0
for m in range(1, 13):
    if d.datetime(int(sys.argv[1]),m,6).weekday()==4: s=s+1
print s

0

পার্ল + লিব পসিক্স 55

খুঁজছি না এর ধারণা সঙ্গে 13thকিন্তু প্রথম, এবং sundayহয় 0এই Let 3 অক্ষর সংরক্ষণ করুন! ধন্যবাদ @ ইসজি এবং ড্যাঙ্কো দুর্বিয়!

$==$_;$_=grep{!strftime"%w",0,0,0,1,$_,$=-1900}(0..11)

২০১০ থেকে ২০১৩ (নমুনার জন্য) এভাবে গণনা করা যায়:

perl -MPOSIX -pE '$==$_;$_=grep{!strftime"%w",0,0,0,1,$_,$=-1900}(0..11)' <(
    printf "%s\n" {2010..2017})
11321312

(ঠিক আছে, কোনও নতুন লাইন নেই , তবে এটি জিজ্ঞাসা করা হয়নি;)

পুরাতন পোস্ট: 63

$==grep{5==strftime"%w",0,0,0,13,$_,$ARGV[0]-1900}(0..11);say$=

কর্মে:

for i in {2010..2017};do
    echo $i $(
        perl -MPOSIX -E '
            $==grep{5==strftime"%w",0,0,0,13,$_,$ARGV[0]-1900}(0..11);say$=
            ' $i );
  done
2010 1
2011 1
2012 3
2013 2
2014 1
2015 3
2016 1
2017 2

0

ইন স্মলটক (চিঁ-চিঁ / Pharo গন্ধ), পূর্ণসংখ্যা মধ্যে এই পদ্ধতি বাস্তবায়ন ( 86 অক্ষর)

countFriday13^(1to:12)count:[:m|(Date year:self month:m day:13)dayOfWeekName='Friday']

তারপরে এটি ব্যবহার করুন: 2014countFriday13

অবশ্যই, আমরা একটি সংক্ষিপ্ত নাম ব্যবহার করতে পারি, তবে তারপরে এটি ছোট্ট টালক হবে না


0

সি ++ - অনেক বেশি বাইট :(

আমি একটি সমাধান চেষ্টা করেছি যা কোনও তারিখের লাইব্রেরি ব্যবহার করে না।

আমি একটি দুর্দান্ত শীতল (যদি আমি নিজেই বলতে পারি) এর সমাধান পেয়েছি। দুর্ভাগ্যক্রমে আমি এটির চেয়ে কম এটি পেতে পারি না, যা সত্যই আমাকে বাগিয়ে দেয় কারণ এর থেকে আরও ভাল উপায় হওয়া উচিত বলে মনে হয়।

সমাধানটি এই অ্যালগরিদমের উপর নির্ভর করে যা নিজেই কেবল ৪৪ বাইট। দুর্ভাগ্যক্রমে এটিকে সুন্দরভাবে মোড়ানোর জন্য আমার আরও 100 বাইট দরকার ...

#include<stdlib.h>
main(int,char**v){int f=0,d,m,y;for(m=1;m<13;++m)d=13,y=atoi(v[1]),(d+=m<3?y--:y-2,23*m/9+d+4+y/4-y/100+y/400)%7-5||++f;return f;}

রিটার্ন কোডের মাধ্যমে আউটপুট (সি ++ এ, ব্যবহার করা coutবা এর printfমতো যে কোনও কিছুর প্রয়োজন হয় #include, যা সমাধানটিকে আরও বেশি করে ধরিয়ে দেবে)।

ড্রাইভার / পরীক্ষা প্রোগ্রাম:

# Make sure we're not running an old version
rm doomsday.exe

gcc doomsday.cpp -o doomsday.exe

./doomsday.exe 1776
echo 1766: $?

./doomsday.exe 2012
echo 2013: $?

./doomsday.exe 2013
echo 2013: $?

./doomsday.exe 2014
echo 2014: $?

echo `wc doomsday.cpp -c` characters

ড্রাইভার প্রোগ্রামের আউটপুট:

$ ./test_doomsday 
1766: 2
2013: 3
2013: 2
2014: 1
150 doomsday.cpp characters

আমি 44 হিসাবে নয়, অ্যালগরিদমের জন্য 88 গণনা করি the অ্যালগরিদম কী এবং ওয়ার্পিং কী? ($m<3?$y--:$y-2)+3পরিবর্তে d=13,, d+=m<3?y--:y-2,এবং d+4পাশাপাশি কাজ করা উচিত এবং অনেক সঞ্চয় করা উচিত। +5এর পরিবর্তে +3এবং -5খুব বেশি কাজ করা উচিত এবং 2 বাইট সংরক্ষণ করা উচিত। for(m=0;++m<13;)একটি বাইট সংরক্ষণ করে। m=0ফাংশন হেড এ সরানো অন্য বাইট সংরক্ষণ করে; এবং ()%7||++fলুপ মাথায় সরানো অন্য একটি সংরক্ষণ করে। 149 থেকে 136 বাইট নিচে।
তিতাস

0

ক্লোজার, 207 187 বাইট

-20 বাইটগুলি পরিত্রাণ পেয়ে importএবং কিছু হোয়াইটস্পেস আমি মিস করেছি।

(import '[java.time LocalDate DayOfWeek])#(loop[d(LocalDate/parse(str %"-01-01"))c 0](if(=(.getYear d)%)(recur(.plusDays d 1)(if(and(=(.getDayOfMonth d)13)(= (.getDayOfWeek d) DayOfWeek/FRIDAY))(inc c)c))c))

প্রদত্ত বছরের ১ লা জানুয়ারি থেকে শুরু করে, এটি প্রতিটি দিনেই লুপ করে। দিনটি 13 তম শুক্রবার হলে এটি গণনা বাড়িয়ে তোলে। এটি পরের বছর পৌঁছানো অবধি লুপ অবিরত থাকে।

(import '[java.time LocalDate DayOfWeek])

(defn count-friday-13ths [year]
  (loop [d (LocalDate/parse (str year "-01-01")) ; Starting date
         c 0] ; The count
    (if (= (.getYear d) year) ; If we haven't moved onto the next year...
      (recur (.plusDays d 1) ; Add a day...
             (if (and (= (.getDayOfMonth d) 13) ; And increment the count if it's Friday the 13th
                      (= (.getDayOfWeek d) DayOfWeek/FRIDAY))
               (inc c) c))
      c))) ; Return the count once we've started the next year.

0

পিএইচপি, কোনও বিল্টিন নেই, 81 বাইট

echo 0x5da5aa76d7699a>>(($y=$argn%400)+($y>102?$y>198?$y>299?48:32:16:0))%28*2&3;

সাথে চালাও echo <year> | php -nR '<code>'

ভাঙ্গন

প্রতি 400 বছর পরে সপ্তাহের দিনগুলি পুনরাবৃত্তি করে।
1600 থেকে 1999-এর ফলাফলগুলিতে (উদাহরণস্বরূপ), কেবলমাত্র তিনটি ফাঁক সহ একটি 28-দৈর্ঘ্যের সময়কাল রয়েছে:

  0:2212122131132131222211221311
 28:2212122131132131222211221311
 56:2212122131132131222211221311
 84:2212122131132131122
103:       131132131222211221311
124:2212122131132131222211221311
152:2212122131132131222211221311
180:2212122131132131222
199:       131132131222211221311
220:2212122131132131222211221311
248:2212122131132131222211221311
276:221212213113213122221122
300:            2131222211221311
316:2212122131132131222211221311
344:2212122131132131222211221311
372:2212122131132131222211221311

এই ব্যবধানগুলির জন্য বছরটি সামঞ্জস্য করার পরে, আমরা একটি সাধারণ হ্যাশ দিয়ে ফলাফলটি পেতে পারি:

$y=$argn%400;foreach([300,199,103]as$k)$y<$k?:$y+=16;
echo"2212122131132131222211221311"[$y%28];

সংক্ষিপ্ত নয় (95 বাইট) তবে সুন্দর। এবং আমরা গল্ফ করতে পারি

  • অফসেটের জন্য একটি বার্ষিক চেইন ব্যবহার করে 4 বাইট,
  • বেস 4 স্ট্রিং থেকে পূর্ণসংখ্যায় হ্যাশ মানচিত্র রূপান্তর করে 8 বাইট
  • হেক্স প্রতিনিধিত্ব ব্যবহার করে আরও একটি,
  • এবং একটি এক্সপ্রেশন মার্জ করে।

কমপুশিপের সি ++ উত্তরটির একটি বন্দরটি 84 বাইটে নামানো যেতে পারে:for(;++$m<13;23*$m/9+($m<3?$y--:$y-2)+5+$y/4-$y/100+$y/400)%7?:$f++)$y=$argn;echo$f;
টাইটাস

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.