5

I am trying to convert

a = "546"

to

a = 546

without using any library functions.

3
  • 6
    Presumably "library functions" includes builtin functions like int, right? Considering that this is homework, we'd like to see what you've thought about/found/tried so far, and what you got stuck with. Commented Sep 25, 2017 at 13:10
  • 2
    Maybe you should ask what google terms your teacher thought you'd find useful and share what you did search for so we know what you've looked at that isn't helpful? Apart from that - what's your understanding of what a "library functions" is? Commented Sep 25, 2017 at 13:10
  • 3
    Looking at the final version of technically correct answer, and that it took 2-3 iterations to root away all the builtin functions, I must say this is a pretty sadistic task. Commented Sep 25, 2017 at 13:33

8 Answers 8

21

The "purest" I can think of:

>>> a = "546"
>>> result = 0
>>> for digit in a:
        result *= 10
        for d in '0123456789':
            result += digit > d

>>> result
546

Or using @Ajax1234's dictionary idea if that's allowed:

>>> a = "546"
>>> value = {'0':0, '1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9}
>>> result = 0
>>> for digit in a:
        result = 10 * result + value[digit]

>>> result
546
Sign up to request clarification or add additional context in comments.

1 Comment

Why multiplying by the result by 10 though ? because i don't see any effect given that the original value of the result variable is zero
4

You can keep a dictionary that stores the string and integer values of a numeric key, and then iterate over the string. While iterating over the string, you can use enumerate to keep track of the index and then raise 10 to that power minus 1 and then multiply by the corresponding key from the dictionary:

a = "546"
length = 0
for i in a:
   length += 1
d = {'1': 1, '0': 0, '3': 3, '2': 2, '5': 5, '4': 4, '7': 7, '6': 6, '9': 9, '8': 8}
count = 0
counter = 0
for i in a:
   count += (10**(length-counter-1)*d[i])
   counter += 1
print(count)

Output:

546

7 Comments

and enumerate :)
I completely forgot about the OP's requirement barring all builtin functions, not just int :) Please see my recent edit.
range and len are also built-in functions aren't they? you can just do for i in a
You might be able to avoid using range or len by first slicing with [::-1] and then incrementing the power manually. However, I think that the builtin functions thing is probably more of a problem with the question's phrasing than this answer - where does a function stop? Isn't a list indexing a call to list.__getitem__?
I mean, I think we're all probably overkilling it. I guess the teacher was trying to disuade students from using int(), but I'd think using any other common built-in function like range or len is fine.
|
3

The trick is that 546 = 500 + 40 + 6, or 5*10^2 + 4*10^1 + 6*10^0.

Note how the exponent is just the index (in reverse). Using that, you can generalize this approach into a function:

def strToInt(number):
    total = 0                             # this is where we accumulate the result
    pwr = len(number) - 1                 # start the exponent off as 2
    for digit in number:                  # digit is the str "5", "4", and "6"
        digitVal = ord(digit) - ord('0')  # using the ascii table, digitVal is the int value of 5,4, and 6.
        total += digitVal * (10 ** pwr)   # add 500, then 40, then 6
        pwr -= 1                          # make sure to drop the exponent down by one each time
    return total

And you can use it like so:

>>> strToInt("546")
546

2 Comments

@Evan and this results in good, readable, educative code. I think this answer is more in the spirit of the task than trying to golf any builtin words out of your code.
ord is a library function.
1
def stringToInt(s):
    result = 0
    value = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
    for digit in s:
        result = 10 * result + value[digit]

    return result

Comments

0
def int(a):
ty = a.__class__.__name__
out = 0
di = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4,
      '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
if ty not in ("str", "int", "float", "bytes"):
    raise TypeError("unsupported format")
if a.__class__ == float:
    return a.__floor__()
elif a.__class__ == int:
    return a
else:
    ind = 0
    for val in a[::-1]:
        if val not in di:
            raise ValueError("invalid input")
        out += di[val]*(10**ind)
        ind += 1
        #print(out, di[val])
    return out
print(int("55"))
55

Comments

-1

You can loop through the string and perform the operation on each character using ord.

example:

a="546"
num=0
for i in a:
     num = num * 10 + ord(i) - ord('0')

1 Comment

ord is clearly a library function and thus not allowed.
-1
astr = "1234"
num = 0
for index,val in enumerate(astr[::-1]):
    res = (ord(val) - ord('0')) * (10 ** index)
    num += (res)

1 Comment

ord is a library function
-1
a=input()
r=0
for i in a:
  r=r*10+(ord(i)-ord("0"))
print(r)
print(type(r))

1 Comment

Two previous answerers already used ord() and they were told that it's not allowed.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.