这个装饰性日历的顶部将是什么?


14

有人给了我妻子一个由四个立方体组成的装饰日历。这是在前面显示今天的日期(截至发布此挑战时):

在此处输入图片说明

当我第一次看到它时,我从错误的角度(从正上方)看了它,却不知道为什么它提供了以下信息:

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

您的工作是在2019年的任何日期复制我的错误。

挑战

编写一个程序或函数,该程序或函数的日期为2019年的任意日期,并输出从日历的正面朝外显示该日期时所有多维数据集顶部显示的内容。

这是所有立方体的所有六个面。要显示a,6您只需将9颠倒过来。该0是上下对称的,所以0倒挂仍然0。某些日期可能有多个正确答案(例如,每个月的11号将有多种使用多维数据集和0事物的方式),因此您可以输出任何正确答案。

在此处输入图片说明

规则

  1. 禁止出现标准漏洞。
  2. 输入/输出格式灵活。
  3. 输出必须按多维数据集顺序排列,但不在多维数据集中。顺序必须首先是月份多维数据集,然后是两个数字多维数据集,然后是工作日多维数据集。但是,当多维数据集的顶部有两个元素时,这两个元素可以任意顺序排列。
  4. 您可以根据需要将其替换JanuaryDecember0-11或1-12。
  5. 您可以根据需要将星期几替换为0-6或1-7,并且可以从任一星期开始 SundayMonday(但您不能在其他任何一天开始这一星期-这是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" ]]

所以...我一直在想,这装饰物怎么能显示所有日期?
Erik the Outgolfer

@ErikTheOutgolfer缺少哪个日期?
ngm

与挑战无关,但是,由于我无法通过聊天对您进行ping操作,您如何使用两个中间的多维数据集?我的意思是,所有10位数字都应该能够代表。
暴民埃里克(Erik the Outgolfer)

1
多维数据集可以按任何顺序使用。如图所示,我们将两个数字立方体称为“右上”和“左下”。要获得18,请使用右上角的1和左下角的8。要获得13,请使用左下角的1和右上角的3。等等。0 1和2必须同时在两个多维数据集上。6和9共享同一个立方体面的事实为您提供了从01到31的所有内容。
ngm

1
根据该照片,272019-10-27应该去36,不是32
japh

Answers:


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)。打印到标准输出。在线尝试!

测试用例:

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

秘籍

strftime被称为以a struct tm作为输入。相反,我声明int S[9]并使用S[4]as tm_monS[6]as tm_wday。如果C库使用与ISO标准相同的结构成员列表,则此方法有效。

s[99]用于存储from中的各种字符串strftime,但是将其制成int数组可以节省索引中的几个字节。


3

JavaScript(ES6),142个字节

将输入作为(year, month, day0, day1)位置ØñŤH 是1索引的 d一种ÿ0 是日期的第一位数字, d一种ÿ1个 是第二个数字。

返回(month0, month1, day0, day1, weekDay0, weekDay1)以0为索引的工作日0星期天。如果第二个工作日为空,则将其设置为-1个

(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]

在线尝试!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.