Guest User

Untitled

a guest
May 5th, 2016
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.11 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. #include <math.h>
  66. #include <unistd.h>
  67. #include <sysexits.h>
  68.  
  69. #define DBLRead(fd, d) (read(fd, d, sizeof(double)) == sizeof(double))
  70. #define DBLWrite(fd, d) (write(fd, d, sizeof(double)) == sizeof(double))
  71.  
  72. int
  73. flatten (int n, int in[], int out)
  74. {
  75. int i, j, rc = 0;
  76. double d0 = NAN, d;
  77.  
  78. for (i = 0; !rc && i < n; close(in[i++]))
  79. for (j = 0; !rc && DBLRead(in[i], &d); j++) {
  80. if (!isnan(d0) && j == 0) {
  81. double m = (d0 + d) / 2;
  82. if (!DBLWrite(out, &m)) {
  83. rc = EX_IOERR;
  84. break;
  85. }
  86. }
  87. if (!DBLWrite(out, &d))
  88. rc = EX_IOERR;
  89. d0 = d;
  90. }
  91.  
  92.  
  93. close(out);
  94. return rc;
  95. }
  96.  
  97. #include <stdio.h>
  98. #include <stdlib.h>
  99. #include <unistd.h>
  100.  
  101. #include <err.h>
  102. #include <sysexits.h>
  103. #include <sys/types.h>
  104. #include <sys/wait.h>
  105.  
  106. int
  107. generate (int p[2], double from, int step, int n)
  108. {
  109. if (fork()) {
  110. close(p[1]);
  111. return p[0];
  112. }
  113.  
  114. int i, rc = 0;
  115.  
  116. for (i = 0; i < n; i++, from += step)
  117. if (!DBLWrite(p[1], &from)) {
  118. rc = EX_IOERR;
  119. break;
  120. }
  121.  
  122. exit(rc);
  123. }
  124.  
  125. #define A_SIZE(a) (sizeof(a) / sizeof(a[0]))
  126.  
  127. int
  128. main (int ac, char *av[])
  129. {
  130. int p1[2], p2[2], p3[2], p4[2], res[2];
  131. if (pipe(p1) || pipe(p2) || pipe(p3) || pipe(p4) || pipe(res))
  132. err(EX_OSERR, "pipes");
  133. int gen_input[4] = {
  134. generate(p1, 1.0, 1, 5),
  135. generate(p2, 6.0, -1, 4),
  136. generate(p3, 1.0, 1, 0),
  137. generate(p4, -3.0, 0, 3)
  138. };
  139.  
  140. if (!fork())
  141. exit(flatten(A_SIZE(gen_input), gen_input, res[1]));
  142. close(res[1]);
  143.  
  144. double r = 0;
  145. while(DBLRead(res[0], &r) || (puts(""), 0))
  146. printf("%g ", r);
  147.  
  148. pid_t pid;
  149. int s;
  150. while ((pid = wait(&s)) > 0)
  151. if (!WIFEXITED(s) || WEXITSTATUS(s))
  152. printf("pid: %d rc = %dn", (int)pid, WEXITSTATUS(s));
  153.  
  154. return puts("End") == EOF;
  155. }
  156.  
  157. function *f(g) {
  158. for (var x of g) {
  159. for (var y of x) {
  160. if (l === +l) {
  161. yield (l+y)/2;
  162. l = '';
  163. }
  164. yield y;
  165. }
  166. var l = y;
  167. }
  168. }
  169.  
  170. for (var x of f([[1,2,3,4,5], [6,5,4,3], [], [-3,-3,-3]])) {
  171. console.log(x);
  172. }
  173.  
  174. flatten :: [[Float]] -> [Float]
  175. flatten [] = []
  176. flatten [y] = y
  177. flatten ([]:xs) = flatten xs
  178. flatten (y:[]:xs) = flatten $ y:xs
  179. flatten ([y]:(yy:ys):xs) = y : (y + yy)/2 : flatten ((yy:ys):xs)
  180. flatten ((y:ys):zs:xs) = y : flatten (ys:zs:xs)
  181.  
  182. main = do
  183. let ls = [[1, 2, 3, 4, 5], [6, 5, 4, 3], [-3, -3, -3]]
  184. print ls
  185. let fs = flatten ls
  186. print fs
  187.  
  188. def inter_means(sequences)
  189. Enumerator.new do |y|
  190. last_inserted = nil
  191. sequences.lazy.each do |seq|
  192. first = true
  193. seq.lazy.each do |element|
  194. if first && last_inserted
  195. y << (element + last_inserted) / 2.0
  196. last_inserted = nil
  197. end
  198. first = false
  199. y << element
  200. last_inserted = element
  201. end
  202. end
  203. end
  204. end
  205. # ---------------- ----------------
  206. # Далее код для тестов
  207.  
  208. # Поток чисел из stdin (изначально не ленивый!)
  209. stdin_number_stream = Enumerator.new do |y|
  210. number = ""
  211. STDIN.each_char.lazy.each do |c|
  212. if c =~ /d/
  213. number += c
  214. else
  215. y << number.to_i if number != ""
  216. number = ""
  217. end
  218. end
  219. # Когда поток закрыли, могло накопиться число
  220. y << number.to_i if number != ""
  221. end
  222.  
  223. inputs = [ # v-вот теперь ленивый
  224. [[], stdin_stream.lazy, [1]],
  225. [[*1..5], [*3..6].reverse, [], [-3, -3, -3]],
  226. [],
  227. [[], [], []],
  228. [[], [1, 2, 3], [], [-3, -2, -1], [], []]
  229. ]
  230.  
  231. inputs.each do |input|
  232. puts " #{input.inspect}n=> #{inter_means(input).to_a.inspect}"
  233. end
  234.  
  235. [[1, 2, 3, 4, 5], [6, 5, 4, 3], [], [-3, -3, -3]]
  236. => [1, 2, 3, 4, 5, 5.5, 6, 5, 4, 3, 0.0, -3, -3, -3]
  237. []
  238. => []
  239. [[], [], []]
  240. => []
  241. [[], [1, 2, 3], [], [-3, -2, -1], [], []]
  242. => [1, 2, 3, 0.0, -3, -2, -1]
  243.  
  244. from itertools import chain
  245.  
  246. def flatten(*lists):
  247. prev_i = -1
  248. prev_elt = None
  249. for i, elt in chain(*map(enumerate, lists)):
  250. if prev_i != i - 1:
  251. yield (prev_elt + elt) / 2
  252. yield elt
  253. prev_i = i
  254. prev_elt = elt
  255.  
  256. lst = [[1, 2, 3, 4, 5], [6, 5, 4, 3], [-3, -3, -3]]
  257. print(list(flatten(*lst)))
  258. [1, 2, 3, 4, 5, 5.5, 6, 5, 4, 3, 0.0, -3, -3, -3]
  259.  
  260. FLOAT next(){
  261. static FLOAT prev = NAN;
  262. static bool isFirst = false;
  263. static Seq<float> local = GLOBAL.next();
  264. if (!local)
  265. return null; //end result seq
  266. if (isFirst) //it's first elem in seq so we read it before
  267. isFirst = false;
  268. return prev;
  269. }
  270. FLOAT temp = local.next();
  271. if (!temp){ //if we read current seq
  272. local = GLOBAL.next();
  273. if (!local) //we read all seq
  274. return null; //end result seq
  275. FLOAT tmp = prev;
  276. prev = local.next();
  277. if (!prev){ //if empty seq
  278. prev = NAN;
  279. local = GLOBAL.next(); //go next seq
  280. return NAN;
  281. }
  282. isFirst = true; // we read first elem need save it
  283. return (prev + tmp)/2;
  284. }
  285. return prev = temp;
  286. }
  287.  
  288. let flatten seqs =
  289. // нумеруем каждый элемент внутренней пос-ти его индексом
  290. let numbering = Seq.zip (Seq.initInfinite id) in
  291. // сливаем внутренние посл-ти
  292. let pairs = (Seq.map numbering >> Seq.concat) seqs in
  293.  
  294. let folder (prev_i, prev_elem, _) (cur_i, cur_elem) =
  295. // если индексы текущего и предыдущего элементов не последовательны
  296. // значит, это граница, добавляем средний
  297. let is_bound = cur_i - prev_i <> 1 in
  298. let with_mean =
  299. if is_bound then [| (cur_elem + prev_elem) / 2.; cur_elem |]
  300. else [| cur_elem |] in
  301. (cur_i, cur_elem, Seq.ofArray with_mean) in
  302.  
  303. let take_3rd = function | _, _, x -> x in
  304. (Seq.scan folder (-1, 0., Seq.empty)
  305. >> Seq.skip 1
  306. >> Seq.map take_3rd
  307. >> Seq.concat) pairs
  308.  
  309. [[1; 2; 3; 4; 5]; [6; 5; 4; 3]; []; [-3; -3; -3]]
  310. |> List.map (List.map float) |> List.map Seq.ofList |> Seq.ofList
  311. |> flatten
  312. |> List.ofSeq
  313. |> printfn "%A"
  314.  
  315. seq {
  316. printfn "Generating outer seq";
  317. yield seq { printfn "Generating inner seq 1"; yield 1.0; };
  318. yield seq { printfn "Generating inner seq 2"; yield 2.0; };
  319. yield seq { printfn "Generating inner seq 3"; yield 3.0; }
  320. }
  321. |> flatten
  322. |> List.ofSeq
  323. |> printfn "%A"
  324.  
  325. [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]
  326. Generating outer seq
  327. Generating inner seq 1
  328. Generating inner seq 2
  329. Generating inner seq 3
  330. [1.0; 1.5; 2.0; 2.5; 3.0]
  331.  
  332. def flatten(*lists):
  333. prev = elt = None
  334. for lst in lists:
  335. for elt in lst:
  336. if prev is not None:
  337. yield (prev + elt) / 2
  338. prev = None
  339. yield elt
  340. prev = elt
  341.  
  342. lst = [[1, 2, 3, 4, 5], [6, 5, 4, 3], [-3, -3, -3]]
  343. print(list(flatten(*lst)))
  344.  
  345. f = foldr c []
  346. where c [] y = y
  347. c (x:[]) (y:b) = x : (x+y)/2 : b
  348. c (x:a) y = x : c a y
  349. c x [] = x
  350.  
  351. flatten [] = []
  352. flatten [y] = y
  353. flatten lists = concat . append_end . map adder . zip xxs $ xs
  354. where
  355. xxs@(_:xs) = concat . map (zip [1..]) $ lists
  356. adder ((n, a), (m, b))
  357. | n + 1 == m = [(a, b)]
  358. | otherwise = [(a, undefined), ((a + b) /2, b)]
  359. append_end [] = []
  360. append_end [x] = [map fst x, [snd $ last x]]
  361. append_end (x:xs) = map fst x : append_end xs
  362.  
  363. (ns inter-means.match
  364. (:require [clojure.core.match :refer [match]]))
  365.  
  366. (defn inter-means
  367. "Функция, возвращающая ленивую конкатенацию переданной последовательности
  368. последовательностей через средниые арифметические крайних элементов"
  369. ([input-seqs]
  370. (inter-means input-seqs nil false))
  371. ([input-seqs last-inserted junction?]
  372. (match input-seqs
  373. ([] :seq)
  374. ()
  375.  
  376. ([([] :seq) & remainder] :seq)
  377. (recur remainder last-inserted (-> last-inserted nil? not))
  378.  
  379. ([([head & tail] :seq) & remainder] :seq)
  380. (let [continuation
  381. (cons head (lazy-seq (inter-means
  382. (cons tail remainder)
  383. head
  384. false)))]
  385. (if junction?
  386. (cons (/ (+ head last-inserted) 2) continuation)
  387. continuation)))))
  388.  
  389. flatten = fst . foldl adder ([], undefined)
  390. where
  391. adder x [] = x
  392. adder ([], _) xs = llist xs
  393. adder (ys, prev) [x] = (ys ++ [(prev + x)/2, x], x)
  394. adder (ys, prev) (x:xs) = let (lxs, lx) = llist xs
  395. in (ys ++ [(prev + x)/2, x] ++ lxs, lx)
  396. llist [x] = ([x], x)
  397. llist (x:xs) = let (ys, y) = llist xs in (x:ys, y)
Add Comment
Please, Sign In to add comment