พิมพ์กำหนดการบล็อกของฉัน


11

โรงเรียนมัธยมของฉันและอื่น ๆ อีกมากมายใช้ตารางเวลาชนิดหนึ่งที่เรียกว่าตารางการหมุนที่ถูกบล็อก นี่เป็นวิธีสำหรับคนที่มี 8 คลาส แต่จะมี 6 คาบในหนึ่งวันเรียน

มีสี่วันในตารางบล็อกที่ทำซ้ำซ้ำแล้วซ้ำอีกและไม่มีอะไรเกี่ยวข้องกับวันที่แท้จริงของสัปดาห์ [1-4]แต่ละคนจะได้รับมอบหมายจำนวน

วิธีการกำหนดการทำงานคือคุณรายการเรียนตอนเช้าของคุณทุกช่วงเวลา:1-4 [1, 2, 3, 4]นี่คือตารางเวลาของคุณสำหรับวันแรกหรือวันที่ 1 [2, 3, 4, 1]ส่วนที่เหลือของวันเพียงแค่หมุนรายการ: [3, 4, 1, 2], [4, 1, 2, 3],

อย่างไรก็ตามช่วงสุดท้ายของช่วงเช้าคือ "ลดลง" และคุณไม่เห็นอาจารย์คนนั้นในวันนั้น ดังนั้นวันที่มี: [1, 2, 3], [2, 3, 4], ,[3, 4, 1][4, 1, 2]

ช่วงบ่ายจะเหมือนกันยกเว้นว่าจะใช้ระยะเวลาแทน:5-8 , , ,[5, 6, 7][6, 7, 8][7, 8, 5][8, 5, 6]

งานของคุณ

การหมุนทั้งหมดนี้ยากที่จะติดตามดังนั้นคุณต้องเขียนโปรแกรมเพื่อพิมพ์ตารางเวลาของฉันตามวันที่เป็นอินพุท รหัสของคุณจะต้องวาง Homeroom และ Lunch ในจุดที่ถูกต้อง นี่คือผลลัพธ์ที่แน่นอนที่รหัสของคุณต้องมีสำหรับอินพุต1-4:

Homeroom    Homeroom    Homeroom    Homeroom
Period 1    Period 2    Period 3    Period 4
Period 2    Period 3    Period 4    Period 1
Period 3    Period 4    Period 1    Period 2
Lunch       Lunch       Lunch       Lunch
Period 5    Period 6    Period 7    Period 8
Period 6    Period 7    Period 8    Period 5
Period 7    Period 8    Period 5    Period 6

แต่เดี๋ยวก่อน - อีกอย่างหนึ่ง!

บางครั้งในวันแรกของโรงเรียนหรือในวันพิเศษอื่น ๆ โรงเรียนของฉันมี "วันที่ 0" นี่หมายถึงว่าฉันจะมีชั้นเรียนทั้งหมดของฉันในวันนั้นพร้อมกับห้องนอนและอาหารกลางวัน รหัสของคุณจะต้องจัดการกับวันที่ 0 นี่คือผลลัพธ์สำหรับวันที่ 0:

Homeroom
Period 1
Period 2
Period 3
Period 4
Lunch
Period 5
Period 6
Period 7
Period 8

นี่คือสั้นที่สุดในหน่วยไบต์ !


มี 4 วันในสัปดาห์หรือไม่ หรือวันศุกร์แรกจะวนกลับไปที่ 1, 2, 3, 5, 6, 7ใด
Zach Gates

@ZachGates เพียง 4 วันใน * สัปดาห์ * กำหนดการบล็อกจะไม่สอดคล้องกับสัปดาห์ของโรงเรียนจริง
Maltysen

"วันที่ 0" ถูกใช้เมื่อใด เราจะรู้ได้อย่างไรว่าเราเลือกสัปดาห์ไหนและ "วันที่ 0" ได้เกิดขึ้นจนถึงเท่าไหร่
Zach Gates

@ZachGates นั้นไม่เกี่ยวข้องใช่ไหม คุณเพียงแค่ต้องส่งออกหนึ่งสำหรับหนึ่งอินพุต มีเอาต์พุตที่แตกต่างกันเพียง 5 ตัวเท่านั้น
mınxomaτ

2
@ZachGates มี 5 อินพุตที่เป็นไปได้ เอาต์พุต 5 รายการที่สอดคล้องกับพวกเขาจะแสดงรายการเป็นคำต่อคำในความท้าทาย
ลูกบิดประตู

คำตอบ:


3

Snowman 1.0.2 , 190 bytes

}vg10sB*:#NdE*!1*"Homeroom
"sP0vn3nR:|%+#nA4NmO'"Period "sP'!#nAtSsP"
"sP|%;ae|"Lunch
"sP5*|ae;:"Homeroom
"sP0vn4nR*#:`"Period "sP`NiNtSsP"
"sP;aE"Lunch
"sP#:`"Period "sP`5nAtSsP"
"sP;aE;#bI

คอลัมน์ทางซ้ายสุดนั้นดูสวยดีใช่ไหม?

...

... ฉันเป็นคนล้อเล่นฉันควรเขียนโปรแกรมใน PHP มากกว่านี้

รุ่น "สามารถอ่านได้":

}vg10sB*   // store day # in permavar
// big if statement coming up, depending on whether the input (n) is 0 or not

// THE FOLLOWING BLOCK IS FOR N != 0
:

#NdE*      // decrement number (because we like 0-based indeces) and re-store
!1*        // store the number 1 in permavar ! for later
"Homeroom
"sP        // print "Homeroom"
0vn3nR     // generate [0 1 2]
// for each element in this array...
:
    |%            // shuffle around some variables so we have room
    +#nA          // add day number (in permavar +)
    4NmO          // modulo by 4
    '"Period "sP  // print "Period "
    '!#nAtSsP     // add whatever is in permavar ! and print
    "
"sP               // print a newline
    |%            // return variables to their original state
;ae
// this is a rare occasion in which we use "ae" instead of "aE"
// we use non-consume mode here because we need the block again
// since we've used a permavar ! to determine what to add to the period number,
//   we can set the permavar to 4 more than it used to be and run the same
//   exact block
|"Lunch
"sP        // print "Lunch"
5*         // store the number 5 in permavar !, as described above
|ae        // run the same block over the same array again

;

// THE FOLLOWING BLOCK IS FOR N == 0

:

// after much frustration, I have determined that the easiest way to go about
//   this is to simply code the "day 0" separately
// yes, snowman is *that* bad
"Homeroom
"sP           // you know the drill
// for each number in [0 1 2 3]
0vn4nR*#:
    `"Period "sP
    `NiNtSsP  // increment and print
    "
"sP
;aE
"Lunch
"sP           // same stuff from here
// only interesting thing is we saved the range from before with *#, so we can
//   get it back easily
#:`"Period "sP`5nAtSsP"
"sP;aE

;

#bI

ความคิดและ musings:

  • ประการแรกฉันต้องใช้วิธีที่ดีกว่าในการพิมพ์บรรทัดใหม่ เนื่องจากสตริงที่มีการขึ้นบรรทัดใหม่ในบล็อกที่เยื้องนั้นน่าเกลียดสุด ๆ

  • ฉันaeชอบกลอุบายของฉันด้วย- คุณไม่ค่อยเห็นaeโอเปอเรเตอร์โดยไม่ต้องEพิมพ์ใหญ่ในรหัส Snowman จริง (คุณแทบจะไม่เห็นรหัส Snowman ที่ฉันไม่ได้เขียน แต่ก็อยู่นอกเหนือประเด็น)

    สำหรับมือใหม่ Snowman มีสองวิธีในการโทรหาผู้ควบคุม โหมด "กิน" และโหมด "ไม่กิน" โหมด "สิ้นเปลือง" จะเรียกผู้ดำเนินการพร้อมกับตัวแปรที่ร้องขอแล้วละทิ้งตัวแปรนั้น โหมดที่ไม่ใช้จะเรียกผู้ดำเนินการและยังคงตัวแปรไว้เหมือนเดิม

    ซึ่งมักจะไม่ใช่สิ่งที่คุณต้องการae(แต่ละอาร์เรย์) เนื่องจากบล็อกที่คุณโทรหาแต่ละองค์ประกอบจะอยู่ที่นั่นและเข้ามาในทางของคุณโดยใช้หนึ่งในแปดตัวแปรที่มีค่า

    อย่างไรก็ตามนี่เป็นสถานการณ์ที่ไม่ค่อยเกิดขึ้นซึ่งจริงๆแล้วae เป็นสิ่งที่เราต้องการ (ดูความคิดเห็นในรหัสสำหรับคำอธิบายเพิ่มเติม)

  • ฉันจริง ๆ แล้วเริ่มคิดว่า Snowman ต้องการมากกว่าสองโหมดนอกเหนือจาก "กิน" และ "ไม่ต้องกิน" ตัวอย่างเช่นด้วยaa (โดยทั่วไปการทำดัชนีอาเรย์) คุณจะได้รับสองวิธีในการเรียกมัน:

    ["foo" 0] -> ["f"]
    ["foo" 0] -> ["foo" 0 "f"]
    

    (Snowman ไม่ได้ใช้โครงสร้างสแต็ก / อาร์เรย์ แต่มันถูกใช้เพื่อความชัดเจนที่นี่)

    เป็นเรื่องธรรมดาที่คุณต้องการ ["foo" "f"] (เช่นใช้ตัวแปรดัชนี แต่ไม่ใช่ตัวแปรดั้งเดิม) มันเป็นกระบวนการที่ซับซ้อนอย่างยิ่งในการกำจัดสิ่งที่น่ารำคาญ0ถ้าคุณใช้โหมด "ไม่ต้องกิน"

    สิ่งที่คล้ายกันเกิดขึ้นเมื่อคุณเรียกว่า "แต่ละอาร์เรย์" ในโหมด "ไม่ต้องใช้" ตามที่ทำที่นี่ อาร์เรย์และบล็อกติดรอบแม้ในระหว่างการดำเนินการของบล็อกกล่าวว่า ซึ่ง ... จริง ๆ แปลกจริง ๆ

    จากนั้นอีกครั้งเป้าหมายการออกแบบของ Snowman คือทำให้สับสนที่สุดเท่าที่จะเป็นไปได้ดังนั้นฉันไม่แน่ใจว่านี่จะเป็นปัญหาหรือไม่



1

Python 3, 193 192 182 168 165 ไบต์

u=int(input())
print('Homeroom')
r=['Period '+i for i in("123567234678341785412856"[(u-1)*6:u*6]if u else"12345678")]
r.insert(len(r)//2,'Lunch')
for i in r:print(i)

เป็นทางออกที่รวดเร็ว

Python 2, 161 ไบต์

u=int(input())
print'Homeroom'
r=['Period '+i for i in("123567234678341785412856"[(u-1)*6:6*u]if u else"12345678")]
r.insert(len(r)//2,'Lunch')
print'\n'.join(r)

คุณสามารถบันทึกได้โดยแทนที่ for for loop ด้วย"\n".join
Maltysen

เป็นจำนวนไบต์ใน Python 3 เท่ากัน แต่จะช่วยใน Python 2 @Maltysen ฉันจะเพิ่มเข้าไปอีก : P
Zach Gates

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