Clipper On Line • Ver Tópico - Combinação

Combinação

Discussão sobre a linguagem CA-Clipper.

Moderador: Moderadores

 

Combinação

Mensagempor WCARDOSO » 04 Jan 2019 16:03

Boa tarde, gostaria de uma ajuda, quero fazer uma combinação de milhar, alguém tem alguma função?
[]´s
Wagner
Avatar de usuário

WCARDOSO
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 57
Data de registro: 08 Jul 2004 10:49
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Combinação

Mensagempor prmuller » 08 Jan 2019 08:10

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
prmuller
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 118
Data de registro: 11 Nov 2008 11:25
Cidade/Estado: Vila Velha - ES
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

Combinação

Mensagempor WCARDOSO » 09 Jan 2019 08:55

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.
[]´s
Wagner
Avatar de usuário

WCARDOSO
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 57
Data de registro: 08 Jul 2004 10:49
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Combinação

Mensagempor prmuller » 09 Jan 2019 09:17

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
prmuller
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 118
Data de registro: 11 Nov 2008 11:25
Cidade/Estado: Vila Velha - ES
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

Combinação

Mensagempor prmuller » 09 Jan 2019 09:38

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
prmuller
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 118
Data de registro: 11 Nov 2008 11:25
Cidade/Estado: Vila Velha - ES
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

Combinação

Mensagempor alxsts » 09 Jan 2019 10:22

Olá!

[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Combinação

Mensagempor prmuller » 09 Jan 2019 11:41

Boa Alxsts! Ainda tem a permuta, rsss
prmuller
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 118
Data de registro: 11 Nov 2008 11:25
Cidade/Estado: Vila Velha - ES
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

Combinação

Mensagempor WCARDOSO » 09 Jan 2019 11:55

Boa tarde prmuller,
Obrigado, vou dar uma olhada, boa cirurgia.
[]´s
Wagner
Avatar de usuário

WCARDOSO
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 57
Data de registro: 08 Jul 2004 10:49
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Combinação

Mensagempor Toledo » 09 Jan 2019 13:54

Se os números que serão combinados não repetir nenhum número, então pode usar este código:

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.
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

Combinação

Mensagempor Jairo Maia » 09 Jan 2019 14:38

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:
//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
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

Combinação

Mensagempor carlos_dornelas » 09 Jan 2019 19:25

Não testei aqui, mas acho que assim também daria certo:

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
carlos_dornelas
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 392
Data de registro: 25 Ago 2004 21:54
Curtiu: 0 vez
Mens.Curtidas: 10 vezes

Combinação

Mensagempor JoséQuintas » 09 Jan 2019 20:59

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


#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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Combinação

Mensagempor JoséQuintas » 09 Jan 2019 21:33

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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes




Retornar para CA-Clipper

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 3 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro