महीनों की समरूपता


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)
user202729

2
चुनौतियों को लिखने से बचने के लिए चीजें / अनावश्यक रूप से सामान जोड़ना " किसी सूची में f(x)प्रत्येक के लिए उत्तर की गणना करना" शामिल है x। "एक तारीख के रूप में एक इनपुट लेने" के बारे में क्या?
user202729

6
PPCG में आपका स्वागत है, और अच्छी पहली चुनौती है! यद्यपि यह चुनौती अच्छी है, भविष्य में यदि आप पोस्ट करने से पहले चुनौती पर कुछ प्रतिक्रिया चाहते हैं, तो आप इसे सैंडबॉक्स में पोस्ट कर सकते हैं ।
user202729

2
आउटपुट का कड़ाई से उल्लेख किए गए तार, या किसी भी 3 अलग-अलग मान होना चाहिए?
यूरिल

2
(एक मिनट प्रतीक्षा करें, ग्रेगोरियन कैलेंडर या जूलियन कैलेंडर! मैंने सुझाव दिया [1901-2099] लेकिन आप [1900-2100] का उपयोग करने का निर्णय लेते हैं, इसलिए वे कुछ इनपुट के लिए अलग हैं)
user202729

जवाबों:


20

जावास्क्रिप्ट (ईएस 6), 55 बाइट्स

@ बाइल के लिए 6 बाइट्स को सहेजा गया

करी सिंटैक्स में इनपुट लेता है (year)(month)falseअसममितता के लिए, trueकेंद्रीय रूप से सममित के लिए और 0पूरी तरह से सममित के लिए रिटर्न ।

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

इसे ऑनलाइन आज़माएं!

कैसे?

हम फ़ंक्शन g () को परिभाषित करते हैं जो कि yyyy / mm / 01 के कार्यदिवस को वापस लौटाता है , 0 = सोमवार और 6 = रविवार के बीच पूर्णांक के रूप में ।

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

क्योंकि 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

इसलिए दूसरा परीक्षण: n == 7


कोई अंतर्निहित नहीं, 93 बाइट्स

ज़ेलर की बधाई का उपयोग करता है । अन्य संस्करण के रूप में समान I / O प्रारूप।

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 बाइट्स (सख्त I / O नियम)

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

SQLFiddle 1

T-SQL , 128 बाइट्स (अनुमेय I / O नियम)

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 होगा।

अगर हम इसे BRITISH भाषा के लिए कॉन्फ़िगर किए गए सर्वर (या लॉगिन के साथ) पर चला सकते हैं, तो हम SET DATEFIRST 115 और बाइट्स को हटा सकते हैं ।

SQLFiddle 2


1
अच्छा काम। सुनिश्चित नहीं है कि यह सभी संस्करणों में काम करेगा, लेकिन SQL 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 लौटाता है


@TuukkaX भ्रम के लिए क्षमा करें - यह मेरी पहली चुनौती है, मैंने नियमों को बदल दिया है ताकि वे भी अनुमति आउटपुट स्वरूप की अनुमति दें ताकि यह कोड-गोल्फ की "आत्मा में" अधिक हो सके।
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(), तो यह पूरी तरह से ठीक होगा।
१45:४५ पर केर्ड कॉइनरहाइडिंग

1
@cairdcoinheringaahing स्वागत के लिए धन्यवाद! फिक्स्ड यूजर इनपुट :)
सभी हुकुमों का जैक

स्वागत हे! यहाँ -9 बाइट्स के लिए ट्विक्स - सभी आयात, अनपैक इनपुट, _[0]+_[-1]->sum(..)
डेड पोसूम

1
कुछ चाल इसे नीचे लाने के लिए 13 बाइट्स यहाँ
जोनाथन एलन

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।


IIRC आप को बदल कर जीसीसी पर यूबी दुरुपयोग कर सकते हैं 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 बाइट्स की आवश्यकता होती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.