Роздрукувати мій блок-графік


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].

Ваше завдання

Все це обертання важко відстежувати, тому вам доведеться написати програму, щоб роздрукувати мій графік, враховуючи, який день він є вхідним. Ваш код повинен розміщувати домашню кімнату та обід у правильних місцях. Ось точний вихід, який повинен мати ваш код для входів 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 дні на * тижні *. План-графік не синхронізується з фактичним навчальним тижнем.
Мальтісен

Коли використовуються "День 0"? Як ми можемо знати, з якого тижня ми збираємось, і скільки "Дня 0" відбулося до цього часу?
Zach Gates

@ZachGates Це не має значення? Вам просто потрібно поставити один вихід на один вхід. Є лише 5 різних виходів.
mınxomaτ

2
@ZachGates Є 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великих літер у реальному коді Сніговика. (Ви також рідко бачите код Сніговика, який не написаний мною, але це крім пункту.)

    Для непосвячених Сніговик має два способи викликати операторів. Режим "Споживати" та "Не споживати". Режим "Споживати" викликає оператора із запитаними змінними, а потім відкидає змінні. Режим без споживання зателефонує оператору і залишить змінні незмінними.

    Що, як правило, не те, що ви хочете ae(масив кожен), тому що блок, який ви викликаєте кожен елемент, залишиться там і перешкодить вам, використовуючи дорогоцінну одну з восьми змінних.

    Однак це рідкісна ситуація, в якій насправді ae є те, чого ми хочемо (див. Коментарі в коді для подальшого пояснення).

  • Я дійсно, дуже починаю думати, що Сніговику потрібно більше двох режимів, крім того, щоб просто "споживати" та "не-споживати" Наприклад, за допомогою aa(в основному індексації масиву) ви можете викликати лише два способи:

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

    (Сніговик не використовує структуру стека / масиву, але тут просто використовується для наочності.)

    Досить поширене, що ви хочете ["foo" "f"](тобто споживати змінну індексу, але не оригінальну). Це супер перекручений процес, щоб позбутися від цього докучливого, 0якщо ви використовуєте режим "не споживайте".

    Аналогічна річ відбувається, коли ви викликаєте "масив кожного" в режимі "робити не споживати", як це робиться тут. Масив та блок тримаються навколо, навіть під час виконання згаданого блоку . Що ... справді, дуже дивно.

    Знову ж таки, мета дизайну Snowman - бути максимально заплутаною, тому я не впевнений, чи це взагалі проблема.



1

Пітон 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
Zach Gates

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.