Og summen blir hundre

Her kan brukere av forum utfordre hverandre med morsomme oppgaver og nøtter man ønsker å dele med andre. Dette er altså ikke et sted for desperate skrik om hjelp, de kan man poste i de andre forumene, men et sted for problemløsing på tvers av trinn og fag.

Moderatorer: Vektormannen, espen180, Aleks855, Solar Plexsus, Gustav, Nebuchadnezzar, Janhaa

Svar
Nebuchadnezzar
Fibonacci
Fibonacci
Innlegg: 5648
Registrert: 24/05-2009 14:16
Sted: NTNU

Ved å bruke sekvensen av tall 123456789 kan vi finne summen 100.

Dette gjøres ved å legge inn + og - mellom tallene. Et eksempel på dette kan være

12 + 3 - 4 + 5 + 67 + 8 + 9 = 100

Hvor mange slike tall par, klarer dere å finne ?

Hva med 987654321?
"Å vite hva man ikke vet er og en slags allvitenhet" - Piet Hein
https://s.ntnu.no/Integralkokeboken
Lektor - Matematikk, Fysikk og Informatikk
Aleks855
Rasch
Rasch
Innlegg: 6855
Registrert: 19/03-2011 15:19
Sted: Trondheim
Kontakt:

1+23-4+56+7+8+9

1*2+3+4*5+6+78-9

1-2-34+56+7+8*9

Dette var faktisk ganske morsomt. Hvor mange muligheter finnes?

EDIT: 98+7-6+5-4+3-2-1, men det er vel den lette versjonen.

98 - 76 + 54 + 3 + 21, dog også ganske simpel.
2357
Lagrange
Lagrange
Innlegg: 1180
Registrert: 07/12-2007 22:08

123-4-5-6-7+8-9
Thales
Brahmagupta
Brahmagupta
Innlegg: 369
Registrert: 05/03-2008 16:04
Sted: Steigen

Noen som tar utfordringen å skrive en algoritme som kunne funnet alle mulige kombinasjoner hvis du har en rekke tall(array of numbers), og en sum du vil oppnå?
1. aar paa MIT(Freshman)

Anbefaler sterkt å sjekke denne artikkelen
Nebuchadnezzar
Fibonacci
Fibonacci
Innlegg: 5648
Registrert: 24/05-2009 14:16
Sted: NTNU

Så vidt meg bekjent er det 11 løsninger for 123456789 og 15 for 987654321
"Å vite hva man ikke vet er og en slags allvitenhet" - Piet Hein
https://s.ntnu.no/Integralkokeboken
Lektor - Matematikk, Fysikk og Informatikk
Charlatan
Guru
Guru
Innlegg: 2499
Registrert: 25/02-2007 17:19

Det er ikke spesielt vanskelig egentlig å skrive et slikt program. Uten at jeg skal skrive i detalj, kan man f.eks gjøre noe slikt i python (jeg tar eksempelet 5421):

definer en funksjon f(a,b,c) = "5a4b2c1". Så for-looper vi gjennom alle mulige ordnede utvalg (a,b,c) av tegnene {+,-,*}, la f.eks p_i være det i'te utvalget.

Så for-looper man for hver i med følgende:

if ( eval(f(p_i)) = N )
k = k+1

der k er tellevariabelen.

Det eval-funksjonen gjør (uten at jeg påberoper meg noen spesiell ekspertise på detaljene her), er å "tolke" f.eks strengen "4*3+1" som 4*3+1 = 13.

Så hvis (a,b,c) nå er (+,-,+), så vil eval(f(a,b,c)) = eval("5+4-2+1") = 5+3-2+1 = 7, og hvis 7 er tallet man er ute etter (dvs N), så teller man dette.

Er ikke så vanskelig å lage en liste av alle mulige ordnede utvalg (a_1,a_2,...,a_n) av {+,-,*} heller, krever bare litt rekursjonskreativitet.

Dette kan jo også gjøres mer generelt, ved å tillate paranteser, deling, potenser osv.. Man må begrense de ordnede utvalgene til det som gir mening (f.eks hvis "(" intreffer, må ")" inntreffe senere).
Thales
Brahmagupta
Brahmagupta
Innlegg: 369
Registrert: 05/03-2008 16:04
Sted: Steigen

Bestemte meg for å finne en løsning, så brukte en time på å skrive følgende, i javscript.
Jeg bemerker at tallsekvens og opersjonstegn må skrives som en "liste", det vil si [a,b,c,...,z], der hvor a, b, c, z er tall, eller tegn. Plus må skrives som "+", minus som "-" og gange som "*".

Eksempel:

Kode: Velg alt

resultat = sumCombinations([1,2,3,4,5],["+","-","*"],7);
alert(resultat.join(" || ")) // Burde vise i en popup boks: 1+2+3-4+5 || 1*2*3-4+5
Running time: [tex]k \cdot (n-1)\cdot m^{(n-1)}[/tex]
Der n = antall tall, og m er antall tegn, og k er en konstant, avhengig av hastigheten til datamskinen.

Funksjon:

Kode: Velg alt

function sumCombinations(tallsekvens, operasjonstegn, sum) { 
    var array1 = tallsekvens,  
        array2 = operasjonstegn;
    var len1 = array1.length - 1,
        len2 = array2.length;
    var arrayComb = [],
        arraySign = [],
        arrayCount = [],
        arrayFinal = [];

    for (var i = 0; i < len1; i++) {
        arrayComb.push(Math.pow(len2, len1 - 1 - i));
        arraySign.push(0);
        arrayCount.push(0);
    }

    for (var j = 0; j < Math.pow(len2, len1); j++) {
        str = array1[0];
        for (var i = 0; i < arrayComb.length; i++) {
            if (arrayCount[i] == arrayComb[i]) {
                arrayCount[i] = 0;
                arraySign[i]++;
                if (arraySign[i] > len2 - 1) {
                    arraySign[i] = 0
                }
            }
            arrayCount[i]++;
            str += array2[arraySign[i]] + array1[i + 1];
        }
        if (eval(str) == sum) {
            arrayFinal.push(str)
        };
    }

    return arrayFinal;
}
1. aar paa MIT(Freshman)

Anbefaler sterkt å sjekke denne artikkelen
Thales
Brahmagupta
Brahmagupta
Innlegg: 369
Registrert: 05/03-2008 16:04
Sted: Steigen

La nettop merke til at funskjonen som jeg nettop lagde ikke tillater å sette opp 12+3, men at det alltid blir 1+2+3. Skal sjekke om jeg gidder å løse dette.
1. aar paa MIT(Freshman)

Anbefaler sterkt å sjekke denne artikkelen
Nebuchadnezzar
Fibonacci
Fibonacci
Innlegg: 5648
Registrert: 24/05-2009 14:16
Sted: NTNU

Nå skal det siesat oppgaven ikke tillatet gangetegn eller subtraksjonstegn.

Bare pluss minus, og å trekke sammen tall

1+2+3 , 12+3 , 1+23 , 123

osv =)
"Å vite hva man ikke vet er og en slags allvitenhet" - Piet Hein
https://s.ntnu.no/Integralkokeboken
Lektor - Matematikk, Fysikk og Informatikk
Thales
Brahmagupta
Brahmagupta
Innlegg: 369
Registrert: 05/03-2008 16:04
Sted: Steigen

Ok, dette tok meg ganske så lang tid, det var vanskelig å arbeide med kombinatorikk i funksjoner. Uansett her er den:

Eksempel:

Kode: Velg alt

resultat = finnAlleSum([1,2,3,4,5],["+","-"],7); 
alert(resultat.join(" || ")) // Burde vise i en popup boks: 1+2+3-4+5 
Running time:
gad ikke å regne ut, men den kan bli lang hvis man bruker en lang sekvens med tall... :wink:

Funksjon(er):

Kode: Velg alt

function finnAlleSum(tallsekvens, operasjonstegn, sum) {
    var array1 = tallsekvens,
        array2 = operasjonstegn,
        arrayFinal = [];
    var comb = combinations(array1);

    for (var i in comb) {
        var comb2 = sumCombinations(comb[i], array2, sum);
        for (var j in comb2) {
            arrayFinal.push(comb2[j]);
        }
    }
    return arrayFinal;
}

function sumCombinations(tallsekvens, operasjonstegn, sum) {
    var array1 = tallsekvens,
        array2 = operasjonstegn;
    var len1 = array1.length - 1,
        len2 = array2.length;
    var arrayComb = [],
        arraySign = [],
        arrayCount = [],
        arrayFinal = [];

    for (var i = 0; i < len1; i++) {
        arrayComb.push(Math.pow(len2, len1 - 1 - i));
        arraySign.push(0);
        arrayCount.push(0);
    }

    for (var j = 0; j < Math.pow(len2, len1); j++) {
        var str = array1[0];
        for (var i = 0; i < arrayComb.length; i++) {
            if (arrayCount[i] == arrayComb[i]) {
                arrayCount[i] = 0;
                arraySign[i]++;
                if (arraySign[i] > len2 - 1) {
                    arraySign[i] = 0
                }
            }
            arrayCount[i]++;
            str += array2[arraySign[i]] + array1[i + 1];
        }
        if (eval(str) == sum) {
            arrayFinal.push(str)
        };
    }

    return arrayFinal;
}

function combinations(tallsekvens) {
    var array1 = tallsekvens,
        len1 = array1.length - 1;
    var arrayComb = [],
        arrayPlace = [],
        arrayCount = [],
        arrayFinal = [];
    var sum = 0;

    for (var i = 0; i <= len1; i++) {
        arrayComb.push(Math.floor(Math.pow(2, len1 - 1 - i)));
        sum += arrayComb[i];
        arrayPlace.push(0);
        arrayCount.push(0);
    }

    for (var j = 0; j <= sum; j++) {
        var str = "";
        for (var i = 0; i < arrayComb.length; i++) {
            if (arrayCount[i] >= arrayComb[i]) {
                arrayCount[i] = 0;
                arrayPlace[i]++;
                if (arrayComb[i] == 0) {
                    arrayComb[i] = Math.floor(Math.pow(2, len1 - 1 - i));
                } else {
                    arrayComb[i] = Math.floor(arrayComb[i] / 2);
                }
                if (arrayPlace[i] > len1 - i) {
                    arrayPlace[i] = 0
                }
            }
            arrayCount[i]++;
            str += array1[i];
            if (arrayPlace[i] == 0 && i != arrayComb.length - 1) {
                str += ",";
            }
        }
        arrayFinal.push(eval("[" + str + "]"))
    }
    return arrayFinal;
}
1. aar paa MIT(Freshman)

Anbefaler sterkt å sjekke denne artikkelen
Thales
Brahmagupta
Brahmagupta
Innlegg: 369
Registrert: 05/03-2008 16:04
Sted: Steigen

Og i ditt eksempel, Nebu, så blir dette:

Kode: Velg alt

finnAlleSum([1,2,3,4,5,6,7,8,9],["+","-"],100)
Som gir 11 muligheter:

Kode: Velg alt

1+2+3-4+5+6+78+9 = 100
1+2+34-5+67-8+9 = 100
1+23-4+5+6+78-9 = 100
1+23-4+56+7+8+9 = 100
12+3+4+5-6-7+89 = 100
12-3-4+5-6+7+89 = 100
12+3-4+5+67+8+9 = 100
123-4-5-6-7+8-9 = 100
123+4-5+67-89 = 100
123+45-67+8-9 = 100
123-45-67+89 = 100

Kode: Velg alt

finnAlleSum([9,8,7,6,5,4,3,2,1],["+","-"],100)
Gir 15 muligheter:

Kode: Velg alt

9-8+7+65-4+32-1 = 100
9+8+76+5+4-3+2-1 = 100
9+8+76+5-4+3+2+1 = 100
9-8+76-5+4+3+21 = 100
9-8+76+54-32+1 = 100
98+7+6-5-4-3+2-1 = 100
98+7-6+5-4+3-2-1 = 100
98+7-6+5-4-3+2+1 = 100
98+7-6-5+4+3-2+1 = 100
98-7+6+5+4-3-2-1 = 100
98-7+6+5-4+3-2+1 = 100
98-7+6-5+4+3+2-1 = 100
98-7-6+5+4+3+2+1 = 100
98-7-6-5-4+3+21 = 100
98-76+54+3+21 = 100


Slitet var verdt det :D :D
1. aar paa MIT(Freshman)

Anbefaler sterkt å sjekke denne artikkelen
Thales
Brahmagupta
Brahmagupta
Innlegg: 369
Registrert: 05/03-2008 16:04
Sted: Steigen

For moro skyld prøvde jeg:

Kode: Velg alt

finnAlleSum([1,2,3,4,5,6,7,8,9],["+","-","*","/"],100)
Den brukte ca 10 sekunder, men kom fram til 101 muligheter:
Dette blir halveis spamming, men følte at jeg måtte bare teste funskjonen min litt ut :lol: :lol: :lol:

Kode: Velg alt

1+2+3+4+5+6+7+8*9 = 100
1+2+3-4*5+6*7+8*9 = 100
1+2-3*4+5*6+7+8*9 = 100
1+2-3*4-5+6*7+8*9 = 100
1+2*3+4*5-6+7+8*9 = 100
1+2*3*4*5/6+7+8*9 = 100
1-2+3*4*5+6*7+8-9 = 100
1-2+3*4*5-6+7*8-9 = 100
1-2*3+4*5+6+7+8*9 = 100
1-2*3-4+5*6+7+8*9 = 100
1-2*3-4-5+6*7+8*9 = 100
1*2*3+4+5+6+7+8*9 = 100
1*2*3-4*5+6*7+8*9 = 100
1*2*3*4+5+6+7*8+9 = 100
1*2*3*4+5+6-7+8*9 = 100
1+2+3*4-5-6+7+89 = 100
1+2*3-4-5+6+7+89 = 100
1*2-3+4-5+6+7+89 = 100
1*2/3+4*5/6+7+89 = 100
1+2+3-4+5+6+78+9 = 100
1+2+3*4*5/6+78+9 = 100
1*2+3+4*5+6+78-9 = 100
1*2+3-4+5*6+78-9 = 100
1*2+3*4+5-6+78+9 = 100
1*2-3+4*5-6+78+9 = 100
1*2*3-4+5+6+78+9 = 100
1*2*3*4-5-6+78+9 = 100
1+2*3+4+5+67+8+9 = 100
1-2+3*4+5+67+8+9 = 100
1-2-3+4*5+67+8+9 = 100
1+2+3*4*56/7-8+9 = 100
1-2-3+4*56/7+8*9 = 100
1/2*3/4*56+7+8*9 = 100
1+2*3-4+56/7+89 = 100
1*2-3+4+56/7+89 = 100
1-2+3+45+6+7*8-9 = 100
1-2-3+45+6*7+8+9 = 100
1-2-3+45-6+7*8+9 = 100
1-2-3+45-6-7+8*9 = 100
1+2+3-45+67+8*9 = 100
1*2+3+45+67-8-9 = 100
1*2*3-45+67+8*9 = 100
1/2/3*456+7+8+9 = 100
1+2+34*5+6-7-8*9 = 100
1*2+34+5+6*7+8+9 = 100
1*2+34+5-6+7*8+9 = 100
1*2+34+5-6-7+8*9 = 100
1/2*34-5+6-7+89 = 100
1+2+34-5+67-8+9 = 100
1-2-34+56+7+8*9 = 100
1*2+34+56+7-8+9 = 100
1*2+34-56/7+8*9 = 100
1*2*34+56-7-8-9 = 100
1+2*34-56+78+9 = 100
1+23-4-5+6+7+8*9 = 100
1+23*4+5-6+7-8+9 = 100
1+23*4-5+6+7+8-9 = 100
1-23+4*5+6+7+89 = 100
1-23-4+5*6+7+89 = 100
1-23-4-5+6*7+89 = 100
1*23-4+5-6-7+89 = 100
1+23-4+5+6+78-9 = 100
1*23+4+5+67-8+9 = 100
1+23-4+56+7+8+9 = 100
1+23-4+56/7+8*9 = 100
1+23*4+56/7+8-9 = 100
1*23+4+56/7*8+9 = 100
1*23*4-56/7/8+9 = 100
1*23-4-56/7+89 = 100
1+234*5/6-7-89 = 100
1+234*5*6/78+9 = 100
1*234+5-67-8*9 = 100
1+234-56-7-8*9 = 100
12+3*4+5+6+7*8+9 = 100
12+3*4+5+6-7+8*9 = 100
12-3+4*5+6+7*8+9 = 100
12-3+4*5+6-7+8*9 = 100
12-3-4+5*6+7*8+9 = 100
12-3-4+5*6-7+8*9 = 100
12*3-4-5-6+7+8*9 = 100
12/3+4*5*6-7-8-9 = 100
12/3+4*5*6*7/8-9 = 100
12+3+4+5-6-7+89 = 100
12-3-4+5-6+7+89 = 100
12/3+4*5-6-7+89 = 100
12+3*4-5-6+78+9 = 100
12*3-4+5-6+78-9 = 100
12/3/4+5*6+78-9 = 100
12+3-4+5+67+8+9 = 100
12*3-4*5+67+8+9 = 100
12+3+4-56/7+89 = 100
12+3*45+6*7-89 = 100
12+34+5*6+7+8+9 = 100
12+34-5+6*7+8+9 = 100
12+34-5-6+7*8+9 = 100
12+34-5-6-7+8*9 = 100
123+4*5-6*7+8-9 = 100
123-4-5-6-7+8-9 = 100
123+4-5+67-89 = 100
123+45-67+8-9 = 100
123-45-67+89 = 100
1. aar paa MIT(Freshman)

Anbefaler sterkt å sjekke denne artikkelen
Thales
Brahmagupta
Brahmagupta
Innlegg: 369
Registrert: 05/03-2008 16:04
Sted: Steigen

Nebuchadnezzar skrev:Så vidt meg bekjent er det 11 løsninger for 123456789 og 15 for 987654321
Dette stemmer med det jeg fant. Men hvordan kom du fram til dette?
1. aar paa MIT(Freshman)

Anbefaler sterkt å sjekke denne artikkelen
Nebuchadnezzar
Fibonacci
Fibonacci
Innlegg: 5648
Registrert: 24/05-2009 14:16
Sted: NTNU

Stod liste på ei side jeg var innom ^^ Selv fant jeg tre av løsningene før jeg tittet på fasiten.

Me la oss ta en liten oppfølger da, som kanskje krever litt større regnekraft.

Du skal bruke tallene fra 1 til 9 en gang. Og plassere disse i en slik rekkefølge at de gir flest muligheter til å summeres til hundre.

1) Finn den sekvensen av 10 tall, som gir flest muligheter til å summeres til
100 når vi bare har lov til å bruke + og -

2) Samme problem over, bare nå har vi lov til å bruke + - * og /. De fire
elementære regneoperasjonene.
"Å vite hva man ikke vet er og en slags allvitenhet" - Piet Hein
https://s.ntnu.no/Integralkokeboken
Lektor - Matematikk, Fysikk og Informatikk
Svar