Avatar billede gummi-manden Nybegynder
02. juni 2007 - 11:53 Der er 9 kommentarer

skal lave en udregner til at finde 4 cifre der kan ligge mellem..

hej... har brug for noget hjælp her...
jeg skal lave en udregner til at finde 4 cifre der kan ligge mellem (1-9) og de må ikke være ens.
A=skal betyde at talet er rigtigt og placeret rigtigt.
B=skal betyde at taller er rigtigt men placeret frokert.

altså en marster mind udregner men med tal og så kun 4 tal...
har set en udregner ligne problemet er kun at den går fra (0-9)

en der er en prof matematiker og prokramør som kan hjælpe mig med at lave sådan en lille program... har fådet af hvide at det er muligt at lave i visual basic, men kan ikke selv finde ud af at programere i nu agter at lære det... en eventuel source code er nok

på forhånd tak
Avatar billede bauerdata Nybegynder
02. juni 2007 - 14:19 #1
#!/usr/bin/env python
def solution ():
    import random
    z = [ x for x in range(1,10) ]
    Solution  = []
    for y in range(4):
        x =  random.choice( z )
        z.remove( x )
        Solution.append(x)
    return Solution
if __name__ == "__main__":
    print solution()
Avatar billede tjacob Juniormester
02. juni 2007 - 14:30 #2
Dim i As Long, j As Long, lTmp As Long, bOK As Boolean

    Randomize
    For i = 1 To 4
        lOrgNum(i) = 0
        Do
            bOK = True
            lTmp = Int((9 * Rnd) + 1)
            For j = 1 To 4
                If j <> i And lTmp = lOrgNum(j) Then
                    bOK = False
                    Exit For
                End If
            Next j
        Loop Until bOK
        lOrgNum(i) = lTmp
    Next i

Dette er en 'blunt force' metode, men da det drejer sig om så få tal, og alle PC'ere i dag er rigeligt hurtige, så er det langt det nemmeste.

Med hensyn til at checke gæt er det rimeligt simpelt:

Denne funktion tager et (1 To 4) Long Array som input, og sammenligner det med lOrgNum-Arrayet.
Der outputtes et (1 To 4) String Array, der indeholder A, B eller C (C er forkert nummer).

Private Function CheckNumbers(ByRef lGuess() As Long) As String()
    Dim i As Long, j As Long, sAnswer(1 To 4) As String
   
    For i = 1 To 4
        sAnswer(i) = "C"
        For j = 1 To 4
            If lGuess(i) = lOrgNum(j) Then sAnswer(i) = "B"
            If lGuess(i) = lOrgNum(j) And i = j Then sAnswer(i) = "A"
        Next j
    Next i
    CheckNumbers = sAnswer

End Function

Da jeg kan forstå at du ikke har megen erfaring med Visual Basic, har jeg lavet et lille testprogram du kan hente her: http://www.home1.stofanet.dk/5soft/v9cxjk4l/MM-Eksp.zip
Avatar billede thomaxz Nybegynder
02. juni 2007 - 19:09 #3
tjacob, ikke for være på nakken, men hvor har du fra at "alle" pc er er rigelig hurtigt, nu kender jeg personligt et par stykker som ikke har særlige hurtige maskiner dvs.  450 mhz og derunder.
Avatar billede gummi-manden Nybegynder
02. juni 2007 - 22:25 #4
hej tjacob tror vi har misforstådet hinnanden lidt...

her er et link til det program jeg omtalte som jeg ikke kunne burge men skulla have et der næsten var meneg til bortset fra det kun skulle gå fra (1-9) i stedet fro (0-9)

http://pyva.net/eng/pc/bk.html

og det med erfaring kan jeg det svære sige det eneste erfaring jeg har er fra mersk data defence i sønderborg hvor jeg ahr lavet en masse afskrift uden vidre at forstå det...:( og det var så i c++
Avatar billede tjacob Juniormester
03. juni 2007 - 09:18 #5
>>thomaxz:  Jeg mente blot at PC'erne er rigeligt hurtige til denne opgave. Selv med en 200 MHz maskine vil de 4 tal være genereret i løbet af få millisekunder.
Min pointe var blot at hvis det skal gøres helt korrekt, så skal tallene ikke lægges tilbage efter efter de er genereret. Dette kan sagtens gøres med en længere kode, men jeg mente ikke at det var nødvendigt i dette tilfælde.

>>gummi-manden: Du har ret, jeg misforstod dig lidt. For at blive som i det link du gav, så skal Check funktionen blot rettes til:

Private Function CheckNumbers(ByRef lGuess() As Long) As Long()
    Dim i As Long, j As Long, lAnswer(1 To 2) As Long
   
    For i = 1 To 4
        For j = 1 To 4
            If lGuess(i) = lOrgNum(j) Then lAnswer(2) = lAnswer(2) + 1
            If lGuess(i) = lOrgNum(j) And i = j Then lAnswer(1) = lAnswer(1) + 1
        Next j
    Next i
    CheckNumbers = lAnswer

End Function

Nu outputter den et (1 To 2) Long Array, hvor (1) indeholder antal rigtige tal på rigtig placering, og (2) indeholder antal rigtige tal på forkert placering.

Jeg har opdateret linket, således at testprogrammet er rettet.
Avatar billede tjacob Juniormester
03. juni 2007 - 09:57 #6
For en god ordens skyld er der her en funktion der genererer 4 forskellige tal UDEN tilbagelægning (altså IKKE 'blunt force') Og den er rent faktisk ikke længere end den jeg beskrev 02/06-2007 14:30:33  ;)
Den outputter et (1 To 4) Long Array:

Function Find4Tal() As Long()
    Dim lOrgTal(1 To 4) As Long, lTmpTal(8) As Long
    Dim i As Long, lAktuelTal As Long, lTilbage As Long
   
    For i = 0 To 8
        lTmpTal(i) = i
    Next i
    Randomize
    lTilbage = 9
    For i = 0 To 3
        lAktuelTal = Int(lTilbage * Rnd)
        lOrgTal(i + 1) = lTmpTal(lAktuelTal) + 1
        lTilbage = lTilbage - 1
        lTmpTal(lAktuelTal) = lTmpTal(lTilbage)
    Next i
    Find4Tal = lOrgTal

End Function
Avatar billede gummi-manden Nybegynder
03. juni 2007 - 16:17 #7
tjacob>>
Hmmm....
ved ikke hvormeget du har kigget på BK.exe det jeg kna forstå er at den siger prøv en her og fortel mig hvormange der er rigtigt placeret og hvormange der er rigte men placeret forkert...

tænkte på om der er en måde vi kan skives privat?
hvis du gider hjælpe mere med dette problem!
Avatar billede tjacob Juniormester
04. juni 2007 - 09:11 #8
Ja, nu fungerer det nøjagtigt som BK.exe...

Der er dog en lille fejl i checkfunktionen, den skal rettes til:

    For i = 1 To 4
        For j = 1 To 4
            If lGuess(i) = lOrgNum(j) And i <> j Then lAnswer(2) = lAnswer(2) + 1
            If lGuess(i) = lOrgNum(j) And i = j Then lAnswer(1) = lAnswer(1) + 1
        Next j
    Next i
    CheckNumbers = lAnswer

Du er da velkommen til at skrive til mig, men en eventuel løsning skal være tilgængelig for alle iflg. Ekspertens regler.
Du kan skrive til mig på: tjacob (her snabela) stofanet (her punktum) dk
Avatar billede bauerdata Nybegynder
07. juni 2007 - 07:11 #9
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
Kategori
Kurser inden for grundlæggende programmering

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