Desquebra-Cabeça dos Palitos

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

[ Hits: 2.227 ]

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

Exercício com números randômicos - randint

Invariância Discreta de Escala

Agendador de comandos

Contagem

SnakeSQL - Crie consultas SQL facilmente


  

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