Life of the IT-Drummer

A web log from Tobias Rusås Olsen.

Sphere Online Judge konkurranse

Spoj.pl er et nettsted som tilbyr en rekke programmeringsutfordringer, faktisk flere tusen stykker. Felles er at de kan løses fritt i en hel del programmeringsspråk. Til forskjell fra for eksempel Project Euler, men i likhet med NM i Programmering sender man inn kildekoden framfor å bare gi svaret i en boks.

I dag har jeg lyst å rette fokus på denne oppgaven, gitt til meg av min gode venn Bjørn. For de som er for lat til å lese, så går selve oppgaven ut på å legge sammen en rekke tall, dersom de er positiv. Første linje er antall tall som kommer, og hver nye linje er et tall som skal adderes til summen dersom tallet er positivt. En veldig grei oppgave, men det artige med oppgaven, er at den skal løses på minst mulig tegn!

Eksempel.
Inndata:
3
5
-2
4
Utdata:
9

“Score equals to size of source code of your program except symbols with ASCII code <= 32". Uten at jeg er altfor god i ASCII, så antar jeg at dette betyr at ting som mellomrom og brakker etc ikke betyr noe.

Siden Java er språket jeg kan best, forsøkte jeg å finne en løsning der. Dette ble resultatet:

import java.util.*;
public class Main{
public static void main(String[] a){
Scanner s=new Scanner(System.in);
int u=0;
for(int i=0,b=0,p=s.nextInt();i {b=s.nextInt();if(b>0)u+=b;}
System.out.print(u);}}

Lengden på programmet er 205, og scoren jeg fikk var 193. Den beste løsningen i Java hadde 167, noe som er vanvittig bra. Det betyr også at koden min har store rom for forbedringer. Ser dere noen innlysende forbedringer, så er det bare til å bruke kommentarfeltet. Dere er uansett ufordret. :)

Oppdatering: Siden jeg kjedet meg litt i kveld, løste jeg den i LISP og. Den fikk en score på 71 poeng. Slik ble den løst:

(let ((x 0)(v 0))
(dotimes (z (read))
(setf v (read))
(if(> v 0)
(incf x v)))
(print x))

Rekorden i LISP er på 40, så her er det også rom for forbedring. Tipper man kan gjøre noen triks med funksjonell programmering. Oppdateres kanskje!

Oppdatering 2: En dårlig løsning med funksjonell programmering:

(let (k)
(dotimes (z (read))
(setf k (cons (read) k)))
(print (apply #’+ (remove-if #’(lambda (x) (< x 0)) k))))

RSS 2.0 | Trackback | Comment

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="">