Pular para o conteúdo principal

Postagem em destaque

BlackTDN :: LeetCode :: Zigzag Conversion: Implementando Soluções em xBase (Harbour) e TL++

_Créditos das imagens: ChatGPT_ ### LeetCode :: Zigzag Conversion: Implementando Soluções em xBase (Harbour) e TL++ A ["Zigzag Conversion"](https://leetcode.com/problems/zigzag-conversion/description/) é um problema popular do LeetCode que desafia desenvolvedores a transformar uma string em um padrão zigzag com base no número de linhas especificado, para então reconstruir a string seguindo a leitura linha a linha do padrão. Aqui, apresento soluções desenvolvidas em Harbour (XBase) e TL++ com melhorias e detalhes adicionais. --- ### **O Problema** Dado uma string e um número de linhas, distribua os caracteres em um padrão zigzag. Leia as linhas do padrão sequencialmente para obter o resultado: Exemplo: **Input:** String: "PAYPALISHIRING" Linhas: 3 **Padrão Zigzag:** ``` P A H N A P L S I I G Y I R ``` **Output:** "PAHNAPLSIIGYIR" --- ### **Implementação em Harbour** As soluções estão organizadas em dois arquivos principai...

BlackTDN :: Harbour :: Entendendo o Uso de Hash

   1: Function main()
   2:  
   3:    LOCAL hPessoa  := hb_hash()
   4:    LOCAL hPessoas := hb_hash()
   5:    LOCAL nPessoa  := 0 
   6:    LOCAL nPessoas := 1000
   7:  
   8:    SET CENTURY ON
   9:    SET DATE TO BRITISH 
  10:    SET DATE FORMAT "mm/dd/yyyy"
  11:  
  12:    hPessoa["PESSOA"] := hb_hash()
  13:    hb_HSetCaseMatch( hPessoa["PESSOA"] , .F. )
  14:  
  15:    hPessoa["PESSOA"]["NOME"]        := "BlackTDN"
  16:    hPessoa["PESSOA"]["NASCIMENTO"]  := Ctod("01/01/2012")
  17:    hPessoa["PESSOA"]["SEXO"]        := "M"
  18:    hPessoa["PESSOA"]["PAIS"]        := "Brasil"
  19:    hPessoa["PESSOA"]["ENDEREÇO"]    := "http://blacktdn.com.br"
  20:    hPessoa["PESSOA"]["CEP"]         := "00000-000"
  21:  
  22:    ? 'hPessoa["PESSOA"]["NOME"] :' + LTrim(str(hb_hPos( hPessoa["PESSOA"] , "NOME" ) ))
  23:    ? 'hPessoa["PESSOA"]["NOME"] :' + hb_hGet( hPessoa["PESSOA"] , "NOME" )
  24:    ? hb_OsNewLine()
  25:    
  26:    ? 'hPessoa["PESSOA"]["NASCIMENTO"] :' + LTrim(str(hb_hPos( hPessoa["PESSOA"] , "NASCIMENTO" ) ))
  27:    ? 'hPessoa["PESSOA"]["NASCIMENTO"] :' + dtoc( hb_hGet( hPessoa["PESSOA"] , "NASCIMENTO" ) )
  28:    ? hb_OsNewLine()
  29:  
  30:    ? 'hPessoa["PESSOA"]["SEXO"] :' + LTrim(str(hb_hPos( hPessoa["PESSOA"] , "SEXO" )))
  31:    ? 'hPessoa["PESSOA"]["SEXO"] :' + hb_hGet( hPessoa["PESSOA"] , "SEXO" )
  32:    ? hb_OsNewLine()
  33:    
  34:    ? 'hPessoa["PESSOA"]["PAIS"] :' + LTrim(str(hb_hPos( hPessoa["PESSOA"] , "PAIS" )))
  35:    ? 'hPessoa["PESSOA"]["PAIS"] :' + hb_hGet( hPessoa["PESSOA"] , "PAIS" )
  36:    ? hb_OsNewLine()
  37:    
  38:    ? hb_AnsiToOem('hPessoa["PESSOA"]["ENDEREÇO"] :') + LTrim(str(hb_hPos( hPessoa["PESSOA"] , "ENDEREÇO" ) ))
  39:    ? hb_AnsiToOem('hPessoa["PESSOA"]["ENDEREÇO"] :') + hb_hGet( hPessoa["PESSOA"] , "ENDEREÇO" )
  40:    ? hb_OsNewLine()
  41:    
  42:    ? 'hPessoa["PESSOA"]["CEP"] :' + LTrim(str( hb_hPos( hPessoa["PESSOA"] , "CEP" ) ))
  43:    ? 'hPessoa["PESSOA"]["CEP"] :' + hb_hGet( hPessoa["PESSOA"] , "CEP" )
  44:    ? hb_OsNewLine()
  45:    
  46:    For nPessoa := 1 To nPessoas
  47:       hPessoas[nPessoa]                         := hb_hClone(hPessoa)
  48:       hPessoas[nPessoa]["PESSOA"]["NOME"]       += ' ' + StrZero(nPessoa,4)
  49:       IF ( ( nPessoa % 2 ) == 0 )
  50:          hPessoas[nPessoa]["PESSOA"]["NASCIMENTO"] := YearSum( hPessoas[nPessoa]["PESSOA"]["NASCIMENTO"] , nPessoa )
  51:       Else
  52:          hPessoas[nPessoa]["PESSOA"]["NASCIMENTO"] := YearSub( hPessoas[nPessoa]["PESSOA"]["NASCIMENTO"] , nPessoa )
  53:       EndIF
  54:    Next nPessoa
  55:    
  56:    FOR EACH hPessoa in hPessoas
  57:    
  58:       ? 'hPessoa["PESSOA"]["NOME"] :' + LTrim(str(hb_hPos( hPessoa["PESSOA"] , "NOME" ) ))
  59:       ? 'hPessoa["PESSOA"]["NOME"] :' + hb_hGet( hPessoa["PESSOA"] , "NOME" )
  60:       ? hb_OsNewLine()
  61:       
  62:       ? 'hPessoa["PESSOA"]["NASCIMENTO"] :' + LTrim(str(hb_hPos( hPessoa["PESSOA"] , "NASCIMENTO" ) ))
  63:       ? 'hPessoa["PESSOA"]["NASCIMENTO"] :' + dtoc( hb_hGet( hPessoa["PESSOA"] , "NASCIMENTO" ) )
  64:       ? hb_OsNewLine()
  65:  
  66:       ? 'hPessoa["PESSOA"]["SEXO"] :' + LTrim(str(hb_hPos( hPessoa["PESSOA"] , "SEXO" )))
  67:       ? 'hPessoa["PESSOA"]["SEXO"] :' + hb_hGet( hPessoa["PESSOA"] , "SEXO" )
  68:       ? hb_OsNewLine()
  69:       
  70:       ? 'hPessoa["PESSOA"]["PAIS"] :' + LTrim(str(hb_hPos( hPessoa["PESSOA"] , "PAIS" )))
  71:       ? 'hPessoa["PESSOA"]["PAIS"] :' + hb_hGet( hPessoa["PESSOA"] , "PAIS" )
  72:       ? hb_OsNewLine()
  73:       
  74:       ? hb_AnsiToOem('hPessoa["PESSOA"]["ENDEREÇO"] :') + LTrim(str(hb_hPos( hPessoa["PESSOA"] , "ENDEREÇO" ) ))
  75:       ? hb_AnsiToOem('hPessoa["PESSOA"]["ENDEREÇO"] :') + hb_hGet( hPessoa["PESSOA"] , "ENDEREÇO" )
  76:       ? hb_OsNewLine()
  77:       
  78:       ? 'hPessoa["PESSOA"]["CEP"] :' + LTrim(str( hb_hPos( hPessoa["PESSOA"] , "CEP" ) ))
  79:       ? 'hPessoa["PESSOA"]["CEP"] :' + hb_hGet( hPessoa["PESSOA"] , "CEP" )
  80:       ? hb_OsNewLine()
  81:  
  82:    NEXT EACH \\hPessoa
  83:    
  84:    inkey(0)
  85:  
  86: Return( .T. )
  87:  
  88: Function Day2Str( uData )
  89:    Local cType := ValType( uData )
  90: IF ( cType == "D" )
  91:    Return( StrZero( Day( uData ) , 2 ) )
  92: ElseIF ( cType == "N" )
  93:    Return( StrZero( uData , 2 ) )
  94: ElseIF ( cType == "C" )
  95:    Return( StrZero( Val( uData ) , 2 ) )
  96: EndIF
  97:  
  98: Function Month2Str( uData )
  99:    Local cType := ValType( uData )
 100: IF ( cType == "D" )
 101:    Return( StrZero( Month( uData ) , 2 ) )
 102: ElseIF ( cType == "N" )
 103:    Return( StrZero( uData , 2 ) )
 104: ElseIF ( cType == "C" )
 105:    Return( StrZero( Val( uData ) , 2 ) )
 106: EndIF
 107:  
 108: Function Year2Str( uData )
 109:    Local cType := ValType( uData )
 110: IF ( cType == "D" )
 111:    Return( StrZero( Year( uData ) , 4 ) )
 112: ElseIF ( cType == "N" )
 113:    Return( StrZero( uData , 4 ) )
 114: ElseIF ( cType == "C" )
 115:    Return( StrZero( Val( uData ) , 4 ) )
 116: EndIF
 117:  
 118: Function Last_Day( dDate )
 119:  
 120:    Local nMonth
 121:    Local nYear
 122:  
 123:    IF ( ValType( dDate ) == "C" )
 124:       dDate := CToD( dDate )   
 125:    EndIF
 126:  
 127:    nMonth := ( Month( dDate ) + 1 )
 128:    nYear  := Year( dDate )
 129:    IF ( nMonth > 12 )
 130:       nMonth := 1
 131:       ++nYear
 132:    EndIF
 133:  
 134:    dDate := CToD( "01/" + Month2Str( nMonth ) + "/" + Year2Str( nYear ) )
 135:    dDate -= 1
 136:  
 137: Return( Day( dDate ) )
 138:  
 139: Function YearSum( dDate , nYear )
 140:  
 141:    Local nMonthAux := Month( dDate )
 142:    Local nDayAux   := Day( dDate )
 143:    Local nYearAux  := Year( dDate )
 144:  
 145:    nYearAux += nYear
 146:    dDate := Ctod( Day2Str( nDayAux ) + "/" + Month2Str( nMonthAux ) + "/" + Year2Str( nYearAux ) )
 147:    IF Empty( dDate )
 148:       dDate   := Ctod( Day2Str( 1 ) + "/" + Month2Str( nMonthAux ) + "/" + Year2Str( nYearAux ) )
 149:       nDayAux := Last_Day( dDate )
 150:       dDate   := Ctod( Day2Str( nDayAux ) + "/" + Month2Str( nMonthAux ) + "/" + Year2Str( nYearAux ) )
 151:    EndIF
 152:  
 153: Return( dDate )
 154:  
 155: Function YearSub( dDate , nYear )
 156:  
 157:    Local nMonthAux := Month( dDate )
 158:    Local nDayAux   := Day( dDate )
 159:    Local nYearAux  := Year( dDate )
 160:  
 161:    nYearAux -= nYear
 162:    dDate := Ctod( Day2Str( nDayAux ) + "/" + Month2Str( nMonthAux ) + "/" + Year2Str( nYearAux ) )
 163:    IF Empty( dDate )
 164:       dDate   := Ctod( Day2Str( 1 ) + "/" + Month2Str( nMonthAux ) + "/" + Year2Str( nYearAux ) )
 165:       nDayAux := Last_Day( dDate )
 166:       dDate   := Ctod( Day2Str( nDayAux ) + "/" + Month2Str( nMonthAux ) + "/" + Year2Str( nYearAux ) )
 167:    EndIF
 168:  
 169: Return( dDate )


Para testar, baixe a última versão do Harbour Nightly binary: exe 7z (win), obtenha o exemplo acima a partir de totvs-advpl-naldodj\harbour\samples\main.prg e compile


image


e execute, verás a saida diretamente no “console”


image


Funções de Manipulação de Hash:  xHarbour e sua equivalência no Harbour



   1: #xtranslate HASH([<x,...>])             => hb_HASH(<x>)
   2: #xtranslate HHASKEY([<x,...>])          => hb_HHASKEY(<x>)
   3: #xtranslate HGETPOS([<x,...>])          => hb_HPOS(<x>)
   4: #xtranslate HGET([<x,...>])             => hb_HGET(<x>)
   5: #xtranslate HSET([<x,...>])             => hb_HSET(<x>)
   6: #xtranslate HDEL([<x,...>])             => hb_HDEL(<x>)
   7: #xtranslate HGETKEYAT([<x,...>])        => hb_HKEYAT(<x>)
   8: #xtranslate HGETVALUEAT([<x,...>])      => hb_HVALUEAT(<x>)
   9: #xtranslate HSETVALUEAT([<x,...>])      => hb_HVALUEAT(<x>)
  10: #xtranslate HGETPAIRAT([<x,...>])       => hb_HPAIRAT(<x>)
  11: #xtranslate HDELAT([<x,...>])           => hb_HDELAT(<x>)
  12: #xtranslate HGETKEYS([<x,...>])         => hb_HKEYS(<x>)
  13: #xtranslate HGETVALUES([<x,...>])       => hb_HVALUES(<x>)
  14: #xtranslate HFILL([<x,...>])            => hb_HFILL(<x>)
  15: #xtranslate HCLONE([<x,...>])           => hb_HCLONE(<x>)
  16: #xtranslate HCOPY([<x,...>])            => hb_HCOPY(<x>)
  17: #xtranslate HMERGE([<x,...>])           => hb_HMERGE(<x>)
  18: #xtranslate HEVAL([<x,...>])            => hb_HEVAL(<x>)
  19: #xtranslate HSCAN([<x,...>])            => hb_HSCAN(<x>)
  20: #xtranslate HSETCASEMATCH([<x,...>])    => hb_HSETCASEMATCH(<x>)
  21: #xtranslate HGETCASEMATCH([<x,...>])    => hb_HCASEMATCH(<x>)
  22: #xtranslate HSETAUTOADD([<x,...>])      => hb_HSETAUTOADD(<x>)
  23: #xtranslate HGETAUTOADD([<x,...>])      => hb_HAUTOADD(<x>)
  24: #xtranslate HALLOCATE([<x,...>])        => hb_HALLOCATE(<x>)
  25: #xtranslate HDEFAULT([<x,...>])         => hb_HDEFAULT(<x>)

[]s
иαldσ dj

Comentários

Postagens mais visitadas