Første gang, jeg hørte om eksponentielle funktioner, var i min folkeskoletid. Jeg vil tro, at det var omkring fjerde eller femte klasse. Begrebet blev naturligvis ikke omtalt som sådan, og mine klassekammerater og jeg havde ikke den fjerneste anelse om den underliggende matematik, men jeg husker tydelig, hvordan vores lærer berettede en variant af fortællingen om en kejser, et stakbræt og en masse ris.
Der er en glimrende oversigt over anekdoten på Wikipedia, men i korte træk går historien ud på, at en kejser vil belønne opfinderen af skak, så han spørger ham, hvad han vil have som tak. Manden svarer, at han vil have et riskorn på første felt, to på andet, fire på tredje og så fremdeles indtil han har fået ris svarende til alle felterne på brættet.
Det bliver til ganske mange ris, og jeg husker stadig fascinationen over, hvordan denne lille konstruktion kunne resulterer i et tal, der var langt større, end hvad lærerens lommeregner kunne håndtere. I den alder er det let at blive imponeret over, at teknologi har sine begrænsninger.
Så som en hyldest til ris, skak og matematik holder jeg endnu en gang kodegolf, og Microsoft har venligst stillet et par præmier til rådighed. Det er naturligvis en glimrende lejlighed til at få leget lidt med Visual Studio 2010 beta2, så jeg håber, I vil være med.
Opgaven
Lav et program, der udskriver antal riskorn per felt samt summen for alle 64 felter.
Feltlinjerne skal se ud som følger F:R, hvor F er nummeret på feltet, og R er antal ris på feltet.
Summen skal udskrives på en linje som =S, hvor S er summen. Altså:
1:1
2:2
3:4
4:8
…
64:xx
=yy
Reglerne
- Programmet skal som en console application og implementeres i managed C#.
Alle assemblies fra VS2010 eller tidligere må bruges.
- Nedenstående skabelon, der skal bruges. Koden i den må ikke ændres. Den sikrer, at default namespace skal hedde ”kodegolf”, og applikationsklassen skal navngives med tre bogstaver baseret på dit navn, så hvis du hedder Ole Hansen kunne den f.eks. hedde OHA. Med samme namespace og klasser med på tre bogstaver bliver optællingen lettere.
namespace Kodegolf {
class XXX { // Ret XXX til dine initialer (tre bogstaver) og slet denne kommentar
public static void Main() {
}
}
}
- White space der ikke har betydning for oversættelsen tæller ikke med. Så tomme linjer, indrykninger af koden og så videre tæller ikke med, men mellemrum i tekster gør.
- Det er ikke tilladt at læse data eller kode fra filer, nettet eller andre steder. Al koden til programmet skal være indeholdt i ovennævnte klasse.
- Update: Alle tal udskrives som heltal.
Deadline
Deadline er mandag den 23. november klokken 6 (som i om morgenen). Send løsningen til brian@kodehoved.dk.
Vinderen er den korrekte besvarelse med færrest anslag. Vinderen får en eller anden lækker præmie fra Microsoft. Jeg trækker desuden lod om en trøstepræmie blandt alle besvarelserne.
Er der spørgsmål til konkurrencen, så smid en kommentar.
Optælling
Optælling foregår som følger:
- Først sikrer jeg mig, at
Main()erpublic. Er den ikke det, indsætter jegpublic.
- Jeg fjerner
string[] argsfraMain(), hvis den del er der.
- Da jeg har alle løsningerne i samme solution, omdøber jeg
Main()tilMAIN().
- Hvis der er mellemrum, der har betydning for korrektheden af løsningen, ændrer jeg disse til underscore i kildeteksten.
- Derefter kører jeg nedenstående kode for at tælle og det tal, den spytter ud, er resultatet for den pågældende fil.
using System;
using System.IO;
using System.Text.RegularExpressions;
namespace Count {
class Program {
static void Main(string[] args) {
if (args.Length < 1) {
Console.WriteLine("Syntax: Count.exe sourcefile");
return;
}
var file = args[0];
if (!File.Exists(file)) {
Console.WriteLine("{0} not found", file);
return;
}
var code = File.ReadAllText(file);
Console.WriteLine(Regex.Replace(code, @"\s", "").Length);
}
}
}
Mit tal vil derfor muligvis være forskellig fra det, I får, men det sikrer, at alles bidrag bliver talt på den samme måde.
Tæller using-direktiver med? De bliver jo i hvert fald nødt til at skulle placeres udenfor klassen.
Ja, using tæller med. Alt hvad der er i din source-fil tæller med, så du må selv om hvorvidt du bruger using eller fulde navne på typerne.
Er lidt i tvivl om white spaces. Er “int i = 0;” det samme som “int i=0;”? Eller tælles de to ekstra spaces med?
Og tælles selve linieskift karakterne med? Dvs er:
int i=0;
double d=1;
Det samme som:
int i=0;double d=1;
Og undgår du så visual studio autoformatering, der indsætter mellemrum hvis man fx paster kode. Det går jeg udfra da du jo nok bare gemmer filer.
@Harry: Mellemrum, tabs og linjeskift tæller ikke med (med mindre de har betydning for implementeringen), så der er ingen grund til at lave koden ulæselig. Jeg filtrerer dem fra, inden jeg tæller op.
Ok. Ville lige være sikker. Kom lige til at se at du vist har lavet et tool til optælling til tidligere kodegolf. Hvis det blev lagt ud i æteren så kunne man blive mere agil ved fx at kalde det i post build step, og du ville så undgå disse irriterende spørgsmål.
Hvordan vil du have løsningen, bare som text i en mail, eller som en vedhæftet fil (XXX.cs / XXX.zip)?
@Søren: Hvis jeg bare kan få en kodefil ud af det, så er jeg tilfreds.
Kan vi yderlige antage, at programmet skal terminere, og at det ikke må udskrive mere tekst end det du angiver ovenfor?
@Kristian: Jeg er ikke helt sikker på, hvad du sigter efter her. Kan du uddybe? Send mig evt. en mail, hvis du ikke vil afsløre din ide.
@Kristian: Du har ikke overset at summen også skal udskrives, vel?
@Jacob: Nej, men jeg kunne spare en stopbetingelse på et par tegn. Dog ville det ende med at sumlinjen ville blive skrevet ud en kvazillion gange
.