Guest User

Untitled

a guest
Apr 29th, 2016
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.19 KB | None | 0 0
  1. 1; 2; 3; 4; 5 // 1 кусок
  2. 6; 5; 4; 3 // 2 кусок
  3. // 3 кусок пустой
  4. -3; -3; -3 // 4 кусок
  5.  
  6. 1; 2; 3; 4; 5; 5.5; 6; 5; 4; 3; 0; -3; -3; -3
  7. // 1-ая часть (5 + 6)/2 2-ая часть (3 + -3)/2 4-я часть
  8.  
  9. IEnumerable<double> FlattenWithInsertedValues(IEnumerable<IEnumerable<double>> seqs)
  10. {
  11. double? firstAddend = null;
  12. foreach (var seq in seqs)
  13. {
  14. double? lastInThisSeq = null;
  15. foreach (var v in seq)
  16. {
  17. if (firstAddend != null)
  18. {
  19. yield return (firstAddend.Value + v) / 2;
  20. firstAddend = null;
  21. }
  22. yield return v;
  23. lastInThisSeq = v;
  24. }
  25. if (lastInThisSeq != null)
  26. firstAddend = lastInThisSeq;
  27. }
  28. }
  29.  
  30. void Test1()
  31. {
  32. var result = FlattenWithInsertedValues(TestGenerator1());
  33. foreach (var v in result)
  34. Console.Write(v + " ");
  35. }
  36.  
  37. void Test2()
  38. {
  39. var result = FlattenWithInsertedValues(TestGenerator2());
  40. Console.Write(result.Count());
  41. }
  42.  
  43. IEnumerable<IEnumerable<double>> TestGenerator1()
  44. {
  45. Console.Write("Generating outer seq 1 ");
  46. yield return Generator(1, 5, 1);
  47. yield return Generator(1, 0, 2);
  48. yield return Generator(1, 3, 3);
  49. }
  50.  
  51. IEnumerable<IEnumerable<double>> TestGenerator2()
  52. {
  53. Console.Write("Generating outer seq 2 ");
  54. yield return Generator(1, 5, 1);
  55. yield return Generator(1, 10000000000000, 2);
  56. }
  57.  
  58. IEnumerable<double> Generator(double from, double to, int seqNum)
  59. {
  60. Console.Write($"Generating seq #{seqNum} ");
  61. for (double curr = from; curr < to; curr += 1)
  62. yield return curr;
  63. }
  64.  
  65. def flatten(*lists):
  66. prev = None
  67. for lst in lists:
  68. for elt in lst:
  69. if prev is not None:
  70. yield (prev + elt) / 2
  71. prev = None
  72. yield elt
  73. prev = elt
  74.  
  75. lst = [[1, 2, 3, 4, 5], [6, 5, 4, 3], [-3, -3, -3]]
  76. print(list(flatten(*lst)))
  77.  
  78. let flatten seqs =
  79. // нумеруем каждый элемент внутренней пос-ти его индексом
  80. let numbering = Seq.zip (Seq.initInfinite id) in
  81. // сливаем внутренние посл-ти
  82. let pairs = (Seq.map numbering >> Seq.concat) seqs in
  83.  
  84. let folder (prev_i, prev_elem, _) (cur_i, cur_elem) =
  85. // если индексы текущего и предыдущего элементов не последовательны
  86. // значит, это граница, добавляем средний
  87. let is_bound = cur_i - prev_i <> 1 in
  88. let with_mean =
  89. if is_bound then [| (cur_elem + prev_elem) / 2.; cur_elem |]
  90. else [| cur_elem |] in
  91. (cur_i, cur_elem, Seq.ofArray with_mean) in
  92.  
  93. let take_3rd = function | _, _, x -> x in
  94. (Seq.scan folder (-1, 0., Seq.empty)
  95. >> Seq.skip 1
  96. >> Seq.map take_3rd
  97. >> Seq.concat) pairs
  98.  
  99. [[1; 2; 3; 4; 5]; [6; 5; 4; 3]; []; [-3; -3; -3]]
  100. |> List.map (List.map float) |> List.map Seq.ofList |> Seq.ofList
  101. |> flatten
  102. |> List.ofSeq
  103. |> printfn "%A"
  104.  
  105. seq {
  106. printfn "Generating outer seq";
  107. yield seq { printfn "Generating inner seq 1"; yield 1.0; };
  108. yield seq { printfn "Generating inner seq 2"; yield 2.0; };
  109. yield seq { printfn "Generating inner seq 3"; yield 3.0; }
  110. }
  111. |> flatten
  112. |> List.ofSeq
  113. |> printfn "%A"
  114.  
  115. [1.0; 2.0; 3.0; 4.0; 5.0; 5.5; 6.0; 5.0; 4.0; 3.0; 0.0; -3.0; -3.0; -3.0]
  116. Generating outer seq
  117. Generating inner seq 1
  118. Generating inner seq 2
  119. Generating inner seq 3
  120. [1.0; 1.5; 2.0; 2.5; 3.0]
  121.  
  122. FLOAT next(){
  123. static FLOAT prev = NAN;
  124. static bool isFirst = false;
  125. static Seq<float> local = GLOBAL.next();
  126. if (!local)
  127. return null; //end result seq
  128. if (isFirst) //it's first elem in seq so we read it before
  129. isFirst = false;
  130. return prev;
  131. }
  132. FLOAT temp = local.next();
  133. if (!temp){ //if we read current seq
  134. local = GLOBAL.next();
  135. if (!local) //we read all seq
  136. return null; //end result seq
  137. FLOAT tmp = prev;
  138. prev = local.next();
  139. if (!prev){ //if empty seq
  140. prev = NAN;
  141. local = GLOBAL.next(); //go next seq
  142. return NAN;
  143. }
  144. isFirst = true; // we read first elem need save it
  145. return (prev + tmp)/2;
  146. }
  147. return prev = temp;
  148. }
  149.  
  150. flatten :: [[Float]] -> [Float]
  151. flatten [] = []
  152. flatten [y] = y
  153. flatten ([]:xs) = flatten xs
  154. flatten (y:[]:xs) = flatten $ y:xs
  155. flatten ([y]:(yy:ys):xs) = y : (y + yy)/2 : flatten ((yy:ys):xs)
  156. flatten ((y:ys):zs:xs) = y : flatten (ys:zs:xs)
  157.  
  158. main = do
  159. let ls = [[1, 2, 3, 4, 5], [6, 5, 4, 3], [-3, -3, -3]]
  160. print ls
  161. let fs = flatten ls
  162. print fs
  163.  
  164. #include <math.h>
  165. #include <unistd.h>
  166. #include <sysexits.h>
  167.  
  168. #define DBLRead(fd, d) (read(fd, d, sizeof(double)) == sizeof(double))
  169. #define DBLWrite(fd, d) (write(fd, d, sizeof(double)) == sizeof(double))
  170.  
  171. int
  172. flatten (int n, int in[], int out)
  173. {
  174. int i, j, rc = 0;
  175. double d0 = NAN, d;
  176.  
  177. for (i = 0; !rc && i < n; close(in[i++]))
  178. for (j = 0; !rc && DBLRead(in[i], &d); j++) {
  179. if (!isnan(d0) && j == 0) {
  180. double m = (d0 + d) / 2;
  181. if (!DBLWrite(out, &m)) {
  182. rc = EX_IOERR;
  183. break;
  184. }
  185. }
  186. if (!DBLWrite(out, &d))
  187. rc = EX_IOERR;
  188. d0 = d;
  189. }
  190.  
  191.  
  192. close(out);
  193. return rc;
  194. }
  195.  
  196. #include <stdio.h>
  197. #include <stdlib.h>
  198. #include <unistd.h>
  199.  
  200. #include <err.h>
  201. #include <sysexits.h>
  202. #include <sys/types.h>
  203. #include <sys/wait.h>
  204.  
  205. int
  206. generate (int p[2], double from, int step, int n)
  207. {
  208. if (fork()) {
  209. close(p[1]);
  210. return p[0];
  211. }
  212.  
  213. int i, rc = 0;
  214.  
  215. for (i = 0; i < n; i++, from += step)
  216. if (!DBLWrite(p[1], &from)) {
  217. rc = EX_IOERR;
  218. break;
  219. }
  220.  
  221. exit(rc);
  222. }
  223.  
  224. #define A_SIZE(a) (sizeof(a) / sizeof(a[0]))
  225.  
  226. int
  227. main (int ac, char *av[])
  228. {
  229. int p1[2], p2[2], p3[2], p4[2], res[2];
  230. if (pipe(p1) || pipe(p2) || pipe(p3) || pipe(p4) || pipe(res))
  231. err(EX_OSERR, "pipes");
  232. int gen_input[4] = {
  233. generate(p1, 1.0, 1, 5),
  234. generate(p2, 6.0, -1, 4),
  235. generate(p3, 1.0, 1, 0),
  236. generate(p4, -3.0, 0, 3)
  237. };
  238.  
  239. if (!fork())
  240. exit(flatten(A_SIZE(gen_input), gen_input, res[1]));
  241. close(res[1]);
  242.  
  243. double r = 0;
  244. while(DBLRead(res[0], &r) || (puts(""), 0))
  245. printf("%g ", r);
  246.  
  247. pid_t pid;
  248. int s;
  249. while ((pid = wait(&s)) > 0)
  250. if (!WIFEXITED(s) || WEXITSTATUS(s))
  251. printf("pid: %d rc = %dn", (int)pid, WEXITSTATUS(s));
  252.  
  253. return puts("End") == EOF;
  254. }
  255.  
  256. def inter_means(sequences)
  257. Enumerator.new do |y|
  258. last_inserted = nil
  259. sequences.lazy.each do |seq|
  260. first = true
  261. seq.lazy.each do |element|
  262. if first && last_inserted
  263. y << (element + last_inserted) / 2.0
  264. last_inserted = nil
  265. end
  266. first = false
  267. y << element
  268. last_inserted = element
  269. end
  270. end
  271. end
  272. end
  273.  
  274. inputs = [
  275. [[*1..5], [*3..6].reverse, [], [-3, -3, -3]],
  276. [],
  277. [[], [], []],
  278. [[], [1, 2, 3], [], [-3, -2, -1], [], []]
  279. ]
  280. inputs.each do |input|
  281. puts " #{input.inspect}n=> #{inter_means(input).to_a.inspect}"
  282. end
  283.  
  284. [[1, 2, 3, 4, 5], [6, 5, 4, 3], [], [-3, -3, -3]]
  285. => [1, 2, 3, 4, 5, 5.5, 6, 5, 4, 3, 0.0, -3, -3, -3]
  286. []
  287. => []
  288. [[], [], []]
  289. => []
  290. [[], [1, 2, 3], [], [-3, -2, -1], [], []]
  291. => [1, 2, 3, 0.0, -3, -2, -1]
  292.  
  293. (inter-means [])
  294. (inter-means [[1 2 3 4 5] [6 5 4 3] [] [-3 -3 -3]])
Add Comment
Please, Sign In to add comment