Desquebra-Cabeça dos Palitos
Publicado por Washington Luis de O Santos (última atualização em 25/04/2019)
[ Hits: 2.343 ]
Eu não sei se esta palavra, Desquebra-Cabeça, existe no nosso dicionário, mas se não existe eu acho que vou patenteá-la.
Bem, mas vamos ao que interessa.
O objetivo deste programa é resolver o problema do "quebra-cabeça das operações de subtração ou adição", onde a pessoa só pode mover um único palito para que o resultado da conta seja verdadeira. O programa poderá encontrar várias formas diferentes de resolver o problema classificando os resultados como doador/receptor e ou mutante. Pra isto, basta o usuário entrar com a expressão que é para ser resolvida.
Com este programa, então, vocês não vão ter mais que ficar quebrando a cabeça. Eu já fiz isto por vocês... eu já quebrei a minha cabeça ao desenvolvê-lo.
Observações:
- O programa roda com o python 3
- Não é necessário importar nenhuma biblioteca externa
- Use um terminal (eu uso o konsole do kde) com o máximo de linhas e de colunas e com a frente branca e o fundo preto para melhor visualizar as cores definidas pelo programa
- Talvez funcione no Windows, ou não, só sei que eu não quero nem saber
Divirtam-se...
#!/usr/bin/env python3 # -*- coding:UTF-8 -*- ''' toothpick.py (palito em portugues) Este programa tem como objetivo resolver o problema do "quebra-cabeça das operações de subtração ou adição" onde a pessoa só pode mover um único palito para que o resultado da conta seja verdadeira. O programa podera encontrar várias formas diferentes de resolver o problema classificando os resultados como doador/receptor e ou mutante Observações: - O programa roda com o python3 - Não é necessário importar nenhuma biblioteca externa - Use um terminal (eu uso o konsole do kde) com o maximo de linhas e de colunas e com a frente branca e o fundo preto para melhor visualizar as cores definidas pelo programa - Talvez funcione no RWindows, ou não, só sei que eu não quero nem saber Copyright (c) 2008-2009 Washington Luis de O. Santos < owashington[arroba]terra.com.br > This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. POR: Washington Luis de Oliveira Santos Taubate - SP, 17 de abril de 2019 ''' # Define variáveis usadas para mostrar cores no terminal RESET = '\x1b[0m' BOLD = '\x1b[1m' BLINK = '\x1b[5m' REVERSE = '\x1b[7m' RST = '\033[00m' RED = '\033[31m' GREEN = '\033[32m' WHITE = '\033[37m' GRAY = '\033[30m' class Fonte: def __init__(self, entrada): self.entrada = entrada data = {'0':( ' _ ', '| |', '|_|'), '1':( ' ', ' |', ' |'), '2':( ' _ ', ' _|', '|_ '), '3':( ' _ ', ' _|', ' _|'), '4':( ' ', '|_|', ' |'), '5':( ' _ ', '|_ ', ' _|'), '6':( ' _ ', '|_ ', '|_|'), '7':( ' _ ', '| |', ' |'), '8':( ' _ ', '|_|', '|_|'), '9':( ' _ ', '|_|', ' _|'), '-':( ' ', ' __', ' '), '=':( ' ', ' __', ' __'), '+':( ' ', ' ', ' '+chr(9532)+' ')} def gera(self): saida = [] if self.entrada != '': for line in range(3): segment_line = '' for caracter in self.entrada: segment_line = segment_line + (''.join(self.data[caracter][line]) + ' ') saida.append(segment_line) return saida def display(self): txt = self.gera() for x in txt: print(x, end='\n') class Toothpick(Fonte): # O dicionario abaixo define os nºs e sinais que podem receber um seguimento/palito e # se transformar em um outro nº ou sinal válido segmentreceptor = {'0':('8'), '3':('9'), '5':('6','9'), '6':('8'), '9':('8'), '-':('+','=')} # O dicionario abaixo define os nºs e sinais que podem doar um seguimento/palito e # se transformar em um outro nº ou sinal válido segmentdoador = {'6':('5'), '8':('0','6','9'), '9':('3','5'), '+':('-'), '=':('-')} # O dicionario abaixo define os nºs e sinais que podem se transformar em um outro nº ou sinal válido segmentmutante = {'0':('6','9'), '2':('3'), '3':('2','5'), '4':('7'), '5':('3'), '6':('0','9'), '7':('4'), '9':('0','6'), '=':('+'), '+':('=')} def __init__(self, entrada): self.entrada = entrada def sreceptor(self, entrada): saida = "" pos = 0 for digito in entrada: try: for ndigit in self.segmentreceptor[digito]: RESULT = entrada[:pos] + ndigit + entrada[pos+1:] if RESULT.__contains__('=') and eval(RESULT.replace('=', '==')): saida = RESULT except: pass pos += 1 return saida def sdoador(self): saida = [] pos = 0 for digito in self.entrada: try: for ndigit in self.segmentdoador[digito]: RESULT = self.entrada[:pos] + ndigit + self.entrada[pos+1:] saida.append(self.sreceptor(RESULT)) except: pass pos += 1 return saida def smutante(self): saida = [] pos = 0 for digito in self.entrada: try: for ndigit in self.segmentmutante[digito]: RESULT = self.entrada[:pos] + ndigit + self.entrada[pos+1:] if RESULT.__contains__('=') and eval(RESULT.replace('=', '==')): saida.append(RESULT) except: pass pos += 1 return saida def stringdiff(self, original, resultado): try: for line in range(3): col = 0 for x, y in zip(original[line], resultado[line]): if x == y: print(y, end='') else: #print('\"%s\" é diferente de \"%s\" na linha %d, col %d' % (x, y, line, col)) if y == ' ': # Posição de onde saiu o "segmento/palito" print('%s%s%s%s%s' % (BLINK, RED, '.', RST, RESET), end='') #print('%s%s%s%s%s' % (REVERSE, RED, x, RST, RESET), end='') else: # Posição aonde entrou o "segmento/palito" print('%s%s%s' % (RED, y, RST), end='') col += 1 print(end='\n') except: #print('%sERRO: stringdiff%s' % (RED, RST)) pass def result(self): try: print('='*80) print ('%sEntrada original:%s' % (RED, RST)) eo = Fonte(self.entrada) eo.display() print('-'*80) print ('Resultado(s) doador/receptor:') rd = self.sdoador() for x in rd: ft = Fonte(x) self.stringdiff(eo.gera(),ft.gera()) print('-'*80) print ('Resultado(s) mutante:') rm = self.smutante() for x in rm: ft = Fonte(x) self.stringdiff(eo.gera(),ft.gera()) print('-'*80) except: print('%sERRO: expressão mal formada%s' % (RED, RST)) return if __name__ == "__main__": print ('\nAbaixo temos alguns exemplos:\n') tst = Toothpick('248+66=394') tst.result() #248+86=334 resultado doador tst = Toothpick('6+4=4') tst.result() #8-4=4 resultado doador #0+4=4 resultado mutante tst = Toothpick('1+1=2-1') tst.result() #1=1=2-1 resultado doador #1+1=3-1 resultado mutante while True: print ('%sUse o padrão abaixo:' % (GREEN)) Fonte('0123456789-=+').display() print ('%s' % (RST)) expression = input('%sEntre com a sua expressão ou de enter para sair:%s ' % (GREEN, RST)) if not expression: break expression = expression.replace(' ','') tst = Toothpick(expression) tst.result() #print(tst.sdoador()) #print(tst.smutante())
Nenhum comentário foi encontrado.
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Flatpak: remover runtimes não usados e pacotes
Mudar o gerenciador de login (GDM para SDDM e vice-versa) - parte 2
Como atualizar o Debian 8 para o 10 (10)
Dica sobre iptables ACCEPT e DROP (6)
NGNIX - Aplicar SNAT para evitar roteamento assimetrico (29)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta