tirsdag 17. 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).
~ 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