Desquebra-Cabeça dos Palitos
Publicado por Washington Luis de O Santos (última atualização em 25/04/2019)
[ Hits: 2.658 ]
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())
Unescape de caracteres especiais ISO-8859-1
Nenhum comentário foi encontrado.
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
Assinador JNLP do Site Portal da Nota Fiscal Eletrônica (4)
Warcraft II Remastered no Linux? (3)









