Skip to content

Commit 652768e

Browse files
committed
Sequence library
1 parent c31dde4 commit 652768e

10 files changed

+77
-5
lines changed

cyaron/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from .io import IO
22
from .graph import Graph, Edge
33
from .str import String
4+
from .sequence import Sequence
45
from .utils import *
56
from .consts import *
67
from random import randint, randrange, uniform, choice, random

cyaron/graph.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ def hack_spfa(point_count, **kwargs):
166166
graph = Graph(point_count, directed)
167167
if point_count % 2 == 1:
168168
point_to_skip = point_count / 2 + 1
169-
half = point_count / 2
169+
half = int(point_count / 2)
170170

171171
for i in range(1, half):
172172
(x, y) = (i, i + 1)

cyaron/io.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,12 @@ def __del__(self):
3636
@staticmethod
3737
def __write(file, *args):
3838
for arg in args:
39-
file.write(str(arg))
40-
if arg != "\n":
41-
file.write(" ")
39+
if list_like(arg):
40+
IO.__write(file, *arg)
41+
else:
42+
file.write(str(arg))
43+
if arg != "\n":
44+
file.write(" ")
4245

4346
def input_write(self, *args):
4447
IO.__write(self.input_file, *args)

cyaron/sequence.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from .utils import *
2+
3+
class Sequence:
4+
5+
def __init__(self, formula, initial_values=[]):
6+
self.formula = formula
7+
if list_like(initial_values):
8+
self.values = {k: v for (k, v) in enumerate(initial_values)}
9+
elif isinstance(initial_values, dict):
10+
self.values = initial_values
11+
else:
12+
raise Exception("Initial_values must be either a list/tuple or a dict.")
13+
14+
def __get_one(self, i):
15+
if i in self.values:
16+
return self.values[i]
17+
18+
self.values[i] = self.formula(i, self.__get_one)
19+
return self.values[i]
20+
21+
def get(self, left_range, right_range=None):
22+
if right_range is None:
23+
return self.__get_one(left_range)
24+
25+
return [self.__get_one(i) for i in range(left_range, right_range+1)]

cyaron/str.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from .consts import ALPHABET_SMALL, SENTENCE_SEPARATORS, SENTENCE_TERMINATORS
22
from .utils import *
3+
from functools import reduce
34
import random
45

56

cyaron/tests/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from sequence_test import TestSequence

cyaron/tests/sequence_test.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import unittest
2+
3+
from cyaron import Sequence
4+
5+
6+
class TestSequence(unittest.TestCase):
7+
8+
def test_simple_get_one(self):
9+
seq = Sequence(lambda i, f: 2 * i + 3)
10+
self.assertEqual(seq.get(1), 5)
11+
self.assertEqual(seq.get(5), 13)
12+
13+
def test_simple_get_many(self):
14+
seq = Sequence(lambda i, f: 3 * i + 2)
15+
self.assertEqual(seq.get(1, 3), [5, 8, 11])
16+
17+
def test_func_get_one(self):
18+
seq = Sequence(lambda i, f: 2 * i + 3 * f(i - 1), [0])
19+
self.assertEqual(seq.get(5), 358)
20+
21+
def test_func_get_many(self):
22+
seq = Sequence(lambda i, f: 3 * i + 2 * f(i - 1), [0])
23+
self.assertEqual(seq.get(3, 5), [33, 78, 171])
24+

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
setup(
44
name='cyaron',
5-
version='0.1.3',
5+
version='0.1.4',
66
keywords='olympic informatics luogu aqours cyaron lovelive sunshine online judge',
77
description='CYaRon: Yet Another Random Olympic-iNformatics test data generator, A library for automatically generating test data for Online Judge, Olympic Informatics or automatic application testing',
88
license='LGPLv3',

test_sequence.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#!/usr/bin/env python
2+
3+
from cyaron import *
4+
5+
test = IO("test.in", "test.out")
6+
7+
test.input_writeln(Sequence(lambda i, f: 2*i+1).get(1))
8+
test.input_writeln(Sequence(lambda i, f: 2*i).get(1, 5))
9+
test.input_writeln(Sequence(lambda i, f: f(i-1)+1, [0]).get(1, 5))

unit_test.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#!/usr/bin/env python
2+
3+
import unittest
4+
5+
from cyaron.tests import *
6+
7+
if __name__ == '__main__':
8+
unittest.main(verbosity=2)

0 commit comments

Comments
 (0)