Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
51
Task/Negative-base-numbers/Nim/negative-base-numbers.nim
Normal file
51
Task/Negative-base-numbers/Nim/negative-base-numbers.nim
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
import algorithm, sugar, tables
|
||||
|
||||
const
|
||||
Digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
|
||||
Values = collect(initTable):
|
||||
for i, c in Digits: {c: i} # Maps the digits to their values in base 10.
|
||||
|
||||
type Number = object
|
||||
## Representation of a number in any base.
|
||||
base: int
|
||||
value: string
|
||||
|
||||
func toBase(n, base: int): Number =
|
||||
## Convert an integer into a number in base 'base'.
|
||||
assert base notin -1..1, "wrong value for base: " & $base
|
||||
if n == 0: return Number(base: base, value: "0")
|
||||
result.base = base
|
||||
var n = n
|
||||
while n != 0:
|
||||
var m = n mod base
|
||||
n = n div base
|
||||
if m < 0:
|
||||
inc m, abs(base)
|
||||
inc n
|
||||
result.value.add Digits[m]
|
||||
result.value.reverse()
|
||||
|
||||
func `$`(n: Number): string =
|
||||
## String representation of a number.
|
||||
$n.value
|
||||
|
||||
func toInt(n: Number): int =
|
||||
## Convert a number in some base into an integer in base 10.
|
||||
for d in n.value:
|
||||
result = n.base * result + Values[d]
|
||||
|
||||
|
||||
when isMainModule:
|
||||
|
||||
proc process(n, base: int) =
|
||||
let s = n.toBase(base)
|
||||
echo "The value ", n, " is encoded in base ", base, " as: ", s
|
||||
echo "and is decoded back in base 10 as: ", s.toInt
|
||||
echo ""
|
||||
|
||||
process(10, -2)
|
||||
process(146, -3)
|
||||
process(15, -10)
|
||||
|
||||
const Nim = Number(base: -62, value: "Nim")
|
||||
echo "The string “Nim” is decoded from base -62 to base 10 as: ", Nim.toInt
|
||||
Loading…
Add table
Add a link
Reference in a new issue