Apa yang akan ada di atas kalender dekoratif ini?

14

Seseorang memberi istri saya kalender dekoratif yang terdiri dari empat kubus. Ini dia menunjukkan tanggal hari ini (pada posting tantangan ini) di bagian depan:

masukkan deskripsi gambar di sini

Ketika saya pertama kali melihatnya, saya melihatnya dari sudut yang salah (dari langsung di atas) dan tidak tahu mengapa ia memberikan informasi ini:

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

Tugas Anda adalah mereplikasi kesalahan saya untuk tanggal apa pun di 2019.

Tantangan

Tulis program atau fungsi yang mengambil tanggal dari 2019, dan tampilkan apa yang muncul di atas semua kubus ketika tanggal itu ditampilkan menghadap keluar dari depan kalender.

Ini semua enam sisi untuk semua kubus. Untuk menampilkan 6Anda cukup membalikkan 9terbalik. Ini 0simetris secara vertikal, sehingga 0terbalik masih 0. Mungkin ada lebih dari satu jawaban yang benar untuk beberapa tanggal (mis. 11 bulan apa pun akan memiliki lebih dari satu cara untuk menggunakan kubus, dan 0masalahnya) sehingga Anda dapat menghasilkan jawaban yang benar.

masukkan deskripsi gambar di sini

Aturan

  1. Celah standar dilarang.
  2. Format input / output fleksibel.
  3. Outputnya harus dalam urutan dengan kubus, tetapi tidak dalam kubus. Urutan harus kubus bulan pertama, kemudian dua kubus angka, diikuti oleh kubus hari kerja. Tetapi ketika sebuah kubus memiliki dua elemen di atas, kedua elemen itu bisa berada di urutan mana pun.
  4. Anda dapat mengganti Januaryke December0-11 atau 1-12 jika Anda suka.
  5. Anda dapat mengganti hari dalam seminggu dengan 0-6 atau 1-7 jika Anda suka, dan Anda dapat memulai minggu pada salah satu SundayatauMonday (tetapi Anda tidak dapat memulai minggu pada hari lain - ini adalah PPGC, bukan semacam kota gila.)
  6. Ini . Bytes paling sedikit untuk setiap bahasa menang.
  7. Penjelasan didorong.

Uji kasus

(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
sumber
Jadi ... Saya sudah bertanya-tanya, bagaimana benda dekoratif ini dapat menunjukkan semua tanggal?
Erik the Outgolfer
@ErikTheOutgolfer tanggal mana yang hilang?
ngm
Tidak terkait dengan tantangan, tetapi, karena saya tidak bisa mem-ping Anda saat mengobrol, bagaimana Anda menggunakan dua kubus tengah? Maksudku, semua 10 digit harus bisa diwakili.
Erik the Outgolfer
1
Kubus dapat digunakan dalam urutan apa pun. Mari kita sebut dua kubus numerik Kanan Atas dan Kiri Bawah seperti pada grafik. Untuk mendapatkan 18 Anda menggunakan 1 dari Kanan Atas dan 8 dari Kiri Bawah. Untuk mendapatkan 13 Anda menggunakan 1 dari Kiri Bawah dan 3 dari Kanan Atas. Dan seterusnya. 0 1 dan 2 harus berada di kedua kubus. Fakta bahwa 6 dan 9 berbagi wajah kubus yang sama memberi Anda segalanya dari 01 hingga 31 yang merupakan semua yang diperlukan.
ngm
1
Menurut gambar, 27di 2019-10-27harus pergi ke 36, tidak 32.
Japh

Jawaban:

5

C (glibc) , 327 319 286 byte

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

(Beberapa jeda baris ditambahkan untuk kejelasan)

fmembutuhkan waktu satu bulan (1–12) dan satu hari (1–31). Mencetak ke stdout. Cobalah online!

Kasus uji:

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

Tidak disatukan

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

Batu kubus digit

Ini adalah kemungkinan untuk digit:

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

Pemetaan berikut ini sepertinya merupakan pilihan terbaik untuk bermain 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

Curang

strftimedimaksudkan untuk dipanggil dengan struct tminput sebagai. Sebagai gantinya, saya menyatakan int S[9]dan menggunakan S[4]sebagai tm_mondan S[6]sebagai tm_wday. Ini berfungsi jika pustaka C menggunakan daftar anggota struct yang sama dengan standar ISO.

s[99]digunakan untuk menyimpan berbagai string dari strftime, tetapi membuatnya menjadi intarray menghemat beberapa byte dalam pengindeksan.

japh
sumber
3

JavaScript (ES6), 142 byte

Mengambil input di (year, month, day0, day1)manamHainth diindeks 1, dSebuahy0 adalah digit pertama dari tanggal dan dSebuahy1 adalah digit kedua.

Mengembalikan di (month0, month1, day0, day1, weekDay0, weekDay1)mana hari hari diindeks dengan 00untuk hari minggu. Jika hari minggu kedua kosong, diatur ke-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]

Cobalah online!

Arnauld
sumber