Imprimir mi horario de bloque

11

Mi escuela secundaria y muchos otros implementan un tipo de horario llamado Horario de Bloque Giratorio. Esta es una forma de que las personas tengan 8 clases, pero que tengan 6 períodos en un día escolar.

Hay cuatro días en un horario de bloque que se repiten una y otra vez, y no tienen nada que ver con los días reales de la semana. A cada uno se le asigna un número [1-4].

La forma en que funciona el programa es que la lista de todas las clases de la mañana, los períodos 1-4: [1, 2, 3, 4]. Esta es la programación para el primer día o el día 1. El resto de los días sólo gire la lista: [2, 3, 4, 1], [3, 4, 1, 2], [4, 1, 2, 3].

Sin embargo, el último período de la mañana se "cae" y no ve a ese maestro ese día. De ahí que los días son: [1, 2, 3], [2, 3, 4], [3, 4, 1], [4, 1, 2].

La tarde es el mismo, excepto que utiliza períodos 5-8en su lugar: [5, 6, 7], [6, 7, 8], [7, 8, 5], [8, 5, 6].

Tu tarea

Es difícil realizar un seguimiento de toda esta rotación, por lo que debe escribir un programa para imprimir mi horario dado qué día es como entrada. Su código tiene que colocar Homeroom and Lunch en los lugares correctos. Aquí está la salida exacta que su código debe tener para las entradas 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

Pero espera, ¡una cosa más!

A veces, en el primer día de clases, o en otros días especiales, mi escuela tiene un "Día 0". Esto solo significa que tendré todas mis clases ese día junto con el aula y el almuerzo. Su código tendrá que lidiar con el día 0. Aquí está la salida para un día 0:

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

Este es el código más corto en bytes gana!

Maltysen
fuente
¿Hay 4 días en la semana? ¿O volvería el primer viernes en bucle 1, 2, 3, 5, 6, 7?
Zach Gates
@ZachGates solo 4 días en la * semana *. El horario de bloque no estaría sincronizado con la semana escolar real.
Maltysen
¿Cuándo se usan los "Día 0"? ¿Cómo sabemos de qué semana estamos eligiendo y cuántos "Día 0" han ocurrido hasta ahora?
Zach Gates
@ZachGates ¿No es eso irrelevante? Solo tiene que suministrar una salida para una entrada. Solo hay 5 salidas distintas.
mınxomaτ
2
@ZachGates Hay 5 entradas posibles. Las 5 salidas que les corresponden se enumeran textualmente en el desafío.
Pomo de la puerta

Respuestas:

3

Muñeco de nieve 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

Esa columna de la izquierda en realidad se ve muy bien, ¿no?

...

... a quién estoy bromeando, prefiero programar en PHP que esto.

Versión "legible":

}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

Pensamientos y reflexiones:

  • En primer lugar, definitivamente necesito implementar una forma más bonita de imprimir nuevas líneas. Porque las cadenas con líneas nuevas en un bloque sangrado son súper feas.

  • Me gusta mi truco con: aerara vez se ve al aeoperador sin el Ecódigo en mayúsculas del muñeco de nieve real. (Rara vez ve el código de Snowman que no he escrito yo, pero eso no viene al caso).

    Para los no iniciados, Snowman tiene dos formas de llamar a los operadores. Modo "Consumir" y modo "no consumir". El modo "Consumir" llamará al operador con las variables solicitadas y luego descartará las variables. El modo sin consumo llamará al operador y aún dejará las variables intactas.

    Lo que generalmente no es lo que desea con ae(array-each), porque el bloque que está llamando a cada elemento permanecerá allí y se interpondrá en su camino, utilizando una preciosa de las ocho variables.

    Sin embargo, esta es una situación rara en la que en realidad ae es lo que queremos (ver los comentarios en el código para más explicaciones).

  • Estoy realmente empezando a pensar que Snowman necesita más de dos modos, además de "consumir" y "no consumir". Por ejemplo, con aa(básicamente indexación de matriz), solo obtiene dos formas de llamarlo:

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

    (Snowman no usa una estructura de pila / matriz, pero eso simplemente se usa aquí para mayor claridad).

    Es bastante común que desee ["foo" "f"](es decir, consumir la variable de índice, pero no la original). Es un proceso súper complicado para deshacerse de ese molesto 0si usa el modo "no consumir".

    Algo similar ocurre cuando se llama "array-each" en modo "no consumir", como se hace aquí. La matriz y el bloque se quedan, incluso durante la ejecución de dicho bloque . Lo cual es ... muy, muy raro.

    Por otra parte, el objetivo de diseño de Snowman es ser lo más confuso posible, por lo que no estoy seguro de si esto es un problema en absoluto.

Pomo de la puerta
fuente
2

CJam, 65 55 bytes

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

Pruébelo en línea en el intérprete de CJam .

Dennis
fuente
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)

Solo una solución rápida.

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)
Puertas de Zach
fuente
Puede ahorrar reemplazando el bucle for con un"\n".join
Maltysen
Es la misma cantidad de bytes en Python 3, pero ayudaría en Python 2. @Maltysen Sin embargo, lo agregaré. : P
Zach Gates
0

Pyth, 51 bytes

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