Bu dekoratif takvimin üstünde ne olacak?


14

Birisi eşime dört küpden oluşan dekoratif bir takvim verdi. Burada bugünün tarihi (bu zorluğun yayınlanmasından itibaren) ön tarafta gösterilmektedir:

resim açıklamasını buraya girin

İlk gördüğümde, yanlış açıdan (doğrudan yukarıdan) baktım ve neden bu bilgiyi verdiğini anlayamadım:

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

İşiniz 2019'daki herhangi bir tarih için hatamı çoğaltmak.

Meydan okuma

2019'dan herhangi bir tarih alan bir program veya işlev yazın ve bu tarih takvimin önünden dışarıya bakacak şekilde görüntülendiğinde tüm küplerin üstünde görünenleri çıktılar .

İşte tüm küpler için altı taraf. A görüntülemek 6için 9baş aşağı çevirin . 0Bu nedenle dikey simetrik 0ters hala 0. Bazı tarihler için birden fazla doğru yanıt olabilir (örneğin, herhangi bir ayın 11'inde küpleri ve 0şeyi kullanmak için birden fazla yol olacaktır ), böylece doğru cevabı verebilirsiniz.

resim açıklamasını buraya girin

kurallar

  1. Standart boşluklar yasaktır.
  2. Giriş / çıkış formatı esnektir.
  3. Çıktının küpte olması gerekir, ancak bir küp içinde olması gerekmez. Sipariş önce ay küpü, ardından iki sayı küpü ve ardından hafta içi küpü olmalıdır. Ancak bir küpün üstünde iki öğe olduğunda, bu iki öğe her iki sırada da olabilir.
  4. Sen değiştirebilirsiniz Januaryiçin Decemberisterseniz 0-11 veya 1-12.
  5. İsterseniz haftanın günlerini 0-6 veya 1-7 ile değiştirebilirsiniz ve haftaya ya ikisinden başlayabilirsiniz Sundayveya Monday(ancak başka bir günde haftaya başlayamazsınız - bu bir çeşit PPGC'dir çılgın kasaba.)
  6. Bu . Her dil için en az bayt kazanır.
  7. Açıklamalar teşvik edildi.

Test senaryoları

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

Peki ... Merak ediyorum, bu dekoratif şey tüm tarihleri ​​nasıl gösterebilir?
Outgolfer Erik

@ErikTheOutgolfer hangi tarihte eksik?
ngm

Meydan okuma ile ilgili değil, ama size sohbet etmek için ping atamadığım için, iki orta küpü nasıl kullanıyorsunuz? Yani, 10 basamağın tümü temsil edilebilmelidir.
Outgolfer Erik

1
Küpler her iki sırada da kullanılabilir. Grafikteki gibi sağ üst ve sol alt iki sayısal küpü çağıralım. 18 elde etmek için sağ üstte 1 ve sol altta 8 kullanıyorsunuz. 13 elde etmek için Sol Alttan 1 ve Sağ Üstten 3'ü kullanırsınız. Ve bunun gibi. 0 1 ve 2 her iki küp üzerinde olmalıdır. 6 ve 9'un aynı küp yüzünü paylaşması, ihtiyacınız olan her şey olan 01'den 31'e kadar her şeyi size verir.
ngm

1
Resimlere göre, 27içinde 2019-10-27gitmeli 36, değil 32.
japh

Yanıtlar:


5

C (glibc) , 327 319 286 bayt

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

(Netlik için bazı satır sonları eklenmiştir)

fbir ay (1-12) ve bir gün (1-31) alır. Stdout'a yazdırır. Çevrimiçi deneyin!

Test senaryoları:

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

Rakam küpleri

Bunlar rakamlar için olasılıklardır:

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

Aşağıdaki eşleme golf için en iyi seçenek gibi görünüyor:

   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

Hileleri

strftime"" ifadesi ", struct tm" input " olarak adlandırılmalıdır . Bunun yerine, beyan int S[9]ve kullanım S[4]olarak tm_monve S[6]sıra tm_wday. C kütüphanesi ISO standardıyla aynı yapı üyeleri listesini kullanıyorsa bu işe yarar.

s[99], çeşitli dizeleri saklamak için kullanılır strftime, ancak bir intdizi haline getirmek dizine ekleme işleminde birkaç bayt tasarruf sağlar.


3

JavaScript (ES6), 142 bayt

Olarak girdi Alır (year, month, day0, day1)nereye 1-endeksli olduğunu, tarihinin ilk basamak olup ikinci rakamdır.monthday0day1

İade (month0, month1, day0, day1, weekDay0, weekDay1)hafta günler 0 endeksli Pazar günü için. İkinci hafta günü boşsa, olarak ayarlanır .01

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

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.