Base-29 – hvordan...?

Her kan du stille spørsmål vedrørende problemer og oppgaver i matematikk på høyskolenivå. Alle som har kunnskapen er velkommen med et svar. Men, ikke forvent at admin i matematikk.net er spesielt aktive her.

Moderatorer: Vektormannen, espen180, Aleks855, Solar Plexsus, Gustav, Nebuchadnezzar, Janhaa

Svar
Gjest

Hei! Prøvde meg i VGS-forumet først, men mulig det ble litt for vanskelig. Fikk ingen svar, i alle fall. Håper det er OK at jeg reposter den i dette forumet, og så håper jeg på flere svar her! :D

Jeg var nylig med i en programmeringsjulekalender, der vi skulle løse små nøtter ved hjelp av programmering. En av disse var som følger:
Kolonner i Excel kan blas i til det nesten evinnelige. Hver kolonne har et navn som følger mønsteret under, der tallet til venstre for pila er kolonnenummeret, mens strengen til høyre for pila er kolonnenavnet.

1 -> A
2 -> B
3 -> C
...
29 -> Å
30 -> AA
31 -> AB
...
58 -> AÅ
...
88 -> CA
Hvilket kolonnenummer har kolonnenavnet GODJULOGGODTNYTTÅR?
Min første tanke var jo at dette er en vanlig konvertering mellom base-29 og base-10, der vi kan lese kodeordet baklengs, og altså får $(R) 18 \cdot 29^0 + (Å) 29 \cdot 29^1 + (T) 20 \cdot 29^2$ osv.

Men i diskusjonstråden ble det postet en helt annen løsning, som til min store forbløffelse fungerer, og jeg forstår ikke hvorfor.

Kode: Velg alt

alpha = ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Æ', 'Ø', 'Å')
goal = "GODJULOGGODTNYTTÅR"
n = 0
for c in goal:
    n = n * 29 + alpha.index(c) + 1
print(n)
For de som ikke kan lese Python-kode, så følger en liten forklaring her:
Vi starter med en verdi $n=0$, som vi bruker til å bygge opp svaret vårt.
Kodeordet leses en bokstav av gangen, fra G til R, og for hver bokstav, så multipliserer vi $n$ med 29, og legger til bokstavens posisjon i alfabetet. Denne verdien blir så vår nye $n$.
De første iterasjonene blir da altså:
G: $n = 0 \cdot 29 + 7 = 7$
O: $n = 7 \cdot 29 + 15 = 218$
D: $n = 218 \cdot 29 + 4 = 6326$
...
og så videre.

Jeg har sittet i flere dager nå og kvernet hjernen for å prøve å finne ut hvordan dette ender opp med riktig svar, men jeg skjønner det ikke. Er det noen som forstår og kan hjelpe meg? :D
DennisChristensen
Grothendieck
Grothendieck
Innlegg: 826
Registrert: 09/02-2015 23:28
Sted: Oslo

Du har tenkt helt riktig, og løsningen baserer seg på et base-29-system på samme måte som du har tenkt. For hvert steg multipliseres $n$ med 29. I base-29 er dette ekvivalent med å "legge til en nuller" på slutten av tallet $n$ (tenk hva som skjer om du multipliserer et tall med 10 i base 10). Dermed legges neste siffer til, nemlig alpha.index(c) + 1 (husk at vi alltid teller fra 0 i python).
Aleks855
Rasch
Rasch
Innlegg: 6855
Registrert: 19/03-2011 15:19
Sted: Trondheim
Kontakt:

Ser Dennis allerede har svart, men det er fint å sette opp et tilsvarende eksempel i 10-tallsystemet.

La oss si vi skal skrive tallet 876 i 10-tallsystemet på samme måte.

n = 0
c = 8

n = 0 * 10 + 8 = 0

c = 7

n = n * 10 + 7 = 8 * 10 + 7 = 80 + 7 = 87 (her ser vi at siden vi ganget den forrige n-en med 10, så er 8ern flyttet mot venstre og gjør plass til neste siffer)

c = 6

n = n * 10 + 6 = 870 + 6 = 876

Og slik blir det å skrive et desimaltall på samme måte som kodesnutten viser.

Forøvrig en fin oppgave, og din metode ville også fungert. Neste steg er kanskje å se hvem sin kode som løser problemet raskest. Det er jo også ganske viktig.
Bilde
Svar