Co będzie na górze tego ozdobnego kalendarza?

14

Ktoś dał mojej żonie ozdobny kalendarz składający się z czterech kostek. Tutaj pokazuje z przodu dzisiejszą datę (od opublikowania tego wyzwania):

wprowadź opis zdjęcia tutaj

Kiedy zobaczyłem to po raz pierwszy, spojrzałem na nią pod niewłaściwym kątem (bezpośrednio z góry) i nie mogłem zrozumieć, dlaczego podał tę informację:

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

Twoim zadaniem jest odtworzenie mojego błędu dla dowolnej daty w 2019 roku.

Wyzwanie

Napisz program lub funkcję, która pobierze dowolną datę od 2019 roku i wyświetli to, co pojawi się na górze wszystkich kostek, gdy data ta będzie wyświetlana na zewnątrz przedniej części kalendarza.

Oto wszystkie sześć stron dla wszystkich kostek. Aby wyświetlić 6, wystarczy odwrócić do 9góry nogami. 0Jest symetryczną pionowo, tak 0nogami nadal 0. Może być więcej niż jedna poprawna odpowiedź dla niektórych dat (np. Każdy jedenasty każdego miesiąca będzie miał więcej niż jeden sposób korzystania z kostek i innych 0rzeczy), więc możesz podać dowolną poprawną odpowiedź.

wprowadź opis zdjęcia tutaj

Zasady

  1. Standardowe luki zabronione.
  2. Format wejścia / wyjścia jest elastyczny.
  3. Dane wyjściowe muszą być uporządkowane według kostki, ale nie w kostce. Najpierw musi być kostka miesiąca, następnie dwie kostki liczbowe, a następnie kostka dnia tygodnia. Ale gdy sześcian ma dwa elementy na górze, te dwa elementy mogą być w dowolnej kolejności.
  4. Możesz wymienić JanuarynaDecember 0-11 lub 1-12, jeśli chcesz.
  5. Możesz zamienić dni tygodnia na 0-6 lub 1-7, jeśli chcesz, i możesz rozpocząć tydzień na SundaylubMonday (ale nie możesz rozpocząć tygodnia w innym dniu - to PPGC, a nie jakiś zwariowanego miasta.)
  6. To jest . Wygrywa najmniej bajtów dla każdego języka.
  7. Zachęca się do wyjaśnień.

Przypadki testowe

(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
źródło
Zastanawiam się, w jaki sposób ta dekoracyjna rzecz może pokazywać wszystkie daty?
Erik the Outgolfer,
@ErikTheOutgolfer, której daty brakuje?
ngm,
Nie ma związku z wyzwaniem, ale skoro nie mogę cię pingować na czacie, jak używasz dwóch środkowych kostek? Mam na myśli, że wszystkie 10 cyfr powinno być reprezentowanych.
Erik the Outgolfer,
1
Kostki mogą być używane w dowolnej kolejności. Nazwijmy dwie kostki numeryczne Górnym prawym i Dolnym lewym jak na grafice. Aby uzyskać 18, użyj 1 z prawego górnego rogu i 8 z lewego dolnego rogu. Aby uzyskać 13, użyj 1 z dolnego lewego rogu i 3 z górnego prawego. I tak dalej. 0 1 i 2 muszą znajdować się na obu kostkach. Fakt, że 6 i 9 mają tę samą ścianę sześcianu, daje wszystko od 01 do 31, co jest wszystkim, czego potrzeba.
ngm,
1
Według zdjęć, 27w 2019-10-27powinien udać się do 36nie 32.
japh

Odpowiedzi:

5

C (glibc) , 327 319 286 bajtów

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

(Dodano kilka podziałów linii dla zachowania przejrzystości)

fzajmuje miesiąc (1–12) i dzień (1–31). Drukuje na standardowe wyjście.Wypróbuj online!

Przypadki testowe:

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

Nie golfił

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

Kostki z cyframi

Oto możliwości dla cyfr:

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

Następujące mapowanie wydaje się najlepszym wyborem do gry w golfa:

   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

Kody

strftimema być wywoływany z struct tmwejściem as. Zamiast tego oświadczam int S[9]i używam S[4]jako tm_moni S[6]jakotm_wday . Działa to, jeśli biblioteka C używa tej samej listy elementów struktury co standard ISO.

s[99]służy do przechowywania różnych ciągów znaków strftime, ale dzięki temu inttablica oszczędza kilka bajtów podczas indeksowania.

japh
źródło
3

JavaScript (ES6), 142 bajty

Pobiera dane wejściowe jak (year, month, day0, day1)gdziemonth ma indeks 1, rezay0 jest pierwszą cyfrą daty i rezay1 jest drugą cyfrą.

Zwraca, gdy (month0, month1, day0, day1, weekDay0, weekDay1)dni tygodnia są indeksowane za pomocą 00na niedzielę. Jeśli drugi dzień tygodnia jest pusty, jest ustawiony na-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]

Wypróbuj online!

Arnauld
źródło