Wydrukuj mój harmonogram bloków

11

Moje liceum i wielu innych wdraża pewien rodzaj harmonogramu zwanego harmonogramem rotacyjnego bloku. Jest to sposób, w jaki ludzie mają 8 klas, ale mają 6 okresów w dzień szkolny.

W harmonogramie blokowym są cztery dni, które powtarzają się w kółko i nie mają nic wspólnego z faktycznymi dniami tygodnia. Każdy ma przypisany numer [1-4].

Sposób harmonogram działa jest to, że lista wszystkich klasach rano, okresy 1-4: [1, 2, 3, 4]. To jest Twój plan na pierwszy dzień, czy Dzień 1. Reszta dni po prostu obrócić listę: [2, 3, 4, 1], [3, 4, 1, 2], [4, 1, 2, 3].

Jednak ostatni okres rano jest „porzucony” i tego dnia nie widzisz tego nauczyciela. Stąd dni to: [1, 2, 3], [2, 3, 4], [3, 4, 1], [4, 1, 2].

Popołudnie jest taka sama, chyba że wykorzystuje okresy 5-8zamiast: [5, 6, 7], [6, 7, 8], [7, 8, 5], [8, 5, 6].

Twoje zadanie

Trudno jest śledzić to wszystko, więc musisz napisać program, który wydrukuje mój harmonogram, biorąc pod uwagę dzień, w którym jest on wprowadzany. Twój kod musi umieścić Homeroom i Lunch we właściwych miejscach. Oto dokładne dane wyjściowe, które Twój kod musi mieć dla danych wejściowych 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

Ale czekaj - jeszcze jedno!

Czasami, pierwszego dnia szkoły lub w inne specjalne dni, moja szkoła ma „Dzień 0”. Oznacza to po prostu, że będę miał wszystkie moje zajęcia tego samego dnia, razem z kolacją i obiadem. Twój kod będzie musiał obsługiwać Dzień 0. Oto wynik dla dnia 0:

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

To jest więc wygrywa najkrótszy kod w bajtach !

Maltysen
źródło
Czy są 4 dni w tygodniu? A może pierwsza pętla w piątek wróciłaby do 1, 2, 3, 5, 6, 7?
Zach Gates
@ZachGates tylko 4 dni w * tygodniu *. Harmonogram bloków byłby niezgodny z rzeczywistym tygodniem szkolnym.
Maltysen
Kiedy stosuje się „Dzień 0”? Skąd wiemy, z którego tygodnia wybieramy i ile „Dnia 0” miało miejsce do tej pory?
Zach Gates
@ZachGates Czy to nie jest bez znaczenia? Musisz tylko dostarczyć jedno wyjście dla jednego wejścia. Istnieje tylko 5 różnych wyników.
mınxomaτ
2
@ZachGates Istnieje 5 możliwych danych wejściowych. 5 odpowiadających im wyjść jest wymienionych dosłownie w wyzwaniu.
Klamka

Odpowiedzi:

3

Snowman 1.0.2 , 190 bajtów

}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

Ta kolumna z lewej strony wygląda całkiem ładnie, prawda?

...

... kogo żartuję, wolałbym programować w PHP niż to.

Wersja „czytelna”:

}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

Myśli i rozważania:

  • Po pierwsze, zdecydowanie muszę wdrożyć ładniejszy sposób drukowania nowych linii. Ponieważ ciągi z nowymi liniami w wciętym bloku są bardzo brzydkie.

  • Podoba mi się moja sztuczka z ae- rzadko widujesz aeoperatora bez użycia Eprawdziwego kodu Snowman. (Rzadko widuje się też kod Snowmana, który nie jest napisany przeze mnie, ale poza tym jest o co chodzi).

    Dla niewtajemniczonych Snowman ma dwa sposoby dzwonienia do operatorów. Tryb „konsumpcji” i tryb „nieużywania”. Tryb „Zużycie” wywoła operatora wymaganymi zmiennymi, a następnie odrzuci zmienne. Tryb nieużywania wywoła operatora i nadal pozostawi zmienne nienaruszone.

    Co zwykle nie jest tym, czego chcesz ae(tablica-każdy), ponieważ blok, który wywołujesz dla każdego elementu, pozostanie tam i stanie ci na drodze, wykorzystując cenną jedną z ośmiu zmiennych.

    Jest to jednak rzadka sytuacja, w której ae tak naprawdę chcemy (zobacz komentarze w kodzie, aby uzyskać dodatkowe wyjaśnienia).

  • Naprawdę, naprawdę zaczynam myśleć, że Bałwan potrzebuje więcej niż dwóch trybów, oprócz „konsumpcji” i „nie konsumpcji”. Na przykład dzięki aa(w zasadzie indeksowaniu tablic) masz tylko dwa sposoby, aby to nazwać:

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

    (Bałwan nie używa struktury stosu / tablicy, ale tutaj jest to po prostu używane dla zachowania przejrzystości.)

    Jest to dość powszechne, że chcesz ["foo" "f"](tj. Zużywają zmienną indeksu, ale nie oryginalną). Jest to bardzo skomplikowany proces, aby pozbyć się tego irytującego, 0jeśli używasz trybu „nie zużywaj”.

    Podobnie dzieje się, gdy wywołasz „tablicę każdego” w trybie „nie zużywaj”, tak jak to tutaj zrobiono. Tablica i blok trzymają się, nawet podczas wykonywania wspomnianego bloku . Co jest ... naprawdę, naprawdę dziwne.

    Z drugiej strony, celem projektu Snowman jest jak najbardziej zagmatwane, więc nie jestem pewien, czy to w ogóle problem.

Klamka
źródło
2

CJam, 65 55 bajtów

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

Wypróbuj online w interpretatorze CJam .

Dennis
źródło
1

Python 3, 193 192 182 168 165 bajtów

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)

Po prostu szybkie rozwiązanie.

Python 2, 161 bajtów

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
źródło
Możesz zaoszczędzić, zastępując pętlę for"\n".join
Maltysen
W Pythonie 3 jest tyle samo bajtów, ale pomogłoby to w Pythonie 2. @Maltysen Dodam jednak. : P
Zach Gates
0

Pyth, 51 bajtów

"Homeroom"j"Lunch
"c2jb+L"Period "+J?QP.<S4tQS4+L4J
orlp
źródło