Drucken Sie meinen Blockplan

11

Meine High School und viele andere implementieren eine Art Zeitplan, der als Rotating Block Schedule bezeichnet wird. Dies ist eine Möglichkeit für Menschen, 8 Klassen zu haben, aber 6 Stunden an einem Schultag.

Es gibt vier Tage in einem Blockplan, die sich immer wieder wiederholen und nichts mit den tatsächlichen Wochentagen zu tun haben. Jedem ist eine Nummer zugeordnet [1-4].

Der Zeitplan funktioniert so, dass Sie alle Ihre Morgenstunden auflisten, Zeiträume 1-4: [1, 2, 3, 4]. Dies ist Ihr Zeitplan für den ersten Tag oder Tag 1. Der Rest der Tage drehen gerade die Liste: [2, 3, 4, 1], [3, 4, 1, 2], [4, 1, 2, 3].

Die letzte Stunde am Morgen wird jedoch "fallen gelassen" und Sie sehen diesen Lehrer an diesem Tag nicht. Daher sind die Tage: [1, 2, 3], [2, 3, 4], [3, 4, 1], [4, 1, 2].

Der Nachmittag ist das gleiche, mit der Ausnahme , dass es verwendet Perioden 5-8statt: [5, 6, 7], [6, 7, 8], [7, 8, 5], [8, 5, 6].

Deine Aufgabe

All diese Rotationen sind schwer nachzuverfolgen, daher müssen Sie ein Programm schreiben, um meinen Zeitplan auszudrucken, je nachdem, an welchem ​​Tag er eingegeben wird. Ihr Code muss Homeroom und Lunch an den richtigen Stellen platzieren. Hier ist die genaue Ausgabe, die Ihr Code für Eingaben haben muss 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

Aber warte - noch eine Sache!

Manchmal hat meine Schule am ersten Schultag oder an anderen besonderen Tagen einen "Tag 0". Dies bedeutet nur, dass ich an diesem Tag alle meine Klassen zusammen mit dem Klassenraum und dem Mittagessen haben werde. Ihr Code muss sich mit Tag 0 befassen. Hier ist die Ausgabe für einen Tag 0:

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

Dies ist also gewinnt der kürzeste Code in Bytes !

Maltysen
quelle
Gibt es 4 Tage in der Woche? Oder würde der erste Freitag zurück zu 1, 2, 3, 5, 6, 7?
Zach Gates
@ZachGates nur 4 Tage in der * Woche *. Der Blockplan würde nicht mit der tatsächlichen Schulwoche synchron sein.
Maltysen
Wann werden "Tag 0" verwendet? Woher wissen wir, aus welcher Woche wir auswählen und wie viele "Tag 0" sind bisher aufgetreten?
Zach Gates
@ZachGates Ist das nicht irrelevant? Sie müssen nur einen Ausgang für einen Eingang liefern. Es gibt nur 5 verschiedene Ausgänge.
mınxomaτ
2
@ZachGates Es gibt 5 mögliche Eingaben. Die 5 Ausgaben, die ihnen entsprechen, werden in der Herausforderung wörtlich aufgelistet.
Türknauf

Antworten:

3

Schneemann 1.0.2 , 190 Bytes

}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

Diese Spalte ganz links sieht tatsächlich ziemlich gut aus, nicht wahr?

...

... wen ich veräpple, ich würde lieber in PHP programmieren als dies.

"Lesbare" Version:

}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

Gedanken und Überlegungen:

  • Erstens muss ich definitiv eine schönere Art des Druckens von Zeilenumbrüchen implementieren. Weil Strings mit Zeilenumbrüchen in einem eingerückten Block super hässlich sind.

  • Ich mag meinen Trick mit ae- Sie sehen den aeOperator selten ohne den Ein echtem Schneemann großgeschriebenen Code. (Sie sehen auch selten Schneemann-Code, der nicht von mir geschrieben wurde, aber das ist nicht der Punkt.)

    Für die Uneingeweihten hat Snowman zwei Möglichkeiten, Operatoren anzurufen. Modus "Verbrauchen" und Modus "Nicht verbrauchen". Der Modus "Verbrauchen" ruft den Bediener mit den angeforderten Variablen auf und verwirft die Variablen. Der Nicht-Verbrauchsmodus ruft den Operator auf und lässt die Variablen intakt.

    Was normalerweise nicht das ist, was Sie mit ae(Array-Each) wollen, weil der Block, den Sie für jedes Element aufrufen, dort bleibt und Ihnen im Weg steht und eine wertvolle der acht Variablen verbraucht.

    Dies ist jedoch eine seltene Situation , in der ae ist eigentlich das, was wir wollen (die Kommentare im Code für weitere Erläuterungen siehe).

  • Ich fange wirklich an zu denken, dass Schneemann mehr als zwei Modi benötigt, außer nur "konsumieren" und "nicht konsumieren". Mit aa(im Grunde genommen Array-Indizierung) haben Sie beispielsweise nur zwei Möglichkeiten, es aufzurufen:

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

    (Snowman verwendet keine Stack / Array-Struktur, aber dies wird hier nur zur Verdeutlichung verwendet.)

    Es ist ziemlich häufig, dass Sie möchten ["foo" "f"](dh die Indexvariable verwenden, aber nicht die ursprüngliche). Es ist ein sehr komplizierter Prozess, um diesen Ärger loszuwerden, 0wenn Sie den "Nicht-Konsumieren" -Modus verwenden.

    Ähnliches passiert, wenn Sie "array-each" im Modus "nicht verbrauchen" aufrufen, wie hier beschrieben. Das Array und der Block bleiben auch während der Ausführung des Blocks bestehen . Welches ist ... wirklich, wirklich komisch.

    Andererseits ist es das Designziel von Snowman, so verwirrend wie möglich zu sein, daher bin ich mir nicht sicher, ob dies überhaupt ein Problem ist.

Türknauf
quelle
2

CJam, 65 55 Bytes

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

Probieren Sie es online im CJam-Interpreter aus .

Dennis
quelle
1

Python 3, 193 192 182 168 165 Bytes

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)

Nur eine schnelle Lösung.

Python 2, 161 Bytes

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
quelle
Sie können speichern, indem Sie die for-Schleife durch eine"\n".join
Maltysen
Es ist die gleiche Anzahl von Bytes in Python 3, aber es würde in Python 2 helfen. @Maltysen Ich werde es trotzdem hinzufügen. : P
Zach Gates
0

Pyth, 51 Bytes

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