Cetak Jadwal Blokir Saya

11

SMA saya, dan banyak lainnya menerapkan jenis jadwal yang disebut Rotating Block Schedule. Ini adalah cara bagi orang untuk memiliki 8 kelas, tetapi memiliki 6 periode dalam satu hari sekolah.

Ada empat hari dalam jadwal blok yang berulang-ulang, dan tidak ada hubungannya dengan hari-hari sebenarnya dalam seminggu. Masing-masing diberi nomor [1-4].

Cara jadwal kerjanya adalah bahwa Anda daftar semua kelas pagi, periode 1-4: [1, 2, 3, 4]. Ini adalah jadwal Anda untuk hari pertama, atau Hari 1. Sisa hari hanya memutar daftar: [2, 3, 4, 1], [3, 4, 1, 2], [4, 1, 2, 3].

Namun, periode terakhir di pagi hari adalah "turun" dan Anda tidak melihat guru itu hari itu. Oleh karena itu hari adalah: [1, 2, 3], [2, 3, 4], [3, 4, 1], [4, 1, 2].

Sore hari yang sama, kecuali bahwa ia menggunakan periode 5-8gantinya: [5, 6, 7], [6, 7, 8], [7, 8, 5], [8, 5, 6].

Tugas Anda

Semua rotasi ini sulit untuk dilacak, jadi Anda harus menulis sebuah program untuk mencetak jadwal saya mengingat hari apa itu sebagai input. Kode Anda harus menempatkan Beranda dan Makan Siang di tempat yang benar. Berikut ini adalah output yang pasti dari kode Anda untuk input 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

Tapi Tunggu - Satu hal lagi!

Terkadang, pada hari pertama sekolah, atau pada hari-hari khusus lainnya, sekolah saya memiliki "Hari 0". Ini berarti bahwa saya akan memiliki semua kelas saya hari itu bersama wali kelas dan makan siang. Kode Anda harus berurusan dengan Hari 0. Berikut ini adalah output untuk Hari 0:

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

Ini adalah sehingga kode terpendek dalam byte menang!

Maltysen
sumber
Apakah ada 4 hari dalam seminggu? Atau apakah loop Jumat pertama kembali ke 1, 2, 3, 5, 6, 7?
Zach Gates
@ZachGates hanya 4 hari dalam * minggu *. Jadwal blok akan tidak sinkron dengan minggu sekolah yang sebenarnya.
Maltysen
Kapan "Hari 0" digunakan? Bagaimana kita tahu dari minggu mana kita memilih, dan berapa banyak "Hari 0" telah terjadi sejauh ini?
Zach Gates
@ZachGates Bukankah itu tidak relevan? Anda hanya perlu menyediakan satu output untuk satu input. Hanya ada 5 output yang berbeda.
mınxomaτ
2
@ZachGates Ada 5 kemungkinan input. 5 output yang sesuai dengan mereka terdaftar kata demi kata dalam tantangan.
Gagang Pintu

Jawaban:

3

Snowman 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

Kolom paling kiri itu sebenarnya terlihat cukup bagus, bukan?

...

... siapa saya bercanda, saya lebih suka program dalam PHP daripada ini.

Versi "Dapat dibaca":

}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

Pikiran dan renungan:

  • Pertama, saya pasti perlu menerapkan cara mencetak baris baru yang lebih cantik. Karena string dengan baris baru di blok berlekuk super jelek.

  • Saya suka trik saya dengan ae- Anda jarang melihat aeoperator tanpaE huruf besar dalam kode Snowman asli. (Kamu juga jarang melihat kode Snowman yang tidak ditulis olehku, tapi itu intinya.)

    Untuk yang belum tahu, Snowman memiliki dua cara untuk memanggil operator. Mode "Konsumsi", dan mode "non-konsumsi". Mode "Konsumsi" akan memanggil operator dengan variabel yang diminta dan kemudian membuang variabel. Mode non-konsumsi akan memanggil operator dan tetap membiarkan variabel tetap utuh.

    Yang biasanya bukan yang Anda inginkan ae(masing-masing array), karena blok yang Anda panggil pada setiap elemen akan tetap ada dan menghalangi Anda, menggunakan salah satu dari delapan variabel yang berharga.

    Namun, ini adalah situasi langka di mana ae adalah benar-benar apa yang kita inginkan (lihat komentar dalam kode untuk penjelasan lebih lanjut).

  • Saya benar-benar mulai berpikir bahwa Snowman membutuhkan lebih dari dua mode, selain hanya "mengonsumsi" dan "jangan-konsumsi." Misalnya, dengan aa(pada dasarnya pengindeksan array), Anda hanya mendapatkan dua cara untuk menyebutnya:

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

    (Snowman tidak menggunakan struktur stack / array, tapi itu hanya digunakan untuk kejelasan di sini.)

    Ini cukup umum yang Anda inginkan ["foo" "f"](yaitu mengkonsumsi variabel indeks, tetapi bukan yang asli). Ini adalah proses yang sangat berbelit-belit untuk menyingkirkan yang menjengkelkan itu 0jika Anda menggunakan mode "jangan konsumsi".

    Hal serupa terjadi ketika Anda memanggil "array-masing-masing" dalam mode "jangan-konsumsi", seperti yang dilakukan di sini. Array dan blok tetap ada, bahkan selama eksekusi blok tersebut . Yang ... sangat, sangat aneh.

    Kemudian lagi, tujuan desain Snowman adalah untuk membingungkan mungkin, jadi saya tidak yakin apakah ini masalah sama sekali.

Gagang pintu
sumber
2

CJam, 65 55 byte

ri_5,m<0-_W<\?_4f+]"HomeroomLunch"8/.{N@{"Period "\N}%}

Cobalah online di penerjemah CJam .

Dennis
sumber
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)

Hanya solusi cepat.

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)
Zach Gates
sumber
Anda dapat menyimpan dengan mengganti for loop dengan a"\n".join
Maltysen
Jumlah byte yang sama dalam Python 3, tetapi akan membantu dalam Python 2. @Maltysen saya akan menambahkannya. : P
Zach Gates
0

Pyth, 51 byte

"Homeroom"j"Lunch
"c2jb+L"Period "+J?QP.<S4tQS4+L4J
orlp
sumber