Le 02/03/2012 21:18, Arnaud Delobelle a écrit :
On 2 March 2012 18:52, shikha panghal<spdollyshik...@gmail.com>  wrote:
Hi

Please decoplile the .pyc code ,as i have lost my .py code.
Aha, a customer!  I've written a module for this: unpyc3
(http://code.google.com/p/unpyc3/)

Here it is in action:


Python 3.2.1 (v3.2.1:ac1f7e5c0510, Jul  9 2011, 01:03:53)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
import unpyc3
import hangman322
code = unpyc3.decompile(hangman322)
print(code)
import random

def readFile(fileName):
     file = open(fileName)
     lineList = file.readlines()
     file.close()
     return lineList

def initialize(fileName):
     try:
         lineList = readFile(fileName)
     except:
         print('Oops! ' + filename + ' was not a valid file.')
         return
     len_d = len(lineList)
     word_length = [0]*len_d
     for i in range(len_d):
         if lineList[i][-1] == '\n':
             word_length[i] = len(lineList[i]) - 1
         else:
             word_length[i] = len(lineList[i])
     tabulate = [0]*25
     for i in range(len_d):
         if word_length[i]>= 24:
             tabulate[24] = tabulate[24] + 1
         else:
             tabulate[word_length[i]] = tabulate[word_length[i]] + 1
     words = [None]*25
     for i in range(2, 24):
         words[i] = [None]*tabulate[i]
         k = 0
         for j in range(len_d):
             if word_length[j] == i:
                 words[i][k] = lineList[j]
                 k = k + 1
     for i in range(24, 25):
         words[i] = [None]*tabulate[i]
         k = 0
         for j in range(len_d):
             if word_length[j]>= i:
                 words[i][k] = lineList[j]
                 k = k + 1
     return words

def wordsOfLength(n, source_file):
     words = initialize(source_file)
     return words[n]

def getUserStringInput(L, prompt):
     replyInList = False
     while not replyInList:
         reply = input(prompt)
         replyInList = reply in L
         if not replyInList:
             print('That reply is invalid. Try again.')
     return reply

def intListToStringList(L):
     L2 = ['']*len(L)
     for i in range(len(L)):
         L2[i] = str(L[i])
     return L2

def getNewLetterGuess(availableLetters):
     letterString = ''
     for j in range(26):
         if availableLetters[j]:
             letterString = letterString + chr(65 + j) + ' '
         else:
             letterString = letterString + '  '
     validChar = False
     print(letterString)
     while not validChar:
         reply = input('Guess!>  ')
         if len(reply) == 1:
             validChar = True
     letterIndex = ord(reply) - 65
     if letterIndex>  25:
         letterIndex = letterIndex - 32
     while letterIndex>  25 or not availableLetters[letterIndex]:
         print('This is an invalid choice. Please try again!')
         validChar = False
         print(letterString)
         while not validChar:
             reply = input('Guess!>  ')
             if len(reply) == 1:
                 validChar = True
         letterIndex = ord(reply) - 65
         if letterIndex>  25:
             letterIndex = letterIndex - 32
     guess = chr(97 + letterIndex)
     availableLetters[letterIndex] = False
     return guess, availableLetters

def getWordFamilyCounter(L, n, guess):
     wordFamilyCounter = [0]*2**n
     familyIndexList = [-1]*len(L)
     for k in range(len(L)):
         w = list(L[k])
         ct = 0
         for k2 in range(n):
             if w[k2] == guess:
                 ct = ct + 2**k2
         familyIndexList[k] = ct
         wordFamilyCounter[ct] = wordFamilyCounter[ct] + 1
     return wordFamilyCounter, familyIndexList

def extractLargestFamily(L, familyIndexList, wordFamilyCounter):
     bestFamily = wordFamilyCounter.index(max(wordFamilyCounter))
     boolist = [False]*len(L)
     for k3 in range(len(L)):
         if familyIndexList[k3] == bestFamily:
             boolist[k3] = True
     j2 = 0
     smallList = [' ']*sum(boolist)
     for k4 in range(len(L)):
         if boolist[k4]:
             smallList[j2] = L[k4]
             j2 = j2 + 1
     return smallList

def updatePatternList(patternList, guess, bestFamily):
     n = len(patternList)
     for k6 in range(n):
         if bestFamily//2 == bestFamily/2:
             pass
         else:
             patternList[k6] = guess + ' '
         bestFamily = bestFamily>>  1
     return patternList

def pickWordFrom(L):
     index = random.randint(0, len(L) - 1)
     return L[index]

def play():
     reply = getUserStringInput(intListToStringList(list(range(2,
21))), 'How long should I make your word?!!? (2 to 20)>  ')
     n = int(reply)
     patternList = ['_ ']*n
     print(''.join(patternList))
     L = wordsOfLength(n, 'dictionary.txt')
     reply = getUserStringInput(intListToStringList(list(range(1,
27))), 'How many guesses will you need?>  ')
     m = int(reply)
     availableLetters = [True]*26
     for i in range(m):
         guess, availableLetters = getNewLetterGuess(availableLetters)
         wordFamilyCounter, familyIndexList = getWordFamilyCounter(L, n, guess)
         bestFamily = wordFamilyCounter.index(max(wordFamilyCounter))
         if bestFamily == 0:
             print('Letter not in word.')
         else:
             print('Letter is in word!!!')
         L = extractLargestFamily(L, familyIndexList, wordFamilyCounter)
         patternList = updatePatternList(patternList, guess, bestFamily)
         print(''.join(patternList))
         if '_ ' not in patternList:
             break
     if '_ ' not in patternList:
         print('SURELY you must be CHEATING, but you guessed my word in
' + str(i + 1) + ' tries!!!')
     else:
         bogusWord = pickWordFrom(L)
         print('You lose.  The word was: ' + bogusWord)

I haven't actually checked if this code runs :)



Great code (unpy3) Arnaud!
pretty well built.

Cheers
Karim
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to