Testoppgave Alternativt oblig-løp
Denne oppgaven er ment for studenter som har lyst på en smakebit på det alternative oblig-løpet. Oppgaven skal være mulig å løse ved hjelp av det man har lært de første to ukene i IN1000, men er ment å være vanskeligere enn andre oppgaver gitt disse to ukene. Det gis også færre detaljerte instruksjoner om hvordan man skal løse oppgaven enn hva som er typisk for vanlige oppgaver og innleveringer i IN1000.
Du finner løsningsforslag her, men ikke se på det før du har gjort et ordentlig forsøk på å løse oppgaven!
Spørsmål til oppgaven kan rettes til ivargry@ifi.uio.no.
Kjærlighetskalkulator
I denne oppgaven skal vi lage en bot som skal fortelle hvor god match den tror det er mellom to personer.
Boten skal samle informasjon om de to personene, gjøre vurderinger og til slutt printe en prosent mellom 0 og 100. Boten skal implementeres stegvis i løpet av de neste oppgavene, og for å sjekke at du har gjort alt riktig vil det til slutt være noen "test-caser" som du kan teste boten på.
Oppgave 1: En superenkel bot
Lag en fil lovetester.py
som du skriver all koden i. Skriv et enkelt Python-program som leser inn navnet på to personer og lagrer navnene i to variable. Definer en variabel match
som har verdien 0
.
Vi ønsker å starte med å konvertere navnene til små bokstaver slik at sammenligningene vi skal gjøre blir enklere. Du kan konvertere et navn til små bokstaver slik:
navn1 = navn1.lower()
Denne enkle boten bryr seg kun om navnene til de to personene:
- Hvis navnene er like lange er boten ganske fornøyd, og sier at matchen er 60%.
- Hvis navnene ikke er like lange, men begynner med samme forbokstav, er boten fortsatt litt optimistisk, og spår at matchen er 40%.
- Hvis ingen av kravene over oppfylles, er boten mistfornøyd, og matchen er bare 15%.
Tips:
- Du kan hente ut den første boktaven til en streng slik:
navn = "Ola"
forste_bokstav = navn[0]
- Lengden til en streng kan hentes ut med funksjonen
len
:
lengde = len(navn)
Test programmet ditt med et par navn, og sjekk at riktig match-prosent printes.
Oppgave 2: Bosted og alder
Utvid programmet slik at også bosted leses inn. Hvis bostedet til de to personene er det samme, skal match-prosenten økes med 50 prosent av sin opprinnelige verdi (det verdien var etter at koden i oppgave 1 har kjørt). Merk at det ikke skal legges til 50, men at matchen skal økes med 50 prosent av det den var. Hvis verdien f. eks var 60 etter at navnene var vurdert, skal verdien økes med 50% av dette, dvs at 30 skal legges til og vi ender på 90 prosent. Dette gjøres enklest ved å gange tallet som ble bestemt av reglene i oppgave 1 med 1.5.
Etter at bosted er vurdert, skal vi vurdere alder:
- Hvis den ene personen er yngre enn halvparten + 7 av den andres alder, skal match-prosenten halveres.
- Hvis forrige kritere ikke oppfylles, og begge er akkurat samme alder, skal prosenten økes med 10% (altså ganges med 1.1).
OBS: Rekkefølgen på reglene er viktig her. Husk å implementere bosted før alder.
Test gjerne programmet ditt litt før du går videre. Sjekk for eksempel at to personer som heter det samme, bor på samme sted og som har samme alder får 99% match.
Oppgave 3: Hemmelig faktor
Vi ønsker at boten vår skal være litt mystisk og ikke så forutsigbar. Vi ønsker derfor at den skal påvirke match-prosenten på litt rare måter slik at de som bruker den ikke skal klare å skjønne hvordan den fungerer.
Vi antar her at en match-prosent har blitt bestemt basert på reglene i oppgave 1 og 2, og vi ønsker å endre denne prosentene videre.
Implementer følgende regler:
- Øk match-prosenten med 2 hvis et av navnene inneholder en a eller en t. Du kan sjekke om en bokstav finnes i en streng slik:
if "t" in "et navn":
# t finnes i strengen "et navn"
- Øk match-prosenten med 15 hvis et av navnene inneholder både en
s
og ene
og det andre navnet ikke inneholder ene
. - Senk match-prosenten med 20 hvis forbokstaven til det første navnet som leses inn ikke finnes i det andre navnet.
- Gi en superboost og øk match-prosenten med 30 hvis et av navnene slutter på bokstaven som det andre navnet starter på. PS: Siste bokstav kan finnes slik:
siste_bokstav = navn[-1]
. - Vi mistenker at korte navn er tulle-navn og ønsker ikke å gi dem høy score. Sørg for at hvis et av navnene er på ett tegn, skal matchen være 0% uansett.
Til slutt: Vi ønsker ikke desimaltall i prosenten som printes. Rund derfor at prosenten før den printes. Hvis prosenten ender opp med å være over 100 skal den bli 100. Hvis den ender opp under 0 skal den bli 0.
match = round(match)
Test at du har implementert reglene rett
Hvis du har gjort alt rett, bør du få følgende match-prosenter:
- 18% med Per, 25 år fra Oslo og Reidunn, 85 år fra Harstad
- 8% med Svein, 50 år fra Oslo og Mari, 31 år fra Oslo
- 14% med Svein, 23 år fra Oslo og Mari, 23 år fra Bergen
- 92% med Amed, 23 år fra Oslo og Lisa, 29 år fra Hamar
- 0% med X, 1000 år fra Venus og Bjørnar, 18 år fra Trondheim