Desquebra-Cabeça dos Palitos

Publicado por Washington Luis de O Santos (última atualização em 25/04/2019)

[ Hits: 2.362 ]

Download toothpick-1.0.py




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...

  



Esconder código-fonte

#!/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())
      

Scripts recomendados

Modificação do Ubuntu Tweak para Debian

Tabela Price

Invariância Discreta de Escala

Criador de instalador USB Linux bootável com Python

Árvore binária de busca do tipo splay


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts