Imprimer mon calendrier de blocage

11

Mon lycée et bien d'autres mettent en œuvre un type d'horaire appelé horaire à blocs rotatifs. C'est une façon pour les gens d'avoir 8 classes, mais d'avoir 6 périodes dans une journée d'école.

Il y a quatre jours dans un calendrier de bloc qui se répètent encore et encore et n'ont rien à voir avec les jours réels de la semaine. Un numéro leur est attribué à chacun [1-4].

La façon dont le programme fonctionne est que vous listez toutes vos classes du matin, les périodes 1-4: [1, 2, 3, 4]. Ceci est votre emploi du temps pour le premier jour, ou le jour 1. Le reste des jours tourner juste la liste: [2, 3, 4, 1], [3, 4, 1, 2], [4, 1, 2, 3].

Cependant, la dernière période du matin est "abandonnée" et vous ne voyez pas ce professeur ce jour-là. Par conséquent , les jours sont: [1, 2, 3], [2, 3, 4], [3, 4, 1], [4, 1, 2].

L'après - midi est le même, sauf qu'il utilise des périodes 5-8plutôt: [5, 6, 7], [6, 7, 8], [7, 8, 5], [8, 5, 6].

Ta tâche

Toute cette rotation est difficile à suivre, vous devez donc écrire un programme pour imprimer mon calendrier en fonction du jour où il est entré. Votre code doit placer Homeroom et Lunch aux bons endroits. Voici la sortie exacte dont votre code a besoin pour les entrées 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

Mais attendez - Encore une chose!

Parfois, le premier jour d'école, ou d'autres jours spéciaux, mon école a un "Jour 0". Cela signifie simplement que j'aurai tous mes cours ce jour-là avec ma chambre et mon déjeuner. Votre code devra gérer les jours 0. Voici la sortie pour un jour 0:

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

C'est le donc le code le plus court en octets gagne!

Maltysen
la source
Y a-t-il 4 jours dans la semaine? Ou le premier vendredi reviendrait-il en boucle 1, 2, 3, 5, 6, 7?
Zach Gates
@ZachGates seulement 4 jours dans la * semaine *. L'horaire des blocs ne serait pas synchronisé avec la semaine scolaire réelle.
Maltysen
Quand le "Jour 0" est-il utilisé? Comment savons-nous de quelle semaine nous choisissons et combien de "Jour 0" se sont produits jusqu'à présent?
Zach Gates
@ZachGates N'est-ce pas hors de propos? Il vous suffit de fournir une sortie pour une entrée. Il n'y a que 5 sorties distinctes.
mınxomaτ
2
@ZachGates Il y a 5 entrées possibles. Les 5 sorties qui leur correspondent sont listées textuellement dans le challenge.
Poignée de porte

Réponses:

3

Snowman 1.0.2 , 190 octets

}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

Cette colonne la plus à gauche est plutôt jolie, non?

...

... à qui je plaisante, je préfère programmer en PHP que ça.

Version "lisible":

}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

Réflexions et réflexions:

  • Tout d'abord, j'ai certainement besoin d'implémenter une manière plus jolie d'imprimer des nouvelles lignes. Parce que les chaînes avec des sauts de ligne dans un bloc en retrait sont super moches.

  • J'aime mon truc avec - aevous voyez rarement l' aeopérateur sans le Ecapital dans le vrai code Snowman. (Vous voyez également rarement du code Snowman qui n'est pas écrit par moi, mais c'est d'ailleurs le point.)

    Pour les non-initiés, Snowman a deux façons d'appeler les opérateurs. Mode «consommer» et mode «non consommé». Le mode "Consommer" appellera l'opérateur avec les variables demandées puis supprimera les variables. Le mode sans consommation appellera l'opérateur et laissera toujours les variables intactes.

    Ce qui n'est généralement pas ce que vous voulez avec ae(tableau-chacun), car le bloc que vous appelez sur chaque élément y restera et vous gênera, en utilisant une précieuse des huit variables.

    Cependant, cela est une situation rare dans laquelle ae est en fait ce que nous voulons (voir les commentaires dans le code pour plus d' explications).

  • Je commence vraiment, vraiment à penser que Snowman a besoin de plus de deux modes, autres que "consommer" et "ne pas consommer". Par exemple, avec aa(essentiellement l'indexation de tableaux), vous n'avez que deux façons de l'appeler:

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

    (Snowman n'utilise pas de structure pile / tableau, mais c'est simplement utilisé pour plus de clarté ici.)

    Il est assez courant de vouloir ["foo" "f"](c'est-à-dire consommer la variable d'index, mais pas celle d'origine). C'est un processus très compliqué pour se débarrasser de cet ennuyeux 0si vous utilisez le mode "ne pas consommer".

    Une chose similaire se produit lorsque vous appelez "array-each" en mode "do-not-consume", comme c'est le cas ici. Le tableau et le bloc restent, même pendant l'exécution dudit bloc . Ce qui est ... vraiment, vraiment bizarre.

    Là encore, l'objectif de conception de Snowman est d'être aussi déroutant que possible, donc je ne suis pas sûr que ce soit un problème.

Poignée de porte
la source
2

CJam, 65 55 octets

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

Essayez-le en ligne dans l' interpréteur CJam .

Dennis
la source
1

Python 3, 193 192 182 182 168 165 octets

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)

Juste une solution rapide.

Python 2, 161 octets

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)
Portes Zach
la source
Vous pouvez économiser en remplaçant la boucle for par un"\n".join
Maltysen
C'est la même quantité d'octets en Python 3, mais cela aiderait en Python 2. @Maltysen Je l'ajouterai cependant. : P
Zach Gates
0

Pyth, 51 octets

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