Avatar billede michaelrar Seniormester
05. juli 2017 - 17:36 Der er 9 kommentarer og
1 løsning

Udfordring :-) - Gruppering af tilfældige tal

Hej

Jeg har fået en "udfordring" på arbejde, jeg ikke selv kan knække :-(

Har en række tilfældige tal fra 1 - 4, der skal grupperes så de giver 8 i hver gruppe.
Eks. på tal 4,2,3,1,3,2,4,3,2,4,3,2,1,4,4,2............

De skal nu grupperes, så hver gruppe giver 8
4+4 = 8
4+4 = 8
osv. til 4 ikke optræder mere
Næste
4+3+1
3+3+2
3+3+1+1
3+2+2+1
osv.......
Den sidste gruppe kan så ende på en tilfældig sum, hvis ikke summen af tal går lige op når de deles med 8. (summen af tal er maksimum 288)
3+2+1 (kunne være slutningen.

Nogen der kan knække den i sommervarmen, så tager jeg hatten af :-)
God sommer til jer alle
Avatar billede arne_v Ekspert
05. juli 2017 - 17:49 #1
Og det skal vaere i VB??
Avatar billede michaelrar Seniormester
05. juli 2017 - 18:03 #2
Ikke nødvendigvis, hvis alternativet er "almindelige" Excel formler.
Var det din tanke ?
Avatar billede claes57 Ekspert
05. juli 2017 - 19:10 #3
en rutine: læg alle tal i en tekststreng
fjern det højeste (og husk det og forkort tekststreng left() og right() så dit tal er væk)
træk dit tal fra 8, og du har en diff - find det første tal med diff
hvis sum af dem giver 8, så udskriv og forfra - ellers fratræk 1 fra diff osv - der skal loopes, så du i værste fald opfanger 1+1+1+1+1+1+1+1

dvs hver tal, du finder og vælger fjernes i tekststreng, så den bliver kortere efterfølgende loop
Avatar billede wjens Guru
05. juli 2017 - 20:00 #4
Det skal nok tages højde for at restgruppen kan ende med en sum større end 8 (3 + 3 +3)
Avatar billede claes57 Ekspert
05. juli 2017 - 20:08 #5
#4 og det stopper så også loop, tak for info
Avatar billede claes57 Ekspert
05. juli 2017 - 20:11 #6
Avatar billede acore Ekspert
05. juli 2017 - 20:20 #7
Løsningen kan afhænge af i hvilken rækkefølge man tager tallene.

Eksempel:
4 3 3 3 3 2 2

Hvis man tager grupper med 4 først (som du skriver), vil man først tage (4,2,2) og så ende med (3,3,3,3)=12 i rest.

Hvis man tager 3 først (som er de "svære" at komme af med), vil man tage (3,3,2) og (3,3,2) og ende med (4) som rest.

Kan du bekræfte, at det er det først du ønsker - altså at der skal tages grupper fra startende med det/de størst mulige tal?
Avatar billede michaelrar Seniormester
05. juli 2017 - 20:51 #8
Tallene kommer i tilfældig rækkefølge men må gerne sorteres.  Sum vil som nævnt aldrig overstige 288
Avatar billede claes57 Ekspert
05. juli 2017 - 20:52 #9
ud fra:

De skal nu grupperes, så hver gruppe giver 8
4+4 = 8
4+4 = 8
osv. til 4 ikke optræder mere

så tages de største tal først.
Avatar billede acore Ekspert
05. juli 2017 - 22:49 #10
Rækkefølgen betyder ikke noget, så det afgørende er bare hvor mange du har af hver. I dit eksempel har du 2x1,5x2,4x3 og 5x4 = { 2,5,4,5 }.

Du fjerner
4 4
4 4
1 3 4
2 3 3
1 2 2 3
og ender med at have
2x2 tilbage.

Kode:
Sub test()
    Dim mycombi As Variant
    Dim combis As Variant
    Dim i As Integer
   
    mycombi = [ { 2,5,4,5 } ]
    combis = [ { 0,0,0,2; 1,0,1,1; 0,2,0,1; 2,1,0,1; 4,0,0,1; 0,1,2,0; 2,0,2,0; 1,2,1,0; 3,1,1,0; 5,0,1,0; 0,4,0,0; 2,3,0,0; 4,2,0,0; 6,1,0,0; 8,0,0,0 } ]

    s = "Start: " & printCombi(mycombi) & vbNewLine
    For i = 1 To UBound(combis, 1)
        Do While foundCombi(i, combis, mycombi)
            s = s & "Fjernet: " & popCombi(i, combis, mycombi) & vbNewLine
        Loop
    Next i
    s = s & "Rest: " & printCombi(mycombi)
    MsgBox s
End Sub

Function foundCombi(n As Integer, combis As Variant, mycombi As Variant) As Boolean
    Dim i As Integer
   
    foundCombi = True
   
    For i = 1 To UBound(combis, 2)
        If mycombi(i) < combis(n, i) Then
            foundCombi = False
            Exit For
        End If
    Next i
End Function

Function popCombi(n As Integer, combis As Variant, ByRef mycombi As Variant) As String
    Dim i As Integer
   
    popCombi = ""
   
    For i = 1 To UBound(combis, 2)
        mycombi(i) = mycombi(i) - combis(n, i)
        For j = 1 To combis(n, i)
            popCombi = popCombi & " " & i
        Next j
    Next i
End Function
Function printCombi(mycombi As Variant) As String
    Dim i As Integer
   
    printCombi = ""
    For i = 1 To UBound(mycombi)
        printCombi = printCombi & i & ": " & mycombi(i) & " "
    Next i
End Function
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester