মাসের প্রতিসাম্য


32

ভূমিকা

কিছু মাস বাকী আছে সম্পূর্ণরূপে প্রতিসম , যার অর্থ তারা আছে কেন্দ্রীয় প্রতিসাম্য সেইসাথে প্রতিফলন প্রতিসাম্য , মত February of 2010:

     February 2010
┌──┬──┬──┬──┬──┬──┬──┐ 
│  │  │  │  │  │  │  │ 
├──┼──┼──┼──┼──┼──┼──┤ 
│  │  │  │  │  │  │  │ 
├──┼──┼──┼──┼──┼──┼──┤ 
│  │  │  │  │  │  │  │ 
├──┼──┼──┼──┼──┼──┼──┤ 
│  │  │  │  │  │  │  │ 
└──┴──┴──┴──┴──┴──┴──┘ 

কিছু মাসের মধ্যে কেবলমাত্র কেন্দ্রীয় প্রতিসাম্য থাকে, যেমন February of 1996বা বর্তমান মাসের April of 2018:

      February 1996
          ┌──┬──┬──┬──┐
          │  │  │  │  │
 ┌──┬──┬──┼──┼──┼──┼──┤
 │  │  │  │  │  │  │  │
 ├──┼──┼──┼──┼──┼──┼──┤
 │  │  │  │  │  │  │  │
 ├──┼──┼──┼──┼──┼──┼──┤
 │  │  │  │  │  │  │  │
 ├──┼──┼──┼──┼──┴──┴──┘
 │  │  │  │  │
 └──┴──┴──┴──┘

       April 2018  ┌──┐
                   │  │
 ┌──┬──┬──┬──┬──┬──┼──┤
 │  │  │  │  │  │  │  │
 ├──┼──┼──┼──┼──┼──┼──┤
 │  │  │  │  │  │  │  │
 ├──┼──┼──┼──┼──┼──┼──┤
 │  │  │  │  │  │  │  │
 ├──┼──┼──┼──┼──┼──┼──┤
 │  │  │  │  │  │  │  │
 ├──┼──┴──┴──┴──┴──┴──┘
 │  │
 └──┘

আর কিছু সামঁজস্যহীন , আগের মাসে মতো March of 2018:

      March 2018
         ┌──┬──┬──┬──┐
         │  │  │  │  │
┌──┬──┬──┼──┼──┼──┼──┤
│  │  │  │  │  │  │  │
├──┼──┼──┼──┼──┼──┼──┤
│  │  │  │  │  │  │  │
├──┼──┼──┼──┼──┼──┼──┤
│  │  │  │  │  │  │  │
├──┼──┼──┼──┼──┼──┼──┘
│  │  │  │  │  │  │
└──┴──┴──┴──┴──┴──┘

কার্য

একটি তারিখ আকারে একটি ইনপুট নিন , যেমন:

  • 2018.04
  • 2018.03
  • 2010.02
  • 1996.02

সম্পর্কিত প্রতিসাম্য আউটপুট , যেমন

  • 2018.04 -> centrally symmetric
  • 2018.03 -> asymmetric
  • 2010.02 -> symmetric
  • 1996.02 -> centrally symmetric

বিধি

  • এটি কোড গল্ফ, তাই বাইটের মধ্যে ক্ষুদ্রতম সংখ্যা।
  • স্ট্যান্ডার্ড লুফোলগুলি স্পষ্টতই অনুমোদিত নয়।
  • অনুমান সপ্তাহে দিয়ে শুরু হয় সোমবার (ধন্যবাদ Angs এবং Arnauld পরামর্শের জন্য)।
  • 1900 এবং 2100 ( সমেত ) মধ্যে কেবল বছর বিবেচনা করুন ।
  • ইনপুট এবং আউটপুট বিন্যাসের নিয়মগুলি অনুমোদিত , যার অর্থ আপনি আপনার পছন্দের ভাষার স্থানীয় যে কোনও সমতুল্য বিন্যাসটি ব্যবহার করতে পারেন।
  • গ্রেগরিয়ান ক্যালেন্ডারে আপনার সমাধানটি বেস করুন ।

7
তারিখগুলি অদ্ভুত বলে বিবেচনা করুন , আপনি ঠিক নিয়মগুলি নির্দিষ্ট করতে চাইতে পারেন বা সম্ভাব্য ইনপুটটিকে একটি ছোট পরিসরে সীমাবদ্ধ করতে পারেন (বলুন, 1901-2099)
ব্যবহারকারী 202729

2
চ্যালেঞ্জগুলি লেখার সময় / অযথা স্টাফ যুক্ত করার সময় যে বিষয়গুলি এড়াতে হবে সেগুলির মধ্যে রয়েছে " তালিকার f(x)প্রত্যেকটির জন্য উত্তর গণনা করা" includes x"একটি তারিখ আকারে একটি ইনপুট নিন" সম্পর্কে কী?
ব্যবহারকারী 202729

6
পিপিসিজিতে আপনাকে স্বাগতম, এবং প্রথম প্রথম চ্যালেঞ্জ! যদিও এই চ্যালেঞ্জটি ভাল, ভবিষ্যতে পোস্ট দেওয়ার আগে আপনি যদি চ্যালেঞ্জ সম্পর্কে কিছু প্রতিক্রিয়া চান তবে আপনি এটি স্যান্ডবক্সে পোস্ট করতে পারেন ।
ব্যবহারকারী 202729

2
আউটপুটটি কঠোরভাবে উল্লিখিত স্ট্রিংগুলি বা কোনও 3 স্বতন্ত্র মান হওয়া উচিত?
উরিল

2
(এক মিনিট অপেক্ষা করুন, গ্রেগরিয়ান ক্যালেন্ডার বা জুলিয়ান ক্যালেন্ডার? আমি প্রস্তাব দিয়েছি [1901-2099] তবে আপনি [1900-2100] ব্যবহার করার সিদ্ধান্ত নেন যাতে তারা কিছু ইনপুটগুলির জন্য আলাদা হয়)
ব্যবহারকারী 202729

উত্তর:


20

জাভাস্ক্রিপ্ট (ES6), 55 বাইট

@ নীলকে ধন্যবাদ 6 বাইট সংরক্ষণ করা হয়েছে

বাক্য গঠন সিনট্যাক্সে ইনপুট নেয় (year)(month)। রিটার্নস falseসামঁজস্যহীন জন্য, trueকেন্দ্রীয়ভাবে প্রতিসম এবং 0সম্পূর্ণরূপে প্রতিসম জন্য।

y=>m=>(n=(g=_=>new Date(y,m--,7).getDay())()+g())&&n==7

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

কিভাবে?

আমরা g () ফাংশনটি সংজ্ঞায়িত করি যা 0 / সোমবার এবং 6 = রবিবারের মধ্যে পূর্ণসংখ্যার হিসাবে yyyy / মিমি / 01 এর সপ্তাহের দিনটি প্রদান করে ।

g = _ => new Date(y, m--, 7).getDay()

কারণ গেটডে () নেটিভালি 0 = রবিবার থেকে 6 = শনিবারে প্রত্যাবর্তন করে , আমরা পরিবর্তে 7 তম দিনের জন্য জিজ্ঞাসা করে ফলাফলটি প্রত্যাশিত পরিসরে স্থানান্তরিত করি।

তারপরে আমরা সংজ্ঞা দিই:

n = g() + g()

প্রস্ততকর্তার কারণ তারিখ 0-সূচীবদ্ধ মাস আশা এবং কারণ গ্রাম () decrements মি পর এটি ক্ষণস্থায়ী তারিখ , আমরা আসলে প্রথম প্রথম দিনের কাজের দিন গনা পরবর্তী মাস এবং তারপর বর্তমান এক যোগ পারে।

সম্পূর্ণরূপে প্রতিসম মাস

সম্পূর্ণরূপে প্রতিসম মাসগুলি সোমবারের সাথে শুরু হয় এবং এর পরে একটি মাস হয় যা সোমবারের সাথে শুরু হয়। এটি কেবলমাত্র অ-লিপ বছরের ফেব্রুয়ারির জন্য সম্ভব।

- Feb --------------    - Mar --------------
Mo Tu We Th Fr Sa Su    Mo Tu We Th Fr Sa Su
--------------------    --------------------
01 02 03 04 05 06 07    01 02 03 04 05 06 07
08 09 10 11 12 13 14    08 09 10 11 12 13 14
15 16 17 18 19 20 21    15 16 17 18 19 20 21
22 23 24 25 26 27 28    22 23 24 25 26 27 28
                        29 30 31

এটি n = 0 বাড়ে ।

কেন্দ্রীয়ভাবে প্রতিসম মাস

কেন্দ্রীয়ভাবে প্রতিসম মাসগুলি এমন মাস হয় যার জন্য তাদের প্রথম দিনের সপ্তাহের দিন এবং পরের মাসের যোগফল 7 হয়

- M ----------------    - M+1 --------------
Mo Tu We Th Fr Sa Su    Mo Tu We Th Fr Sa Su
--------------------    --------------------
 0  1 [2] 3  4  5  6     0  1  2  3  4 [5] 6
--------------------    --------------------
      01 02 03 04 05                   01 02
06 07 08 09 10 11 12    03 04 05 06 07 07 09
13 14 15 16 17 18 19    ...
20 21 22 23 24 25 26
27 28 29 30 31

সুতরাং দ্বিতীয় পরীক্ষা: এন == 7


বিল্ট ইন নেই, 93 বাইট

জেলারের সম্মিলন ব্যবহার করে । অন্যান্য সংস্করণ হিসাবে একই আই / ও ফর্ম্যাট।

y=>m=>(n=(g=_=>(Y=y,((m+(m++>2||Y--&&13))*2.6|0)+Y+(Y>>2)-6*~(Y/=100)+(Y>>2))%7)()+g())&&n==7

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


আমি ভেবেছিলাম এটা ছিল true, falseএবং filenotfoundপরিবর্তে 0...
Angs

g=m=>new Date(y,m,7).getDay()6 বাইট সঞ্চয়
নীল

7

টি-এসকিউএল , 213 বাইট (কঠোর আই / ও বিধি)

SET DATEFIRST 1SELECT CASE WHEN a+b<>8THEN'a'WHEN a=1THEN''ELSE'centrally 'END+'symetric'FROM(SELECT DATEPART(DW,f)a,DATEPART(DW,DATEADD(M,1,f)-1)b FROM (SELECT CONVERT(DATETIME,REPLACE(s,'.','')+'01')f FROM t)y)x

উপরের ক্যোয়ারী কঠোর ইনপুট / আউটপুট বিন্যাসের নিয়ম বিবেচনা করে।

ইনপুটটি sনামযুক্ত টেবিলের কলাম থেকে নেওয়া হয়েছে t:

CREATE TABLE t (s CHAR(7))
INSERT INTO t VALUES ('2018.04'),('2018.03'),('2010.02'),('1996.02')

Ungolfed:

SET DATEFIRST 1
SELECT *, CASE WHEN a+b<>8 THEN 'a' WHEN a=1 AND b=7 THEN '' ELSE 'centrally ' END+'symetric'
FROM (
    SELECT *,DATEPART(WEEKDAY,f) a, 
        DATEPART(WEEKDAY,DATEADD(MONTH,1,f)-1) b 
    FROM (SELECT *,CONVERT(DATETIME,REPLACE(s,'.','')+'01')f FROM t)y
) x

এসকিউএলফিডল ঘ

টি-এসকিউএল , 128 বাইট (অনুমতিপ্রাপ্ত আই / ও বিধি)

SET DATEFIRST 1SELECT CASE WHEN a+b<>8THEN 1WHEN a=1THEN\END FROM(SELECT DATEPART(DW,d)a,DATEPART(DW,DATEADD(M,1,d)-1)b FROM t)x

যদি ইনপুট এবং আউটপুটটির ফর্ম্যাট পরিবর্তন করা যায় তবে আমি নামের প্রথম datetimeকলামে মাসের প্রথম দিনটি ইনপুট বেছে নিতে পারি d:

CREATE TABLE t (d DATETIME)
INSERT INTO t VALUES ('20180401'),('20180301'),('20100201'),('19960201')

আউটপুটটি অ্যাসিমেট্রিকের জন্য 1, সিমেট্রিকের জন্য 0, কেন্দ্রীয় সিমেট্রিকের জন্য NULL হবে।

যদি আমরা এটি ব্রিটিশ ভাষার জন্য কনফিগার করা কোনও সার্ভারে (বা লগইন সহ) চালাতে পারি তবে আমরা SET DATEFIRST 1আরও 15 টি বাইট সংরক্ষণ করতে পারি ।

এসকিউএলফিডল 2


1
চমৎকার কাজ. এটি সমস্ত সংস্করণে কাজ করবে কিনা তা নিশ্চিত নয়, তবে এসকিউএল 2012 এ আমি CONVERT(DATETIME,s+'.01')পরিবর্তে 15 টি বাইট ব্যবহার করে সঞ্চয় করতে সক্ষম হয়েছি REPLACE। আপনি স্থানটি ড্রপ করতে পারেনFROM (SELECT
ব্র্যাডিসি

1
এটি কাজ করে তবে এটি DATEFORMATসেটিংসের উপর নির্ভর করে । উদাহরণস্বরূপ, আমরা যদি ব্যবহার করি SET LANGUAGE BRITISHতবে CONVERT(DATETIME,'2018.02.01')1 শে ফেব্রুয়ারির পরিবর্তে 2 শে জানুয়ারী হবে।
রাজ্জান সোসোল

5

হাস্কেল, 170 বাইট

import Data.Time.Calendar
import Data.Time.Calendar.WeekDate
a%b=((\(_,_,a)->a).toWeekDate.fromGregorian a b$1)!gregorianMonthLength a b
1!28=2
4!29=1
7!30=1
3!31=1
_!_=0

কেন্দ্রীয়ভাবে প্রতিসমের জন্য 2, প্রতিসমের জন্য 1 এবং অসমমিতের জন্য 0 প্রদান করে


@ টুকুএক্সএক্স বিভ্রান্তির জন্য দুঃখিত - এটি আমার প্রথম চ্যালেঞ্জ, আমি নিয়মগুলি পরিবর্তন করেছি যাতে তারা অনুমতিপ্রাপ্ত আউটপুট ফর্ম্যাটগুলিকেও অনুমতি দেয় যাতে কোড-গল্ফের আরও "স্পিরিটে" থাকতে পারে।
mkierc

5

পাইথন 2, 118 104 বাইট

উন্নতির জন্য জোনাথন অ্যালান এবং ডেড পসুমকে ধন্যবাদ!

from calendar import*
def f(*d):_=monthcalendar(*d);print all(sum(_,[]))+(_[0].count(0)==_[-1].count(0))

পাইথন 3, 122 105 বাইট

from calendar import*
def f(*d):_=monthcalendar(*d);print(all(sum(_,[]))+(_[0].count(0)==_[-1].count(0)))

ইনপুট

  • প্রথম বছর হয়
  • দ্বিতীয়টি হচ্ছে মাস


আউটপুট

  • 0 = কোনও প্রতিসাম্য নেই
  • 1 = কেন্দ্রীয় প্রতিসাম্য
  • 2 = সম্পূর্ণ প্রতিসাম্য

3
সাইটে স্বাগতম! আপনি ধরে নিতে পারেন না যে ইনপুটটি একটি চলক (যেমন Yবা M) তে সঞ্চিত আছে , সুতরাং এটি বর্তমানে একটি স্নিপেট এবং অবৈধ। আপনি যদি ভেরিয়েবলগুলিকে কলগুলিতে পরিবর্তন করেন input()তবে এটি পুরোপুরি ঠিক আছে।
কেয়ার্ড কোইনরিঙ্গিংহিং

1
স্বাগত জানার জন্য ধন্যবাদ! ফিক্সড ইউজার ইনপুট :)
জ্যাক অফ স্পেডস

স্বাগত! এখানে -9 বাইটের জন্য টুইটগুলি - সমস্ত আমদানি, আনপ্যাকড ইনপুট, _[0]+_[-1]->sum(..)
ডেড পসসাম


1
... এবং ডেড পসুমের যোগফল ব্যবহার করে অন্য একটি বাইট - এখানে
জোনাথন অ্যালান

4

লাল , 199, 168 161 বাইট

func[d][t: split d"."y: do t/1 m: do t/2 a: to-date[1 m y]b: a + 31
b/day: 1 b: b - 1 if(1 = s: a/weekday)and(7 = e: b/weekday)[return 1]if 8 - e = s[return 2]0]

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

0 - অসমমিত

1 - প্রতিসম

2 - কেন্দ্রীয়ভাবে প্রতিসম

আরও পঠনযোগ্য:

f: func[d][                  ; Takes the input as a string
    t: split d "."           ; splits the string at '.'
    y: do t/1                ; stores the year in y 
    m: do t/2                ; stores the month in m
    a: to-date[1 m y]        ; set date a to the first day of the month
    b: a + 31                ; set date b in the next month  
    b/day: 1                 ; and set the day to 1st
    b: b - 1                 ; find the end day of the month starting on a
    s: a/weekday             ; find the day of the week of a 
    e: b/weekday             ; find the day of the week of b
    if(s = 1) and (e = 7)    ; if the month starts at Monday and ends on Sunday
        [return 1]           ; return 1 fo symmetric
    if 8 - e = s             ; if the month starts and ends on the same day of the week
        [return 2]           ; return 2 for centrally symmetric  
    0                        ; else return 0 for assymetric
]

2

গণিত, 137 বাইট

a=#~DateValue~"DayName"&;b=a/@{2}~DateRange~{3};Which[{##}=={0,6},1,+##>5,0,1>0,-1]&@@(Position[b,a@#][[1,1]]~Mod~7&)/@{{##},{#,#2+1,0}}&

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


2

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

date -f- +%u<<<"$1/1+1month-1day
$1/1"|dc -e??sad8*la-55-rla+8-d*64*+p

ইনপুট হিসাবে ফর্ম্যাট করা হয় YYYY/MM

আউটপুটটি সংখ্যাসূচক, নিম্নরূপ:

  • 0 এর চেয়ে কম: কেন্দ্রীয়ভাবে প্রতিসম
  • ঠিক 0: প্রতিসম
  • 0 এর চেয়ে বড়: অসম্পূর্ণ

আমি ধরে নিই যে এই আউটপুট ফর্ম্যাটটি এই প্রশ্নের জন্য গ্রহণযোগ্য।

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


1

সি, 111 বাইট

a;g(y,m){y-=a=m<3;return(y/100*21/4+y%100*5/4+(13*m+16*a+8)/5)%7;}f(y,m){a=g(y,m)+g(y,m+1);return(a>0)+(a==7);}

দাওয়াত করুন f(year, month), সম্পূর্ণ প্রতিসাম্যের জন্য 0, অসমমিতের জন্য 1, কেন্দ্রীয় প্রতিসমের জন্য 2।


আইআইআরসি আপনি (প্রথম প্যারামিটার) প্রতিস্থাপন returnকরে y=এবং ফাংশন থেকে বেরিয়ে জিসিসিতে ইউবির আপত্তিজনক ব্যবহার করতে পারেন ।
কোয়ান্টিন

1

পার্ল 6 , 74 বাইট

{{{$_==30??2!!$_%7==2}(2*.day-of-week+.days-in-month)}(Date.new("$_-01"))}

বেয়ার ব্লক, স্পষ্টভাবে 1 টি আর্গুমেন্টের একটি ফাংশন, এর মতো স্ট্রিং "2012-02"। রিটার্নস:

2     # Fully symmetric
True  # Centrally symmetric
False # Asymmetric

যখন প্যাটার্নটি প্রতিসাম্যহীন হয়, সপ্তাহের শেষ দিনটি 1 দ্বারা বৃদ্ধি পায়, তখনও ম্যাচ করার জন্য ডেস-ইন-মাসে 2 দ্বারা সরানো প্রয়োজন (মাসটি একদিন পরে শুরু হবে তবে একদিন আগে শেষ হওয়া দরকার) ), তাই 2 * .day-of-week + .days-in-month আমাদের সেই ফাঁকের একটি পরিমাপ দেয়। মডুলো 7 এটি প্রতিসাম্য পেতে 1 হওয়া উচিত, তবে আমরা প্রথমে মডিউলোর আগে সর্বমোট (সোমবার এবং 28 দিনের ন্যূনতম সম্ভাব্য সংমিশ্রণটি) পরীক্ষা করে নন-লিপ ফেব্রুয়ারিতে সস্তায় পরীক্ষা করতে পারি।

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

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