¿Qué habrá en la parte superior de este calendario decorativo?

14

Alguien le dio a mi esposa un calendario decorativo que consta de cuatro cubos. Aquí se muestra la fecha de hoy (a partir de la publicación de este desafío) en el frente:

ingrese la descripción de la imagen aquí

Cuando lo vi por primera vez, lo miré desde el ángulo equivocado (directamente desde arriba) y no pude entender por qué daba esta información:

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

Su trabajo es replicar mi error para cualquier fecha en 2019.

Desafío

Escriba un programa o función que tome cualquier fecha de 2019 y muestre lo que aparece en la parte superior de todos los cubos cuando esa fecha se muestra hacia afuera desde el frente del calendario.

Aquí están los seis lados para todos los cubos. Para mostrar un 6solo dale la vuelta 9. El 0es verticalmente simétrico, por lo que está 0al revés 0. Puede haber más de una respuesta correcta para algunas fechas (por ejemplo, cualquier día 11 de cualquier mes tendrá más de una forma de usar los cubos, y la 0cosa) para que pueda generar cualquier respuesta correcta.

ingrese la descripción de la imagen aquí

Reglas

  1. Lagunas estándar prohibidas.
  2. El formato de entrada / salida es flexible.
  3. La salida tiene que estar en orden por cubo, pero no dentro de un cubo. El orden debe ser primero el cubo del mes, luego los dos cubos numéricos, seguidos del cubo del día de la semana. Pero cuando un cubo tiene dos elementos en la parte superior, esos dos elementos pueden estar en cualquier orden.
  4. Puede reemplazar Januarya December0-11 o 1-12 si lo desea.
  5. Puede reemplazar los días de la semana con 0-6 o 1-7 si se quiere, y se puede empezar la semana en cualquiera Sundayo Monday(pero no se puede iniciar la semana en cualquier otro día - esto es PPGC, no algún tipo del pueblo loco)
  6. Esto es . Pocos bytes para cada idioma gana.
  7. Explicaciones alentadas.

Casos de prueba

(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
fuente
Entonces ... Me he estado preguntando, ¿cómo es que esta cosa decorativa puede mostrar todas las fechas?
Erik the Outgolfer
@ErikTheOutgolfer, ¿qué fecha falta?
ngm
No está relacionado con el desafío, pero, dado que no puedo enviarle un ping por chat, ¿cómo utiliza los dos cubos intermedios? Quiero decir, los 10 dígitos deberían poder representarse.
Erik the Outgolfer
1
Los cubos se pueden usar en cualquier orden. Llamemos a los dos cubos numéricos Superior derecho e Inferior izquierdo como en el gráfico. Para obtener 18, usa 1 desde arriba a la derecha y 8 desde abajo a la izquierda. Para obtener 13, usa 1 desde la parte inferior izquierda y 3 desde la parte superior derecha. Y así. 0 1 y 2 tienen que estar en ambos cubos. El hecho de que 6 y 9 compartan la misma cara del cubo te da todo, del 01 al 31, que es todo lo que se necesita.
ngm
1
Según las imágenes, 27en 2019-10-27debería ir a 36, no 32.
japh

Respuestas:

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

(Se agregaron algunos saltos de línea para mayor claridad)

ftoma un mes (1–12) y un día (1–31). Imprime en stdout. Pruébalo en línea!

Casos de prueba:

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

Sin golf

#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 son las posibilidades para los 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

El siguiente mapeo parece ser la mejor opción para jugar al golf:

   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

Trucos

strftimeestá destinado a ser llamado con a struct tmcomo entrada. En cambio, declaro int S[9]y uso S[4]como tm_mony S[6]comotm_wday . Esto funciona si la biblioteca C usa la misma lista de miembros de estructura que el estándar ISO.

s[99]se usa para almacenar varias cadenas strftime, pero al convertirlo en una intmatriz se ahorran algunos bytes en la indexación.

japh
fuente
3

JavaScript (ES6), 142 bytes

Toma entrada como (year, month, day0, day1)dondemetroonortethreuny0 0reuny1

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

Pruébalo en línea!

Arnauld
fuente