Распечатать расписание блокировки


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?
Зак Гейтс

@ZachGates только 4 дня в * неделю *. Расписание блока будет не синхронизировано с фактической учебной неделей.
Maltysen

Когда используется «День 0»? Как мы узнаем, с какой недели мы выбираем, и сколько «Дней 0» уже произошло?
Зак Гейтс

@ZachGates Разве это не имеет значения? Вы просто должны предоставить один выход для одного входа. Есть только 5 различных выходов.
Минсхома

2
@ZachGates Есть 5 возможных входов. 5 выходов, которые соответствуют им, дословно перечислены в задании.
Дверная ручка

Ответы:


3

Снеговик 1.0.2 , 190 байт

}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

Мысли и размышления:

  • Во-первых, мне определенно нужно реализовать более красивый способ печати новых строк. Потому что строки с символами новой строки в блоке с отступами супер уродливы.

  • Мне нравится мой трюк ae- вы редко видите aeоператора без Eзаглавной буквы в реальном коде Snowman. (Вы также редко видите код Snowman, который написан не мной, но это не главное.)

    Для непосвященных Snowman предлагает два способа вызова операторов. Режим «потребления» и режим «не потребления». В режиме «Потребление» оператор вызывает запрошенные переменные, а затем отбрасывает переменные. Неиспользуемый режим вызовет оператора и все равно оставит переменные нетронутыми.

    Это обычно не то, что вам нужно ae(массив-каждый), потому что блок, который вы вызываете для каждого элемента, останется там и встанет у вас на пути, используя драгоценную одну из восьми переменных.

    Тем не менее, это редкая ситуация, в которой ae мы действительно хотим (см. Комментарии в коде для дальнейшего объяснения).

  • Я действительно начинаю думать, что Snowman нужно более двух режимов, кроме просто «потреблять» и «не потреблять». Например, с помощью aa(в основном индексации массива) вы можете вызвать его только двумя способами:

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

    (Snowman не использует структуру стека / массива, но это просто используется для ясности здесь.)

    Это довольно часто, что вы хотите ["foo" "f"](т.е. использовать переменную индекса, но не исходную). Это очень запутанный процесс избавления от этого раздражающего, 0если вы используете режим «не потреблять».

    Подобное происходит, когда вы вызываете «array-each» в режиме «не использовать», как это делается здесь. Массив и блок остаются рядом даже во время выполнения указанного блока . Что ... действительно, очень странно.

    С другой стороны, цель 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 на"\n".join
Maltysen

Это то же количество байтов в Python 3, но это поможет в Python 2. @Maltysen Я добавлю его, хотя. : P
Зак Гейтс

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.