이 장식용 달력의 상단에는 무엇이 있습니까?


14

누군가 내 아내에게 네 개의 큐브로 구성된 장식용 달력을주었습니다. 여기에 오늘 날짜가 표시됩니다 (이 도전을 게시 한 현재).

여기에 이미지 설명을 입력하십시오

처음 보았을 때 잘못된 각도에서 (위에서 직접) 보았는데 왜이 정보를 제공했는지 알 수 없었습니다.

[["February", "January"], [3], [7], ["Monday", "Tuesday"]]

당신의 임무는 2019의 모든 날짜에 대한 내 오류를 복제하는 것입니다.

도전

2019 년부터 날짜를 가진 프로그램이나 함수를 작성하고 해당 날짜가 달력 앞쪽을 향하여 표시 될 때 모든 큐브 의 맨 위에 나타나는 내용을 출력 합니다.

다음은 모든 큐브의 6면입니다. 를 표시하려면 거꾸로 6뒤집으 9십시오. 이 0때문에, 수직으로 대칭 0거꾸로가 아직 0. 일부 날짜에 대해 둘 이상의 정답이있을 수 있습니다 (예 : 매월 11 일에 큐브를 사용하는 방법 및 0사물이 둘 이상임)하여 정답을 출력 할 수 있습니다.

여기에 이미지 설명을 입력하십시오

규칙

  1. 표준 허점은 금지되어 있습니다.
  2. 입 / 출력 형식은 유연합니다.
  3. 출력은 큐브별로 순서가 맞아야하지만 큐브 내에는 없어야합니다. 순서는 먼저 월 큐브, 두 개의 큐브, 그 다음 주일 큐브 여야합니다. 그러나 큐브에 두 개의 요소가있는 경우 두 요소는 순서에 관계없이있을 수 있습니다.
  4. 당신은 대체 할 수 있습니다 JanuaryDecember당신이 좋아하는 경우에 0-11 또는 1-12.
  5. 원하는 경우 요일을 0-6 또는 1-7로 바꿀 수 있으며 Sunday또는 주 중 하나를 Monday시작할 수 있습니다. 그러나 다른 요일에는 주를 시작할 수 없습니다. PPGC입니다. 미친 마을.)
  6. 이것은 입니다. 각 언어에 대한 가장 적은 바이트가 이깁니다.
  7. 격려했다.

테스트 사례

(Tue) 2019-01-29   [[ "July", "August" ], [3], [7], [ "Thursday", "Wednesday" ]]
                   [[ "August", "July" ], [3], [7], [ "Wednesday", "Thursday" ]]

                   etc. since the order within each cube doesn't matter.


(Thu) 2019-07-11   [[ "May", "June" ], [3], [8], [ "Saturday", "Friday" ]]
                   [[ "May", "June" ], [8], [3], [ "Saturday", "Friday" ]]

                   since the two 1 cubes could be either way.

(Sun) 2019-10-27   [[ "January", "February" ], [3], [6], [ "Friday", "Saturday" ]]

(Wed) 2019-05-01   [[ "March", "April" ], [8], [3], [ "Monday", "Tuesday" ]]
                   [[ "March", "April" ], [6], [3], [ "Monday", "Tuesday" ]]
                   [[ "March", "April" ], [9], [3], [ "Monday", "Tuesday" ]]

                   since the 0 cube could have either the 8 side or the 6 side facing up, and the 6 could also be considered a 9.


(Sat) 2019-08-24   [[ "February", "January" ], [8], [5], [ "Sunday" ]]

그래서 ... 궁금합니다.이 장식물이 어떻게 모든 날짜를 보여줄 수 있습니까?
Outgolfer Erik

@ErikTheOutgolfer 어느 날짜가 빠졌습니까?
ngm

도전과 관련이 없지만 채팅을 통해 핑을 할 수 없으므로 두 개의 중간 큐브를 어떻게 사용합니까? 내 말은, 10 자리 숫자를 모두 표현할 수 있어야한다는 뜻입니다.
Outgolfer Erik

1
큐브는 어느 순서로나 사용할 수 있습니다. 그래픽에서와 같이 두 개의 숫자 큐브를 오른쪽 위와 왼쪽 아래라고합니다. 18을 얻으려면 오른쪽 상단에서 1을 사용하고 왼쪽 하단에서 8을 사용하십시오. 13을 얻으려면 왼쪽 하단에서 1을 사용하고 오른쪽 상단에서 3을 사용하십시오. 등등. 0 1과 2는 두 큐브 모두에 ​​있어야합니다. 6과 9가 같은 큐브면을 공유한다는 사실은 01에서 31까지 모든 것을 제공합니다.
ngm

1
사진에 따르면, 272019-10-27에 가야 36하지,32 합니다.
japh

답변:


5

C (glibc에) , 327 (319) 286 바이트

#define C strftime(s
#define U(B,E)S[6]=E-1,C+B,99,"%A"+2*!E,S)
S[9],s[99];f(M,D){S[4]=112233107696>>3*M&7;C,9,"%B",S);S[4]^=1;
C+3,9,"%B",S);M=161102>>(D+M*23/9-1-2*(M>2))%7*3&7;U(6,M);U(9,(M^1));
printf("%s/%s %d%d %s/%s\n",
s,s+3,D>29?4:D%10<6?8:3,D>29?8:1070160091>>D%10*3&7,s+6,s+9);}

(명확성을 위해 일부 줄 바꿈이 추가됨)

f한 달 (1-12)과 하루 (1-31)가 걸립니다. stdout으로 인쇄합니다. 온라인으로 사용해보십시오!

테스트 사례 :

2019-01-29: July/August 37 Thursday/Wednesday
2019-07-11: May/June 83 Saturday/Friday
2019-10-27: January/February 36 Friday/Saturday
2019-05-01: March/April 83 Monday/Tuesday
2019-08-24: February/January 85 /Sunday

언 골프

#include <stdio.h>
#include <time.h>
void f(int M, int D) {
    int month_cube[] = {6,3,0,5,2,7,4,1,4,0,5,1};
    int day_cube[] = {3,3,3,4,5,2,2,6,7,7};
    int week_cube[] = {6,1,5,2,7,4,0}; /* 1=Sun, 7=Sat, 0=none */
    int D1 = D/10, D2 = D%10;
    char s[4][99] = {{0}};
    struct tm t;

    t.tm_mon = month_cube[M-1];
    strftime(s[0], 99, "%B", &t);
    t.tm_mon = month_cube[M-1]^1;
    strftime(s[1], 99, "%B", &t);

    if (D1 >= 3) { /* D = 30, 31 */
        D1 = 4, D2 = 8;
    } else {
        if (D2 <= 5) {
            D1 = 8; /* 012[69]78: 012 -> 8 */
        } else {
            D1 = 3; /* 012345: 012 -> 3 */
        }
        D2 = day_cube[D2];
    }

    int W = (D + M*23/9 - 1 - 2*(M>2)) % 7; /* day of week */
    if (week_cube[W]) {
        t.tm_wday = week_cube[W] - 1;
        strftime(s[2], 99, "%A", &t);
    }
    if (week_cube[W]^1) {
        t.tm_wday = (week_cube[W]^1) - 1;
        strftime(s[3], 99, "%A", &t);
    }

    printf("%s/%s %d%d %s/%s\n", s[0], s[1], D1, D2, s[2], s[3]);
}

숫자 큐브

다음과 같은 가능성이 있습니다.

Cube 1:
0 1 2 3 4 5
3 3 3 4 5 2
5

Cube 2:
0 1 2        6 7 8 9
8 8 8        2 6 7 7
6                2
9

다음 매핑은 골프를위한 최선의 선택 인 것 같습니다.

   01 02 03 04 05 06 07 08 09
   83 83 84 85 82 32 36 37 37

10 11 12 13 14 15 16 17 18 19
83 83 83 84 85 82 32 36 37 37

20 21 22 23 24 25 26 27 28 29
83 83 83 84 85 82 32 36 37 37

30 31
48 48

요령

strftimestruct tm입력 으로 호출되어야합니다 . 대신, 선언 int S[9]및 사용 S[4]tm_monS[6]같이tm_wday 합니다. C 라이브러리가 ISO 표준과 동일한 구조체 멤버 목록을 사용하는 경우 작동합니다.

s[99]에서 다양한 문자열을 저장하는 데 사용 strftime되지만 int배열을 만들면 색인 작성에 몇 바이트가 절약됩니다.


3

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

(year, month, day0, day1)미디엄영형h와이0와이1

(month0, month1, day0, day1, weekDay0, weekDay1)01

(y,m,t,u)=>[M=-~((s='45226276204264')[m--+6]||4*m%2),M+1,t<3?u<6?8:3:s[t-3],u<3?3:s[u-3],D=s[(new Date(y,m,t*10+u).getDay()+6)%7+7],-~D%7||-1]

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

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