Skip to content

Commit

Permalink
Added operators
Browse files Browse the repository at this point in the history
  • Loading branch information
Glan9 committed Jul 19, 2017
1 parent aa07034 commit 1263588
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 51 deletions.
127 changes: 76 additions & 51 deletions operators.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import time
import functools
import itertools
import random

import utilities

Expand Down Expand Up @@ -708,21 +709,16 @@ def dHighDotOperator(stack, z, mode):
z = int(z)
if z < 4:
stack.append([z])
p = 2
p = 0
result = []
primes = [2] # The primes we know so far, just to make finding successive primes faster
while z > 1:
count = 0
while z%p == 0:
z //= p
while z%utilities.getPrime(p) == 0:
z //= utilities.getPrime(p)
count += 1
if count > 0:
result.append([p, count])
result.append([utilities.getPrime(p), count])
p += 1
while not all(p%d for d in primes):
# We only need to check divisibility with other primes, not even number
p += 1
primes.append(p)
stack.append(result)
elif mode == 2 or mode == 3: # str or list
if len(z)==0:
Expand All @@ -742,18 +738,13 @@ def dLowDotOperator(stack, z, mode):
z = int(z)
if z < 4:
stack.append([z])
p = 2
p = 0
result = []
primes = [2] # The primes we know so far, just to make finding successive primes faster
while z > 1:
while z%p == 0:
result.append(p)
z //= p
while z%utilities.getPrime(p) == 0:
result.append(utilities.getPrime(p))
z //= utilities.getPrime(p)
p += 1
while not all(p%d for d in primes):
# We only need to check divisibility with other primes, not even number
p += 1
primes.append(p)
stack.append(result)
elif mode == 2 or mode == 3: # str or list
def partitions(z):
Expand Down Expand Up @@ -793,7 +784,9 @@ def eHighDotOperator(stack, z, mode):
def eLowDotOperator(stack, z, mode):
if mode == 1: # num
stack.append(utilities.formatNum(math.acos(z)))
elif mode == 2 or mode == 3: # str or list
elif mode == 2:
""" Don't know what to do here yet """
elif mode == 3: # str or list
if len(z) == 0:
stack.append([])
else:
Expand Down Expand Up @@ -835,20 +828,6 @@ def subfactorial(n):
else:
monadNotImplemented(mode, '')

# ọ
def oLowDotOperator(stack, z, mode):
if mode == 1: # num
stack.append(-1 if z < 0 else (1 if z > 0 else 0))
elif mode == 2: # str
stack.append(z.strip())
elif mode == 3: # list
if len(z) <= 1:
stack.append(z)
else:
stack.append([z[i+1]-z[i] for i in range(len(z)-1)])
else:
monadNotImplemented(mode, '')

# ḣ
def hHighDotOperator(stack, z, mode):
if mode == 1: # num
Expand All @@ -874,40 +853,83 @@ def hLowDotOperator(stack, z, mode):
# ṅ
def nHighDotOperator(stack, z, mode):
if mode == 1: # num
z = int(z)
primes = []
p = 1
while len(primes) < z:
while p == 1 or not all(p%d for d in primes):
p += 1
primes.append(p)
stack.append(primes)
if (z > 0):
stack.append(utilities.getPrimes(int(z)))
else:
stack.append([])
elif mode == 2: # str
stack.append()
elif mode == 3: # list
stack.append(1 if all(z) and len(z) > 0 else 0)
stack.append(1 if all(z) else 0)
else:
monadNotImplemented(mode, '')

# ṇ
def nLowDotOperator(stack, z, mode):
if mode == 1: # num
z = int(z)
primes = []
p = 1
while len(primes) < z:
while p == 1 or not all(p%d for d in primes):
p += 1
primes.append(p)
if primes:
stack.append(primes[-1])
if (z > 0):
stack.append(utilities.getPrime(int(z)))
elif mode == 2: # str
stack.append()
elif mode == 3: # list
stack.append(1 if all(not i for i in z) else 0)
else:
monadNotImplemented(mode, '')

# ȯ
def oHighDotOperator(stack, z, mode):
if mode == 1: # num
stack.append(abs(z))
elif mode == 2: # str
stack.append(''.join(sorted(z)))
elif mode == 3: # list
stack.append(sorted(z))
else:
monadNotImplemented(mode, '')

# ọ
def oLowDotOperator(stack, z, mode):
if mode == 1: # num
stack.append(-1 if z < 0 else (1 if z > 0 else 0))
elif mode == 2: # str
stack.append(z.strip())
elif mode == 3: # list
if len(z) <= 1:
stack.append(z)
else:
stack.append([z[i+1]-z[i] for i in range(len(z)-1)])
else:
monadNotImplemented(mode, '')

# ṗ
def pHighDotOperator(stack, z, mode):
if mode == 1: # num
z = int(z)
if z < 2:
stack.append(0)
else:
while utilities.getPrime(-1) < z:
utilities.generatePrime()
stack.append(1 if z in utilities.getPrimes(-1) else 0)
elif mode == 2: # str
stack.append()
elif mode == 3: # list
stack.append()
else:
monadNotImplemented(mode, '')

# ṙ
def rHighDotOperator(stack, z, mode):
# TODO this isn't quite right because of the weird issue with the quote characters
if mode == 1: # num
stack.append(str(z))
elif mode == 2: # str
stack.append('“'+re.sub('[\\\\“”‘’„‟]', '\\\\\g<0>', z)+'”') # TODO this should be used for the output format...
elif mode == 3: # list
stack.append(utilities.outputFormat(z))
else:
monadNotImplemented(mode, '')

# ṡ
def sHighDotOperator(stack, z, mode):
if mode == 1: # num
Expand Down Expand Up @@ -1697,7 +1719,10 @@ def ___Operator(stack, x, y, mode):
'ḥ': Operator('ḥ', 1, hLowDotOperator),
'ṅ': Operator('ṅ', 1, nHighDotOperator),
'ṇ': Operator('ṇ', 1, nLowDotOperator),
'ȯ': Operator('ȯ', 1, oHighDotOperator),
'ọ': Operator('ọ', 1, oLowDotOperator),
'ṗ': Operator('ṗ', 1, pHighDotOperator),
'ṙ': Operator('ṙ', 1, rHighDotOperator),
'ṡ': Operator('ṡ', 1, sHighDotOperator),
'ṣ': Operator('ṣ', 1, sLowDotOperator),
'ṫ': Operator('ṫ', 1, tHighDotOperator),
Expand Down
3 changes: 3 additions & 0 deletions primes.py

Large diffs are not rendered by default.

20 changes: 20 additions & 0 deletions utilities.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
import re
import array

import primes

codepage = """₀₁₂₃₄₅₆₇₈₉ₓ₌ₔ∂€₵⟨⟩⟪⟫⇑⇓⇐⇒↑↓←→⇈⇊⇇⇉ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
«»…┅⌋⌉⊂⊃∧∨ΣΠ‼×÷⁻øؤ¶§ ₸ℍȦĊḊĖḞĠḢṀṄȮṖṘṠṪẆẊẎŻȧċḋėḟġḣṁṅȯṗṙṡṫẇẋẏżẠḄḌẸḤḲḶṂṆỌṚṢṬỤṾẈỴẒạḅḍẹḥḳḷṃṇọṛṣṭụṿẉỵẓ¿¡⁇⁈↻↺∞¦†‡∆∇⊢⊣‖ “”‘’„‟""" # TODO: finish code page

Expand Down Expand Up @@ -127,3 +129,21 @@ def castToList(v):
elif type(v) == list:
return v

# Add a new prime to the prime list
def generatePrime():
p = primes.primes[-1] + 1
while not all(p%n for n in primes.primes):
p += 1
primes.primes.append(p)

# Get the nth prime
def getPrime(n):
while len(primes.primes) < n:
generatePrime()
return primes.primes[n-1]

# Get the first n primes
def getPrimes(n):
while len(primes.primes) < n:
generatePrime()
return primes.primes[:n]

0 comments on commit 1263588

Please sign in to comment.