সর্বশেষ সোমবার


27

সোমবার, 31 অক্টোবর, হ্যালোইন। এবং এটা সম্পর্কে চিন্তা পেয়েছিলাম - আমি ভাবছি অন্য মাসের মাসের শেষ দিন আছে এছাড়াও একটি সোমবার হতে পারে?

ইনপুট

  • কোনও বছরের উপস্থাপন করা যে কোনও সুবিধাজনক বিন্যাসে ইতিবাচক পূর্ণসংখ্যার 10000 > y > 0,।
  • প্রয়োজনে ইনপুটটি জিরো (যেমন 0025বছরের জন্য 25) দিয়ে প্যাড করা যেতে পারে ।

আউটপুট

  • সেই বছরের মাসগুলির একটি তালিকা যেখানে মাসের শেষ দিনটি সোমবার।
  • এটি মাসের নাম (যেমন, January, March, October), বা শর্টনাম ( Jan, Mar, Oct), বা সংখ্যা ( 1, 3, 10), আলাদা লাইন বা একটি তালিকা বা সীমিত, ইত্যাদি হিসাবে হতে পারে, যতক্ষণ না এটি পাঠকের কাছে দ্ব্যর্থহীন।
  • আউটপুট ফর্ম্যাট অবশ্যই সামঞ্জস্যপূর্ণ হতে হবে:
    • সমস্ত বছর ইনপুট (অর্থাত্ আপনি কিছু ইনপুটগুলির জন্য মাসের নাম এবং অন্যান্য ইনপুটগুলির জন্য মাসের সংখ্যা আউটপুট করতে পারবেন না)
    • ভাল আউটপুট প্রতি সামঞ্জস্যপূর্ণ যত (অর্থাত, আপনি পারবেন না আউটপুট 1জন্য Januaryহিসাবে একই আউটপুটে Julজন্য July)
    • মূলত, একটি ফর্ম্যাট চয়ন করুন এবং এটি আটকে থাকুন।

বিধি

  • এমনকি ইনপুট / আউটপুট জন্য গ্রেগরিয়ান ক্যালেন্ডার ধরে নিন y = 1
  • লিপ বছরগুলি অবশ্যই যথাযথভাবে জবাবদিহি করতে হবে (অনুস্মারক হিসাবে: প্রতি বছর 4 দ্বারা বিভাজ্য বছরগুলি 100 দ্বারা বিভাজ্য বছরগুলি ব্যতীত, যদি 400 - 1700, 1800, 1900 এর দ্বারা বিভাজ্য না হয় সমস্ত লিপ বছর নয়, তবে 2000 ছিল)।
  • আপনি পছন্দ মতো কোনও বিল্ট-ইন বা অন্যান্য তারিখ গণনা সরঞ্জাম ব্যবহার করতে পারেন।
  • হয় একটি সম্পূর্ণ প্রোগ্রাম বা একটি ফাংশন গ্রহণযোগ্য। যদি কোনও ফাংশন হয় তবে আপনি আউটপুটটি মুদ্রণের পরিবর্তে ফিরিয়ে দিতে পারেন।
  • স্ট্যান্ডার্ড লুফোলগুলি নিষিদ্ধ।
  • এটি তাই সাধারণ গল্ফিংয়ের সমস্ত নিয়ম প্রয়োগ হয় এবং সংক্ষিপ্ততম কোড (বাইটে) জয়ী হয়।

উদাহরণ

   1 --> Apr, Dec
 297 --> May
1776 --> Sep
2000 --> Jan, Jul
2016 --> Feb, Oct
3385 --> Jan, Feb, Oct

লিডারবোর্ড



1
সম্পর্কিত কিন্তু নকল বা না?
এলপেড্রো

@ এলপিড্রো সম্পর্কিত তবে সদৃশ নয়। প্রথম কোনো বিল্ট-ইন করার অনুমতি দেয় না এবং (শুক্রবার 13) একটি নির্দিষ্ট তারিখ / দিন কম্বো জন্য অনুরোধ দ্বিতীয় বছরের প্রতি মাসের শেষ রবিবার, 3015. 1900 মধ্যে সীমাবদ্ধ জন্য অনুরোধ
AdmBorkBork

দুঃখিত @ টিমএমডি। আপনার মন্তব্য সম্পর্কে আমার ভুল ধারণা।
এলপেড্রো

1
@ এলপিড্রো সমস্যা নেই! আমি বরং একটা প্রশ্ন আছে এবং এটি স্পষ্ট হওয়া, এর চেয়ে থাকবে না একটা প্রশ্ন আছে এবং কিছু অস্পষ্ট আছে।
অ্যাডমবর্কবার্ক

উত্তর:


2

Dyalog APL সঙ্গে dfns এর ক্যাল , সংস্করণ 15.0: 22; সংস্করণ 16.0: 19 বাইট

ক্যাল ফাংশনটি একটি ডিফল্ট ইনস্টল সহ আসে, কেবল প্রবেশ করান )copy dfns

সংস্করণ 15.0: ∊⎕{⍵/⍨2=≢⍎⊢⌿cal⍺⍵}¨⍳12

তালিকাভুক্ত (সমতল)

⎕{... নিম্নলিখিত বেনামী ফাংশনে বাম আর্গুমেন্ট হিসাবে সংখ্যাগত ইনপুট, প্রতিটি ডান পাশের মানকে ঘুরিয়ে ডান আর্গুমেন্ট হিসাবে গ্রহণ করে

⍵/⍨ আর্গুমেন্ট যদি (খালি তালিকা দেয় না তবে)

2= দুটি (রবিবার এবং সোমবার) সমান equal

এর ট্যালি

সংখ্যাগুলি

⊢⌿ নীচে সবচেয়ে সারি

cal জন্য ক্যালেন্ডার

⍺⍵ বছর বাম-যুক্তি, মাস ডান যুক্তি, পরেরটি

⍳12 1 থেকে 12

সংস্করণ 16.0: ⍸2=⎕{≢⍎⊢⌿cal⍺⍵}¨⍳12

সূচক যেখানে

2= দুটি সমান (রবিবার এবং সোমবার)

⎕{... নিম্নলিখিত বেনামী ফাংশনে বাম আর্গুমেন্ট হিসাবে সংখ্যাগত ইনপুট, প্রতিটি ডান পাশের মানকে ঘুরিয়ে ডান আর্গুমেন্ট হিসাবে গ্রহণ করে

এর ট্যালি

সংখ্যাগুলি

⊢⌿ নীচে সবচেয়ে সারি

cal জন্য ক্যালেন্ডার

⍺⍵ বছর বাম-যুক্তি, মাস ডান যুক্তি, পরেরটি

⍳12 1 থেকে 12


19

জাভাস্ক্রিপ্ট (ফায়ারফক্স 30+), 112 109 103 95 বাইট

মা দেখুন, কোনও বিল্ট-ইন নেই!

y=>[for(m of(i=0,y%4|y%400*!(y%100)&&6)+"63153042641")if((i++,y+(y>>2)-(y/100|0)*3/4|0)%7==m)i]

এখানে একটি 107-বাইট ES6 সংস্করণ রয়েছে:

y=>[...(y%4|y%400*!(y%100)&&6)+"63153042641"].map((m,i)=>(y+(y>>2)-(y/100|0)*3/4|0)%7-m?0:i+1).filter(x=>x)

এবং এখানে আমার আগের প্রয়াস, ইএস 6 এর 123 113 বাইট:

y=>[(l=y%4|y%400*!(y%100))?[7]:[1,7],[4,12],[9],[3,6],[8,11],[5],l?[1,2,10]:[2,10]][(y+(y>>2)-(y/100|0)*3/4|0)%7]

ব্যাখ্যা

নির্দিষ্ট বছরের সপ্তাহের দিনটি এভাবে গণনা করা হয়:

y+(y>>2)-(y/100|0)*3/4|0)%7

অন্য কথায়:

  • নিন y
  • y( y>>2) এর আগে চতুর্থ বছরের সংখ্যা যুক্ত করুন ।
  • y( y/100|0) এর আগে 100 তম বছরের সংখ্যা বিয়োগ করুন ।
  • এর আগে 400 তম বছরের সংখ্যায় ফিরে যোগ করুন y; এটি 1/4 এর y/100|0, তাই আমরা ব্যবহার করি *3/4|0

তারপরে আমরা ফলাফলটি 7. দ্বারা মডুলো করি যদি আমরা 0রবিবার 1মানে, সোমবার ইত্যাদির অর্থ করি, ফলাফলটি বছরের 31 শে ডিসেম্বর সপ্তাহের সাথে মিলে যায়। সুতরাং, ডিসেম্বরের জন্য, আমরা ফলাফল কিনা তা যাচাই করতে চাই 1। এটি আমাদেরকে স্ট্রিংয়ের শেষ চর দেয়।

নভেম্বরের শেষ দিনটি ডিসেম্বরের শেষ দিনের 31 দিন আগে। এর অর্থ হ'ল নভেম্বরের শেষ দিন সোমবার হওয়ার জন্য 31 ডিসেম্বর একটি (1 + 31) % 7 = 4= বৃহস্পতিবার হওয়া দরকার।

আমরা মার্চ (এ 3) ফিরে না আসা পর্যন্ত এই পদ্ধতিটি পুনরাবৃত্তি করা হয় । সেখানে লিপ দিবস থাকুক বা না থাকুক, ফেব্রুয়ারির শেষ দিনটি মার্চের শেষ দিনের 31 দিন আগে, সুতরাং আমরা এটিও গণনা করতে পারি (এটি (3 + 31) % 7 = 6)। কৌশলযুক্ত অংশটি জানুয়ারীর জন্য সঠিক মানটি সন্ধান করছে:

  • যদি এটি লিপ বছর হয় তবে জানুয়ারির শেষ দিনটি ফেব্রুয়ারির শেষ দিনের 29 দিন আগে হয়, যার ফলস্বরূপ (6 + 29) % 7 = 0
  • অন্যথায়, এটি ফেব্রুয়ারির শেষ দিনের 28 দিন আগে, যার ফলস্বরূপ (6 + 28) % 7 = 6

নিম্নলিখিত স্নিপেটের সাথে এটি লিপ বছর কিনা তা আমরা গণনা করতে পারি:

!(y%400)|y%100*!(y%4)

এটি লিপ বছর না 0হলে yএবং অন্যথায় ইতিবাচক পূর্ণসংখ্যা দেয়। এটি আমাদের দিকে নিয়ে যায়

!(y%400)|y%100*!(y%4)?0:6

জানুয়ারীর জন্য দিন গণনার জন্য। তবে আমরা শর্তগুলি বিপরীত করে আরও ভাল করতে পারি:

y%4|y%400*!(y%100)?6:0

যেহেতু মিথ্যা ফলাফল সর্বদা 0 হয়, তাই আমরা এটিকে হ্রাস করতে পারি

y%4|y%400*!(y%100)&&6

আরও একটি মূল্যবান বাইট সংরক্ষণ করা হচ্ছে।

এগুলি একসাথে রেখে আমরা স্ট্রিংয়ের প্রতিটি চরের মধ্য দিয়ে লুপ করে দেখছি যে 31 ডিসেম্বর সপ্তাহের দিনের সমান কিনা। আমরা যেগুলির সাথে মেলে তার সূচকগুলি রাখি, শেষ পর্যন্ত এই অ্যারেটি ফেরত। এবং এভাবেই আপনি বিল্ট-ইনগুলি ছাড়াই লিপ ইয়ার গণনা করেন।


ওহউ ... আমার মস্তিস্ক, তুমি কি এতোদিনের মতো লাফিয়েছ?
ম্যাজিক অক্টোপাস উরান

2
কি যে @carusocomputing !(y%4)*y%100|!(y%400)জন্য। প্রতি বছর 4 দ্বারা বিভাজ্য, 100 দ্বারা বিভাজ্য বছরগুলি বাদে, 400 দ্বারা বিভাজ্য না হলে
mbomb007

আশা করি y+(y>>2)+(z=y/25>>2)+(z>>2)এখনও আপনাকে একটি বাইট সংরক্ষণ করে।
নীল

@ নীল ধন্যবাদ, তবে আমি এর থেকে আরও ভাল উপায় খুঁজে পেয়েছি :-)
ইটিএইচ প্রডাকশন

নিস; আমি আমার ব্যাচ বন্দরে 6 বাইট ব্যবহার করে সংরক্ষণ করেছি (y*5/4-(y/100)*3/4)
নীল

11

জাভাস্ক্রিপ্ট (ফায়ারফক্স 30-57), 67 65 64 63 61 বাইট

y=>[for(_ of(m='')+1e11)if(new Date(y+400,++m).getDay()==2)m]

সংরক্ষিত 2 4 6 বাইট @ETH প্রডাকশন ধন্যবাদ। বিপরীত ক্রমে মাসগুলি আউটপুট করে আরেকটি বাইট সংরক্ষণ করা হয়েছে।


আমি মনে করি আপনি এটি ছাড়াই 2 টি বাইট সংরক্ষণ করতে পারবেন .keys():y=>[for(_ of(m=0,Array(12)))if(new Date(y+400,++m).getDay()==2)m]
ETH প্রোডাকশনগুলি

@ ইথ প্রডাকশনস আমি অর্ডার উল্টিয়ে আরও একটি বাইট সংরক্ষণ করতে পারি!
নীল

বিপরীত অর্ডার ঠিক আছে। আউটপুট ফর্ম্যাট করা এই চ্যালেঞ্জের আকর্ষণীয় অংশ নয়।
অ্যাডমবর্কবার্ক

অ্যারে সমঝোতার বিষয়ে আমাদের নীতিটি এখন কী যে তারা চশমা থেকে সরানো হয়েছে?
মেয়রমন্টি

Array(12)পুরোপুরি এড়িয়ে আপনি আরও 2 টি বাইট সংরক্ষণ করতে পারেন : y=>[for(_ of(m=0,1e11+""))if(new Date(y+400,++m).getDay()==2)m]
ইটিএইচ প্রডাকশনগুলি

8

মাইএসকিউএল, 183 134 129 106 বাইট

SET @y=2016;SELECT help_topic_id AS m FROM mysql.help_topic HAVING m BETWEEN 1 AND 12 AND 2=DAYOFWEEK(LAST_DAY(CONCAT(@y,-m,-1)))

2016পছন্দসই বছর দিয়ে প্রতিস্থাপন করুন । চালান।

রেভ 2: help_topicsঅস্থায়ী টেবিল তৈরি করার পরিবর্তে ডিফল্ট ইনস্টলেশনতে টেবিলটি ব্যবহার করা হয়েছে।

Rev.3: গৃহীত আরস -ট্রিক এবং লক্ষ্য করেছেন আমি এর জন্য উদ্ধৃতিগুলিও বাদ দিতে পারি "-1"
তবে, -1মাইএসকিউএল প্রয়োজন: আমার একটি পূর্ণ তারিখ প্রয়োজন।

Rev.4: বিধিনিষেধটি (-6) m BETWEEN 1 AND 12হিসাবে করা যেতে পারে m>0 AND m<13তবে একেবারেই প্রয়োজন হয় না - অবৈধ মানগুলি উপেক্ষা করা হবে; সতর্কতা গণনা করা হবে তবে তালিকাভুক্ত নয়।


আপনি টেবিল shema mysql সত্যিই প্রয়োজন? mariadb.com/kb/en/mariadb/mysqlhelp_topic-table
Jörg Hülsermann

@ জার্গহেলসারম্যান আমি আপনার বক্তব্যটি পাই না।
তিতাস

কাজ FROM help_topicছাড়া করা উচিত mysql.? আমি এটি চেষ্টা করে
দেখিনি

@ JörgHülsermann কেবলমাত্র আপনি প্রিনেন্ড করলে USE mysql;সঠিক ডাটাবেসটি অবশ্যই কোনওভাবে বেছে নেওয়া উচিত।
তিতাস

5

পার্ল, 64 বাইট

এর জন্য +1 অন্তর্ভুক্ত -n

এসটিডিনে ইনপুট দিন:

perl -M5.010 mon.pl <<< 2016

mon.pl:

#!/usr/bin/perl -n
map$b.=$/.gmtime$_.e4,-7e6..3e7;say$b=~/on (\S+ )\S.* $_.* 1 /g

5

ব্যাচ, 160 152 বাইট

@set/ay=%1,m=0,j=6*!(!(y%%4)*(y%%100)+(y%%400)),y=(y*5/4-y/100*3/4)%%7
@for %%d in (%j% 6 3 1 5 3 0 4 2 6 4 1)do @set/am+=1&if %%d==%y% call echo %%m%%

@ ইটিএইচ প্রডাকশনের উত্তরের পোর্ট। 189 বাইটে 197 সংক্ষিপ্ত বিবরণ সহ :

@set/ay=%1,j=6*!(!(y%%4)*(y%%100)+(y%%400)),y=(y*5/4-y/100*3/4)%%7
@for %%m in (Jan.%j% Feb.6 Mar.3 Apr.1 May.5 Jun.3 Jul.0 Aug.4 Sep.2 Oct.6 Nov.4 Dec.1)do @if %%~xm==.%y% call echo %%~nm

4

জে, 48 34 33 বাইট

[:I.(2=7|_2#@".@,@{.])&>@calendar

@ অ্যাডেমের সাহায্যে 15 বাইট সংরক্ষণ করা হয়েছে

মাসের প্রতিনিধিত্ব করে স্ট্রিংগুলির একটি অ্যারে তৈরি করতে ক্যালেন্ডার অন্তর্নির্মিত ব্যবহার করে, তারপরে প্রতিটি স্ট্রিংকে পার্স করে নির্ধারণ করে যে গত সোমবার মাসের শেষ দিন কিনা। এটি প্রতি মাসের প্রত্যেকের মাসের সংখ্যা হিসাবে আউটপুট করে। অর্থাৎ Jan = 0, Feb = 1, ..., Dec = 11

এর আউটপুট calendarহয়

   _3 ]\ calendar 2016
┌─────────────────────┬─────────────────────┬─────────────────────┐
│         Jan         │         Feb         │         Mar         │
│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│
│                 1  2│     1  2  3  4  5  6│        1  2  3  4  5│
│  3  4  5  6  7  8  9│  7  8  9 10 11 12 13│  6  7  8  9 10 11 12│
│ 10 11 12 13 14 15 16│ 14 15 16 17 18 19 20│ 13 14 15 16 17 18 19│
│ 17 18 19 20 21 22 23│ 21 22 23 24 25 26 27│ 20 21 22 23 24 25 26│
│ 24 25 26 27 28 29 30│ 28 29               │ 27 28 29 30 31      │
│ 31                  │                     │                     │
├─────────────────────┼─────────────────────┼─────────────────────┤
│         Apr         │         May         │         Jun         │
│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│
│                 1  2│  1  2  3  4  5  6  7│           1  2  3  4│
│  3  4  5  6  7  8  9│  8  9 10 11 12 13 14│  5  6  7  8  9 10 11│
│ 10 11 12 13 14 15 16│ 15 16 17 18 19 20 21│ 12 13 14 15 16 17 18│
│ 17 18 19 20 21 22 23│ 22 23 24 25 26 27 28│ 19 20 21 22 23 24 25│
│ 24 25 26 27 28 29 30│ 29 30 31            │ 26 27 28 29 30      │
│                     │                     │                     │
├─────────────────────┼─────────────────────┼─────────────────────┤
│         Jul         │         Aug         │         Sep         │
│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│
│                 1  2│     1  2  3  4  5  6│              1  2  3│
│  3  4  5  6  7  8  9│  7  8  9 10 11 12 13│  4  5  6  7  8  9 10│
│ 10 11 12 13 14 15 16│ 14 15 16 17 18 19 20│ 11 12 13 14 15 16 17│
│ 17 18 19 20 21 22 23│ 21 22 23 24 25 26 27│ 18 19 20 21 22 23 24│
│ 24 25 26 27 28 29 30│ 28 29 30 31         │ 25 26 27 28 29 30   │
│ 31                  │                     │                     │
├─────────────────────┼─────────────────────┼─────────────────────┤
│         Oct         │         Nov         │         Dec         │
│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│
│                    1│        1  2  3  4  5│              1  2  3│
│  2  3  4  5  6  7  8│  6  7  8  9 10 11 12│  4  5  6  7  8  9 10│
│  9 10 11 12 13 14 15│ 13 14 15 16 17 18 19│ 11 12 13 14 15 16 17│
│ 16 17 18 19 20 21 22│ 20 21 22 23 24 25 26│ 18 19 20 21 22 23 24│
│ 23 24 25 26 27 28 29│ 27 28 29 30         │ 25 26 27 28 29 30 31│
│ 30 31               │                     │                     │
└─────────────────────┴─────────────────────┴─────────────────────┘

ব্যবহার

   f =: [:I.(2=7|_2#@".@,@{.])&>@calendar
   f 1
3 11
   f 297
4
   f 1776
8
   f 2000
0 6
   f 2016
1 9
   f 3385
0 1 9

ব্যাখ্যা

[:I.(2=7|_2#@".@,@{.])&>@calendar  Input: year Y
                         calendar  Get 12 boxes each containing a month
    (                )&>@          Operate on each box
                    ]                Identity, get the box
         _2       {.                 Take the last two strings
                ,@                   Flatten it
             ".@                     Parse it into an array of integers
           #@                        Get the length
       7|                            Take it modulo 7
     2=                              Test if it equals 2 - it will either
                                     have two days or 9 days in the last
                                     two lines if the end is on a Monday
[:I.                               Return the indices containing a true value

অপেক্ষা করুন, ক্যালেন্ডার আসলে আসকি আউটপুট দেয়?
ধ্বংসাত্মক লেবু

@ আবিষ্কারযোগ্য জলছবি ঠিক বলতে গেলে, আউটপুট ফর্ম্যাটটি calendar12 টি বাক্সের একটি অ্যারে যেখানে প্রতিটি বাক্সে 2d অ্যারে থাকে
মাইল

আমি জেতে "প্রতিটি" কীভাবে করব তাও জানি না, তবে এটি ইতিমধ্যে অনেক খাটো: I.7=;#&.>".&.>,&.>_2{.&.>calendar 2016আপনি যদি সমস্ত "আন্ডার-ওপেন" এর সাথে একত্রিত হন তবে আপনি এটি খুব ছোট করে রাখতে সক্ষম হবেন।
Adám

@ আদম ধন্যবাদ, এটি একটি ভাল পদ্ধতি ব্যবহার কিন্তু এটা জে একটি ক্রিয়া নয় আমি এটা করবে এখনও সাহায্যের যদিও মনে
মাইল

আমার উদ্দেশ্য কেবল অনুপ্রেরণা ছিল। আমি জানি এটি একটি ক্রিয়াপদ নয়।
Adám

4

গণিত, 62 57 বাইট

DayName@DayRange[{#},{#+1},"EndOfMonth"]~Position~Monday&

বেনামে ফাংশন। একটি সংখ্যা ইনপুট হিসাবে নেয় এবং আউটপুট হিসাবে সংখ্যার একক-উপাদান তালিকার একটি তালিকা ফেরত দেয়। আমি কীভাবে এটি আর কাজ করে তা সত্যই আমি নিশ্চিত নই।


4

পার্ল + ক্যাল, 46 বাইট

say`cal $_ $ARGV[0]`=~/\n.{5}\n/&&$_ for 1..12

উদাহরণ:

$ perl -E 'say`cal $_ $ARGV[0]`=~/\n.{5}\n/&&$_ for 1..12' 2016

2







10


$

1
কড়া কথায় বলতে গেলে, এটি পার্ল + ক্যাল, কেবল পার্ল :- পি নয়। উদাহরণস্বরূপ, আমার উইন্ডোজ মেশিনে পার্ল রয়েছে তবে এটি সেখানে কাজ করবে না।
ফিলোমোরি ২

ফেয়ার পয়েন্ট, এটি এবং আমার বাশ প্রয়াস আপডেট হয়েছে।
স্টিভ

4

জাভা 7,186 182 172 বাইট

4 বাইট সংরক্ষণের
জন্য কেভিনকে ধন্যবাদ 10 বাইট সংরক্ষণের জন্য @ ক্লিফ্রুটকে ধন্যবাদ

int[]f(int n){int c=n-1,x=c*365+c/4+c/400-c/100,k=0,b[]={3,(n%4<1&n%100>0)|n%400<1?1:0,3,2,3,2,3,3,2,3,2,3},a[]=new int[12];for(int i:b)a[k++]=(x+=i+28)%7==1?1:0;return a;}

ungolfed

int[] f(int n) {
 int c=n-1,x=c*365+(c/4)+(c/400)-(c/100),k=0,
   b[] = {3,(n % 4 < 1 & n % 100 > 0) | n % 400 < 1 ? 1 : 0
                                     ,3,2,3,2,3,3,2,3,2,3},a = new int[ 12 ];

 if ( (n % 4 < 1 & n % 100 > 1) | n % 400 < 1 )
     b[ 1 ] = -1;
 for (int i : b)
    a[ k++ ] = (x += i + 28) % 7 == 1 ? 1 : 0;

return a;
     }

এই সংস্করণটি @ ক্লিফ্রুট ( 168 বাইট ) সরবরাহ করেছেন

 static int[] f(int n) {
 int b = 13561787 | ( (n%4 < 1 & n%100 > 0) | n%400 < 1 ? 1 << 20 : 0 ),
           x = --n*365 + n/4 + n/400 - n/100,a[]=new int[12],k=0;
    while (k < 12)
    a[k++] = (x += (b >> 24 - k*2&3 ) + 28) % 7 == 1 ? 1 : 0;
  return a;   }
    }

আউটপুট নমুনা

1 1 0 0 0 0 0 0 0 1 0 0(for input 3385)

1
আমি আমার উত্তর লিখেছে আমি সবকিছু গণক নিজেকে খাটো হবে জানতাম .. :) BTW, আপনি গলফ পারেন n%4==0করতে n%4<1; n%400==0থেকে n%400<1এবং int c=...;int[]b=...,a=...থেকে int c=...,b[]=...,a[]=...
কেভিন ক্রুইজসেন

1
bএবং aএর intঅংশ হিসাবে এটি সংজ্ঞায়িত করা যেতে পারে :int ... ,b[]=...,a[]=...
অলিভিয়ার গ্রাগোয়ার

1
int[]f(int n){int x=--n*365+n/4+n/400-n++/100,k=0,b[]={1,(n%4<1&n%100>0)|n%400<1?-1:-2,1,0,1,0,1,1,0,1,0,1},a[]=new int[12];for(int i:b)a[k++]=(x+=i+30)%7==1?1:0;return a;}কয়েকটি বাইট সংরক্ষিত হয়েছে
ক্লিফ্রুট

1
আরও 2 টি বাইটে এবং এও পরিবর্তন bকরতে পারেb[]={3,(n%4<1&n%100>0)|n%400<1?1:0,3,2,3,2,3,3,2,3,2,3}i+30i+28
ক্লিফ্রুট

1
এবং আরও 3 বাইটint[]f(int n){int b=13561787|((n%4<1&n%100>0)|n%400<1?1<<20:0),x=--n*365+n/4+n/400-n/100,a[]=new int[12],k=0;while(k<12)a[k++]=(x+=(b>>24-k*2&3)+28)%7==1?1:0;return a;}
ক্লিফ্রুট

3

পাইথন 2, 100 বাইট

বিতৃষ্ণা। তারিখগুলি সহ গণিত আমার পছন্দ মতো সহজ নয়।

lambda y:[m+1for m in range(12)if(date(y,12,31)if m>10else(date(y,m+2,1)-timedelta(1))).weekday()<1]

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

একই দৈর্ঘ্য:

lambda y:[m-1for m in range(2,14)if(date(y,12,31)if m>12else(date(y,m,1)-timedelta(1))).weekday()<1]

আমি এটিকে দিয়ে পাইথনের চেষ্টাও করিনি। চমৎকার চেষ্টা।
এলপেড্রো

3

এমএটিএল , 21 বাইট

12:"G@QhO6(YO9XO77=?@

মাস সংখ্যা হিসাবে প্রদর্শিত হয়।

এটি অনলাইন চেষ্টা করুন! বা সমস্ত পরীক্ষার কেস যাচাই করুন

ব্যাখ্যা

এটি তারিখ রূপান্তর অন্তর্নির্মিত ফাংশন ব্যবহার করে। প্রদত্ত বছরের জন্য এটি পরীক্ষা করে যে কোন মাসের শেষ দিন সোমবার।

মাসের শেষ দিনটি k(যা 28, 29, 30 বা 31 হতে পারে) স্পষ্টভাবে নির্দিষ্ট করার পরিবর্তে , আমরা 0মাসের -২০ তম দিনটি নির্দিষ্ট করি k+1, যা সমান এবং মাস বা বছরের উপর নির্ভর করে না।

12:      % Push [1 2 ... 12] (months)
"        % For each month k
  G      %   Push input
  @Q     %   Push k+1
  h      %   Concatenate
  O6(    %   Postpend four zeros. For example, for input 2016 and month k=1 
         %   (first iteration) this gives [2016 2 0 0 0 0] (year, month, day,
         %   hour, min, sec). The 0-th day of month k+1 is the same as the
         %   last day of month k.
  YO     %   Convert the above 6-element date vector to date number
  9XO    %   Convert date number to date string with output format 9, which 
         %   is weekday as a capital letter
  77=    %   Is it an 'M'?
  ?      %   If so
    @    %     Push current month (will be implicitly displayed)

3

বাশ + জিএনইউ ইউটিলিটিস, 56 বাইট

seq -f1month-1day$1-%g-1 12|date -f- +%B%u|sed -n s/1//p

date8.25 সংস্করণ প্রয়োজন বলে মনে হচ্ছে । আইডিয়নের 8.23 ​​সংস্করণ এটি কাটবে না।


3

এক্সেল, 537 বাইট

কারণ - আপনি জানেন - এক্সেল!

এ 1 এ ইনপুট বছর নেয়। মাসের হেক্সাডেসিমাল তালিকা প্রদান করে; ২ = জানুয়ারী, সি = ডিসেম্বর। যেহেতু প্রতিটি মাসই একক অঙ্ক, তাই কোনও বিভাজকের প্রয়োজন হয় না।

=IF(2=WEEKDAY(EOMONTH(DATE(A1,1,1),0)),1,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,2,1),0)),2,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,3,1),0)),3,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,4,1),0)),4,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,5,1),0)),5,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,6,1),0)),6,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,7,1),0)),7,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,8,1),0)),8,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,9,1),0)),9,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,10,1),0)),"A","")&IF(2=WEEKDAY(EOMONTH(DATE(A1,11,1),0)),"B","")&IF(2=WEEKDAY(EOMONTH(DATE(A1,12,1),0)),"C","")

উদাহরণ: ক 1 2016. খ 1 উপরে সূত্র রয়েছে, এবং প্রদর্শন রয়েছে 2A, ফেব্রুয়ারি ও অক্টোবর অর্থ।


3

পিএইচপি, 109 180 159 বাইট

for($z=$argv[1];$m++<12;)if(date(N,strtotime(sprintf("%04d-$m-",$z).cal_days_in_month(0,$m,$z)))<2)echo"$m,";
  • প্রদত্ত বছরের আউটপুট দেয়, তাদের সবগুলিই নয় (... সর্বদা প্রশ্নটি পড়ুন)
  • উপেক্ষা করা বিজ্ঞপ্তি (ধন্যবাদ টাইটাস)
  • পরিবর্তন whileকরার জন্য forএটা এখন একটি একক বছরের হিসাবে (আবার, ধন্যবাদ তিতাস)

পুরাতন 2

$z=0;while($z++<9999){$o=[];$m=0;while($m++<12)if(date("N",strtotime(sprintf("%04d-$m-","$z").cal_days_in_month(0,$m,$z)))<2)$o[]=$m;echo count($o)>0?"$z:".implode(",",$o)."
":"";}

বিন্দু থেকে 10000 পর্যন্ত সমস্ত বছর সমর্থন করে, আমি একটি পিসিতে অবগত নই এমন একটি অপরিজ্ঞাত বর্ণ সতর্কতা থেকেও মুক্তি পেয়েছি। হ্যাঁ এটি পুরানো সংস্করণের চেয়ে দীর্ঘ, তবে এটি আরও দৃ rob়।

পুরাতন ঘ

while($z++<9999){$o=[];$m=0;while($m++<12)if(date("N",strtotime("$z-$m-".cal_days_in_month(0,$m,$z)))<2)$o[]=$m;echo count($o)>0?"$z:".implode(",",$o)."
":"";}

উইন্ডোজ বা 32 বিবিট সিস্টেমে চললে ভয়ঙ্কর 2038 বাগ থাকবে তবে 64 বিট লিনাক্স সিস্টেমে এটি ঠিক আছে।

আমি ব্যবহারের চেষ্টা করেছি date("t"...যা প্রদত্ত মাসের শেষ তারিখের প্রতিনিধিত্ব করতে বোঝানো হয়েছে, তবে ফলাফলগুলি এই থ্রেডে উল্লিখিতগুলির সাথে মেলে না।


2
-2: "$ z" এর কোন উদ্ধৃতি দরকার নেই -7: নোটিশগুলি উপেক্ষা করুন (তারা ডিফল্ট সেটিংস দিয়ে মুদ্রিত নয়: এর $zজন্য কোন উদ্ধৃতি দেবেন না N) -1: forপরিবর্তে while -৩৪ : বছরের পরে লুপিংয়ের পরিবর্তে অনুরোধ হিসাবে ইনপুট নিন -3: এর joinপরিবর্তে implode-16: প্রত্যক্ষ আউটপুট: for($z=$argv[1];$m++<12;)if(date(N,strtotime(sprintf("%04d-$m-",$z).cal_days_in_month(0,$m,$z)))<2)echo"$m,";+9 যদি আপনি কোনও পিছনে কমা না থাকার জন্য জিদ করেন:echo$o=$o?",$m":$m;
টাইটাস

আহঃ প্রশ্ন ভুল করে! ভেবেছিলাম এটি সমস্ত বছরের জন্য ছিল .. ওফস: বি অন্যান্য পরামর্শের জন্যও ধন্যবাদ, সেগুলি গ্রহণ করবে
CT14.IT

3

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

for($d=new DateTime("$argv[1]-1-1");$i++<12;)$d->modify("1month")->format(w)!=2?:print"$i,";

বছরের প্রথম দিন পরে 12 বার 1 মাস পরীক্ষা করুন মঙ্গলবার। যদি তা হয় তবে মাসের শেষ দিনের আগের দিনটি সোমবার।


আপনি মুদ্রণের পরিবর্তে প্রতিধ্বনি ব্যবহার করতে পারেন এবং 1
অক্টোপাস

1
@ অ্যাক্টপাস টেরিনারি অপারেটরের ভিতরে নেই
জার্গ হালসারম্যান

3

সি, 214 বাইট

main(int a,char *b[]){for(int x,y,d,m=12;m;m--){y=atoi(b[1]);x=m-1;d=x==1?(y%4==0?(y%100==0?(y%400==0?29:28):29):28):(x==3||x==5||x==10?30:31);if((d+=m<3?y--:y-2,23*m/9+d+4+y/4-y/100+y/400)%7==1)printf("%d\n",m);}}

কম্পাইল

gcc -std=c99 -o foo foo.c

Ungolfed

প্রাসঙ্গিক গুরুদের ক্রেডিট সহ।

মাইকেল কীথ এবং টম ক্র্যাভারের জন্য সি প্রোগ্রামের সপ্তাহের তারিখের তারিখ নির্ধারণ করতে

প্রশ্নোত্তরের জন্য কলিন বিডেনকাপ : মাসের শেষ দিনটি কী?

/* credit to Collin Biedenkapp */
short _get_max_day(short x, int z) {
    if(x == 0 || x == 2 || x == 4 || x == 6 || x == 7 || x == 9 || x == 11)
        return 31;
    else if(x == 3 || x == 5 || x == 8 || x == 10)
        return 30;
    else {
        if(z % 4 == 0) {
            if(z % 100 == 0) {
                if(z % 400 == 0)
                    return 29;
                return 28;
            }
            return 29;
        }
        return 28;
    }
}

main(int argc,char *argv[]) {
 for(int y,d,m=12;m;m--) {
  y=atoi(argv[1]);
  d=_get_max_day(m-1,y);
  /* credit to Michael Keith and Tom Craver */
  if ((d+=m<3?y--:y-2,23*m/9+d+4+y/4-y/100+y/400)%7 == 1)
    printf("%d\n",m);
 }
}

1
আপনি যদি আবার ফিরে আসার ifজন্য আপনার অন্য দিকটিকে সরিয়ে যান এবং তাই আপনি বড় চেইনটি মুছে ফেলতে পারেন তবে কী হবে? else31==
অ্যাডমবর্কবার্ক

1
(x == 1) {z অংশ} অন্যথায় যদি (x == 3 || x == 5 || x == 8 || x == 10) 30 টি ফিরে আসে 31
রোজলুপি

1
কী সম্পর্কে: রিটার্ন x == 1? (z% 4 == 0? (z% 100 == 0? (z% 400 == 0? 29: 28): 29): 28) :( এক্স == 3 | | x == 5 || x == 8 || x == 10? 30: 31)
রোজলুপি

টিমমিডি + রোজলুপি: রিটার্ন () পয়েন্টের জন্য ধন্যবাদ, এখন 100 টি বাইট সংরক্ষণ করা হয়েছে।
স্টিভ

1
এটি অবধি শেষ পর্যন্ত হ্রাস অব্যাহত রাখা সম্ভব: u (y, m) {m-1? 30 + ((2773 >> মি) & 1): 28+ (y% 4 == 0 && y% 100 || y% 400 == 0); y যেখানে y বছর এবং এম মাস
রোসলুপি

3

সি, 119 বাইট

t=1248700335,m;main(y){for(scanf("%d",&y),t+=y&3||y%25<1&&y&15;m++,(6+y+y/4-y/100+y/400+t)%7||printf("%d,",m),t;t/=7);}

এটি একটি টেবিল ব্যবহার করে যা লিপ বছরের জন্য প্রতি মাসের শেষ দিনের সপ্তাহের দিনগুলির অফসেট ধারণ করে, বেস 7 ব্যবহার করে একটি স্বাক্ষরিত 32-বিট শব্দের সাথে এনকোডেড থাকে it এটি লিপ বছর না হলে আমরা জানুয়ারীর অফসেটে 1 যুক্ত করি (আপনি দেখতে পারেন যে y&3||y%25<1&&y&15লিপ দিন ছাড়া বছর ধরে পরীক্ষা করতে ব্যবহৃত হয়)। তারপরে আমরা সহজেই প্রতিমাসে লুপ করে দেখি যে এর শেষ দিনটি সোমবার day বেশ সহজ আসলে, কোনও কুৎসিত হ্যাক বা কৌশল নয় or এখানে এটি সামান্য নিয়মিত হয়:

t=1248700335,m;
main(y){
  for(
    scanf("%d",&y),t+=y&3||y%25<1&&y&15;
    m++,(6+y+y/4-y/100+y/400+t)%7||printf("%d,",m),t;
    t/=7
  );
}

আমি কয়েকটি চরিত্র সংরক্ষণের জন্য এটি ফাংশন হিসাবে পুনরায় লেখার জন্য এটি আবার ঘুরে দেখতে পারি। printfএছাড়াও একটু অত্যধিক স্থান লাগে ...


প্রিন্টফ ("% ডি,", মি) 1, বা 2, 3 হিসাবে কিছু মুদ্রণ করবে, তাই সর্বদা একটি ',' আরও থাকে ... আমি কেবল ফাঁকা স্থান পছন্দ করি
রোজলুপ

প্রকৃতপক্ষে, আমি আউটপুটটিতে প্রকৃতপক্ষে স্পেসগুলিও পছন্দ করি তবে আমি সাধারণত আমার গল্ফড সি সমাধানগুলি লিখি যাতে তাদের কোনও শ্বেত স্পেসের প্রয়োজন না হয়, তাই আমি যখন আমার চরিত্রের গণনা পরীক্ষা করতে চাই তখন আমার আধো গল্ফ সংস্করণটি থেকে আমি সমস্ত সাদা স্থান স্পষ্ট করতে পারি can ।
Fors

3

পিএইচপি, 96 95 76 71 69 64 61 বাইট

দ্রষ্টব্য: বছরের নম্বরগুলি অবশ্যই 4 টি চরকে প্যাড করা উচিত, যেমন 0070

for(;13+$i-=1;)date(N,mktime(0,0,0,1-$i,0,$argn))-1||print$i;

এভাবে চালান:

echo 3385 | php -nR 'for(;13+$i-=1;)date(N,mktime(0,0,0,1-$i,0,$argn))-1||print$i;';echo
> -1-2-10

ব্যাখ্যা

-1 থেকে -12 পর্যন্ত আইট্রেটস। এমকেটাইম, দিন 0(আগের মাসের শেষ দিন) এবং মাস ব্যবহার করে তারিখ তৈরি করুন 2..13। তারিখটিকে দিনের সংখ্যা হিসাবে ফর্ম্যাট করুন এবং ফলাফলটি 1 হলে বর্তমান নম্বরটি মুদ্রণ করুন। নেতিবাচক চিহ্নটি -ডিলিমিটার হিসাবে ব্যবহৃত হয়।

মিলেনিয়াম বাগ আবার স্ট্রাইক!

নোট করুন যে এই সংস্করণটি সহ, পরিসীমাটি 0..100হিসাবে ব্যাখ্যা করা হয়েছে 1970..2069। এটি পরিসীমাটির জন্য কোনও সমস্যা নয় 0..69, কারণ সপ্তাহগুলিতে এমন একটি প্যাটার্ন রয়েছে যা প্রতি 400 বছর (146097 দিন, ঠিক 20871 সপ্তাহ) পুনরাবৃত্তি করে তবে পরিসরের জন্য 70..991900 বছরের সংখ্যায় যুক্ত হয়, যা 400 এর একাধিক নয় not যে সমস্যাটি 10 ​​বছরের পরিসরে 30 বছরের সংখ্যার জন্য কেবলমাত্র নয়, সবচেয়ে সহজ উপায় হ'ল 2-সংখ্যার ব্যাখ্যা ( +4 বাইট ) প্রতিরোধ করার জন্য বছরের সংখ্যাতে 400 যোগ করা :

for(;13+$i-=1;)date(N,mktime(0,0,0,1-$i,0,$argn+400))-1||print$i;

বদলান

  • ব্যবহার করে একটি বাইট সংরক্ষিত !~-$iতুলনা $iসঙ্গে 1( -1বাইনারি অস্বীকার করা হয় 0, কথাটি অস্বীকার করা হয় true; প্রত্যেক অন্যান্য সংখ্যা false), তাই প্রথম বন্ধনী দেবার প্রয়োজন নেই
  • last day ofYYYY-mতারিখটি তৈরি করতে স্বরলিপি ব্যবহার করে 19 বাইট সংরক্ষণ করা হয়েছে
  • ব্যবহার করে dateএবং strtotimeপরিবর্তে 5 বাইট সংরক্ষণ করা হয়েছেdate_create
  • নেগেটিভ সংখ্যা থেকে গণনা করে আউটপুট ডিলিমিটার হিসাবে নেতিবাচক চিহ্ন ব্যবহার করে (নেতিবাচক মাসের সংখ্যা বিদ্যমান নেই) এবং YYYY-mতারিখের অংশেও ডিলিম হিসাবে সংরক্ষণ করা হয়েছে
  • mktimeপরিবর্তে ব্যবহার করে 5 বাইট সংরক্ষণ করা হয়েছে strtotime। দিন ব্যবহারে প্রত্যাবর্তিত হয়েছে 0( mktimeএছাড়াও 13 মাস সমর্থন করে, তাই 0-13== 31-12)
  • উপলব্ধ -Rকরতে ব্যবহার করে 3 বাইট সংরক্ষণ করা হয়েছে$argn

mktimeবছর প্যাড প্রয়োজনীয়তা অপসারণ, এটি না?
তিতাস

@ টিটাস, ধারালো ওয়েল আমি শুধু মূর্ত আউট যে mktimeহয় পাল্টা স্বজ্ঞাত , কারণ আর্গুমেন্ট হিসাবে গ্রহণ করা হয় INTসে। তার মানে আপনি বছরটি প্যাড করতে পারবেন না ... সুতরাং পরিসরের 0..100প্রতিটি জিনিসই ব্যাখ্যা করা হয় 1970..2070। এটি পরিসীমাটির জন্য কোনও সমস্যা নয় 0..70কারণ 400 বছরগুলিতে সপ্তাহের সঠিক সংখ্যা থাকে (সুতরাং ক্যালেন্ডারগুলি প্রতি 400 বছর পরে প্যাটার্নটি পুনরাবৃত্তি করে), তবে 70..991900 যুক্ত করে (400 এর একাধিক নয়!)। অতএব নতুন ভার্চ। একটি বাগ আছে।

$argv[1]+400জুলাইয়ান এবং গ্রেগরিয়ান সাপ্তাহিক দিনের পার্থক্য না থাকলে কেবলমাত্র আমি এখনই তার সমাধান দেখতে পাচ্ছি unless
টাইটাস

@ টিটাস, হ্যাঁ বিধিগুলি বলছে গ্রেগরিয়ান ক্যাল ব্যবহার করুন

3

এক্সেল, 428 97 96 বাইট

এ 1 এ ইনপুট। আউটপুট আন-বিভক্ত হেক্সাডেসিমাল মান (জানুয়ারী = ০, ডিসেম্বর = বি)

=IF(2=WEEKDAY(DATE(A1+2000,1,31)),0,"")&CHOOSE(WEEKDAY(DATE(A1+2000,3,0)),4,19,6,"3B",8,25,"7A")

1990-পূর্বের তারিখগুলি পরিচালনা করার জন্য 10 বাইট ("+2000") যুক্ত করা হয়েছে।

সংরক্ষিত 11 বাইট ধন্যবাদ @ ইঞ্জিনিয়ার টোস্ট


@ অ্যাডামের সমাধান থেকে ভারী ingণ গ্রহণের প্রথম প্রচেষ্টা (428 বাইট) ।

=IF(2=WEEKDAY(DATE(A1,1,31)),1,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,2,1),0)),2,"")&IF(2=WEEKDAY(DATE(A1,3,31)),3,"")&IF(2=WEEKDAY(DATE(A1,4,30)),4,"")&IF(2=WEEKDAY(DATE(A1,5,31)),5,"")&IF(2=WEEKDAY(DATE(A1,6,30)),6,"")&IF(2=WEEKDAY(DATE(A1,7,31)),7,"")&IF(2=WEEKDAY(DATE(A1,8,31)),8,"")&IF(2=WEEKDAY(DATE(A1,9,30)),9,"")&IF(2=WEEKDAY(DATE(A1,10,31)),"A","")&IF(2=WEEKDAY(DATE(A1,11,30)),"B","")&IF(2=WEEKDAY(DATE(A1,12,31)),"C","")

1900 এরও আগের বছরগুলিতে এটি কীভাবে কাজ করে? এই সূত্রটি দিয়ে পরীক্ষার মামলাটি 297 -> Mayফিরে আসে 6। এটা 4 হবে না? কেবল সেপ্টেম্বরের পরিবর্তে 1776দেয় । 7A8
ইঞ্জিনিয়ার টোস্ট

আপনি যদি এটি কাজ করে যান তবে আপনি সম্ভবত এর Date(A1,3,0)পরিবর্তে ব্যবহার করতে পারেনEOMONTH(DATE(A1,2,1),0)
ইঞ্জিনিয়ার টোস্ট

2

বাশ + ক্যাল, 58 বাইট

$ cat t.sh
for A in {1..12};do cal $A $1|grep -qx .....&&echo $A;done
$ bash t.sh 2016
2
10
$

+1 - বিএসডি cal(যেমন ওএসএক্স) এর জন্য কাজ করে তবে জিএনইউতে স্থান ফাঁকা করার জন্য লক্ষ্য রাখে cal
ডিজিটাল ট্রমা

2

পাইথন 2, 94 বাইট

from datetime import*
lambda y:[m for m in range(1,13)if date(y+(m>11),m%12+1,1).weekday()==1]

repl.it

একটি নামহীন ফাংশন, পূর্ণসংখ্যার বছর নেয়, মাসের সংখ্যাগুলির একটি তালিকা আউটপুট করে [1-12]

আমি সাফল্য (110 বাইট) ছাড়াই পাটিগণিতের সাথে বাইট গণনাটিকে পরাজিত করার চেষ্টা করেছি। :

lambda y:map(lambda x,v:(23*((x+2)%13or 1)/9+y-2*(0<x<11)+(x>10)+v/4-v/100+v/400)%7==4,range(12),[y-1]+[y]*11)

একটি নামবিহীন ফাংশন যা বুলিয়ান মানগুলির একটি তালিকা ফেরত দেয় যদি মাসগুলি [জানুয়ারি-ডিসেম্বর] সোমবার শেষ হয়


2

জাভা 7, 200 249 বাইট

import java.util.*;String c(int y){String r="";GregorianCalendar c=new GregorianCalendar();c.setGregorianChange(new Date(1L<<63));c.set(1,y);c.set(2,0);for(int i=0;i++<12;c.add(2,1)){c.set(5,c.getActualMaximum(5));if(c.get(7)==2)r+=i+" ";}return r;}

জাভাতে, GregorianCalendarগ্রেগরিয়ান এবং জুলিয়ান ক্যালেন্ডারের মধ্যে একটি মিশ্রণ। এ কারণে বছরটি 1ভুল ফলাফল দিয়েছে। পরিবর্তন Calendar c=Calendar.getInstance();করার জন্য GregorianCalendar c=new GregorianCalendar();c.setGregorianChange(new Date(1L<<63));শুধুমাত্র গ্রেগরিয়ান ক্যালেন্ডার একটি ব্যবহার জোর করে সংশোধন করা হয়েছে এটা। এটি আমার কাছে ব্যাখ্যা করার জন্য স্ট্যাকওভারফ্লো ডটকমকে @ জনস্কিটকে ধন্যবাদ ।

অবরুদ্ধ এবং পরীক্ষার কোড:

এখানে চেষ্টা করুন।

import java.util.*;
class M{
  static String c(int year){
    String r = "";
    GregorianCalendar calendar = new GregorianCalendar();
    calendar.setGregorianChange(new Date(Long.MIN_VALUE));
    calendar.set(Calendar.YEAR, year);
    calendar.set(Calendar.MONTH, 0);
    for(int i = 0; i++ < 12; calendar.add(Calendar.MONTH, 1)){
      calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
      if(calendar.get(Calendar.DAY_OF_WEEK) == 2){
        r += i+" ";
      }
    }
    return r;
  }

  public static void main(String[] a){
    System.out.println(c(1));
    System.out.println(c(297));
    System.out.println(c(1776));
    System.out.println(c(2000));
    System.out.println(c(2016));
    System.out.println(c(3385));
  }
}

আউটপুট:

4 12
5 
9 
1 7 
2 10 
1 2 10 

2

সি # 6 সি #, 171 167 135 বাইট

using System;
void d(int n){for(int i=0;++i<13;)if((int)new DateTime(n,i,DateTime.DaysInMonth(n,i)).DayOfWeek==1)Console.Write(i+" ");}

-32 বাইট শেবাংকে ধন্যবাদ

সংখ্যা হিসাবে মুদ্রণ মাস; স্থান সীমানা সহ; পিছনে স্থান সহ। এখন এই উত্তরটি সি # এর পূর্ববর্তী সংস্করণগুলির জন্যও কাজ করে।


পুরাতন, 167 বাইট

using System;using System.Linq;
c(int n)=>string.Join(",",Enumerable.Range(1,12).Where(i=>new DateTime(n,i,DateTime.DaysInMonth(n,i)).DayOfWeek==(DayOfWeek)1));

-4 বাইট টিমমিডকে ধন্যবাদ

আউটপুট মাসগুলি হ'ল রিটার্নে নম্বর, কমা সীমানা

Ungolfed

string c(int n)=>
    string.Join(",",                                        // Join them with commas
        Enumerable.Range(1,12)                              // For 1-12 inclusive
        .Where(                                             // Select only
            i=>new DateTime(n,i,DateTime.DaysInMonth(n,i)   // Get last day of that year-month
            ).DayOfWeek                                     // Get its day of week
            ==(DayOfWeek)1                              // Is Monday
        )
    )
;

@ টিমমিড হ্যাঁ তবে সুস্পষ্ট কাস্টের প্রয়োজন। উত্তর আপডেট হয়েছে
লিঙ্ক এনজি

LINQ মজা কিন্তু এই 126 বাইট: void q(int y){for(int m=1;m<13;m++){if((int)new DateTime(y,m,DateTime.DaysInMonth(y,m)).DayOfWeek==1){Console.WriteLine(m);}}};) এছাড়া, এটিও কাস্ট করার জন্য খাটো হবে DayOfWeekথেকে intতুলনায় এটি নিক্ষেপ করতে হবে intকরতেDayOfWeek
Kade

@ শেবাং ধন্যবাদ আমার সত্যিই এক লাইনের লিন্কে গল্ফ করা উচিত নয় --- কেবল জন স্কিইট এটি করতে পারে। আগামীকাল আমার আপডেটের জন্য সময় আছে কিনা তা দেখুন। ক্লান্ত এখন।
লিঙ্ক এনজি

Action<int>কিছু বাইট সংরক্ষণ করার জন্য আপনি এটিকে রূপান্তর করতে পারেন
TheLethalCoder

2

রুবি, 54 + 6 = 60 বাইট

λ cat monday.rb
p (1..12).select{|m|Date.new($*[0].to_i,m,-1).monday?}
λ ruby -rdate monday.rb 2016
[2, 10]

-rdateস্ট্যান্ডার্ড লাইব্রেরি থেকে তারিখের ক্লাসটি পেতে কমান্ড লাইনে 6 বাইটের জন্য ।

ব্যাখ্যা: রুবি স্টাডলিবের দুর্দান্ত Dateক্লাসের জন্য বেশ সোজা ধন্যবাদ । শুধু এটা পছন্দ পদ্ধতি আছে monday?, tuesday?ইত্যাদি কন্সট্রাকটর গত বছর কোনো ক্ষেত্রের জন্য ঋণাত্মক সংখ্যা নিতে মানে 'পূর্ববর্তী ক্ষেত্র দ্বারা প্রতিনিধিত্ব সময়ের শেষে থেকে এই ক্ষেত্র পিছন গণনা' হবে। $*সংক্ষিপ্তকরণের জন্য ARGV, সুতরাং $*[0]প্রথম কমান্ড লাইনের আর্গুমেন্ট পাওয়ার দ্রুত উপায়।


2

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

for($m=1;$m++<14;){if(strftime('%w',strtotime($argv[1]."-$m-1"))==2)echo($m-1)." ";}

আমার প্রথম কোড গল্ফ এই প্রশ্নটিতে এটি এখন পর্যন্ত সংক্ষিপ্ততম পিএইচপি।

সম্পাদনা: 1 বছর ধরে কাজ করবে বলে মনে হচ্ছে না কারণ আমি তা খুঁজে বের করতে হবে তবে এখনই আমাকে যেতে হবে।


1
আমি বলতাম "পিপিসিজিতে আপনাকে স্বাগতম!" তবে আপনি আমার চেয়ে বেশি সময় এখানে নিবন্ধিত হয়েছেন! : ডি নিস প্রথম গল্ফ।
অ্যাডমবর্কবার্ক

আপনার ত্রুটিটি হল আপনি 1 <13 বছরের জন্য 1-13-1 এবং 1-14-1 তৈরি করেছেন যথেষ্ট। আপনি যদি এটি সমাধান করেন তবে আপনি মুহুর্তে অযৌক্তিক বন্ধনীগুলি সরিয়ে ফেলতে পারেন এবং টার্নারি অপারেটরটি ব্যবহার করার বিষয়ে ভাবতে পারেন
Jörg Hülsermann

এটি আপনার সমস্যাগুলির সমাধান করতে হবেfor(;$m++<12;)strftime("%w",strtotime($argv[1]+($m/12^0)."-".($m%12+1)."-1"))!=2?:print"$m ";
Jörg Hmanlsermann

2

আর, 106 99 95 83 78 77 74 বাইট

g=function(x)which(format(seq(as.Date(paste0(x,-2,-1)),,'m',12)-1,"%u")<2)

প্রতি মাসের শেষ দিনগুলির ক্রমটি প্রদান করেছেন seq(as.Date(paste0(x,-2,-1)),,'m',12)-1:

  • paste0coerces -2 এবং -1 টি অক্ষর। xউদাহরণস্বরূপ যদি 2016 ছিল, তখন paste0(x,-2,-1)দেয় "2016-2-1"যা পরে 1 ই ফেব্রুয়ারী 2016 এ রূপান্তরিত হয় as.Date

  • seqPOSIXct এ প্রয়োগ করা হয় বা একটি তারিখ অবজেক্টটি হ'ল seq(from, to , by, length.out): এখানে toদেওয়া হয় না, byদেওয়া হয় 'm'যা 'month'আংশিক মিলের জন্য ধন্যবাদ মিলে যায়, এবং length.outঅবশ্যই 12 হয়।

  • ফলস্বরূপ ক্রমটি প্রশ্নের মধ্যে বছরের ফেব্রুয়ারি থেকে শুরু হওয়া 12 মাসের প্রথম দিন। -1আমাদেরকে বছরের 12 জানুয়ারির শেষ দিনটি নিয়ে প্রশ্নে বছরের জানুয়ারী দিয়ে শুরু করে।

পরীক্ষার কেস:

> g(1)
[1]  4 12
> g(25)
[1] 3 6
> g(297)
[1] 5
> g(2000)
[1] 1 7
> g(2016)
[1]  2 10
> g(3385)
[1]  1  2 10
> g(9999)
[1] 5

পুরানো সংস্করণ 95 বাইটে, কেবলমাত্র তাদের সংখ্যার পরিবর্তে মাসের নামগুলি আউটপুট করে:

g=function(x)format(S<-seq(as.Date(sprintf("%04i-02-01",x)),,'m',12)-1,"%B")[format(S,"%u")==1]

এই উত্তরটি কেবল উজ্জ্বল। আমার কাছে কোন প্রকল্পের seqজন্য Dateকোনও পদ্ধতি ছিল না এবং এটি আমার মোছা উত্তরে as.Dateউপরের বছরগুলি পরিচালনা না করার বিষয়টি সমাধান করে 10000
বিলিউব

@Billywob হ্যাঁ seq.Dateএবং seq.POSIXtবেশ চিত্তাকর্ষক হয়: তারা এমনকি কমান্ড যেমন প্রক্রিয়া করতে পারি seq(time1, time2, by="10 min")বা seq(date1, date2, by="quarter")। সময়-সিরিজের প্লট করার সময় খুব দরকারী।
প্ল্যানাপাস

2

জাপট, 24 বাইট

Do1 £Ov"Ð400+U"+X e ¥2©X

এটি অনলাইন পরীক্ষা! falseকয়েক সোমবারে শেষ না হওয়া মাসের স্থানেসংখ্যার একটি অ্যারের আউটপুট দেয়।

ইন্টারপ্রেটারে একটি বাগ ছিল যা আমাকে Ðফাংশন বডিটিতে ব্যবহার করতে দেয়নি £। বাগ ফিক্স এবং আরও একটি বৈশিষ্ট্য সংযোজনের পরে, এটি বর্তমান প্রতিশ্রুতিতে 18 বাইট:

Do1@Ð400+UX e ¥2©X

1

জাভা, 143 129 বাইট

এটি জাভা 8 এর নতুন সময়ের এপিআই ব্যবহার করে।

y->{String s="";for(int m=0;++m<13;)if(java.time.YearMonth.of(y,m).atEndOfMonth().getDayOfWeek().ordinal()==0)s+=m+" ";return s;}

আউটপুট

নোট করুন যে প্রতিটি লাইনের শেষে অতিরিক্ত স্থান রয়েছে।

4 12 
5 
9 
1 7 
2 10 
1 2 10 

Ungolfed এবং পরীক্ষা

import java.time.*;
import java.util.function.*;

public class Main {
    public static void main (String[] args) {
        IntFunction<String> func = year -> {
          String result = "";
          for (int month=1; month <= 12; month++) {
            if (YearMonth.of(year, month).atEndOfMonth().getDayOfWeek().ordinal() == 0) {
              result += month + " ";
            }
          }
          return result;
        };
        System.out.println(func.apply(1));
        System.out.println(func.apply(297));
        System.out.println(func.apply(1776));
        System.out.println(func.apply(2000));
        System.out.println(func.apply(2016));
        System.out.println(func.apply(3385));
    }
}

shaves

  1. 143 থেকে 129 বাইট: DayOfWeek::ordinalএনাম ধ্রুবকের পরিবর্তে একটি সংখ্যাীয় ধ্রুবকের সাথে তুলনা করতে ব্যবহার করুন।
    নির্ভুল সমাধান না হলে সাধারণ ধারণার জন্য @ টিমমিডকে ধন্যবাদ! ;-)

@ টিমিডি দুঃখের বিষয়, এটি একটি এনাম। এটির একটি getValue()পদ্ধতি রয়েছে তবে এটি কয়েকটি বাইট সংরক্ষণ করতে পারে।
সেলোস

@ সেলোস এটির ordinal()তুলনায় আরও 1 টি বাইট সাশ্রয় করে getValue()যদিও এটি কখনও ব্যবহার না করার পরামর্শ দেওয়া হয়।
অলিভিয়ার গ্রাগোয়ার

হ্যাঁ, ভাল চিন্তাভাবনা আমি আমার মন্তব্যটি প্রথম রিফ্রেশ না করে পোস্ট করেছি, তাই আমি আপনার উত্তর এবং সম্পাদনাটি দেখতে পেলাম না।
সেলোস

1

GNU awk, 80 বাইট tes

{for(;m<13;a=mktime($0" "++m" 1 9 0 0")){if(strftime("%w",a-8e4)~1){print m-1}}}

উদাহরণ

$ gawk '{for(;m<13;a=mktime($0" "++m" 1 9 0 0")){if(strftime("%w",a-8e4)~1){print m-1}}}' <<<2016
2
10
$
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.