Stampa il mio programma di blocco


11

Il mio liceo e molti altri implementano un tipo di programma chiamato un programma a blocchi rotanti. Questo è un modo per le persone di avere 8 lezioni, ma di avere 6 periodi in un giorno di scuola.

Ci sono quattro giorni in un programma a blocchi che si ripetono più volte e non hanno nulla a che fare con i giorni effettivi della settimana. A ciascuno è assegnato un numero [1-4].

Il modo in cui il programma funziona è che si elencano tutte le lezioni del mattino, periodi 1-4: [1, 2, 3, 4]. Questo è il vostro programma per il primo giorno, o il giorno 1. Il resto dei giorni basta ruotare l'elenco: [2, 3, 4, 1], [3, 4, 1, 2], [4, 1, 2, 3].

Tuttavia, l'ultimo periodo del mattino viene "lasciato cadere" e quel giorno non si vede quell'insegnante. Di qui le giornate sono: [1, 2, 3], [2, 3, 4], [3, 4, 1], [4, 1, 2].

Il pomeriggio è lo stesso, eccetto che utilizza periodi 5-8invece: [5, 6, 7], [6, 7, 8], [7, 8, 5], [8, 5, 6].

Il tuo compito

È difficile tenere traccia di tutte queste rotazioni, quindi devi scrivere un programma per stampare il mio programma dato che giorno è come input. Il tuo codice deve posizionare Homeroom e Lunch nei punti corretti. Ecco l' output esatto che il tuo codice deve avere per gli input 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

Ma aspetta - Un'altra cosa!

A volte, il primo giorno di scuola o altri giorni speciali, la mia scuola ha un "Giorno 0". Questo significa solo che avrò tutte le mie lezioni quel giorno insieme a casa e pranzo. Il tuo codice dovrà occuparsi del Day 0. Ecco l'output per un giorno 0:

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

Questo è quindi vince il codice più breve in byte !


Ci sono 4 giorni alla settimana? O tornerebbe il primo venerdì 1, 2, 3, 5, 6, 7?
Zach Gates,

@ZachGates solo 4 giorni nella * settimana *. Il programma dei blocchi non sarebbe sincronizzato con la settimana scolastica effettiva.
Maltysen,

Quando vengono utilizzati i "Day 0"? Come facciamo a sapere da quale settimana selezioniamo e quanti "Day 0" si sono verificati finora?
Zach Gates,

@ZachGates Non è irrilevante? Devi solo fornire un output per un input. Ci sono solo 5 uscite distinte.
mınxomaτ,

2
@ZachGates Ci sono 5 possibili ingressi. Le 5 uscite che corrispondono ad esse sono elencate alla lettera nella sfida.
Maniglia della porta

Risposte:


3

Pupazzo di neve 1.0.2 , 190 byte

}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

La colonna più a sinistra sembra davvero carina, vero?

...

... chi sto prendendo in giro, preferirei programmare in PHP piuttosto che in questo.

Versione "leggibile":

}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

Pensieri e riflessioni:

  • In primo luogo, ho sicuramente bisogno di implementare un modo più carino di stampare nuove righe. Perché le stringhe con newline in un blocco rientrato sono super brutte.

  • Mi piace il mio trucco: aeraramente vedi l' aeoperatore senza il Emaiuscolo in codice Snowman reale. (Raramente vedi anche il codice del pupazzo di neve che non è stato scritto da me, ma a parte questo.)

    Per chi non lo sapesse, Snowman ha due modi per chiamare gli operatori. Modalità "Consumo" e modalità "non consumo". La modalità "Consumo" chiamerà l'operatore con le variabili richieste e quindi eliminerà le variabili. La modalità non consumo chiamerà l'operatore e lascerà comunque intatte le variabili.

    Che di solito non è quello che vuoi ae(array-ciascuno), perché il blocco che stai chiamando su ogni elemento rimarrà lì e ti ostacolerà, utilizzando una preziosa delle otto variabili.

    Tuttavia, questa è una situazione rara in cui ae è effettivamente ciò che vogliamo (vedere i commenti nel codice per ulteriori spiegazioni).

  • Sto davvero, davvero iniziando a pensare che Snowman abbia bisogno di più di due modalità, oltre a "consumare" e "non consumare". Ad esempio, con aa(essenzialmente indicizzazione di array), hai solo due modi per chiamarlo:

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

    (Pupazzo di neve non usa una struttura stack / array, ma qui viene semplicemente usato per chiarezza.)

    È abbastanza comune che tu voglia ["foo" "f"](cioè consumare la variabile indice, ma non quella originale). È un processo super complicato per sbarazzarsi di quel fastidioso 0se si utilizza la modalità "non consumare".

    Una cosa simile accade quando si chiama "array-each" in modalità "non consumare", come viene fatto qui. L'array e il blocco rimangono attaccati, anche durante l'esecuzione di detto blocco . Il che è ... davvero molto strano.

    Inoltre, l'obiettivo progettuale di Snowman è quello di essere il più confuso possibile, quindi non sono sicuro che si tratti di un problema.


2

CJam, 65 55 byte

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

Provalo online nell'interprete CJam .


1

Python 3, 193 192 182 168 165 byte

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 soluzione rapida.

Python 2, 161 byte

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)

Puoi salvare sostituendo il ciclo for con un"\n".join
Maltysen

È la stessa quantità di byte in Python 3, ma sarebbe utile in Python 2. @Maltysen Lo aggiungerò però. : P
Zach Gates,

0

Pyth, 51 byte

"Homeroom"j"Lunch
"c2jb+L"Period "+J?QP.<S4tQS4+L4J
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.