Que sera au sommet de ce calendrier décoratif?

14

Quelqu'un a donné à ma femme un calendrier décoratif composé de quatre cubes. Ici, il affiche la date d'aujourd'hui (à compter de la publication de ce défi) sur le devant:

entrez la description de l'image ici

Quand je l'ai vu pour la première fois, je l'ai regardé sous le mauvais angle (directement au-dessus) et je n'ai pas pu comprendre pourquoi il donnait ces informations:

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

Votre travail consiste à reproduire mon erreur pour n'importe quelle date en 2019.

Défi

Écrivez un programme ou une fonction qui prend n'importe quelle date à partir de 2019 et affiche ce qui apparaît en haut de tous les cubes lorsque cette date est affichée face à l'avant du calendrier.

Voici les six faces de tous les cubes. Pour afficher un, il 6vous suffit de retourner la 9tête en bas. Le 0est verticalement symétrique, donc 0à l'envers est toujours 0. Il peut y avoir plus d'une réponse correcte pour certaines dates (par exemple, n'importe quel 11 du mois aura plus d'une façon d'utiliser les cubes, et 0ainsi de suite) afin que vous puissiez afficher n'importe quelle réponse correcte.

entrez la description de l'image ici

Règles

  1. Failles standard interdites.
  2. Le format d'entrée / sortie est flexible.
  3. La sortie doit être en ordre par cube, mais pas dans un cube. L'ordre doit d'abord être le cube du mois, puis les deux cubes numériques, suivis du cube du jour de la semaine. Mais lorsqu'un cube a deux éléments au-dessus, ces deux éléments peuvent être dans l'un ou l'autre ordre.
  4. Vous pouvez remplacer Januaryà December0-11 ou 1-12 si vous le souhaitez.
  5. Vous pouvez remplacer les jours de la semaine par 0-6 ou 1-7 si vous le souhaitez, et vous pouvez commencer la semaine sur SundayouMonday (mais vous ne pouvez pas commencer la semaine un autre jour - c'est PPGC, pas une sorte de ville folle.)
  6. C'est du . Le moins d'octets pour chaque langue gagne.
  7. Explications encouragées.

Cas de test

(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
la source
Alors ... je me demandais, comment ce truc décoratif peut-il montrer toutes les dates?
Erik the Outgolfer
@ErikTheOutgolfer quelle date manque?
ngm
Pas lié au défi, mais, comme je ne peux pas vous cingler sur le chat, comment utilisez-vous les deux cubes du milieu? Je veux dire, les 10 chiffres devraient pouvoir être représentés.
Erik the Outgolfer
1
Les cubes peuvent être utilisés dans l'un ou l'autre ordre. Appelons les deux cubes numériques en haut à droite et en bas à gauche comme dans le graphique. Pour obtenir 18, vous utilisez 1 en haut à droite et 8 en bas à gauche. Pour obtenir 13, vous utilisez 1 en bas à gauche et 3 en haut à droite. Etc. 0 1 et 2 doivent être sur les deux cubes. Le fait que 6 et 9 partagent la même face de cube vous donne tout de 01 à 31, ce qui est tout ce dont vous avez besoin.
ngm
1
D' après les photos, 27en 2019-10-27devrait aller 36, non 32.
2018

Réponses:

5

C (glibc) , 327 319 286 octets

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

(Certains sauts de ligne ont été ajoutés pour plus de clarté)

fprend un mois (1–12) et un jour (1–31). Imprime à stdout. Essayez-le en ligne!

Cas de test:

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

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

Cubes de chiffres

Ce sont les possibilités pour les chiffres:

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

La cartographie suivante semble être le meilleur choix pour le 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

Cheats

strftimeest destiné à être appelé avec une struct tmentrée as. Au lieu de cela, je déclare int S[9]et utilise au S[4]fur tm_monet à S[6]mesure tm_wday. Cela fonctionne si la bibliothèque C utilise la même liste de membres de structure que la norme ISO.

s[99]est utilisé pour stocker diverses chaînes strftime, mais en faire un inttableau économise quelques octets dans l'indexation.

japh
la source
3

JavaScript (ES6), 142 octets

Prend l'entrée comme (year, month, day0, day1)month est indexé 1, uney0 est le premier chiffre de la date et uney1 est le deuxième chiffre.

Renvoie (month0, month1, day0, day1, weekDay0, weekDay1)où les jours de la semaine sont indexés à 0 avec0pour dimanche. Si le deuxième jour de la semaine est vide, il est défini sur-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]

Essayez-le en ligne!

Arnauld
la source