Gå til innhold

Anbefalte innlegg

Ettersom det siste problemet tydeligvis ikke falt helt i smak, har jeg besluttet å prøve meg på et problem som er mer i stil med det første problemet i denne tråden. Det er trivielt, men er muligens litt morsom å bryne seg på.

 

Tenk deg at du bygger et funksjonsbibliotek i et C#-liknende språk til støtte for et svært begrenset og primitivt skriptspråk som irriterende nok ikke implementerer vanlige logiske operatorer (selv om det er i stand til å kalle funksjoner og bruke Boolean-datatypen). Oppgaven går da ut på å lage en funksjon som er i stand til å simulere de fleste logiske operatorer på to Boolean-verdier - alt i så få linjer kode (og operatorer) som mulig. Koden bør se noenlunde slik ut:

public enum Tables
{
   And = 1,    // Logical conjunction
   Or = 2,     // Logical disjunction 
   Imp = 3,    // Logical implication
   Eq = 4,     // Logical equality
   Xor = 5,    // Exclusive disjunction
   NAnd = 6,   // Logical NAND
   Nor = 7,    // Logical NOR
   MImp = 8,   // Material nonimplication
   CImp = 9    // Converse nonimplication
}

public bool Truth(Tables Table, bool A, bool B)
{
}

Dersom en legger til/endrer/fjerner linjer fra dette standardoppsettet, er det å regne som nye linjer. Det eneste som ikke telles med, er å endre verdiene/rekkefølgen på de ulike elementene/operatorene i Tables-enumerasjonen.

 

Hvordan kan dette gjøres på så få linjer som overhodet mulig?

Endret av aadnk
Lenke til kommentar
Videoannonse
Annonse

Siden ingen har meldt seg, akter jeg å komme med en besvarelse i en spoiler-tagg. Dersom noen andre har interessante oppgaver på lager, er det bare å komme med dem.

Klikk for å se/fjerne innholdet nedenfor
public enum Tables
{
   And = 8,    // Logical conjunction
   Or = 14,    // Logical disjunction 
   Imp = 11,   // Logical implication
   Eq = 9,     // Logical equality
   Xor = 6,    // Exclusive disjunction
   NAnd = 7,   // Logical NAND
   Nor = 1,    // Logical NOR
   MImp = 4,   // Material nonimplication
   CImp = 2    // Converse nonimplication
}

public bool Truth(Tables Table, bool A, bool B)
{
   return ((int)Table & (1 << ((Convert.ToInt32(A) << 1) + Convert.ToInt32(B)))) != 0;
}

Lenke til kommentar
  • 2 måneder senere...

Denne tråden har ligget død altfor lenge, så jeg vekker den til live med en ny nøtt. :)

 

Tenk deg at vi har et ubegrenset antall røde kuber i et begrenset antall størrelser (f.eks. ti størrelser), samtidig som vi har et begrenset antall blå kuber (f.eks. hundre stykker) av ulik størrelse. Den største blå kuben får plass inni den største røde.

 

Du får utdelt X antall blå kuber, og har så mange røde du ønsker. Vi skal putte noen av de blå kubene oppi så få av de røde kubene som mulig, samtidig som vi ønsker at totalt volum av de røde kubene skal være så lite som mulig.

 

Fordi antall kuber i begge farger er lite er det heller ønskelig med en treg og god løsning enn en rask og mindre god løsning. Det blir ekstrapoeng hvis løsningen er skrevet i C/C++/C#/Java/VB eller et språk som ligner på et av disse. :)

Lenke til kommentar

Hmm. Morsom tråd. Slenger meg på....

 

I mens dere grubler over den kombinatoriske løsningen så kan dere også gruble litt på denne. Et triviellt programmeringsuttrykk, men dere skal finne det matematiske uttrykket som gir det største tallet av to tall.

 

Altså: int StørstTall = FinnStørst(tallA, tallb)

 

Husk: Ingen tester er tillat, kunn ren matematikk

 

Kansje ikke den vanskeligste oppgaven som finnes, men har flere og tyngre på lager....

Endret av HDSoftware
Lenke til kommentar

Den er ikke så lett da :O

 


private static int Max(int a, int b)
{
  return (a + b + (int)Math.Sqrt(Math.Pow((a - b), 2))) / 2;
}

private static double Max(double a, double b)
{
  return (a + b + Math.Sqrt(Math.Pow((a - b), 2))) / 2;
}

 

altså, formelen er a + b + sqrt((a - b)^2) / 2

Endret av GeirGrusom
Lenke til kommentar
  • 2 uker senere...

Har du testet den formelen, GeirGrusom? Det ser ikke ut til at den fungerer slik den skal:

 A	  B   Max(A, B)
 21	3	  33 
 8	 -21	2 
 -20   27	 30 
 -49   26	 14 
 31	21	 57 
 -45   -9	-36 
 36	29	 68 
 -13   46	 62 
 37	-44	34 
 45	-14	60

 

Nåvel, over til ovenstående oppgave. Mitt forslag blir å benytte Sign()-funksjonen:

Max(a,b)   = a * Equal(Sign(a - b), 1) + b * Equal(Sign(b - a), 1) + Equal(a, b)
Equal(a,b) = (1 - Abs(Sign(A - B))) * A

 

I C# blir dette som følger:

public double Max(double A, double B)
{
return A * Equal(Math.Sign(A - B), 1) + B * Equal(Math.Sign(B - A), 1) + Equal(A, B);
}

public double Equal(double A, double B)
{
return (1 - Math.Abs(Math.Sign(A - B))) * A;
}

 

For øvrig kan Sign()-funksjonen defineres med Abs()-funksjonen, hvilket i sin tur kan defineres med primitive operasjoner:

Sign(a) = a / abs(a) = a / sqrt(a^2)
Endret av aadnk
Lenke til kommentar

GeirGrusom sin fungerer fint den, i alle fall i min oversetning til Scheme:

 

(define (finn-størst a b)
(/ (+ a b (sqrt (expt (- a b) 2))) 2))

Kjøring:

> (finn-størst 2 3)
3
> (finn-størst 3 2)
3
> (finn-størst 9 2)
9
> (finn-størst -1 2)
2

 

Merk at i formelen mente han nok (a + b + sqrt((a - b)2)) / 2.

Lenke til kommentar
  • 2 uker senere...

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...