Що буде на вершині цього декоративного календаря?


14

Хтось подарував моїй дружині декоративний календар, що складається з чотирьох кубиків. Тут показано сьогоднішню дату (станом на опублікування цього виклику) на передній частині:

введіть тут опис зображення

Коли я вперше побачив це, я подивився на нього з неправильного кута (прямо зверху) і не міг зрозуміти, чому він дає цю інформацію:

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

Ваше завдання - повторити мою помилку на будь-яку дату в 2019 році.

Виклик

Напишіть програму або функцію, яка приймає будь-яку дату з 2019 року, і виводить те, що з’являється у верхній частині всіх кубів, коли ця дата відображається виворітною стороною календаря.

Ось усі шість сторін на всі кубики. Щоб відобразити a, 6ви просто переверніть 9догори дном. 0Вертикально симетричні, так що 0вниз по - , як і раніше 0. На деякі дати може бути більше, ніж одна правильна відповідь (наприклад, будь-який 11 числа будь-якого місяця матиме більше одного способу використання кубів та 0речі), щоб ви могли отримати будь-яку правильну відповідь.

введіть тут опис зображення

Правила

  1. Стандартні лазівки заборонені.
  2. Формат вводу / виводу є гнучким.
  3. Вихід має бути впорядкований за кубом, але не в межах куба. Порядок повинен спочатку бути кубиком місяця, потім двома кубиками числа, а потім кубом будня. Але коли на кубі є два елементи зверху, ці два елементи можуть бути в будь-якому порядку.
  4. Ви можете замінити Januaryна December0-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" ]]

Отже ... Мені було цікаво, як ця декоративна річ здатна показати всі дати?
Ерік Аутгольфер

@ErikTheOutgolfer, яка дата відсутня?
ngm

Не пов'язане з викликом, але, оскільки я не можу пінгнути вас у чаті, як ви використовуєте два середніх кубика? Я маю на увазі, що всі 10 цифр повинні бути здатні бути представлені.
Ерік Аутгольфер

1
Кубики можна використовувати в будь-якому порядку. Назвемо два числові кубики вгорі праворуч і знизу зліва, як на графіці. Щоб отримати 18, ви використовуєте 1 зверху праворуч та 8 знизу зліва. Щоб отримати 13, ви використовуєте 1 знизу зліва і 3 зверху праворуч. І так далі. 0 1 і 2 повинні бути на обох кубиках. Той факт, що 6 і 9 діляться одним і тим же кубом, дає вам все від 01 до 31, тобто все, що потрібно.
ngm

1
Згідно з картинками, 27в 2019-10-27слід перейти 36, а не 32.
Джаф

Відповіді:


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

Коди

strftimeМається на увазі, що називається struct tmвхідним кодом. Натомість я декларую int S[9]і використовую S[4]як tm_monі S[6]як tm_wday. Це працює, якщо бібліотека C використовує той самий список членів структури, що і стандарт ISO.

s[99]використовується для зберігання різних рядків з strftime, але внесення intмасиву економить кілька байтів при індексації.


3

JavaScript (ES6), 142 байти

(year, month, day0, day1)монтгодгау0гау1 - друга цифра.

(month0, month1, day0, day1, weekDay0, weekDay1)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]

Спробуйте в Інтернеті!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.