Working solution for K

This commit is contained in:
Claudio Maggioni (maggicl) 2019-04-22 20:17:56 +02:00
parent c3c1d42acf
commit bfdce7b68f
4 changed files with 118 additions and 60 deletions

0
bootiful_strings.py Normal file → Executable file
View file

0
circular_dna.py Normal file → Executable file
View file

View file

@ -1,69 +1,127 @@
def get_digits(s): #!/usr/bin/env python3
S = ["ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN",
"EIGHT", "NINE"] # Dictionary letter -> (number, position in number)
L = { LN = {
'A': [], 'A': [],
'B': [], 'B': [],
'C': [], 'C': [],
'D': [], 'D': [],
'E': [0,1,3,5,7,8,9], #3*2 7*2 'E': [(0,1),(1,2),(3,3),(3,4),(5,3),(7,1),(7,3),(8,0),(9,3)],
'F': [4,5], 'F': [(4,0),(5,0)],
'G': [8], 'G': [(8,2)],
'H': [3,8], 'H': [(3,1),(8,3)],
'I': [5,6,8,9], 'I': [(5,1),(6,1),(8,1),(9,1)],
'J': [], 'J': [],
'K': [], 'K': [],
'L': [], 'L': [],
'M': [], 'M': [],
'N': [1,7,9], #9*2 'N': [(1,1),(7,4),(9,0),(9,2)],
'O': [0,1,2,4], 'O': [(0,3),(1,0),(2,2),(4,1)],
'P': [], 'P': [],
'Q': [], 'Q': [],
'R': [0,3,4], 'R': [(0,2),(3,2),(4,3)],
'S': [6,7], 'S': [(6,0),(7,0)],
'T': [2,3,8], 'T': [(2,0),(3,0),(8,4)],
'U': [4], 'U': [(4,2)],
'V': [5,7], 'V': [(5,2),(7,2)],
'W': [2], 'W': [(2,1)],
'X': [6], 'X': [(6,2)],
'Y': [], 'Y': [],
'Z': [0] 'Z': [(0,0)]
} }
dgts = [0] * 10
O = [] def print_scoreboard(scoreboard, NUMS):
N = [] for s in NUMS:
for string in S: print(s, end=' ')
O.append(list(string)) print()
N.append(list(string)) for n in scoreboard:
removed = [] for score in n:
print(str(score) if score != 0 else ' ', end='')
print(' ', end='')
print('\n')
# Criteria of rarity (shortest number of (number, position) couples for the letter)
# Sort of a lambda, but in python
def criteria(l):
return len(LN[l])
def get_digits(s):
NUMS = ["ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN",
"EIGHT", "NINE"]
scoreboard = []
for num in NUMS:
scoreboard.append([0]*len(num))
numbers = [0] * 10
# Sort the string by rarity of letters (all Vs come before Es)
s = "".join(sorted(s, key=criteria))
for c in s: for c in s:
print(c) last_n = None
for n in L[c]: last_pos = None
try: # For every (number, position) ordered pair for our letter
N[n].remove(c) for k in range(len(LN[c])):
removed.append([n, c]) np = LN[c][k]
except ValueError: if last_n != np[0]:
"fregacazzi" # Increment the letter if the we've never seen this number
print(N) scoreboard[np[0]][np[1]] += 1
for i in range(10): last_n = np[0]
if len(N[i]) == 0: last_pos = np[1]
print("BINGO "+ str(i)) elif scoreboard[np[0]][np[1]] < scoreboard[np[0]][last_pos] - 1:
dgts[i] = dgts[i] + 1 # If we have a duplicate letter in more positions, increment evenly
for log in reversed(removed): # instead of incrementing just the first letter.
if log[1] in O[i]: # This code works if the are at most 2 positions for each letter, which
N[log[0]].append(log[1]) # is true with the numbers from ZERO to NINE
del log scoreboard[np[0]][last_pos] -= 1
print(N) scoreboard[np[0]][np[1]] += 1
last_n = None
print(dgts) # Debug print the scoreboard, uncomment this if unclear
print(N) # print_scoreboard(scoreboard, NUMS)
o = ""
for i in range(10): for i in range(10):
while dgts[i] > 0: # Check if the scoreboard for number i is BINGO
o = o + str(i) valid = True
dgts[i] = dgts[i] - 1 for j in range(len(scoreboard[i])):
return o if scoreboard[i][j] == 0:
valid = False
break
if valid:
# If true, mark BINGO and remove all the "ticks" for other numbers
numbers[i] += 1
# print(numbers)
for c in NUMS[i]:
last_n = None
last_pos = None
for k in range(len(LN[c])):
np = LN[c][k]
if last_n != np[0]:
scoreboard[np[0]][np[1]] -= 1
last_n = np[0]
last_pos = np[1]
elif scoreboard[np[0]][np[1]] > scoreboard[np[0]][last_pos] + 1:
# Decrement magic similar to the even incrementation above.
# Note that this decrements the first position first, but the code
# for incrementing is able to cope with this oddity, so whatever man...
scoreboard[np[0]][last_pos] += 1
scoreboard[np[0]][np[1]] -= 1
last_n = None
# Print the scoreboard if not clean (this should never happen if the input string is valid)
# for a in scoreboard:
# for b in a:
# if b != 0:
# print(scoreboard, end=' ')
# break
# else:
# continue
# break
# Build the output string using our BINGO log
output = ""
for i in range(10):
output += str(i) * numbers[i]
return output
if __name__ == "__main__": if __name__ == "__main__":
n = int(input()) n = int(input())

View file

@ -1,4 +1,4 @@
1 5
ZEROONETWOTHREEFOURFIVESIXSEVENEIGHTNINE ZEROONETWOTHREEFOURFIVESIXSEVENEIGHTNINE
OZONETOWER OZONETOWER
WEIGHFOXTOURIST WEIGHFOXTOURIST