2
\$\begingroup\$

Project Overview:

See how many times numbers would repeat x times on a digital clock output. This particular code only counts from 12:00 to 11:59, so it's technically only half of a day, I could take the (output x 2) for a full day.

Functions:

input_io(): Input the number of times you would like to see if a number repeats (for example 11:11 will have the number "1" repeated four times. 12:11 would have 3 repeated "1"s, etc.)

gen_times(): Generate a list of all the "digital clock" outputs starting from 12:00 to 11:59 - including leading zeros for minutes (e.g. 12:04 would need the zero before the "4").

count_repeat(): Test each "clock output" (from gen_times()) to see how many times the numbers 0-9 repeat in each one. If it is greater than the input time add one to the counter.

Questions:

  1. In the code, you'll see that I return values from functions and immediately assign them to variables. I'm not sure the proper conventions of this in Python. Are there ways to pass-through variables from function to function - is it reasonable to assign variables outside of functions to function outputs?

  2. Is there a better way to run this program without all of the coercion? The main use case of the coercion is for the leading zeros when generating times.

Code:

def input_io():
    input_repeats = input("Please input the amount of times you'd like to see if numbers repeat")

    while True:
        try:
            input_repeats = int(input_repeats)
            break
        except:
            print("Please enter an integer.")
            input_repeats = input()
    return input_repeats

input_repeats = input_io()


def gen_times():

    total_minutes = (24 * 60) / 2
    print(f"Total Minutes {total_minutes}")
    times = ["0"] * int(total_minutes)
    hours = "12"
    minutes = "00"
    i = 0

    while (i < total_minutes):

        if(hours==13):
            hours=1


        times[i] = str(hours)+str(minutes)
        #print(int(minutes))



        if(minutes == "59"):
            minutes = "00"
            hours = int(hours) + 1

            #ADDING "0" IN FRONT OF HOURS
            #if(int(hours) >= 10):
            #    hours = hours
            #else:
            #    hours = "0"+str(hours)

        else:
            minutes = str(int(minutes)+1)

            if (int(minutes) >= 10):
                minutes = minutes
            else:
                minutes = "0" + str(minutes)

        i += 1
    return times

times = gen_times()
print(times)


def count_repeat():
    counter_repeat = 0
    i=0
    ii=0
    iterationcounter = 0

    while(i != len(times)):

        ii=0

        while(ii < 10):
            count = times[i].count(str(ii))
            #iterationcounter+=1
            if count >= int(input_repeats):
                counter_repeat+=1
                break

            ii+=1
        i+=1
    return counter_repeat

counter_repeat = count_repeat()


print(f"Number of Times w/ {input_repeats} repeats: {counter_repeat}")
print(counter_repeat,"/",len(times))
percent_repeat = (counter_repeat/len(times))
print("{:.2%}".format(percent_repeat))
#print(iterationcounter)
\$\endgroup\$

1 Answer 1

3
\$\begingroup\$

Input loop

Your

        print("Please enter an integer.")

can probably be lumped into the input statement after it.

Time math

Usually doing your own should be avoided. As an example, this:

total_minutes = (24 * 60) / 2

can be

from datetime import timedelta
# ...
total_minutes = timedelta(hours=12) / timedelta(minutes=1)

General approach

Currently you're doing a lot of string manipulation, including a stringly-typed hours and minutes in gen_times. Your code would be simpler if, instead of maintaining and incrementing those strings, increment a single datetime.time instance. From there, to get individual digits, you could strftime it to a string and feed that to a Counter. The strftime format string in this case would be most useful as '%I%M'.

Variable names

Try to avoid names like i and ii. In particular, this:

    while(ii < 10):
        count = times[i].count(str(ii))
        #iterationcounter+=1
        if count >= int(input_repeats):
            counter_repeat+=1
            break

        ii+=1

is better represented as

for digit in range(10):
    count = times[i].count(str(digit))
    if count >= int(input_repeats):
        counter_repeat+=1
        break

Though that times[i].count should be replaced with the use of a Counter.

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.