Pular para o conteúdo principal

Postagem em destaque

BlackTDN :: LeetCode :: Comparando Implementações Harbour e TLPP para o Desafio Longest Palindromic Substring

_Créditos das imagens: ChatGPT_ ### LeetCode :: Comparando Implementações Harbour e TLPP para o Desafio Longest Palindromic Substring Resolver o problema do [Longest Palindromic Substring](https://leetcode.com/problems/longest-palindromic-substring/description/) é um exercício clássico de programação, que desafia desenvolvedores a encontrar a maior substring palindrômica dentro de uma string. Recentemente, exploramos soluções tanto em Harbour quanto em TLPP (Total Language Protheus Programming). Neste artigo, comparamos as implementações nessas duas linguagens, destacando suas semelhanças, diferenças e funcionalidades específicas. #### Implementações em Harbour ##### Versão 5.1 Essa solução utiliza a técnica de expansão a partir do centro do palíndromo. Cada caractere ou par de caracteres consecutivos é considerado um possível "centro". O algoritmo expande em ambas as direções enquanto os caracteres forem iguais, retornando o maior palíndromo encontrado. ##### Versão 5....

BlackTDN :: ADVPL ~ Strongly Typed Variables : ParamType Extended

Baseado na idéia original “Strongly Typed Variables  (c) 1996-1997 by Bryan Duchesne” BlackTDN disponibiliza uma versão adaptada para o ADVPL. A base para a versão “eXtended” foi o include ParmType.ch da própria TOTVS. Alguns ajustes foram necessários dentre eles: Substituir  “List match marker” por “Regular match marker” na atribuição de variável do tipo Objeto e na verificação de exceção.
 
-  Regular match marker:
Matches the next legal expression in the input text.  The regular match marker, a simple label, is the most general and, therefore, the most likely match marker to use for a command argument. Because of its generality, it is used with the regular result marker, all of the stringify result markers, and the blockify result marker.
-  List match marker:
Matches a comma-separated list of legal expressions.  If no input text matches the match marker, the specified marker name contains nothing. You must take care in making list specifications because extra commas will cause unpredictable and unexpected results.
 
Em função dessas alterações uma particularidade, em relação ao exemplo postado em BlackTDN :: ADVPL ~ PARAMTYPE, é a passagem do nome da Classe a ser usada na atribuição. Como ParmType.ch usa “List match marker” o nome da classe é passada como “Literal” sendo resolvida pelo pré-processador. Já em ParamTypeX.ch a classe a ser utilizada, considerando o uso de “Regular match marker”, deverá ser passada como uma “String”.
 
Denominamos o novo arquivo de cabeçalho de ParamTypeX.ch. Com ele poderemos, além validar a atribuição dos valores formais em uma função, validar os valores atribuídos a variáveis. Nesta primeira versão de ParamTypeX não nos preocupamos em salvar o conteúdo atribuído às variáveis para uso com depuração em tempo de execução deixaremos isso para uma versão futura.
 
Um uso para ParamTypeX.ch poderá ser visto a seguir:
 
   1: #ifdef TOTVS
   2:     #include "TOTVS.CH"
   3: #else    
   4:     #include "protheus.ch"
   5: #endif
   6:  
   7: /*
   8:     Programa : StronglyTypedVar.prg
   9:     Função   : STypedVar
  10:     Autor    : Marinaldo de Jesus [ http://www.blacktdn.com.br ]
  11:     Data     : 29/07/2012
  12:     Uso      : Strongly Typed Variables
  13: */
  14: User Function STypedVar()
  15:  
  16:     // declare your variables as strongly typed
  17:     LOCAL bError AS BLOCK VALUE {|e|MsgRun(e:Description,"Exception: "+IF(Empty(ProcName(3)),ProcName(2),ProcName(3)),{||Sleep(1000)})}
  18:     LOCAL bErrorBlock AS BLOCK
  19:  
  20:     LOCAL alcVar1 AS ARRAY VALUE Array(10)
  21:     LOCAL alcVar2 AS ARRAY
  22:      
  23:     LOCAL blcVar1 AS BLOCK VALUE { || .T. }
  24:     LOCAL blcVar2 AS BLOCK
  25:      
  26:     LOCAL clcVar1 AS CHARACTER VALUE "cVar1"
  27:     LOCAL clcVar2 AS CHARACTER
  28:      
  29:     LOCAL nlcVar1 AS NUMERIC VALUE 15
  30:     LOCAL nlcVar2 AS NUMERIC
  31:      
  32:     LOCAL dlcVar1 AS DATE VALUE Date()
  33:     LOCAL dlcVar2 AS DATE
  34:      
  35:     LOCAL llcVar1 AS LOGICAL VALUE .T.
  36:     LOCAL llcVar2 AS LOGICAL
  37:      
  38:     LOCAL olcVar1 AS OBJECT CLASS "FWFORMBROWSE" VALUE FWFORMBROWSE():New()
  39:     LOCAL olcVar2 AS OBJECT VALUE TFTPClient():New() //Generic Object
  40:           
  41:     STATIC astVar1 AS ARRAY VALUE Array(10)
  42:     STATIC astVar2 AS ARRAY
  43:      
  44:     STATIC bstVar1 AS BLOCK VALUE { || .T. }
  45:     STATIC bstVar2 AS BLOCK
  46:      
  47:     STATIC cstVar1 AS CHARACTER VALUE "cVar1"
  48:     STATIC cstVar2 AS CHARACTER
  49:      
  50:     STATIC nstVar1 AS NUMERIC VALUE 15
  51:     STATIC nstVar2 AS NUMERIC
  52:      
  53:     STATIC dstVar1 AS DATE VALUE Date()
  54:     STATIC dstVar2 AS DATE
  55:      
  56:     STATIC lstVar1 AS LOGICAL VALUE .T.
  57:     STATIC lstVar2 AS LOGICAL
  58:      
  59:     STATIC ostVar1 AS OBJECT CLASS "FWFORMBROWSE" VALUE FWFORMBROWSE():New()
  60:  
  61:     PRIVATE aptVar1 AS ARRAY VALUE Array(10)
  62:     PRIVATE aptVar2 AS ARRAY
  63:      
  64:     PRIVATE bptVar1 AS BLOCK VALUE { || .T. }
  65:     PRIVATE bptVar2 AS BLOCK
  66:      
  67:     PRIVATE cptVar1 AS CHARACTER VALUE "cVar1"
  68:     PRIVATE cptVar2 AS CHARACTER
  69:     
  70:     PRIVATE nptVar1 AS NUMERIC VALUE 15
  71:     PRIVATE nptVar2 AS NUMERIC
  72:      
  73:     PRIVATE dptVar1 AS DATE VALUE Date()
  74:     PRIVATE dptVar2 AS DATE
  75:     
  76:     PRIVATE lptVar1 AS LOGICAL VALUE .T.
  77:     PRIVATE lptVar2 AS LOGICAL
  78:      
  79:     PRIVATE optVar1 AS OBJECT CLASS "FWFORMBROWSE" VALUE FWFORMBROWSE():New()
  80:     
  81:     PUBLIC apbVar1 AS ARRAY VALUE Array(10)
  82:     PUBLIC apbVar2 AS ARRAY
  83:      
  84:     PUBLIC bpbVar1 AS BLOCK VALUE { || .T. }
  85:     PUBLIC bpbVar2 AS BLOCK
  86:      
  87:     PUBLIC cpbVar1 AS CHARACTER VALUE "cVar1"
  88:     PUBLIC cpbVar2 AS CHARACTER
  89:      
  90:     PUBLIC npbVar1 AS NUMERIC VALUE 15
  91:     PUBLIC npbVar2 AS NUMERIC
  92:      
  93:     PUBLIC dpbVar1 AS DATE VALUE Date()
  94:     PUBLIC dpbVar2 AS DATE
  95:     
  96:     PUBLIC lpbVar1 AS LOGICAL VALUE .T.
  97:     PUBLIC lpbVar2 AS LOGICAL
  98:     
  99:     PUBLIC opbVar1 AS OBJECT CLASS "FWFORMBROWSE" VALUE FWFORMBROWSE():New()
 100:     
 101:     //This command replaces the traditional := assignment
 102:     ASSIGN alcVar1 := Array(10)
 103:     ASSIGN blcVar1 := { || .T. }
 104:     ASSIGN clcVar1 := "ASSIGN cVar1"
 105:     ASSIGN nlcVar1 := 20
 106:     ASSIGN dlcVar1 := MsDate()
 107:     ASSIGN llcVar1 := .F.
 108:     ASSIGN olcVar1 := FWFORMBROWSE():New()
 109:      
 110:     ASSIGN astVar1 := Array(10)
 111:     ASSIGN bstVar1 := { || .T. }
 112:     ASSIGN cstVar1 := "ASSIGN cVar1"
 113:     ASSIGN nstVar1 := 20
 114:     ASSIGN dstVar1 := MsDate()
 115:     ASSIGN lstVar1 := .F.
 116:     ASSIGN ostVar1 := FWFORMBROWSE():New()
 117:      
 118:     ASSIGN aptVar1 := Array(10)
 119:     ASSIGN bptVar1 := { || .T. }
 120:     ASSIGN cptVar1 := "ASSIGN cVar1"
 121:     ASSIGN nptVar1 := 20
 122:     ASSIGN dptVar1 := MsDate()
 123:     ASSIGN lptVar1 := .F.
 124:     ASSIGN optVar1 := FWFORMBROWSE():New()
 125:      
 126:     ASSIGN apbVar1 := Array(10)
 127:     ASSIGN bpbVar1 := { || .T. }
 128:     ASSIGN cpbVar1 := "ASSIGN cVar1"
 129:     ASSIGN npbVar1 := 20
 130:     ASSIGN dpbVar1 := MsDate()
 131:     ASSIGN lpbVar1 := .F.
 132:     ASSIGN opbVar1 := FWFORMBROWSE():New()
 133:      
 134:     //Ao Tentar Atribuir uma valor diferente do que o esperado ocorrera uma Excecao
 135:  
 136:     ASSIGN bErrorBlock := ErrorBlock(bError)
 137:     
 138:     BEGIN SEQUENCE
 139:         ASSIGN alcVar1 := 1
 140:     END SEQUENCE
 141:  
 142:     BEGIN SEQUENCE
 143:         ASSIGN blcVar1 := .T.
 144:     END SEQUENCE
 145:  
 146:     BEGIN SEQUENCE
 147:          ASSIGN clcVar1 := 10
 148:     END SEQUENCE
 149:  
 150:     BEGIN SEQUENCE
 151:          ASSIGN nlcVar1 := "10"
 152:     END SEQUENCE
 153:  
 154:     BEGIN SEQUENCE
 155:          ASSIGN llcVar1 := 0
 156:     END SEQUENCE
 157:  
 158:     BEGIN SEQUENCE
 159:          ASSIGN olcVar1    := FWBROWSE():NEW() //Espera "FWFORMBROWSE"
 160:     END SEQUENCE
 161:  
 162:     BEGIN SEQUENCE
 163:         ASSIGN olcVar2    := TSocketClient():New() 
 164:     END SEQUENCE    
 165:  
 166:     ASSIGN bError := { |e| MsgInfo( e:Description , "Exception: " + ProcName(3) ) }
 167:  
 168:     ErrorBlock( bError )
 169:  
 170:     BEGIN SEQUENCE
 171:         ParamType()
 172:     END SEQUENCE
 173:  
 174:     ErrorBlock( bErrorBlock )
 175:  
 176: Return( NIL )
 177:  
 178: /*
 179:     Programa : StronglyTypedVar.prg
 180:     Função   : ParamType
 181:     Autor    : Marinaldo de Jesus [ http://www.blacktdn.com.br ]
 182:     Data     : 29/07/2012
 183:     Uso      : Strongly Typed Variables
 184: */
 185: Static Function ParamType(cVar,nVar,lVar,dVar,bVar,uVar,aVar,oVar1,oVar2)
 186:  
 187:     PARAMTYPE 1 VAR cVar  AS CHARACTER                   OPTIONAL DEFAULT ""
 188:     PARAMTYPE 2 VAR nVar  AS NUMERIC                     OPTIONAL DEFAULT 0
 189:     PARAMTYPE 3 VAR lVar  AS LOGICAL                     OPTIONAL DEFAULT .T.
 190:     PARAMTYPE 4 VAR dVar  AS DATE                        OPTIONAL DEFAULT Date()
 191:     PARAMTYPE 5 VAR bVar  AS BLOCK                       OPTIONAL DEFAULT { || .F. }
 192:     PARAMTYPE 6 VAR uVar  AS CHARACTER,NUMERIC           OPTIONAL DEFAULT "0"
 193:     PARAMTYPE 7 VAR aVar  AS ARRAY                       OPTIONAL DEFAULT Array(0)
 194:     PARAMTYPE 8 VAR oVar1 AS OBJECT CLASS "FWFORMBROWSE" OPTIONAL DEFAULT FWFORMBROWSE():New()
 195:     PARAMTYPE 9 VAR oVar2 AS OBJECT                      OPTIONAL DEFAULT TSocketClient():New()
 196:  
 197:     ASSIGN cVar  := cVar
 198:     ASSIGN nVar  := nVar 
 199:     ASSIGN lVar  := lVar
 200:     ASSIGN dVar  := dVar
 201:     ASSIGN bVar  := bVar
 202:     ASSIGN uVar  := uVar
 203:     ASSIGN aVar  := aVar
 204:     ASSIGN oVar1 := oVar2 //Espera "FWFORMBROWSE"
 205:     ASSIGN oVar2 := oVar1
 206:  
 207: Return( NIL )
 208:  
 209: #include "paramtypex.ch"

 

 

 

ParamTypeX.ch e o arquivo de exemplo poderão ser obtidos ao clicar aqui.



[]s
иαldσ dj

Comentários

Postagens mais visitadas