Desquebra-Cabeça dos Palitos
Publicado por Washington Luis de O Santos (última atualização em 25/04/2019)
[ Hits: 2.663 ]
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())
      
Modificação do Ubuntu Tweak para Debian
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
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Mint Xfce não mantém a conexão no wi-fi (1)
Problemas com Driver NVIDIA (5)
Warcraft II Remastered no Linux? (8)









