In lịch trình khối của tôi


11

Trường trung học của tôi, và nhiều trường khác thực hiện một loại lịch trình gọi là Lịch quay khối. Đây là một cách để mọi người có 8 lớp, nhưng có 6 tiết trong một ngày học.

Có bốn ngày trong một lịch trình khối lặp đi lặp lại nhiều lần và không liên quan gì đến các ngày thực tế trong tuần. Mỗi người được chỉ định một số [1-4].

Cách thức hoạt động của lịch trình là bạn liệt kê tất cả các lớp học buổi sáng của mình 1-4: [1, 2, 3, 4]. Đây là lịch trình của bạn cho ngày đầu tiên, hoặc ngày 1. Phần còn lại của những ngày chỉ cần xoay danh sách: [2, 3, 4, 1], [3, 4, 1, 2], [4, 1, 2, 3].

Tuy nhiên, khoảng thời gian cuối cùng vào buổi sáng là "bỏ" và bạn không thấy giáo viên đó vào ngày hôm đó. Do đó những ngày là: [1, 2, 3], [2, 3, 4], [3, 4, 1], [4, 1, 2].

Buổi chiều là như nhau, ngoại trừ việc nó sử dụng thời gian 5-8thay vì: [5, 6, 7], [6, 7, 8], [7, 8, 5], [8, 5, 6].

Nhiệm vụ của bạn

Tất cả sự luân chuyển này rất khó để theo dõi, vì vậy bạn phải viết một chương trình để in ra lịch trình của tôi được đưa ra vào ngày nào là ngày đầu vào. Mã của bạn phải đặt Homeroom và Ăn trưa ở những điểm chính xác. Đây là đầu ra chính xác mà mã của bạn cần phải có cho đầu vào 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

Nhưng chờ đã - Một điều nữa!

Đôi khi, vào ngày đầu tiên đến trường, hoặc vào những ngày đặc biệt khác, trường tôi có "Ngày 0". Điều này chỉ có nghĩa là tôi sẽ có tất cả các lớp học của mình ngày hôm đó cùng với tiết chủ nhiệm và bữa trưa. Mã của bạn sẽ phải đối phó với Ngày 0. Đây là đầu ra cho một ngày 0:

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

Đây là để mã ngắn nhất trong byte thắng!


Có 4 ngày trong tuần không? Hay vòng lặp thứ sáu đầu tiên sẽ quay trở lại 1, 2, 3, 5, 6, 7?
Zach Gates

@ZachGates chỉ 4 ngày trong * tuần *. Lịch học khối sẽ không đồng bộ với tuần học thực tế.
Maltysen

Khi nào "Ngày 0" được sử dụng? Làm thế nào để chúng ta biết chúng ta đang chọn tuần nào và bao nhiêu "Ngày 0" đã xảy ra cho đến nay?
Zach Gates

@ZachGates Không liên quan sao? Bạn chỉ cần cung cấp một đầu ra cho một đầu vào. Chỉ có 5 đầu ra riêng biệt.
mınxomaτ

2
@ZachGates Có 5 đầu vào có thể. 5 đầu ra tương ứng với chúng được liệt kê nguyên văn trong thử thách.
Doorknob

Câu trả lời:


3

Người tuyết 1.0.2 , 190 byte

}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

Cột ngoài cùng bên trái thực sự trông khá đẹp, phải không?

...

... Tôi đang đùa ai, tôi thích lập trình trong PHP hơn thế này.

Phiên bản "có thể đọc":

}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

Suy nghĩ và suy ngẫm:

  • Đầu tiên, tôi chắc chắn cần phải thực hiện một cách mới hơn để in các dòng mới. Bởi vì các chuỗi với dòng mới trong một khối thụt lề là siêu xấu xí.

  • Tôi thích mánh khóe của tôi với tinh aeranh hiếm khi thấy aenhà điều hành mà không được Eviết hoa trong mã Snowman thực. (Bạn cũng hiếm khi thấy mã Người tuyết không phải do tôi viết, nhưng đó là điểm chính.)

    Đối với người không quen biết, Snowman có hai cách để gọi các nhà khai thác. Chế độ "Tiêu thụ" và chế độ "không tiêu thụ". Chế độ "Tiêu thụ" sẽ gọi toán tử với các biến được yêu cầu và sau đó loại bỏ các biến. Chế độ không tiêu thụ sẽ gọi toán tử và vẫn giữ nguyên các biến.

    Đó thường không phải là những gì bạn muốn với ae(từng mảng), bởi vì khối bạn đang gọi trên mỗi phần tử sẽ ở đó và cản trở bạn, sử dụng một trong tám biến số quý giá.

    Tuy nhiên, đây là một tình huống hiếm gặp trong đó thực sự ae những gì chúng ta muốn (xem các bình luận trong mã để được giải thích thêm).

  • Tôi thực sự, thực sự bắt đầu nghĩ rằng Snowman cần nhiều hơn hai chế độ, ngoài việc chỉ "tiêu thụ" và "không tiêu thụ". Ví dụ: với aa(về cơ bản lập chỉ mục mảng), bạn chỉ có hai cách để gọi nó:

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

    (Snowman không sử dụng cấu trúc ngăn xếp / mảng, nhưng đơn giản là nó được sử dụng cho rõ ràng ở đây.)

    Nó khá phổ biến mà bạn muốn ["foo" "f"](nghĩa là tiêu thụ biến chỉ mục, nhưng không phải là biến ban đầu). Đây là một quá trình cực kỳ phức tạp để loại bỏ sự phiền toái đó 0nếu bạn sử dụng chế độ "không tiêu thụ".

    Một điều tương tự xảy ra khi bạn gọi "mảng-mỗi" trong chế độ "không tiêu thụ", như được thực hiện ở đây. Mảng và khối dính xung quanh, ngay cả trong quá trình thực hiện khối đã nói . Đó là ... thực sự, thực sự kỳ lạ.

    Một lần nữa, mục tiêu thiết kế của Snowman là khó hiểu nhất có thể, vì vậy tôi không chắc liệu đây có phải là vấn đề hay không.



1

Python 3, 193 192 182 168 165 byte

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)

Chỉ là một giải pháp nhanh chóng.

Python 2, 161 byte

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)

Bạn có thể lưu bằng cách thay thế vòng lặp for bằng"\n".join
Maltysen

Đó là cùng một lượng byte trong Python 3, nhưng nó sẽ giúp ích cho Python 2. @Maltysen Tôi sẽ thêm nó vào. : P
Zach Gates

0

Bình thường, 51 byte

"Homeroom"j"Lunch
"c2jb+L"Period "+J?QP.<S4tQS4+L4J
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.