vanderleipinto / TT3

TT3
0 stars 0 forks source link

TT 3 #3

Open vanderleipinto opened 5 months ago

vanderleipinto commented 5 months ago

Questão 1

O objetivo desta questão é escrever um método que receba uma lista de hashes e retorne um string. Considere o seguinte código.

input = [
  {name: "Maria Neusa de Aparecida",
   cpf: "97905796671",
   state: "Sao Paulo",
   value: "1234"},
  {name: "Ricardo Fontes",
   cpf: "44010762900",
   state: "Rio Grande do Sul",
   value: "567"}
]

def solucao(arg)
# Retornar um string
end

solucao(input) == "Maria Neusa97905796671Sao Paulo 1234 \nRicardo Fon44010762900Rio Grande 567 "

A sua tarefa é preencher o conteúdo do método solucao de modo que:

Questão 2

O objetivo desta questão é extender a solução acima de modo que o formato do string retornado seja configurável. Considere um arquivo yaml no seguinte modelo. As chaves de primeiro nível (name, cpf, etc) representam atributos do hash e não são fixas (quer dizer, elas podem diferir de um arquivo yaml para outro). As chaves de segundo nível são sempre as mesmas: length, align, e padding.

length Com quantos caracteres deve ser formatado esse campo no output. Se o conteúdo do campo ultrapassar esse comprimento, ele deve ser truncado. align Indica se o conteúdo do campo deve ser alinhado a esquerda ou a direita. padding Caso o conteúdo do cammpo seja mais curto que a length especificada, o padding indica se o espaço restante deve ser preenchido com espaços em branco ou zero.

Exemplo yaml 1

# format-1.yaml
cpf:
  length: 11
  align: left
  padding: spaces
name:
  length: 14
  align: left
  padding: spaces
value:
  length: 8
  align: right
  padding: zeroes

Utilizando esse arquivo com o exemplo da questão anterior, o retorno esperado seria:

"97905796671Maria Neusa de00001234\n44010762900Ricardo Fontes00000567"

Exemplo yaml 2

# format-2.yaml
cpf:
  length: 14
  align: right
  padding: zeroes
value:
  length: 8
  align: right
  padding: zeroes
state:
  length: 14
  align: left
  padding: spaces

Utilizando esse arquivo com o exemplo da questão anterior, o retorno esperado seria: "0009790579667100001234Sao Paulo \n0004401076290000000567Rio Grande do "

Nesta solução, além de receber a lista de hashes como argumento, o método solucao deve ler estas configurações de um arquivo yaml de nome “format.yaml”. Se preferir, fique a vontade para usar uma class ou module ao invés de só um método.

Questão 3

O objetivo desta questão é implementar a operação inversa da questão 2. Isto é: escreva um método que recebe como argumento um string e retorna um hash. A forma como ele deve ler o string para extrair os valores é dada por um arquivo yaml como os da questão 2.

Por exemplo, se seguirmos o arquivo “format-1.yaml”.

# format-1.yaml
cpf:
  length: 11
  align: left
  padding: spaces
name:
  length: 14
  align: left
  padding: spaces
value:
  length: 8
  align: right
  padding: zeroes

Um método corretamente implementado deve se comportar da seguinte forma:

solucao("97905796671Maria Neusa de00001234") == { cpf: '97905796671', name: 'Maria Neusa de', value: '1234' }
solucao("44010762900Ricardo Fontes00000567") == { cpf: '44010762900', name: 'Ricardo Fontes', value: '567' }
vanderleipinto commented 5 months ago

1

def solucao(arg)
  string = ""
  arg.each do |item|
    item.each do |i|
      string << i[1][0, 10].ljust(10)
    end
    string << "\n"
  end
  string
end

input = [
  {name: "Maria Neusa de Aparecida",
   cpf: "97905796671",
   state: "Sao Paulo",
   value: "1234"},
  {name: "Ricardo Fontes",
   cpf: "44010762900",
   state: "Rio Grande do Sul",
   value: "567"}
]

puts solucao(input)

Foi criado o método solucao(arg) que recebe os dados de input como parâmetro. Dentro desse método temos criamos uma string vazia para receber os dados formatados e ser retornada Percorremos o array e cada hash dentro dele. Cada hash tem seus dados inseridos na string conforme a formatação. string << i[1][0, 10].ljust(10) onde i é a hash e i[1] é o valor. No final de cada campo da hash é acrescentando um \n.

vanderleipinto commented 5 months ago

2

require "yaml"

input = [
  {
    name: "Maria Neusa de Aparecida",
    cpf: "97905796671",
    state: "Sao Paulo",
    value: "1234"
  },
  {name: "Ricardo Fontes",
   cpf: "44010762900",
   state: "Rio Grande do Sul",
   value: "567"}
]

class UserData
  attr_reader :config
  attr_reader :data

  def initialize(data)
    @data = data
    @config = change_config(YAML.load_file("format-2.yaml"))
  end

  def change_config(config_data)
    config_data.each_pair do |key, value|
      value["align"] = (value["align"] == "left") ? :ljust : :rjust
      value["padding"] = (value["padding"] == "spaces") ? " " : "0"
    end
  end

  def formated
    string = ""
    @data.each do |i, index|
      string << i[:cpf][0, config["cpf"]["length"]].send(config["cpf"]["align"], config["cpf"]["length"], config["cpf"]["padding"])
      string << i[:name][0, config["name"]["length"]].send(config["name"]["align"], config["name"]["length"], config["name"]["padding"]) if config.key?("name")
      string << i[:value][0, config["value"]["length"]].send(config["value"]["align"], config["value"]["length"], config["value"]["padding"])
      string << i[:state][0, config["state"]["length"]].send(config["state"]["align"], config["state"]["length"], config["state"]["padding"]) if config.key?("state")
      string << "\n"
    end
    string
  end
end

user = UserData.new(input)

puts user.formated

Destrinchando o código

Fazemos require "yaml" para o uso dos arquivos Yaml, biblioteca nativa do ruby.

Temos os dados do input no próprio arquivo do código.

Criamos uma classe para a resolução do exercício. Essa classe se inicia com os dados (input). Já na inicialização da classe, importamos os dados do arquivo Yaml para a variável @data.

Criamos um método def change_config(config_data) para alterar os dados de configuração de acordo com o desejado:

def change_config(config_data)
    config_data.each_pair do |key, value|
     #se o valor de align for left, a hash recebe a função :ljust para uso posterior (será usado com o comando send)
      value["align"] = (value["align"] == "left") ? :ljust : :rjust
     #se o valor de padding for spaces, ele recebe um espaço, senão recebe um zero. Também para uso futuro.
      value["padding"] = (value["padding"] == "spaces") ? " " : "0"
    end
  end

se o valor de align for left, a hash recebe a função :ljust para uso posterior (será usado com o comando send)

se o valor de padding for spaces, ele recebe um espaço, senão recebe um zero. Também para uso futuro.

Criamos o método formated para trabalhar com os dados informados e a configuração modificada.

  def formated
    string = ""
    @data.each do |i, index|
      string << i[:cpf][0, config["cpf"]["length"]].send(config["cpf"]["align"], config["cpf"]["length"], config["cpf"]["padding"])
      string << i[:name][0, config["name"]["length"]].send(config["name"]["align"], config["name"]["length"], config["name"]["padding"]) if config.key?("name")
      string << i[:value][0, config["value"]["length"]].send(config["value"]["align"], config["value"]["length"], config["value"]["padding"])
      string << i[:state][0, config["state"]["length"]].send(config["state"]["align"], config["state"]["length"], config["state"]["padding"]) if config.key?("state")
      string << "\n"
    end
    string
  end
end

A cada valor das chaves dados ele altera de acordo com a configuração, insere em uma string para retorno.

vanderleipinto commented 5 months ago

3

require "yaml"

def solucao(string)
  config = YAML.load_file("format-1.yaml")
  ret = {}

  ret[:cpf] = string.slice!(0, config["cpf"]["length"])
  ret[:name] = string.slice!(0, config["name"]["length"])
  ret[:value] = string.slice!(0, config["value"]["length"]).sub(/\A0+/, "")

  ret
end

p solucao("97905796671Maria Neusa de00001234")
p solucao("44010762900Ricardo Fontes00000567")

Destrinchando o código

Aqui fazemos o require para usar a biblioteca yaml. Criamos um método que recebe a string a ser separada. Separamos de acordo com o tamanho indicado no arquivo yaml importado para variável config. Criamos uma Hash vazia para comportar os dados. Fazemos o slice! passando o tamanho do campo que desejamos retirar da string e colocando nas chaves correspondentes.

Retornamos a hash.