สิ่งที่จะอยู่ด้านบนของปฏิทินตกแต่งนี้


14

มีคนให้ปฏิทินตกแต่งกับภรรยาของฉันซึ่งประกอบด้วยสี่ก้อน นี่คือมันแสดงวันที่วันนี้ (ณ วันที่โพสต์ของความท้าทายนี้) ที่ด้านหน้า:

ป้อนคำอธิบายรูปภาพที่นี่

เมื่อฉันเห็นมันครั้งแรกฉันมองจากมุมที่ผิด (จากด้านบน) และไม่สามารถหาสาเหตุที่ทำให้ข้อมูลนี้:

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

งานของคุณคือการทำซ้ำข้อผิดพลาดของฉันสำหรับวันใด ๆ ใน 2019

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้วันที่ใดก็ได้ตั้งแต่ปีพ. ศ. 2562 และส่งออกสิ่งที่ปรากฏที่ด้านบนของคิวบ์ทั้งหมดเมื่อวันที่นั้นปรากฏออกมาจากด้านหน้าของปฏิทิน

ที่นี่มีทั้งหมดหกด้านสำหรับลูกบาศก์ทั้งหมด ในการแสดงตัว6คุณเพียงแค่พลิก9คว่ำ 0เป็นรูปสมมาตรในแนวตั้งเพื่อให้คว่ำลงยังคงเป็น0 0อาจมีคำตอบที่ถูกต้องมากกว่าหนึ่งคำสำหรับบางวัน (เช่นวันที่ 11 ของเดือนใด ๆ จะมีมากกว่าหนึ่งวิธีในการใช้คิวบ์และ0สิ่งของ) เพื่อให้คุณสามารถส่งคำตอบที่ถูกต้องได้

ป้อนคำอธิบายรูปภาพที่นี่

กฎระเบียบ

  1. ช่องโหว่มาตรฐานต้องห้าม
  2. รูปแบบอินพุต / เอาต์พุตมีความยืดหยุ่น
  3. เอาต์พุตจะต้องเรียงตามคิวบ์ แต่ต้องไม่อยู่ในคิวบ์ คำสั่งซื้อจะต้องเป็นลูกบาศก์เดือนก่อนจากนั้นจะเป็นลูกบาศก์สองก้อนตามด้วยลูกบาศก์ในวันทำงาน แต่เมื่อคิวบ์มีสององค์ประกอบด้านบนองค์ประกอบทั้งสองนั้นสามารถอยู่ในลำดับใดก็ได้
  4. คุณสามารถแทนที่Januaryเป็นDecember0-11 หรือ 1-12 หากต้องการ
  5. คุณสามารถแทนที่วันในสัปดาห์ด้วย 0-6 หรือ 1-7 หากต้องการและคุณสามารถเริ่มสัปดาห์ในแบบใดก็ได้SundayหรือMonday(แต่คุณไม่สามารถเริ่มสัปดาห์ในวันอื่น ๆ ได้ - นี่คือ PPGC ไม่ใช่การเรียงลำดับบางอย่าง ของเมืองบ้า)
  6. นี่คือรหัสไบต์น้อยที่สุดสำหรับแต่ละภาษาที่ชนะ
  7. สนับสนุนคำอธิบาย

กรณีทดสอบ

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

ดังนั้น ... ฉันสงสัยมาแล้วว่าสิ่งตกแต่งนี้สามารถแสดงวันที่ทั้งหมดได้อย่างไร
Erik the Outgolfer

@ErikTheOutgolfer วันที่หายไปไหน?
ngm

ไม่เกี่ยวข้องกับความท้าทาย แต่เนื่องจากฉันไม่สามารถ ping คุณผ่านการแชทคุณจะใช้สองก้อนกลางได้อย่างไร ฉันหมายถึงตัวเลข 10 หลักทั้งหมดควรจะสามารถเป็นตัวแทนได้
Erik the Outgolfer

1
สามารถใช้คิวบ์ในลำดับใดก็ได้ ลองเรียกลูกบาศก์สองก้อนด้านบนขวาและล่างซ้ายเหมือนในกราฟิก ในการรับ 18 คุณต้องใช้ 1 จากขวาบนและ 8 จากล่างซ้าย เพื่อให้ได้ 13 คุณใช้ 1 จากล่างซ้ายและ 3 จากบนขวา และอื่น ๆ 0 1 และ 2 จะต้องอยู่บนลูกบาศก์ทั้งสอง ความจริงที่ว่า 6 และ 9 แชร์หน้าคิวบ์เดียวกันให้ทุกอย่างตั้งแต่ 01 ถึง 31 ซึ่งเป็นสิ่งที่จำเป็น
ngm

1
ตามภาพ27ใน2019-10-27ควรจะไปไม่ได้36 32
japh

คำตอบ:


5

C (glibc) , 327 319 286 ไบต์

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

(เพิ่มตัวแบ่งบรรทัดเพื่อความชัดเจน)

fใช้เวลาหนึ่งเดือน (1–12) และวัน (1–31) พิมพ์ไปยัง stdout ลองออนไลน์!

กรณีทดสอบ:

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

ก้อนหลัก

นี่คือความเป็นไปได้สำหรับตัวเลข:

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

การทำแผนที่ต่อไปนี้ดูเหมือนจะเป็นทางเลือกที่ดีที่สุดสำหรับการเล่นกอล์ฟ:

   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

กลโกง

strftimeมีความหมายที่จะเรียกว่าstruct tmเป็นอินพุต แต่ผมประกาศint S[9]และการใช้งานS[4]เป็นtm_monและเป็นS[6] tm_wdayใช้งานได้ถ้าไลบรารี C ใช้รายการสมาชิกโครงสร้างเดียวกันกับมาตรฐาน ISO

s[99]ใช้เพื่อเก็บสตริงต่างๆจากstrftimeแต่ทำให้intอาร์เรย์สามารถบันทึกไม่กี่ไบต์ในการทำดัชนี


3

JavaScript (ES6), 142 ไบต์

(year, month, day0, day1)ม.โอnเสื้อชั่วโมงdaY0daY1

(month0, month1, day0, day1, weekDay0, weekDay1)0-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]

ลองออนไลน์!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.