Página 1 de 1

Combinação

Enviado: 04 Jan 2019 17:03
por WCARDOSO
Boa tarde, gostaria de uma ajuda, quero fazer uma combinação de milhar, alguém tem alguma função?

Combinação

Enviado: 08 Jan 2019 09:10
por prmuller
Bom dia Wagner!
Qual o objetivo final?
Em análise combinatória existe o arranjo e a combinação, daí, depende do que vc quer fazer. Seria algum sorteio, gerar milhares aleatórias?

Sds,
Paulo Müller

Combinação

Enviado: 09 Jan 2019 09:55
por WCARDOSO
Bom dia prmuller, a combinação seria de uma milhar por exemplo: 9756, nesta milhar a função iria fazer todas as possíveis combinações.
Ex.: 9567 - 9567 - 9756 - 9765- 7965 - 7956 - 5976 - 5967 - etc.. sempre nas milhares que forem inseridas.

Combinação

Enviado: 09 Jan 2019 10:17
por prmuller
Bom dia!
Isso, na realidade, é um problema de arranjo. Seria a resposta para duas questões: quantas combinações são possíveis usando a milhar x? Como fazer isso?
Já fiz assim mas, usando o Pascal. Existe inclusive uma função já pronta. Em clipper eu gerava bds para bingos, raspadinhas, etc.
De qualquer forma, vou procurar nos meus arquivos antigos para ver se acho alguma coisa.
Não é o caso, mas de uma olhada na função Random do clipper que gera números alea
tórios.

Sds,
Paulo Müller

Combinação

Enviado: 09 Jan 2019 10:38
por prmuller
Correção. É combinação mesmo e não arranjo.
Nesse link um ponto de partida para vc, com o código fonte: viewtopic.php?f=43&t=15007
Analise e veja se dá para adaptar.
Amanhã vou fazer uma cirurgia de fratura do cotovelo e, na volta, tentarei te ajudar, oK?

Sds,
Paulo Müller

Combinação

Enviado: 09 Jan 2019 11:22
por alxsts
Olá!


Combinação

Enviado: 09 Jan 2019 12:41
por prmuller
Boa Alxsts! Ainda tem a permuta, rsss

Combinação

Enviado: 09 Jan 2019 12:55
por WCARDOSO
Boa tarde prmuller,
Obrigado, vou dar uma olhada, boa cirurgia.

Combinação

Enviado: 09 Jan 2019 14:54
por Toledo
Se os números que serão combinados não repetir nenhum número, então pode usar este código:

Código: Selecionar todos

Function Main()
aCmb:=CombMil("9756")   //chame a funcao passando o numero que sera combinado
*Vai retornar uma matriz com as combinacoes
For i_=1 to len(aCmb)
   ? aCmb[i_]
Next
Return Nil


Function CombMil(cMil)
Local cCmbPos:="1234|1243|1324|1342|1423|1432|2134|2143|2314|2341|2413|2431|3124|3142|3214|3241|3412|3421|4123|4132|4213|4231|4312|4321|"
Local aRet_:={}
For e_=1 to 4
   cNum_:=SUBS(cMil,e_,1)
   cCmbPos:=StrTran( cCmbPos, Str(e_,1), cNum_)
Next
For e_=1 to 24
   cCob_:=Left(cCmbPos,4)
   AADD(aRet_,cCob_)
   If e_<24
      cCmbPos:=SUBS(cCmbPos,6)
   endif
Next
Return aRet_
Obs.: esta função vai funcionar apenas para combinações de 4 números.

Combinação

Enviado: 09 Jan 2019 15:38
por Jairo Maia
Olá Pessoal,

Vou dar uma contribuição aqui que acho que funcionou (pode ser com mais de 4 dígitos também). Acho que funcionou:

Código: Selecionar todos

//Function Main()  // para Clipper deixe comentado...

 Local GetList:={}
 Local x, xy, cChar
 Local cNumero, cNumeroFix
 Local aMatriz:={}, nPosi:=0
 
 Clear Screen
 
 cNumero := Space( 4 )
 @ 3,5 SAY "Digite um Numero:" GET cNumero PICTURE "9999"
 Read
 
 cNumero := AllTrim( cNumero )
 
 If Empty( cNumero )
  Return Nil
 Else
  cNumeroFix := cNumero
 EndIf
 
 While nPosi < Len( AllTrim( cNumero ) )  // trata a milhar principal...
 
  nPosi++

  For x = 1 To Len( AllTrim( cNumero ) )
  
   cChar := SubSt( cNumero, x, 1 )
  
   cChar := cChar + Stuff( cNumero, x, 1, "" )
  
   If AScan( aMatriz, cChar ) = 0
    AaDd( aMatriz, cChar )
   EndIf
  
   If x = Len( AllTrim( cNumero ) )// - 1
    cNumero := cChar
   EndIf
  
  Next

 EndDo

 nPosi := 0
 For xy:=1 To Len( aMatriz )  // trata as combinações...
 
  cNumero := aMatriz[xy]

  For x = 1 To Len( AllTrim( cNumero ) )
  
   cChar := SubSt( cNumero, x, 1 )
  
   cChar := cChar + Stuff( cNumero, x, 1, "" )
  
   If AScan( aMatriz, cChar ) = 0
    AaDd( aMatriz, cChar )
   EndIf
  
  Next

 Next

 Clear Screen
 aMatriz := Asort( aMatriz )

 ? "Combinacoes de:", cNumeroFix
 ?
 For x:=1 To Len( aMatriz )
  ? aMatriz[x]
 Next
 ?
 ?
 //Return Nil

Combinação

Enviado: 09 Jan 2019 20:25
por carlos_dornelas
Não testei aqui, mas acho que assim também daria certo:

Código: Selecionar todos

aDigitos:={9,7,5,6}
for a=1 to 4
  for b=1 to 4
    for c=1 to 4
      for d=1 to 4
        if a<>b .and. a<>c .and. a<>d .and. b<>c .and. b<>d .and. c<>d
            ? str(aDigitos[a],1)+str(aDigitos[b],1)+str(aDigitos[c],1)+str(aDigitos[d],1)
        endif
      next
    next
  next
next
[]s

Antonio Carlos

Combinação

Enviado: 09 Jan 2019 21:59
por JoséQuintas
Gostei da brincadeira, uma espécie de desafio.
Parece que deu certo, já que as opções seriam 4 x 3 x 2 x 1, o que dá 24.
Comecei pensando em agilizar a rotina anterior.
depois pensei reduzir variáveis alterando pra array.
como ficaria repetitivo nos loops, pensei em recursividade.
uma coisa foi levando pra outra.
Depois retirei o FOR/EACH, porque aqui é Clipper.
Até que ficou interessante.
Combinacao.png

Código: Selecionar todos

#include "inkey.ch"

PROCEDURE Main

   LOCAL cNumero := "9756", aList := {}, nCont

   SetMode( 30, 80 )
   CLS
   ? Time()
   Combina( cNumero, "", @aList )
   ASort( aList )
   FOR nCont = 1 TO Len( aList )
      ? nCont, aList[ nCont ]
   NEXT
   ? Time() + " ESC"
   DO WHILE Inkey(0) != K_ESC
   ENDDO

   RETURN

FUNCTION Combina( cNumeros, cAcumulado, aList )

   LOCAL cNumero, nCont

   IF Len( cAcumulado ) == Len( cNumeros )
      AAdd( aList, cAcumulado )
      RETURN NIL
   ENDIF
   FOR nCont = 1 TO Len( cNumeros )
      cNumero := Substr( cNumeros, nCont, 1 )
      IF ! cNumero $ cAcumulado
         Combina( cNumeros, cAcumulado + cNumero, @aList )
      ENDIF
   NEXT

   RETURN NIL

Combinação

Enviado: 09 Jan 2019 22:33
por JoséQuintas
Não ficou limitado a 4 números.
combinacao2.png
6 x 5 x 4 x 3 x 2 x 1 = 720 combinações para 6 números