Please ignore secret bonuses. Secret tests do NOT award bonus. Max hw grade is 30+2 bonus efficiency

[HOMEWORK] Test homework

andrea.sterbini (207920 points)
750 1267 2373
in Annunci by (208k points)
edited by

Homework di prova - sequenza a finestra scorrevole

NOTA: questo è un HW vecchio che serve solo per provare il macchinario di test automatico

Data una sequenza S di N numeri interi, da questa si può ottenere una sequenza derivata Y di N-K interi sommando, per ogni indice i nell'intervallo [0 .. N-k], i k elementi di S agli indici j in [i .. i+k-1].

Esempio (in cui evidenzio in grassetto un valore di Y ad indice 5 ed i k elementi che sommati lo producono ad indici 5,6,7,8):

  • k = 4
  • S =   97, 77, 51, -96,   63, 45, -23, 26, -13,   -42,    -30,   -95,    47,    -91, -12, -44, -10, 53, -31, -71
  • Y = 129, 95, 63, -11, 111, 35, -52, -59, -180, -120, -169, -151, -100, -157, -13, -32, -59

Non conoscendo a priori la lunghezza della sequenza S, non è possibile pre-allocare staticamente lo spazio di memoria necessario a memorizzarla completamente prima di calcolare la sequenza Y.

Se però si sa che k è limitato è possibile produrre la stampa della sequenza Y ricordando solo gli ultimi k elementi letti.

Scrivete il programma assembly MIPS che:

  • legge il numero intero 0 < k < 21
  • legge la sequenza S di almeno k interi diversi da 0 terminata dal valore 0 (zero, che non fa parte della sequenza)
    • mano a mano che ha informazioni sufficienti, stampa i valori della sequenza Y seguiti da accapo
  • alla fine stampa (in quest'ordine, sempre seguiti da accapo) i valori
    • minimo della sequenza S
    • massimo della sequenza S
    • minimo della sequenza Y
    • massimo della sequenza Y

I valori letti in input sono tutti valori interi seguiti da accapo in modo che li possiate leggere con la syscall 5.

Esempio di input/output:

Input: (commentato, nei test NON ci saranno commenti)

4                     # K
97
77
51
-96
63
45
-23
26
-13
-42
-30
-95
47
-91
-12
-44
-10
53
-31
-71
0                 # indica fine della sequenza S, non fa parte della sequenza

 Output atteso: (commentato, nei test NON ci saranno commenti)

129
95
63
-11
111
35
-52
-59
-180
-120
-169
-151
-100
-157
-13
-32
-59
-96             # minimo della sequenza S
97              # massimo della sequenza S
-180           # minimo della sequenza Y
129            # massimo della sequenza Y

Consegna

Il file da consegnare è il file sorgente program01.asm del vostro programma (meglio se commentato):

  • NON DEVE contenere stampe/prompt diverse da quelle indicate
  • DEVE iniziare la propria esecuzione dalla etichetta main
    • ricordatevi quindi di inserire la direttiva .globl main
  • DEVE terminare la sua esecuzione con la syscall 10
  • NON DEVE memorizzare nè tutta S nè tutta Y in memoria, nè con allocazione statica, nè con quella dinamica nè con la stack.
  • DEVE: stampare Y mano a mano che legge S.
  • NOTA: i compiti copiati vengono annullati

Per consegnare il file programma.asm sviluppato in Mars usate la pagina di consegna

Scadenza della consegna:  domenica 8 aprile 2017 ore 24

Per eseguire i test in locale

  • aprite una finestra di comando/console e posizionatevi nella directory in cui avete messo i file:
    • il programma program01.asm da voi sviluppato
    • il simulatore Mars4_5.jar
    • un file di esempio di input input.txt
    • il corrispondente file di output atteso expected.txt

eseguite in console il comando

  • java -jar Mars4_5.jar me nc sm ic program01.asm < input.txt > output.txt
  • in questo modo produrrete nel file output.txt le stampe del vostro programma

  • confrontate il file output.txt con il file expected.txt, se sono uguali il test è superato

File di test

K N range di valori
1 1 -1000 .. 1000
1 18 -1000 .. 1000
2 26 -1000 .. 1000
7 100 -1000 .. 1000
8 57 -1000 .. 1000
14 69 -1000 .. 1000
17 62 -1000 .. 1000
20 68 -1000 .. 1000

NOTA: ho messo pochi dati piccoli per permettervi di debuggare il codice ma farò dei test anche con N >> 1000 e con valori grandi

Premi e cotillon

Il voto di ciascun homework dà 0.5 o 1 punto (a seconda della difficoltà) da aggiungere ai voti delle prove scritte/ASM ed è composto da due parti:

  • correttezza = % di test passati * 0.5                 (da 0 a 0.5 per questo HW)
  • efficienza = +0.5 punti se siete nel primo 1/2 della classifica di efficienza di chi ha superato tutti i test

Per calcolare la classifica dell'efficienza uso il numero di istruzioni totali eseguite dal vostro programma sui test, in ordine crescente (lower = better).

PS. se qualcosa non è chiaro chiedete sotto

1.1k views

3 Answers

f
fabrizio_ancaiani (1790 points)
0 0 9
by (1.8k points)
edited by
Colgo l'invito ad esprimere i dubbi su qualcosa che non mi è chiaro.

- per produrre l'output, si utilizzerà la syscall numero 1? Ma per l'accapo si deve usare la numero 4 con la stringa "\n" oppure la 11 con un carattere che credo dipenda dal S.O.? Nel mio sistema windows ho usato le syscall 1 e 4 ottenendo i risultati attesi, ma vedo che nel server di test non producono alcun output. Posso chiedere qui cosa sto sbagliando?

- all'inizio si specifica che bisogna considerare ogni indice i nell'intervallo [0 .. N-k-1], ma dagli esempi si evince che l'indice i dovrebbe esistere nell'intervallo [0 .. N-k ]. In questo modo risulterebbero corretti gli esempi e i test. Ho sbagliato a interpretare qualcosa?

Grazie molte per l'attenzione.
andrea.sterbini (207920 points)
750 1267 2373
by (208k points)
- per produrre l'output puoi usare tutte le syscall di stampa (1 2 3 4 11), se usi la 11 metti come carattere '\n' che l'assemblatore converte in linefeed. (FYI i test girano su Linux)
- giusto, gli ultimi k elementi sono ad indici N-k ... N-1 (ho corretto il testo)
andrea.sterbini (207920 points)
750 1267 2373
by (208k points)
Ho guardato il tuo codice, usi male la syscall 11
c
c.giannobile (660 points)
0 2 6
by (660 points)
Salve Professore,

ho lo stesso problema del collega, nonostante tutti i test eseguiti sulla mia macchina sembrerebbero andare a buon fine, quando rilascio il programma su Q2A la finestra dei risultati non torna alcun valore, come se le syscall di scrittura non andassero a buon fine.

Ho utilizzato la syscall 1 per stampare i valori interi e la syscall 4 per stampare una stringa contenente "\n" per l'accapo, ma ho provato anche con la syscall 11 passandogli direttamente il carattere '\n' o ad omettere l'accapo, ma in qualsiasi caso l'output sembrerebbe non tornare alcun risultato.

Probabilmente il fatto che i miei test vadano a buon fine mentre i rilasci no potrebbero essere dovuti al fatto che sul mio PC è installato Windows, mentre sul simulatore Linux, ma volevo capire come dovremmo comportarci per non trovarci impreparati quando bisognerà svolgere gli HW che contano.

Grazie.
c
c.giannobile (660 points)
0 2 6
by (660 points)
Salve Professore,

sto tendando di consegnare l'HW di test, ma quando provo ad effettuare il rilascio ottengo l'errore:

UTF-8 encoding mismatch

Ho provato a lanciare il programma in locale e tutti i test sembrerebbero andati a buon fine, quindi non capisco da cosa sia dovuta la problematica.

Grazie.
andrea.sterbini (207920 points)
750 1267 2373
by (208k points)
Stai lavorando in Windows? Apri il file con Notepad ++ e risalvalo nella codifica UTF8
c
c.giannobile (660 points)
0 2 6
by (660 points)
Grazie, così è andato.
s
stefanocali (1230 points)
1 2 9
by (1.2k points)
edited by
Buona sera Prof. Sterbini, ho seguito le sue videolezioni fino alla lezione numero 9.
Ho iniziato creandomi una word nel file contenente tutti i valori di S, e sembra funzionare.
Adesso sto cercando di testare in locale il programma, utilizzando il comando da console. La procedura si interrompe generandomi il seguente errore:

line 1 column 1: "4" is not a recognized operator
....
questo per ogni riga presente nel file.

Sicuramente sto sbagliando la parte di lettura, da quel che ho capito, il comando da digitare in console, dovrebbe automaticamente caricarmi uno alla volta in $v0 i valori presenti nel file esempio, come se li stessi digitando io con la syscall 5.
Puo' gentilmente indicarmi la lezione, per capire bene come avviene la lettura da un file.
Grazie
andrea.sterbini (207920 points)
750 1267 2373
by (208k points)
Se sei della teledidattica e la domanda riguarda una lezione allora dovresti fare la domanda sul forum di Unitelma.

Se invece si tratta di questo HW puoi caricare il codice su Q2A socì riesco a vederlo e posso capire qual'è il problema.
s
stefanocali (1230 points)
1 2 9
by (1.2k points)
Buongiorno, ha perfettamente ragione, non mi sono spiegato bene.
Sto cercando di sviluppare il programma per questo HW, non riesco a capire bene cosa succede quando eseguo questa riga di codice da console windows:

java -jar Mars4_5.jar me nc sm ic program01.asm < input.txt > output.txt

Cercando su internet, ho visto che dovrebbe inserire i valori contenuti nel file come se li digitassi io manualmente con la syscall 5.
Ma ogni volta che eseguo, il comando da console, mi restituisce un errore:

line 1 column 1: "4" is not a recognized operator
line 1 column 1: "97" is not a recognized operator
....

Ho provato anche con un file contenente solo l'etichetta main, e nient'altro, sempre stesso errore.
Ho caricato il codice del mio file.
Grazie per la disponibilità
andrea.sterbini (207920 points)
750 1267 2373
by (208k points)
C'era un problema di encoding del file.
Bisogna usare l'encoding utf8 ma senza BOM.
Sul server ho aggiunto un comando per eliminare il BOM ed ora il file viene eseguito
s
stefanocali (1230 points)
1 2 9
by (1.2k points)
La ringrazio per la risposta, ho appena caricato la versione ufficiale, testata in locale su tutti i file, ottenendo il risultato atteso.
Ma una volta che la carico su Q2A, mi da correttezza 0, è normale?
Grazie
andrea.sterbini (207920 points)
750 1267 2373
by (208k points)
edited by
C'era qualcosa che non andava nei miei script di test, ora sembrano funzionare
O
Oakandrew (6400 points)
7 27 64
by (6.4k points)
no, prof,purtroppo non funziona, fatto upload ora
andrea.sterbini (207920 points)
750 1267 2373
by (208k points)

crying                 .          .

andrea.sterbini (207920 points)
750 1267 2373
by (208k points)
Mo' vediamo ... a me ha funzionato ... vediamo ai prossimi