개월의 대칭


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

규칙

  • 이것은 코드 골프이므로 가장 적은 바이트 수가 이깁니다.
  • 표준 허점은 분명히 허용되지 않습니다.
  • 주가 월요일로 시작한다고 가정합니다 ( AngsArnauld 에게 제안 해 주셔서 감사합니다 ).
  • 1900에서 2100 사이의 연도 만 고려하십시오 ( 포함 ).
  • 입력 및 출력 형식 규칙은 허용됩니다 . 즉, 선택한 언어의 고유 형식을 사용할 수 있습니다.
  • 솔루션을 그레고리력 기반으로합니다 .

7
날짜가 이상 하다고 생각 하면 정확하게 규칙을 지정하거나 가능한 입력을 작은 범위로 제한 할 수 있습니다 (예 : 1901-2099)
user202729

2
과제를 쓸 때 / 불필요하게 물건을 추가 할 때 피해야 할 것은 " 목록에있는 f(x)모든 것에 대해 답변을 계산하는 것"을 포함 x합니다. "날짜 형식으로 입력"은 어떻습니까?
user202729

6
PPCG에 오신 것을 환영합니다. 이 챌린지는 훌륭하지만 나중에 게시하기 전에 챌린지에 대한 피드백을 원하는 경우 샌드 박스에 게시 할 수 있습니다 .
user202729

2
출력이 언급 된 문자열 또는 3 개의 고유 값이어야합니까?
Uriel

2
(분, 잠깐만 요, 그레고리력 또는 줄리안 달력? [1901-2099]를 제안했지만 [1900-2100]을 사용하기로 결정했습니다 (일부 입력에 따라 다름))
user202729

답변:


20

자바 스크립트 (ES6), 55 바이트

@Neil 덕분에 6 바이트 절약

카레 구문으로 입력을 (year)(month)받습니다. false비대칭, true중앙 대칭 및 0완전 대칭 을 반환 합니다 .

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

온라인으로 사용해보십시오!

방법?

평일 yyyy / mm / 01 을 반환 하는 함수 g ()0 = 월요일과 6 = 일요일 사이의 정수로 정의합니다 .

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

getDay ()는 기본적으로 0 = 일요일에서 6 = 토요일 을 반환 하기 때문에 대신 7 일을 쿼리하여 결과를 예상 범위로 이동합니다.

그런 다음 다음을 정의합니다.

n = g() + g()

Date 의 생성자는 0 인덱싱 된 월을 기대하고 g ()는 mDate에 전달한 m 감소 시키기 때문에 실제로 다음 달 첫 날의 요일을 계산 한 다음 현재 달 의 요일 을 추가합니다.

완전 대칭 개월

완전히 대칭적인 달은 월요일로 시작하고 그 다음 달은 월요일로 시작합니다. 이것은 윤년이 아닌 2 월에만 가능합니다.

- 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 바이트를 저장합니다.
Neil

7

T-SQL , 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')

언 골프 드 :

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입니다.

영국 언어로 구성된 서버에서 (또는 로그인으로) 실행할 수 있으면 SET DATEFIRST 115 바이트를 더 절약 할 수 있습니다 .

SQLFiddle 2


1
잘 하셨어요. 모든 버전에서 작동하는지 확실하지 않지만 SQL 2012에서는 CONVERT(DATETIME,s+'.01')대신을 사용하여 15 바이트를 절약 할 수있었습니다 REPLACE. 당신은 또한 공간을 드롭 할 수 있습니다FROM (SELECT
BradC

1
작동하지만 DATEFORMAT설정에 따라 다릅니다 . 예를 들어, 우리가 사용하는 경우 SET LANGUAGE BRITISH, 다음 CONVERT(DATETIME,'2018.02.01')대신 월 1월 1일 2 일이 될 것입니다.
Razvan Socol

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 바이트

개선을위한 Jonathan Allan과 Dead Possum에게 감사합니다!

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

파이썬 3, 122105 바이트

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

입력

  • 두 번째는 달입니다


산출

  • 0 = 대칭 없음
  • 1 = 중심 대칭
  • 2 = 완전한 대칭

3
사이트에 오신 것을 환영합니다! 입력이 변수 (예 : Y또는 M)에 저장되어 있다고 가정 할 수 없으므로 현재 스 니펫이며 유효하지 않습니다. input()그러나 호출 변수를 변경하면 완벽하게 작동합니다.
caird coinheringaahing

1
@cairdcoinheringaahing 감사합니다! 고정 사용자 입력 :)
모든 스페이드의 잭

환영! 여기 에서 -9 바이트로 조정 -모든 가져 오기, 언 패킹 된 입력, _[0]+_[-1]->sum(..)
Dead Possum


1
... 그리고 죽은 좀도둑의 합 트릭을 사용하여 다른 바이트 - 여기
조나단 앨런

4

빨강 , 199, 168161 바이트

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

Mathematica, 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

배쉬 + GNU 유틸리티, 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

C, 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 당신은 대체하여 GCC에 UB를 남용 할 수 returny=(첫 번째 매개 변수)과 함수의 떨어지는.
Quentin

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

패턴이 대칭 인 경우 .day-of-week가 1 씩 증가함에 따라 .date-in-month는 여전히 일치하기 위해 2만큼 이동해야합니다 (월은 하루 후에 시작하지만 하루는 더 일찍 끝나야 함) )의 2 * .day-of-week + .days-in-month차이를 측정합니다. 모듈로 7은 대칭을 얻기 위해 1이되어야하지만, 모듈로 이전의 총계를 확인하여 비 도약 2 월을 먼저 저렴하게 확인할 수 있습니다 (월요일과 월 28 일은 가능한 최소 조합 임).

나는 이것이 너무 많은 바이트를 요구한다는 것에 놀랐지 만, 날짜를 만들고 그 달의 요일과 일을 얻는 데 완전히 36 바이트가 필요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.