O que estará no topo deste calendário decorativo?

14

Alguém deu à minha esposa um calendário decorativo composto por quatro cubos. Aqui está mostrando a data de hoje (a partir da publicação deste desafio) na frente:

insira a descrição da imagem aqui

Quando o vi pela primeira vez, olhei pelo ângulo errado (diretamente acima) e não consegui descobrir por que ele forneceu essa informação:

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

Seu trabalho é replicar meu erro para qualquer data em 2019.

Desafio

Escreva um programa ou função que tenha qualquer data a partir de 2019 e produza o que aparece na parte superior de todos os cubos quando essa data é exibida voltada para frente na frente do calendário.

Aqui estão todos os seis lados para todos os cubos. Para exibir um 6você apenas vira de 9cabeça para baixo. O 0é verticalmente simétrico, então de 0cabeça para baixo ainda 0. Pode haver mais de uma resposta correta para algumas datas (por exemplo, qualquer 11 de cada mês terá mais de uma maneira de usar os cubos, e a 0coisa) para que você possa produzir qualquer resposta correta.

insira a descrição da imagem aqui

Regras

  1. Falhas padrão proibidas.
  2. O formato de entrada / saída é flexível.
  3. A saída precisa estar em ordem por cubo, mas não dentro de um cubo. O pedido deve ser o cubo do mês primeiro, depois os dois cubos numéricos, seguidos pelo cubo do dia da semana. Mas quando um cubo tem dois elementos no topo, esses dois elementos podem estar em qualquer ordem.
  4. Você pode substituir JanuaryparaDecember 0-11 ou 1-12, se quiser.
  5. Você pode substituir os dias da semana por 0-6 ou 1-7, se quiser, e pode começar a semana com um Sundayou outroMonday (mas não pode começar a semana em nenhum outro dia - esse é o PPGC, não de algum tipo da cidade louca.)
  6. Este é o . O menor número de bytes para cada idioma vence.
  7. Explicações encorajadas.

Casos de teste

(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" ]]
ngm
fonte
Então ... eu estive pensando, como essa coisa decorativa é capaz de mostrar todas as datas?
Erik the Outgolfer
@ErikTheOutgolfer que data está faltando?
NGM
Não está relacionado ao desafio, mas como não consigo fazer o ping no bate-papo, como você usa os dois cubos do meio? Quero dizer, todos os 10 dígitos devem poder ser representados.
Erik the Outgolfer
1
Os cubos podem ser usados ​​em qualquer ordem. Vamos chamar os dois cubos numéricos superior direito e inferior esquerdo, como no gráfico. Para obter 18, use 1 do canto superior direito e 8 do canto inferior esquerdo. Para obter 13, use 1 da parte inferior esquerda e 3 da parte superior direita. E assim por diante. 0 1 e 2 devem estar nos dois cubos. O fato de 6 e 9 compartilharem a mesma face de cubo fornece tudo de 01 a 31, o que é necessário.
NGM
1
De acordo com as fotos, 27em 2019-10-27deve ir para 36, não 32.
japh

Respostas:

5

C (glibc) , 327 319 286 bytes

#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);}

(Algumas quebras de linha foram adicionadas para maior clareza)

fleva um mês (1 a 12) e um dia (1 a 31). Imprime em stdout. Experimente online!

Casos de teste:

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

Ungolfed

#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]);
}

Cubos de dígitos

Estas são as possibilidades para os dígitos:

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

O seguinte mapeamento parece ser a melhor opção para o golfe:

   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

Cheats

strftimedeve ser chamado com a struct tmcomo entrada. Em vez disso, declaro int S[9]e uso S[4]comotm_mon e S[6]comotm_wday . Isso funciona se a biblioteca C usar a mesma lista de membros struct que o padrão ISO.

s[99]é usado para armazenar várias strings strftime, mas torná-lo uma intmatriz economiza alguns bytes na indexação.

japh
fonte
3

JavaScript (ES6), 142 bytes

(year, month, day0, day1)monthdumay0 0dumay1 é o segundo digito.

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

Experimente online!

Arnauld
fonte