Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

AIVD Kerstpuzzel

Pagina: 1
Acties:

  • amas
  • Registratie: Maart 2009
  • Laatst online: 15:24

amas

Law of Nature: Chaos

Topicstarter
Echt pro is het niet, maar een andere topic waar programming in voorkomt kon ik niet vinden.

Tijdens Kerst met de familie wordt er altijd een Kerstpuzzel gemaakt, dit jaar dus van de AIVD (deze). Hierin staat een puzzel over treinen en gewichten, opgave 7. Veel gepuzzel en gereken, maar uiteindelijk waren er teveel combinaties om uit het hoofd te doen en het leuk te houden.

Eenmaal thuis bedacht ik me om er een scriptje voor te schrijven. Uiteindelijk is het een redelijk simpel script geworden (let wel, ik heb extreem weinig ervaring met programmeren, alleen MATLAB voor mijn studie).

Matlab:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
num =    input('  numerator = ');
den =    input('denominator = ');
blocks = input('    #blocks = ');

M = zeros(100,blocks);
c = 0;

for i = blocks:26
    
    for ii = blocks:26
        
        for iii = blocks:26
        
            S = 1/i+1/ii+1/iii;
        
            if S == num/den;
                
                c = c + 1;
                M(c,1) = i;
                M(c,2) = ii;
                M(c,3) = iii;
                        
            end
        end
    end
end

char('A' + M(1:c,1:blocks) - 1)

Het werkt... sort of. Het script test simpelweg alle combinaties. Dus eerst (in dit geval begin je bij letter 3, C dus) CCC, CCD, CCE, CCF, enz, daarna CDC, CDD, CDE, CDF etc... Komt dit overeen met het aangegeven gewicht, sla de combinatie op en ga verder. De laatste regel converteert cijfers naar letters.

Ik kan er wagons met een specifiek aantal blokken mee oplossen. Als het aantal blokken verandert, moet ik for-loops gaan toevoegen of verwijderen. Natuurlijk kan ik hier wel de puzzel met oplossen, maar het liefst komt er één elegant script uit :) Wat er dus moet gebeuren is dat het aantal for-loops wordt aangepast aan het aantal blokken wat op de wagon ligt. Heeft iemand een idee hoe dit moet/kan? Het hoeft niet per se in MATLAB taal te worden uitgelegd, een concept is genoeg, dan kan ik het wel in het scriptje stoppen.

Optimist: The glass is half full; Pessimist: The glass is half empty; Physicist: The glass is full of liquid and air.


  • rikkert278
  • Registratie: Februari 2010
  • Laatst online: 13-06-2024
Hier kun je recursie voor gebruiken. :)

Hier kun je een voorbeeld/uitleg van recursie vinden, en hier is er eentje specifiek voor MATHLAB.

[ Voor 63% gewijzigd door rikkert278 op 29-12-2014 19:43 ]


  • freddifish
  • Registratie: November 2000
  • Laatst online: 30-10 07:38

freddifish

schnappi !

Ik heb hier ook een recursief scriptje voor geschreven in c#. Het aantal combinaties is inderdaad heel erg groot bij sommige blokken, dus na deze stap is er nog aardig wat werk. Heb de trein wel opgelost hiermee :)

hier het essentiele deel van mijn code
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
for(int i=1; i<10; i++)
            {
                permute("",i,alfabet);
            }

void permute(string current, int maxlen, List<char> alfabet)
        {
            if (current.Length < maxlen)
            {
                foreach (char add in alfabet)
                {
                    if ( (current.Length == 0 || current[current.Length - 1] <= add))
                    {
                        permute(current + add, maxlen, alfabet);
                    }
                }
            }
            else
            {
                double sum=lookupsum(current);  // functie de van een string tekens de som van de breukwaardes berekent
                if (sum <= 1)
                {
                    foreach (double key in find.Keys)  // key = de breuk die je wilt vinden, de lengte van de wagon staat hier in find[key]
                    {
                        if ((Math.Abs(sum-key)<0.000001) && (find[key]==current.Length))
                        { 
                           // doe iets met de gevonden match
                        }
                    }
                }
            }
        }

'people say I'm a drinker, but I'm sober half the time' - Mick Jagger | mail: freddifish_AT_gmx.net