Archive for the ‘kodehoved.dk’ Category

Resultatet af kodegolfkonkurrencen

Friday, July 30th, 2010

Konkurrence er slut, og vinderen er fundet, men inden vi kommer så langt, skal jeg først og fremmest sige tak til alle jer, der har indsendt bidrag. Sommervarme og ferie til trods har jeg modtaget ikke mindre end 30 løsninger på udfordringen denne gang og flere af dem har tilmed været igennem adskillige revisioner. Jeg er imponeret! Tusind tak fordi I ville være med.

Gennemsnittet for løsningerne ligger på 185 anslag, og der er ikke mindre end syv løsninger på under 140 anslag! 29 ud af 30 løsninger klarer alle mine test cases, så vinderen er altså fundet blandt de 29.

Der er rigtig mange gode og kreative ideer. Flere har været forbi den nye Zip-metode, og LINQ er i det hele taget pænt repræsenteret i løsningerne. Der er brugt mange forskellige datastrukturer så som arrays, List, Stack og sågar string. Vinderen benytter LINQ og string.

Nok snak, lad os se vinderen. Med blot 132 anslag:

public static int[] MadsOgPeterSandbergBrun_Add(int[] a,int[] b){
   var c="";
   for(int o=a.Length,p=b.Length,s=0;-o-p<(s=s/10+(0<o?a[--o]:0)+(0<p?b[--p]:0));)
      c=s%10+c;
   return c.Select(i=>i-48).ToArray();
}

Tillykke til Mads og Peter Sandberg Brun! Der er et stk. Visual Studio 2010 Ultimate + MSDN på vej til jer.

Resten af feltet ser ud som følger:

Mads og Peter Sandberg Brun            132
Jacob Korsgaard                        135
Jørgen Ulrik B. Krag (Jubk)            135
Asger Hallas  og Lars Udengaard        135
Fredrik Olsson                         138
Mogens Heller Grabe (Mookid8000)       138
Ole Tolshave                           139
Jan Jensen (JanJ)                      141
Niels Rasmussen (NTR)                  151
Steffen Holmslykke (SNH)               153
Asger Hallas                           157
Mads Mau Pedersen (MMP)                158
Jesper Harder (JHD)                    158
Daniel Brixen                          169
Anders Uhl Pedersen (Aup)              170
Jonathan Jørgensen (Jonathan)          170
Jesper Alf Dam (Jalf)                  176
Christian Rysgaard (CER)               183
Morten Gejl (MGE)                      193
Mads Hedegaard                         195
Carsten Hess                           196
Brian Vestergaard Andersen             208
Anders Reimer                          218
Dennis Riis                            226
Martin Faartoft                        227
Allan Tech                             248
Martin Larsen                          287
Simon Kristensen (Imonsei)             289
Claus Jensen                           296
Daniel Mellgaard Frost (Danielovich)   229 (fejler)

Jeg har lavet en fil med alle bidragene, så I kan få ideer til fremtidige kodegolfturneringer.

Endnu en gang tak til jer alle!

Kodegolf: Vind Visual Studio 2010 Ultimate

Wednesday, July 14th, 2010

Det er sommer, det er varmt, og det er tid til en gang golf. Her på siden foregår den slags jo ikke ude i det fri men derimod foran computeren, hvilket sikkert ikke er det værste sted at opholde sig i disse høj-UV-tider.

Denne gang går opgaven ud på at implementere nedenstående metode, der kan lægge potentielt meget store, ikke-negative heltal sammen. Koden skal skrives i C#.

public static int[] Add(int[] a, int[] b) { }

Som det fremgår, tager Add() to int[]. Hvert int i de to arrays repræsenterer et ciffer, så hvis a repræsenterer værdien 1000, indeholder den { 1, 0, 0, 0 }, og hvis b rummer værdien på Decimal.MaxValue indeholder den { 7, 9, 2, 2, 8, 1, 6, 2, 5, 1, 4, 2, 6, 4, 3, 3, 7, 5, 9, 3, 5, 4, 3, 9, 5, 0, 3, 3, 5 }. Den øvre grænse for tallenes størrelse er kun begrænset af størrelsen på int[]. De to værdier skal lægges sammen og returneres som int[].

Følgende regler gælder:

  • Alle anslag mellem metodedefinitionens start- og slut-curlies tælles med – white space, der ikke har betydning for metodens virke er dog undtaget.
  • a og b kan ikke være tomme, men de har ikke nødvendigvis samme længde.
  • Alle regneoperationer skal foregå på datatypen int.
  • Det er ikke tilladt at bruge BigInteger.
  • Alle udregninger skal foregå i Add().
  • Ingen hjemmelavede hjælpemetoder eller erklæringer uden for Add().
  • Navngiv metoden så den hedder DitNavnEllerAlias_Add, f.eks. kunne min version hedde Kodehoved_Add. Navnets længde påvirker ikke optællingen med mindre metoden benytter rekursion (så lad være med det).
  • Det er ikke tilladt at bruge using-aliaser, da alle bidrag bliver testet af samme program.
  • Resultatet må ikke indeholde foranstillede nuller.
  • Send løsningsforslag til brian@kodehoved.dk.
  • Deadline: 30. juli kl. 20.00.

Jeg har et stk. Microsoft Visual Studio 2010 Ultimate with MSDN som præmie. Vinderen er den, der leverer en korrekt løsning på ovenstående med færrest mulige anslag. I tilfælde af flere løsninger med lige få anslag trækker jeg lod blandt disse.

Skulle der være uklarheder så skriv en kommentar, så skal jeg uddybe snarest. Følg med i kommentarerne og husk at tjekke for opdateringer til dette indlæg. God fornøjelse!

Kodehoved på spansk

Tuesday, February 9th, 2010

Der er næppe mange af jer, der vil få glæde af følgende servicemeddelelse, men det er jo ikke hver dag, at man sådan får lov at være verdensberømt for en dag, så derfor vil jeg lige gøre opmærksom på, at februarnummeret af det spanske magasin, dotNetMania, har et langt interview med Tess Ferrandez, hendes kollega Finbar Ryan og undertegnede. Artiklen er en spansk oversættelse af et videointerview om debugging, vi lavede på TechEd i Berlin sidste år. Jeg håber, at videoen også bliver tilgængelig på et tidspunkt, og jeg skal nok smide et link, hvis det skulle blive aktuelt. Indtil da står den på spansk debugging. God fornøjelse!

dotNetMania

Kodegolf: Resultater og vinderne

Monday, November 23rd, 2009

Jeg er imponeret! Ikke alene modtog jeg hele 24 bidrag i konkurrencen, men flere af jer sendte også adskillige forsøg, og der var rigtig mange gode forslag imellem de indkomne svar. Tak for det.

Jeg har modtaget bidrag fra: Jacob Eisenberg, Kristian Vinther, Mark Seemann, Jan Jensen, Janus Egholm, Claus Christensen, Christian Rysgaard, Morten Gejl, Mads Mau Pedersen, ”lajensen”, Dennis Riis, Søren Larsen, Troels Thomsen, Jakob Gade, Carsten Hess, Hakon Baunsgaard, Jacob Tjørnholm, Rune Juhl-Petersen, David Thomas, Allan Thraen, Jesper Harder, Mads Hedegaard, Mads Lützhøft og Niels Rasmussen.

Tusind tak fordi I ville være med.

Ifølge mit optællingsscript ser resultaterne ud som følger.

129 : Hakon Baunsgaard
129 : Jesper Harder
129 : ”lajensen”
129 : Mads Mau Pedersen
129 : Troels Thomsen
132 : Kristian Vinther
137 : Mads Hedegaard
138 : Christian Rysgaard
139 : Niels Rasmussen
141 : Morten Gejl
144 : Jacob Tjørnholm
149 : Jan Jensen
149 : Rune Juhl-Petersen
150 : Søren Larsen
151 : Dennis Riis
152 : Carsten Hess
152 : Jacob Eisenberg
164 : Claus Christensen
168 : Mads Lützhøft
177 : David Thomas
196 : Janus Egholm
228 : Jakob Gade
281 : Allan Thraen
348 : Mark Seemann

Det vil sige, at der ikke er en, men ikke mindre end fem vindere! Tillykke til Hakon Baunsgaard, Jesper Harder, ”lajensen”, Mads Mau Pedersen og Troels Thomsen.

129 tegn er altså godt gået.

Jeg har talt med Microsoft, og jeg har fået lov at indløse min trøstepræmie for fire yderligere præmier, så det betyder, at alle vinderne får en præmie. Stort tillykke til vinderne!

Jeg har lavet en zip-fil med alle besvarelserne, så I kan nyde de andres påfund, men her kommer lige en tilfældig udvalgt blandt de fem vindere.

namespace Kodegolf {
    class MMP {
        public static void MAIN() {
            for (int t = 0; ++t < 66; )
                System.Console.WriteLine(t < 65 ? t + ":" + (1ul << t - 1) : "=" + ~0ul);
        }
    }
}

Læg desuden mærke til hvordan flere af vinderne for alle praktiske formål er nået frem til den samme løsning. Det er åbenbart måden at løse denne opgave.

Jeg er imponeret over, at fem personer kom frem til en løsning med så få anslag, og jeg er ligeledes imponeret over det meget tætte løb mellem deltagerne. Hatten af for jer, tak til jer alle sammen fordi I ville være med og endnu en gang tillykke til vinderne!

Hvorfor læser du denne blog?

Friday, January 16th, 2009

Kodehoved.dk fylder to år i næste måned og har efterhånden en del .NET-interesserede læsere. Skal jeg dømme efter de kommentarer og mails, jeg har modtaget gennem tiden, lader det også til, at der er en del kloge hoveder i blandt jer.

Derfor kunne jeg godt tænke mig at høre lidt om, hvad I finder interessant og mindre interessant ved denne blog. Hvilke indlæg læser I? Hvilke typer indlæg kunne I tænke jer at se mere af? Er der noget, jeg bør holde mig fra? Med andre ord: Hvad kan jeg gøre, for at gøre kodehoved.dk bedre?

Jeg har naturligvis mine logs, men min erfaring siger mig, at man skal være meget varsom med at opfatte antal sidevisninger som et udtryk for popularitet hos målgruppen. Hvis jeg f.eks. nævner Kim Kardashian sex tape i dette indlæg, skal det nok få flere hits end mine lange gennemgange af diverse WinDbg-sessioner. Så i håb om at få lidt mere kvalificeret inspiration til de fremtidige skriblerier, håber jeg, at I vil smide et par kommentarer eller sende mig nogle mails. Ris, ros og spørgsmål velkommen!

Det var den jul og det nytår

Wednesday, January 14th, 2009

Jeg håber, at I alle havde en glimrende ferie. Jeg havde jo lidt travlt op til jul med konkurrencerne og de mange bidrag, så derfor har jeg holdt en lille pause, men nu er det vist på tide at komme i gang igen. Jeg er rigtig glad for, at der var så mange, der havde lyst til at lege med, og jeg har fået et væld af positiv feedback, som jeg kunne gå rundt og sole mig i i decembermørket. Tak for det!

Jeg har et par indlæg på vej. Lidt om debugging og lidt om kodestil, så stay tuned. Derudover bliver det tidlige forår nok præget af, at jeg forhåbentlig tager til Seattle i slutningen af februar for at deltage i MVP Summit. Det er en årlig konference for MVPere fra hele verden. Da jeg havde besøg af Jon Skeet i forbindelse med vores arrangement, fortalte han lidt om det, så forventningerne er høje, og jeg glæder mig.

Jeg må også indrømme, at jeg har brugt en del af julen på Stack Overflow. Det er et rigtig godt alternativ til nyhedsgrupper, så det er hermed anbefalet.

Julekonkurrence: Den subtile fejl

Monday, December 15th, 2008

Med al den positive respons jeg fik på forrige konkurrence, synes jeg, at vi skal blive i kodesporet. Denne uges konkurrence er dog lidt sværere både for jer og for mig, for her er succeskriterierne subjektive. 

I skal implementere en simpel rutine, så det ser ud som om, den virker efter hensigten, men der skal være en subtil fejl, der får den til at fejle i visse situationer. Det er altså meningen, at jeres fejl skal kunne slippe igennem et code review på en god (eller måske nærmere dårlig) dag. Jo mere subtil fejlen er, desto bedre er mulighederne for at vinde. Eller sagt på en anden måde: Hvis koden er simpel og ser ud til at fungere, men ikke gør det, er du på rette spor. Også denne gang står Microsoft for en præmie og en trøstepræmie (som jeg denne gang vil uddele til det næstbedste forslag). Update: Jeg har netop hørt fra Microsoft, at uges præmie bliver et snowboard (bjerg og sne medfølger vist ikke), så det er bare med at komme til tasterne!

Opgaven: Lav en rutine, der checker styrken af et password og returnerer en bool afhængig af om passwordet kan accepteres eller ej. Rutinen skal indeholde en subtil fejl, der gør at et eller flere password, der ikke overholder reglerne, godkendes. Derudover skal passwords, der overholder reglerne resultere i true, mens passwords, der ikke overholder reglerne skal resultere i false. 

Et godkendt password skal som overholde nedenstående regler

  1. Bestå af mindst 8 tegn
  2. Indeholde mindst tre af følgende kategorier: store bogstaver, små bogstaver, tal, specielle tegn
  3. Må ikke indeholde tre identiske tegn i rækkefølge

Koden skal tage udgangspunkt i nedenstående skabelon, men I kan tilføje lige så mange private hjælpemetoder, som I mener, der er brug for. 

public class PasswordValidator {
   public bool IsPasswordValid(string password) {
   }
}

Koden skal skrives i managed C# og I må bruge alle standardbibliotekerne til og med .NET 3.5. 

Ud over selve koden, skal I lave mindst tre test cases, der viser, at koden godkender gyldige passwords, og mindst tre test cases, der viser, at koden afviser ugyldige passwords. Sidst men ikke mindst, skal I lave en test case, der påviser jeres fejl. Brug nedenstående skabelon.

[TestClass]
public class PasswordValidatorTest {

   [TestMethod]
   public void ValidPasswords() {
      var validator = new PasswordValidator();
      Assert.IsTrue(validator.IsPasswordValid("" /* test af gyldig password */));
      Assert.IsTrue(validator.IsPasswordValid(""));
      Assert.IsTrue(validator.IsPasswordValid(""));
   }

   [TestMethod]
   public void InvalidPasswords() {
      var validator = new PasswordValidator();
      Assert.IsFalse(validator.IsPasswordValid("" /* test af ugyldig password */));
      Assert.IsFalse(validator.IsPasswordValid(""));
      Assert.IsFalse(validator.IsPasswordValid(""));
   }

   [TestMethod]
   public void TheBug() {
      var validator = new PasswordValidator();
      Assert.IsTrue(validator.IsPasswordValid("" /* påviser fejl i koden */));
   }
}

Deadline er som sædvanlig fredag kl. 20. Send jeres bidrag i en mail til brian@kodehoved.dk.  Jeg glæder mig til at se, hvad I finder på.

Spørgsmål: Skriv en kommentar.

Update: Jeg havde desværre lavet en fejl i testen TheBug. Der skal naturligvis bruges Assert.IsTrue(). Input er jo et password, der ikke overholder reglerne, men som mod forventning bliver godtkendt. Jeg ved godt, at det ikke er hittet med en subtil fejl her, men det var altså ikke med vilje.