Last active
August 29, 2016 09:28
-
-
Save APIUM/5346b46fd5ee637b1babf8090e2cf5b3 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /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