decompilation

Arnaud Delobelle arnodel at gmail.com
Fri Mar 2 15:18:56 EST 2012


On 2 March 2012 18:52, shikha panghal <spdollyshikha4 at 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 :)
-- 
Arnaud


More information about the Python-list mailing list

AltStyle によって変換されたページ (->オリジナル) /