Skip to content

Instantly share code, notes, and snippets.

@APIUM
Last active August 29, 2016 09:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save APIUM/5346b46fd5ee637b1babf8090e2cf5b3 to your computer and use it in GitHub Desktop.
Save APIUM/5346b46fd5ee637b1babf8090e2cf5b3 to your computer and use it in GitHub Desktop.
#! /usr/bin/python3
# Reddit Daily Programming Challenge 277 - Fake Coins
# The challenge input
challenge = """abcd efgh equal
abci efjk left
abij efgl equal
mnopqrs tuvwxyz equal"""
# Global variables
equal = []
finalEqual = {}
possibilities = []
fake = 0
fakeCheck = 0
# Splits the input up into a list of lists
coins = challenge.split('\n')
for i in range(len(coins)):
coins[i] = coins[i].split()
def dupeCheck():
# Defines the inner vars as the global ones
global equal
global finalEqual
global possibilities
# Checks all inputs for equal ones
for i in range(len(coins)):
# Upon finding ones puts it in another list called equal
if coins[i][2] == 'equal':
equal.append(coins[i][0] + coins[i][1])
# For this list find which letters are the same as others
for j in range(len(equal)):
for k in range(len(equal[j])):
# This gives an out of range error at the end so need the try
try:
for o in range(len(equal)):
if equal[j][k] in equal[j+o]:
if equal[j][k] not in finalEqual:
for l in range(len(equal[j])):
finalEqual[equal[j][l]] = equal[j+o]
possibilities.append(equal[j][l])
possibilities = list(set(possibilities))
except:
# For debugging
print(finalEqual)
for m in range(len(possibilities)):
for n in possibilities:
if possibilities[m] in finalEqual[n]:
if finalEqual[n] not in finalEqual[possibilities[m]]:
print(m,n,possibilities[m], finalEqual[n])
finalEqual[possibilities[m]] += finalEqual[n]
# Removes all duplicate characters in the finalEqual dict strings
finalEqual[possibilities[m]] = "".join(set(finalEqual[possibilities[m]]))
def subsitute():
global coins
for n in finalEqual:
for i in range(len(coins)):
for j in range(2):
coins[i][j] = coins[i][j].replace(str(n), finalEqual[n], 1)
print(coins)
# Gets rid of dublicate characters in the coins list, making it possible
# To see by eye which coin is lighter
def cleanUp():
for i in range(2):
for j in range(len(coins)):
coins[j][i] = "".join(set(coins[j][i]))
print(coins)
def solve1():
for i in range(len(coins)):
if coins[i][2] == 'left':
for n in possibilities:
if n in coins[i][1]:
if n not in coins[i][0]:
return n + ' is Lighter'
def solve():
global fake
global fakeCheck
for i in range(len(coins)):
if coins[i][2] == 'left':
for x in coins[i][1]:
if x not in possibilities:
return x + ' is Lighter'
if coins[i][2] == 'right':
for x in coins[i][0]:
if x not in possibilities:
return x + ' is Lighter'
if coins[i][2] == 'left':
if coins[i][0] == coins[i][1]:
return 'Data is inconsistent'
if coins[i][2] == 'right':
if coins[i][0] == coins[i][1]:
return 'Data is inconsistent'
if coins[i][2] == 'equal':
if coins[i][0] == coins[i][1]:
fake = 1
else: fakeCheck = 1
dupeCheck()
subsitute()
cleanUp()
solve()
if fake == 1:
if solve() == None:
print('No fake coins detected')
else:
print(solve())
else:
print(solve())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment