PowerShell / PSReadLine

A bash inspired readline implementation for PowerShell
BSD 2-Clause "Simplified" License
3.75k stars 296 forks source link

Bug no console solicitando reportar ao github #3635

Closed LacerdaKris closed 1 year ago

LacerdaKris commented 1 year ago

Prerequisites

Exception report

Últimas 3 Chaves:

Exceção:
 deve ser maior ou igual a zero e menor que o tamanho do buffer do console nessa dimensão.
Nome do parâmetro: left
Valor real era -2.
   em System.Console.SetCursorPosition(Int32 left, Int32 top)
   em Microsoft.PowerShell.Internal.VirtualTerminal.set_CursorLeft(Int32 value)       
   em Microsoft.PowerShell.PSConsoleReadLine.ReallyRender(RenderData renderData, String defaultColor)
   em Microsoft.PowerShell.PSConsoleReadLine.ForceRender()
   em Microsoft.PowerShell.PSConsoleReadLine.Insert(Char c)
   em Microsoft.PowerShell.PSConsoleReadLine.SelfInsert(Nullable`1 key, Object arg)   
   em Microsoft.PowerShell.PSConsoleReadLine.ProcessOneKey(ConsoleKeyInfo key, Dictionary`2 dispatchTable, Boolean ignoreIfNoAction, Object arg)
   em Microsoft.PowerShell.PSConsoleReadLine.InputLoop()
   em Microsoft.PowerShell.PSConsoleReadLine.ReadLine(Runspace runspace, EngineIntrinsics engineIntrinsics)

Screenshot

image

Environment data

No linha:1 caractere:1
+ }
+ ~
Token '}' inesperado na expressão ou       
instrução.
    + CategoryInfo          : ParserError  
   : (:) [], ParentContainsErrorRecordEx   
  ception
    + FullyQualifiedErrorId : UnexpectedT  
   oken

Steps to reproduce

import pandas as pd from unidecode import unidecode

distancias = pd.read_csv('DNIT-Distancias.csv', delimiter=';', header=0)

custo por km rodado de cada caminhão

custo_caminhoes = {'P': 4.87, 'M': 11.92, 'G': 27.44}

lista para armazenar os transportes cadastrados na opção 2 do menu

transportes_cadastrados = []

def menu(): print("Menu:") print("1") print("2")

opcao = 0 while opcao !=4: menu() opcao = int(input("Digite a opção desejada pelo número: ")) if opcao == 1: break

elif opcao == 2:

cria lista com as cidades digitadas, e passa pra outra removendo os espaços em branco no início/fim

input_cidades = input("Digite quais cidades serão percorridas, separe-as com vírgula: ").split(",")
cidades = [cidade.strip() for cidade in input_cidades]

#dicionário p/ armazenar os pares de trecho entre cidades, e um acumulador do total
distancias_cidades = {}
km_total = 0

#começa a iterar as cidades pela segunda da lista (indice 1)
for i in range(1, len(cidades)):
  #retira acentos e deixa todos os caracteres em maiúsculo
  cidade_anterior = unidecode(cidades[i-1]).upper()
  cidade_atual = unidecode(cidades[i]).upper()

  origem_posicao = distancias.columns.get_loc(cidade_anterior)
  destino_posicao = distancias.columns.get_loc(cidade_atual)
  distancia = distancias.iloc[origem_posicao, destino_posicao]

  #cria chave e valor do par, armazena com a dstancia no dict e soma ao acumulador
  chave = cidade_anterior + " - " + cidade_atual
  valor = distancia
  distancias_cidades[chave] = valor
  km_total += valor

  #prepara valor da cidade anterior para próxima iteração
  cidade_anterior = cidade_atual

#cria dicionário para armazenar os itens e seus respectivos pesos
itens = {}

while True:
  item = input('Digite o nome do item a incluir na carga: ')
  peso = int(input('Digite o peso do item em kg (número inteiro): '))
  itens[item] = peso

  mais_itens = input('Incluir mais itens? (S/N): ')
  if mais_itens.lower() != 's':
    break

paradas = input("Haverá paradas para retirada de carga? (S/N): ")
if paradas.lower() == 's':
  paradas_cidades = input("Em quais cidades haverá paradas para retirada de carga, separe-as com vírgula: ").split(",")
  paradas_itens = []
  for cidade in paradas_cidades:
    itens_cidade = input(f"Quais itens serão retirados em {cidade}? (separe-os com vírgula): ").split(",")
    paradas_itens.append({cidade.strip(): [item.strip() for item in itens_cidade]})

  #reorganiza paradas para ficar no formato {cidade: [itens]}
  paradas_itens_dict = {}
  for parada in paradas_itens:
    for cidade, itens in parada.items():
      paradas_itens_dict[cidade] = itens

else:
  paradas_itens_dict = {}

#identifica o modelo de caminhão mais adequado para o transporte
dist_total = km_total
print(f"A distância total a ser percorrida é de {dist_total:.2f} km.")
carga_total = sum(itens.values())

caminhoes_necessarios = {}
for modelo, capacidade in {'P': 1, 'M': 4, 'G': 10}.items():
  if carga_total <= capacidade:
    caminhoes_necessarios[modelo] = 1
    break
  else:
    caminhoes_necessarios[modelo] = -(-carga_total // capacidade) #arredondamento para cima

print("Para transportar a carga, serão necessários:")
for modelo, qtd in caminhoes_necessarios.items():
  if qtd > 0:
    print(f"{qtd} caminhão(s) de porte {modelo}")

#calcula o custo de transporte por trecho e total
custo_por_trecho = {modelo: dist_total * custo_caminhoes[modelo] for modelo in caminhoes_necessarios.keys()}
custo_total = sum(custo_por_trecho.values())

print("O custo de transporte por trecho para cada modelo de caminhão será:")
for modelo, custo in custo_por_trecho.items():
  print(f"Modelo {modelo}: R$ {custo:.2f}")
print(f"O custo total do transporte será de R$ {custo_total:.2f}")

DNIT-Distancias.csv

Expected behavior

apenas foi inclupida o último trecho da opção 2, que pergunta se haverão paradas com retirada de carga, e se sim, informar em quais cidades e quais itens serão retirados. Calcula a distância total a ser percorrida e identifica o modelo de caminhão mais adequado para este transporte considerando a Capacidade máxima das opções: P- 1 tonelada, M- 4 toneladas, G- 10 toneladas. E por último, calcula os custos envolvidos (por trecho e totais) mostrando os resultados.

Actual behavior

apareceu no console: Opa, algo deu errado. Relate este bug com os detalhes abaixo. Relate no GitHub: https://github.com/lzybkr/PSReadLine/issues/new

github-actions[bot] commented 1 year ago

@LacerdaKris, you were using a pretty old version of PSReadLine (2.0.0-beta2 or prior), and it's likely that the issue was fixed in a newer version. Please upgrade to the 2.2.6 version of PSReadLine from PowerShell Gallery. See the upgrading section for instructions. Please let us know if you run into the same issue with the latest version.