Imprimir minha agenda de blocos

11

Minha escola e muitos outros implementam um tipo de programação chamada de Rotating Block Schedule. É uma maneira de as pessoas terem 8 aulas, mas terem 6 períodos em um dia escolar.

Há quatro dias em um cronograma de blocos que se repetem sem parar e não têm nada a ver com os dias reais da semana. Cada um recebe um número [1-4].

A forma como o cronograma funciona é que você listar todas as suas aulas de manhã, períodos 1-4: [1, 2, 3, 4]. Esta é a sua programação para o primeiro dia, ou dia 1. O resto dos dias basta girar a lista: [2, 3, 4, 1], [3, 4, 1, 2], [4, 1, 2, 3].

No entanto, o último período da manhã é "descartado" e você não vê esse professor naquele dia. Por isso, os dias são: [1, 2, 3], [2, 3, 4], [3, 4, 1], [4, 1, 2].

A tarde é o mesmo, exceto que ele usa períodos 5-8em vez disso: [5, 6, 7], [6, 7, 8], [7, 8, 5], [8, 5, 6].

Sua tarefa

É difícil acompanhar todo esse giro, então você precisa escrever um programa para imprimir minha programação, considerando o dia em que é como entrada. Seu código deve colocar Homeroom e Lunch nos pontos corretos. Aqui está a saída exata que seu código precisa ter para 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

Mas espere - mais uma coisa!

Às vezes, no primeiro dia de aula ou em outros dias especiais, minha escola tem um "Dia 0". Isso significa apenas que terei todas as minhas aulas naquele dia, junto com a sala de aula e o almoço. Seu código terá que lidar com o dia 0. Aqui está a saída para um dia 0:

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

Este é o pelo que o código mais curto em bytes vence!

Maltysen
fonte
Existem 4 dias na semana? Ou a primeira sexta-feira volta para 1, 2, 3, 5, 6, 7?
Zach Gates
@ZachGates apenas 4 dias na * semana *. O horário do bloco estaria fora de sincronia com a semana escolar real.
Maltysen 15/09/2015
Quando o "Dia 0" é usado? Como sabemos em que semana estamos escolhendo e quantos "Dia 0" ocorreram até agora?
Zach Gates
@ZachGates Isso não é irrelevante? Você apenas precisa fornecer uma saída para uma entrada. Existem apenas 5 saídas distintas.
mınxomaτ 15/09/2015
2
@ZachGates Existem 5 entradas possíveis. As 5 saídas que correspondem a elas são listadas literalmente no desafio.
Maçaneta da porta

Respostas:

3

Boneco de neve 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

A coluna mais à esquerda realmente parece muito legal, não é?

...

... quem eu estou brincando, eu prefiro programar em PHP do que isso.

Versão "legível":

}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

Pensamentos e reflexões:

  • Em primeiro lugar, eu definitivamente preciso implementar uma maneira mais bonita de imprimir novas linhas. Porque strings com novas linhas em um bloco recuado são super feias.

  • Eu gosto do meu truque ae- você raramente vê o aeoperador sem o Ecapitalizado no código real do boneco de neve. (Você também raramente vê o código do Snowman que não foi escrito por mim, mas está além do ponto.)

    Para os não iniciados, o Snowman tem duas maneiras de ligar para os operadores. Modo "consumir" e modo "não consumir". O modo "consumir" chamará o operador com as variáveis ​​solicitadas e as descartará. O modo de não consumo chamará o operador e ainda deixará as variáveis ​​intactas.

    O que geralmente não é o que você deseja ae(array cada), porque o bloco que você está chamando em cada elemento fica lá e fica no seu caminho, usando uma preciosa das oito variáveis.

    No entanto, essa é uma situação rara na qual ae é realmente o que queremos (consulte os comentários no código para obter mais explicações).

  • Estou realmente começando a pensar que o Snowman precisa de mais de dois modos, além de apenas "consumir" e "não consumir". Por exemplo, com aa(basicamente indexação de matriz), você só tem duas maneiras de chamá-lo:

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

    (O Snowman não usa uma estrutura de pilha / matriz, mas isso é simplesmente usado para maior clareza aqui.)

    É bastante comum que você queira ["foo" "f"](ou seja, consuma a variável de índice, mas não a original). É um processo super complicado para se livrar desse incômodo 0se você usar o modo "não consumir".

    Uma coisa semelhante acontece quando você chama "array-each" no modo "não consumir", como é feito aqui. A matriz e o bloco permanecem, mesmo durante a execução do referido bloco . O que é ... muito, muito estranho.

    Por outro lado, o objetivo do design do Snowman é ser o mais confuso possível, por isso não tenho certeza se isso é um problema.

Maçaneta da porta
fonte
2

CJam, 65 55 bytes

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

Experimente on-line no intérprete CJam .

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

Apenas uma solução 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)
Zach Gates
fonte
Você pode salvar substituindo o loop for por um"\n".join
Maltysen 15/15
É a mesma quantidade de bytes no Python 3, mas ajudaria no Python 2. @ Maltysen Vou adicioná-lo. : P
Zach Gates
0

Pitão, 51 bytes

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