I due problemi del Day 2 proposti da Eric Wastl su Advent of Code cominciano ad essere veramente impegnativi.
Per risolverli ho utilizzato diversi strumenti messi a disposizione da FreeBASIC:
- le istruzioni per la lettura di un file di testo
- il contenitore indicizzato (array)
- la struttura di controllo select case
- il ciclo do-loop
- il ciclo for-next
- la struttura di controllo if-then-else
- la subroutine
Più sotto il codice relativo alle due soluzioni.
File 02a.bas
''programma: Quiz 1 del Day 2 di Advent of Code 2019
''autore: ciuco informatico
''data: 12 dicembre 2019
''web: https://ciucoinformatico.home.blog/
dim as integer array() ''array vuoto
dim as integer position
dim as integer value
position = 0
value = 0
''lettura del file e creazione del contenitore indicizzato (array)
open "02_input.txt" for input as #1
do until eof(1)
input #1, value ''lettura di un singolo valore
redim preserve array (0 to position) ''ridimensionamento array
array(position) = value
position += 1
loop
close #1
''restore the gravity assist program
array(1) = 12
array(2) = 2
''intcode program
position = 0
do
value = array(position)
select case value
case 1 ''somma
array(array(position +3)) = array(array(position + 1)) + array(array(position + 2))
case 2 ''moltiplica
array(array(position +3)) = array(array(position + 1)) * array(array(position + 2))
case 99 ''esce dal programma intcode
exit do
case else ''caso non previsto
print "opcode non previsto"
end select
position += 4
loop until position >= ubound(array)
''risposta del quiz 1 del Day 2
print "Il valore in posizione zero e':"; array(0)
File 02b.bas
''programma: Quiz 2 del Day 2 di Advent of Code 2019
''autore: ciuco informatico
''data: 12 dicembre 2019
''web: https://ciucoinformatico.home.blog/
dim shared array() as integer ''array vuoto
dim shared address as integer
dim shared value as integer
dim as integer opcode
''dichiarazione procedura intcode
declare sub reset_intcode
address = 0
opcode = 0
value = 0
''ciclo per il parametro "verbo" (verb)
for i as integer = 0 to 99
''ciclo per il parametro "sostantivo" (noon)
for j as integer = 0 to 99
''chiamata della procedura intcode reset input)
reset_intcode
array(2) = i ''verb
array(1) = j ''noon
address = 0
do
opcode = array(address)
select case opcode
case 1 ''somma
array(array(address +3)) = array(array(address + 1)) + array(array(address + 2))
case 2 ''moltiplica
array(array(address +3)) = array(array(address + 1)) * array(array(address + 2))
case 99 ''esce dal programma intcode
exit do
case else ''caso non previsto
print "opcode non previsto"
end select
address += 4
loop until address > ubound(array)
if array(0) = 19690720 then
''domanda del quiz 2 del Day 2
print "What is 100 * noun + verb?"; 100 * array(1) + array(2)
else
''non fare nulla
end if
next j
next i
''definizione procedura intcode
sub reset_intcode
address = 0
''lettura del file e creazione del contenitore indicizzato (array)
open "02_input.txt" for input as #1
do until eof(1)
input #1, value ''lettura di un singolo valore
redim preserve array (0 to address) ''ridimensionamento array
array(address) = value
address += 1
loop
close #1
end sub
Attenzione però!
L’algoritmo utilizzato per scrivere il codice contenuto nel file sorgente 02b.bas contiene una parte che lo rende altamente inefficiente.
Lascio a voi trovarla. 😉
Quando progettiamo i nostri algoritmi non dobbiamo mai dimenticarci di curare la fase di ottimizzazione.

