Was steht auf diesem dekorativen Kalender?

14

Jemand gab meiner Frau einen dekorativen Kalender, bestehend aus vier Würfeln. Hier ist das heutige Datum (ab dem Absenden dieser Challenge) auf der Vorderseite zu sehen:

Bildbeschreibung hier eingeben

Als ich es zum ersten Mal sah, schaute ich es aus dem falschen Winkel (von oben) an und konnte nicht herausfinden, warum es diese Informationen gab:

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

Ihre Aufgabe ist es, meinen Fehler für jedes Datum im Jahr 2019 zu wiederholen.

Herausforderung

Schreiben Sie ein Programm oder eine Funktion, die ein Datum aus dem Jahr 2019 annimmt und das ausgibt, was oben auf allen Würfeln erscheint, wenn dieses Datum mit der Vorderseite nach außen im Kalender angezeigt wird.

Hier sind alle sechs Seiten für alle Würfel. Zum Anzeigen eines 6drehen Sie einfach den 9Kopf. Das 0ist vertikal symmetrisch, also 0steht es immer noch auf dem Kopf 0. Für einige Daten kann es mehr als eine richtige Antwort geben (z. B. gibt es für jeden 11. eines Monats mehrere Möglichkeiten, die Würfel und das 0Objekt zu verwenden), sodass Sie jede richtige Antwort ausgeben können.

Bildbeschreibung hier eingeben

Regeln

  1. Standardlücken verboten.
  2. Das Eingabe- / Ausgabeformat ist flexibel.
  3. Die Ausgabe muss nach Würfeln geordnet sein, aber nicht innerhalb eines Würfels. Die Reihenfolge muss zuerst der Monatswürfel sein, dann die beiden Zahlenwürfel, gefolgt vom Wochentagswürfel. Wenn ein Würfel zwei Elemente oben hat, können diese beiden Elemente in beliebiger Reihenfolge sein.
  4. Sie können ersetzen JanuaryzuDecember 0-11 oder 1-12 wenn Sie möchten.
  5. Sie können die Wochentage durch 0-6 oder 1-7 ersetzen, wenn Sie möchten, und Sie können die Woche entweder mit Sundayoder beginnenMonday (aber Sie können die Woche nicht an einem anderen Tag beginnen - dies ist PPGC, keine Sorte der verrückten Stadt.)
  6. Das ist . Es gewinnen die wenigsten Bytes für jede Sprache.
  7. Erläuterungen ermutigt.

Testfälle

(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
quelle
Also ... ich habe mich gefragt, wie kann dieses dekorative Ding alle Daten anzeigen?
Erik der Outgolfer
@ErikTheOutgolfer welches Datum fehlt?
ngm
Nicht mit der Herausforderung verbunden, aber wie benutzt man die beiden mittleren Würfel, da ich dich nicht über den Chat anpingen kann? Ich meine, alle 10 Ziffern sollten dargestellt werden können.
Erik der Outgolfer
1
Die Würfel können in beliebiger Reihenfolge verwendet werden. Nennen wir die beiden numerischen Würfel wie in der Grafik oben rechts und unten links. Um 18 zu bekommen, benutzt man 1 von rechts oben und 8 von links unten. Um 13 zu bekommen, benutzt man 1 von links unten und 3 von rechts oben. Und so weiter. 0 1 und 2 müssen auf beiden Würfeln sein. Die Tatsache, dass 6 und 9 die gleiche Würfelfläche haben, gibt Ihnen alles von 01 bis 31, was alles ist, was benötigt wird.
ngm
1
Laut den Bildern soll 27in 2019-10-27gehen 36, nicht 32.
Japh

Antworten:

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

(Einige Zeilenumbrüche zur Verdeutlichung hinzugefügt)

fdauert einen Monat (1–12) und einen Tag (1–31). Druckt nach Standard. Probieren Sie es online!

Testfälle:

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

Ziffernwürfel

Dies sind die Möglichkeiten für die Ziffern:

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

Die folgende Zuordnung scheint die beste Wahl für das Golfen zu sein:

   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

Betrügt

strftimesoll mit a struct tmals Eingabe aufgerufen werden. Stattdessen erkläre int S[9]und benutze ich S[4]als tm_monund S[6]als tm_wday. Dies funktioniert, wenn die C-Bibliothek dieselbe Liste von Strukturelementen wie der ISO-Standard verwendet.

s[99]wird verwendet, um verschiedene Zeichenfolgen von zu speichern strftime, aber um ein intArray zu erstellen, werden einige Bytes bei der Indizierung gespart.

japh
quelle
3

JavaScript (ES6), 142 Byte

Übernimmt die Eingabe als (year, month, day0, day1)womÖnth ist 1-indiziert, deiny0 ist die erste Ziffer des Datums und deiny1 ist die zweite Ziffer.

Gibt zurück, (month0, month1, day0, day1, weekDay0, weekDay1)wo Wochentage mit 0 indiziert sind0für Sonntag. Wenn der zweite Wochentag leer ist, wird er auf festgelegt-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]

Probieren Sie es online!

Arnauld
quelle