Kalenderluke 16: Et kryptisk program


mandag 16. desember 2013 Julekalender

Og hva sier nissen?

Nissen sier Hohohoho Hohohoho!

Jepp, det var det som var output fra det kryptiske programmet du fant i dagens luke. Selvfølgelig var dette ganske vanskelig å finne ut av, siden jeg ikke ville røpe hvilket språk det var. Språket heter Betterave (fransk for rødbete), og jeg dedikerte en luke til språket i kalenderen for to år siden. Var du så heldig å finne den så kunne du enten løse oppgaven ved å følge reglene og simulere språket i hodet, eller du kunne laste ned tolkeren implementert i Ruby og så kjøre programmet.

Om du ikke fant ut at språket var Betterave så mener jeg det likevel er mulig for en erfaren og kreativ utvikler å gjette seg til hva koden gjør. Kanskje jeg forventer for mye? Kanskje jeg har studert litt for mange esoteriske språk?

Daniel T Johansen var raskest ute med riktig svar, og fikk full pott for andre gang. Stian var også tidlig ute, og tok kraftig innpå Magnar Sveen sammenlagt (som ikke klarte oppgaven).

luke16_utvikling

Gjennomgang av koden

~ Et juleprogram ~

Første linje (alt mellom to tilde-tegn) er kun en kommentar.

"Nissen" "sier"

Her definerer jeg to strenger, som automatisk plasseres i en egen streng-liste på henholdsvis indeks 0 og 1.

A * 89

Her tilordner jeg en verdi til en variabel jeg kaller A. Variabler i Betterave består av kun én bokstav, og uppercase betyr tilordning.

* er en funksjon som ganger sammen de to neste verdiene – og de to neste verdiene er 8 og 9. Man kan nemlig ikke direkte uttrykke tall med mer enn ett siffer, så man må bruke tallene mellom 0 og 9 til å lage større tegn. Her lager jeg tallet 72, som tilfeldigvis er ASCII-verdien til bokstaven H.

B+ * 98 * 84

Her gjør jeg mye av det samme, men jeg er ute etter et større tall, så utregningen er mer kompleks. Tallet som tilordnes variabel B er (8*9)+(8*4), altså 104, som er ASCII-verdien til bokstaven h.

C + 7b

Og for å lage C plusser jeg sammen tallet 7 og verdien av B, som blir 111 – eller bokstaven o.

D  * 48

D er 4 ganger 8, som blir 32 – karakteren "space".

&0d &1d

& er en funksjon som appender et tegn (basert på ASCII-verdien) til en av strengene i streng-listen. &0d appender verdien fra variabel D til strengen med indeks 0. Og så gjør jeg det samme med strengen med indeks 1. Verdien til disse strengene er nå "Nissen " og "sier ".

$0 $1

Og nå begynner vi å skrive output. $0 skriver ut streng med indeks 0, og $1 skriver ut streng med indeks 1.

E0 [

Her begynner det å bli interessant. Jeg oppretter en variabel E og gir den verdien 0. Og så starter jeg noe som tilsvarer en while-løkke ved å åpne en firkantklamme.

,a,c

Det neste jeg gjør er å skrive ut tegnene som verdiene i variabel A og C representerer, altså H og o. Vi har sålangt skrevet ut "Nissen sier Ho".

F3 [ F-f1,b,c | >f0 ]

Linjen over er en komplett while-løkke. Først opprettes variabelen F som får verdien 3. F-f1,b,c er det som skjer for hver iterasjon, og løkken itererer sålenge >f0 er sant.

F-f1 vil si at jeg trekker 1 fra verdien i F, og så tilordner denne verdien til F igjen. Jeg dekrementerer den altså.

Og ,b,c skriver ut verdiene i B og C, som tilsammen utgjør "ho".

Til slutt har du kanskje skjønt at >f0 tester om F er større enn 0. Dette betyr at løkken itererer fra 3 til 0 – men siden F dekrementeres før testen kjøres må vi trekke fra én, så den itererer og skriver ut "ho" tre ganger. Output er nå "Nissen sier Hohohoho".

,d D+d1

Vi er fortsatt inne i den ytre while-løkken. Vi skriver ut verdien av D (som er et space), og så inkrementerer vi D. D får da verdien 33, som er ASCII-verdien til et utropstegn. Neste gang denne linjen eksekveres er det altså "!" som blir skrevet ut. Men foreløpig har vi skrevet ut "Nissen sier Hohohoho "

E+1e
| <e2 ]

Og så tar vi siste del av while-løkken (og av programmet). Her inkrementeres variabel E (som staret på 0), og så kommer testen for om vi skal fortsette å iterere. Og testen er om verdien i E er mindre enn 2. Det er den ikke første gang, men etter andre iterasjon vil den være det – og programmet er ferdig.

I andre iterasjon skriver løkken ut "Hohohoho!". Fullstendig output blir dermed "Nissen sier Hohohoho Hohohoho!".

Det var jo enkelt ;P


comments powered by Disqus