Python
Opdracht 1:
In dit programma leest je programma twee gehele getallen op één regel met daartussen een spatie van de input. De output van het programma moet de som van deze twee getallen zijn.
Voorbeeld input:
7 11
Voorbeeld output:
18
Uitwerking:
Je moet hier de getallen inlezen op één regel. Daarvoor gebruik je input().split(). Vervolgens wil je deze omzetten naar integers en dan optellen. Dat kan op de volgende manier:
getallen = input().split()
getal1 = int(getallen[0])
getal2 = int(getallen[1])
print(getal1+getal2)
Als je het op een andere manier gedaan hebt, kun je jouw antwoord controleren door hem in te typen bij de opdracht Add two numbers op Kattis.
Opdracht 2:
In Engeland kun je zes cijfers halen voor een toets: van A (het beste), B, C, D, E tot F (het slechtse). Je programma leest op de eerste regel 5 getallen in die de grens aangeven hoeveel procent je minstens moet halen om respectievelijk een A, B, C, D of E te halen. Op regel 2 staat één getal dat aangeeft hoeveel procent jij gehaald hebt. Schrijf een programma dat als output geeft welk cijfer je gehaald hebt.
Voorbeeld input:
90 89 70 60 50
40
Voorbeeld output:
F
Uitwerking
Bij deze opdracht moeten we eerst weer de grenzen inlezen met input().split(). Vervolgens wil je van deze grenzen weer getallen maken. Dat kan door eerst vijf regels met a=int(grenzen[0]), b=int(grenzen[1]), etcetera te maken, maar omdat je ze toch maar één keer gebruikt, kun je op de plaatsen waar je later a, b, … zou gebruiken ook gewoon int(grenzen[0]) neerzetten.
In het vervolg gebruik je if-statements om te testen wat je als output moet geven. Dat kan bijvoorbeeld op de volgende manier.
grenzen = input().split()
waarde = int(input())
if waarde >= int(grenzen[0]):
print("A")
elif waarde >= int(grenzen[1]):
print("B")
elif waarde >= int(grenzen[2]):
print("C")
elif waarde >= int(grenzen[3]):
print("D")
elif waarde >= int(grenzen[4]):
print("E")
else:
print("F")
Als je een ander antwoord hebt en wilt controleren of die correct is, kun je deze in Kattis je antwoord testen bij de Kattis-opdracht Grading.
Opdracht 3:
Je programma krijgt als input een regel met daarop de vijf getallen 1 t/m 5 in willekeurige volgorde (met daartussen weer spaties). Je programma moet deze getallen via de volgende stappen sorteren:
Stap 1: Als het getal op plek 1 groter is dan het getal op plek 2 verwissel je deze getallen.
Stap 2: Als het getal op plek 2 groter is dan het getal op plek 3 verwissel je deze getallen.
Stap 3: Als het getal op plek 3 groter is dan het getal op plek 4 verwissel je deze getallen.
Stap 4: Als het getal op plek 4 groter is dan het getal op plek 5 verwissel je deze getallen.
Stap 5; Als de getallen nog niet in de volgorde 1, 2, 3, 4, 5 staan, ga je terug naar stap 1.
Schrijf een programma dat dit algoritme uitvoert waarbij de positie van de deeltjes na iedere verwisseling geprint worden.
Voorbeeld input:
2 1 5 3 4
Voorbeeld output:
1 2 5 3 4
1 2 3 5 4
1 2 3 4 5
Uitwerking:
We moeten eerst weer getallen inlezen. Aangezien we de getallen dit keer vaker nodig hebben, is het handig om ze los in variabelen te zetten. Vervolgens voeren we stap 1 tot en met stap 4 een aantal keer achter elkaar uit. Bij dit algoritme is het zo dat na de eerste keer stap 1 tot en met 4 je al zeker weet dat het grootste getal op de laatste plaats staat (waarom?). Na de tweede keer weet je dat het opeennagrootste getal op de eennalaatste plaats staat, enzovoort. Dus na vier keer de lijst doorlopen, moet de lijst helemaal geordend zijn. Dit kun je met de onderstaande for-loop voor elkaar krijgen:
getallen = input().split()
a = getallen[0]
b = getallen[1]
c = getallen[2]
d = getallen[3]
e = getallen[4]
for i in range(4):
if a > b:
a, b = b, a
print(a, b, c, d, e)
if b > c:
b, c = c, b
print(a, b, c, d, e)
if c > d:
c, d = d, c
print(a, b, c, d, e)
if d > e:
d, e = e, d
print(a, b, c, d, e)
Natuurlijk kun je in plaats daarvan ook steeds testen of de lijst al gesorteerd is. Als je een ander antwoord hebt, kun je bij de opdracht Mjehuric om te testen of je code klopt.
Programmeren met enen en nullen
Opdracht 4:
Schrijf in de programmeertaal met enen en nullen een programma dat als input een aantal positieve getallen (meer dan één) krijgt gevolgd door een nul. Als output moet je het getal 1 geven als de getallen van groot naar klein gesorteerd waren en het getal 0 als ze dat niet zijn.
Uitwerking:
Net als in de les moeten we hier ook bij iedere input (vanaf het tweede getal) twee logische tests doen:
Logische test 1:
Is de input 0? Als dat het geval is, moeten we het antwoord geven. Dit kun je op meerdere manieren doen. In mijn code heb ik ervoor gekozen om direct het antwoord 0 te geven als de lijst fout gesorteerd is en weet ik dus als ik een nul als input tegenkom dat de lijst goed gesorteerd is en ik een 1 als antwoord moet geven.
Logische test 2:
We moeten testen of de laatste input groter is dan de kleiner is dan de vorige. Dit doe ik in deze oplossing door de vorige input in reg1 te zetten en de laatste input in reg2. Ik test dan of reg1-reg2<0. Als dat zo is, gaan we door met het testen van de volgende getallen. Als dat niet zo is, geven we het antwoord 0 als output.
0: 10110001 # zet eerste input in reg1
1: 10110011 # zet input in reg3
2: 00100000 # zet het getal 32 in reg0
3: 11000001 # spring naar 32 als reg3=0
4: 10011010 # kopieer van reg3 naar reg2
5: 01000101 # zet reg1-reg2 in reg3
6: 10011001 # kopieer reg2 naar reg1
7: 00000001 # zet 1 in reg0
8: 11000110 # ga terug naar regel 1 als goed gesorteerd
9: 00100010 # zet 34 in reg0
10:11000100 # spring altijd naar regel 34
32:00000001 # zet het getal 1 in reg0
33:10000100 # zet het getal 1 in reg4
34:10000110 # Geef reg4 als antwoord
Hardware descripion language
Opdracht 5:
Maak een programma dat een output van 1 geeft als van de vier inputbits er minstens twee een 1 zijn. Anders moet hij een output van nul geven.
Input:
a, b, c, d
Output:
out
Uitwerking:
Een slome oplossing is om gewoon alle combinaties van twee inputs te testen en vervolgens met or’s te kijken of minstens één van die combinaties beide aanstaat. Deze oplossing staat hieronder.
And(a=a, b=b, out=ab);
And(a=a, a=c, out=ac);
And(a=a, b=d, out=ad);
And(a=b, a=c, out=bc);
And(a=b, b=d, out=bd);
And(a=c, a=d, out=cd);
Or(a=ab, b=ac, out=or1);
Or(a=or1, b=ad, out=or2);
Or(a=or2, b=bc, out=or3);
Or(a=or3, b=bd, out=or4);
Or(a=or4, b=cd, out=out);
Het kan op allemaal manieren sneller. Een manier is om te testen of (a en b) of (c en d) of (minstens één van a of b én minstens één van c of d) klopt. Controleer voor jezelf waarom dit voor alle combinaties van twee draden goedgaat. De code hiervan staat hieronder.
And(a=a, b=b, out=ab);
And(a=c, a=d, out=cd);
Or(a=a, b=b, out=aorb);
Or(a=c, b=d, out=cord);
AND(a=aorb, b=cord, out=ab_and_cd)
Or(a=ab, b=cd, out=or1);
Or(a=or1, b=ab_and_cd, out=out);