Advertisement
Guest User

Untitled

a guest
Apr 26th, 2016
1,337
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.30 KB | None | 0 0
  1. //function create(*args)
  2. // Создает массив с указанными элементами
  3. //
  4. // Параметры:
  5. // *args -- элементы массива, до 26 аргументов, не <null> типа
  6. //
  7. // Возвращает:
  8. // <array>
  9. //
  10. // Описание:
  11. // Имитирует конструктор массива, создающий массив с элементами,
  12. // переданными в качестве аргументов. Пропущенные или элементы,
  13. // равные null не включаются в массив.
  14. //
  15. function create(a=null,b=null,c=null,d=null,e=null,f=null,g=null,
  16. h=null,i=null,j=null,k=null,l=null,m=null,n=null,
  17. o=null,p=null,q=null,r=null,s=null,t=null,u=null,
  18. v=null,w=null,x=null,y=null,z=null) export
  19. res=new Array();
  20. temp=new Array();
  21. exstr="";
  22. for _i=97 to 122 do
  23. exstr=exstr+"temp.add("+char(_i)+");";
  24. enddo;
  25. execute(exstr);
  26. for each item in temp do
  27. if item<>null then
  28. res.add(item);
  29. endif;
  30. enddo;
  31. return res;
  32. endfunction
  33.  
  34. /////////////////////////////////////////////////////////////////////////////
  35.  
  36. //function count(arr,value)
  37. // Возвращает количество элементов value в массиве arr
  38. //
  39. // Параметры:
  40. // arr <array>,<fixedarray>
  41. // value <any>
  42. //
  43. // Возвращает:
  44. // <number>
  45. //
  46. function count(arr,value) export
  47. if not check.is_array_or_fixedarray(arr) then
  48. raise exception.TypeError("argument 1 must be array or fixedarray",
  49. new Structure("arr,value",arr,value));
  50. endif;
  51. res=0;
  52. for each item in arr do
  53. if item=value then
  54. res=res+1;
  55. endif;
  56. enddo;
  57. return res;
  58. endfunction
  59.  
  60. /////////////////////////////////////////////////////////////////////////////
  61.  
  62. //function copy(arr)
  63. // Возвращает копию массива arr
  64. //
  65. // Параметры:
  66. // arr <array>,<fixedarray>
  67. //
  68. // Возвращает:
  69. // <array>,<fixedarray>
  70. //
  71. function copy(arr) export
  72. if not check.is_array_or_fixedarray(arr) then
  73. raise exception.TypeError("argument 1 must be array or fixedarray",
  74. new Structure("arr",arr));
  75. endif;
  76. res=new Array();
  77. execute("
  78. |for each item in arr do
  79. | res.add(item);
  80. |enddo;");
  81. return ?(check.is_array(res),res,array.freeze(res));
  82. endfunction
  83.  
  84. /////////////////////////////////////////////////////////////////////////////
  85.  
  86. //function freeze(arr)
  87. // "Замораживает" массив, создавая из него FixedArray
  88. //
  89. // Параметры:
  90. // arr <array>,<fixedarray>
  91. //
  92. // Возвращает:
  93. // <fixedarray>
  94. //
  95. // Описание:
  96. // Враппер над конструктором FixedArray. Ничего не делает, если передать
  97. // arr как <fixedarray>.
  98. //
  99. function freeze(arr) export
  100. if check.is_fixedarray(arr) then
  101. return arr;
  102. endif;
  103. if not check.is_array(arr) then
  104. raise exception.TypeError("argument 1 must be array",
  105. new Structure("arr",arr));
  106. endif;
  107. return new FixedArray(arr);
  108. endfunction
  109.  
  110. /////////////////////////////////////////////////////////////////////////////
  111.  
  112. //function frozenset(arr)
  113. // Создает неизменяемый массив без повторяющихся элементов
  114. //
  115. // Параметры:
  116. // arr <array>,<fixedarray>
  117. //
  118. // Возвращает:
  119. // <fixedarray>
  120. //
  121. function frozenset(arr) export
  122. if not check.is_array_or_fixedarray(arr) then
  123. raise exception.TypeError("argument 1 must be array or fixedarray",
  124. new Structure("arr",arr));
  125. endif;
  126. res=new Array();
  127. for each item in arr do
  128. if res.find(item)=undefined then
  129. res.add(item);
  130. endif;
  131. enddo;
  132. return array.freeze(res);
  133. endfunction
  134.  
  135. /////////////////////////////////////////////////////////////////////////////
  136.  
  137. //function len(arr)
  138. // Возвращает количество элементов массива arr
  139. //
  140. // Параметры:
  141. // arr <array>,<fixedarray>
  142. //
  143. // Возвращает:
  144. // <number>
  145. //
  146. // Описание:
  147. // Аналог arr.count()
  148. //
  149. function len(arr) export
  150. if not check.is_array_or_fixedarray(arr) then
  151. raise exception.TypeError("argument 1 must be array or fixedarray",
  152. new Structure("arr",arr));
  153. endif;
  154. return arr.count();
  155. endfunction
  156.  
  157. /////////////////////////////////////////////////////////////////////////////
  158.  
  159. //function merge(arr1,arr2)
  160. // Создает новый массив из элементов двух массивов
  161. //
  162. // Параметры:
  163. // arr1 <array>,<fixedarray>
  164. // arr2 <array>,<fixedarray>
  165. //
  166. // Возвращает:
  167. // <array>
  168. //
  169. function merge(arr1,arr2) export
  170. if check.is_fixedarray(arr1) then
  171. arr1=array.update(new Array(),arr1);
  172. endif;
  173. if not check.is_array_or_fixedarray(arr1) then
  174. raise exception.TypeError("argument 1 must be array or fixedarray",
  175. new Structure("arr1,arr2",arr1,arr2));
  176. endif;
  177. if not check.is_array_or_fixedarray(arr2) then
  178. raise exception.TypeError("argument 2 must be array or fixedarray",
  179. new Structure("arr1,arr2",arr1,arr2));
  180. endif;
  181. res=new Array();
  182. for each item in arr1 do
  183. res.add(item);
  184. enddo;
  185. for each item in arr2 do
  186. res.add(item);
  187. enddo;
  188. return res;
  189. endfunction
  190.  
  191. /////////////////////////////////////////////////////////////////////////////
  192.  
  193. //function min_n_max(arr)
  194. // Возвращает максимальный и минимальный элементы массива
  195. //
  196. // Параметры:
  197. // arr <array>,<fixedarray>
  198. //
  199. // Возвращает:
  200. // <array>
  201. //
  202. // Описание:
  203. // Функция является доработаным вариантом идей отсюда:
  204. // http://habrahabr.ru/blogs/development/92303
  205. //
  206. function min_n_max(arr) export
  207. l=arr.ubound();
  208. i=0;min=0;max=0;
  209. if l=-1 then
  210. return pair(undefined,undefined);
  211. elsif l=0 then
  212. return pair(arr[min],arr[max]);
  213. else
  214. while i<l do
  215. if arr[i]<arr[i+1] then
  216. if arr[i]<arr[min] then min=i; endif;
  217. if arr[i+1]>arr[max] then max=i+1; endif;
  218. else
  219. if arr[i+1]<arr[min] then min=i+1; endif;
  220. if arr[i]>arr[max] then max=i; endif;
  221. endif;
  222. i=i+2;
  223. enddo;
  224. if i=l then
  225. if arr[i]<arr[min] then min=i; endif;
  226. if arr[i]>arr[max] then max=i; endif;
  227. endif;
  228. return pair(arr[min],arr[max]);
  229. endif;
  230. endfunction
  231.  
  232. /////////////////////////////////////////////////////////////////////////////
  233.  
  234. //function pop(arr,start=undefined,end=undefined)
  235. // Удаляет и возвращает удаленный элемент/набор элементов из массива
  236. //
  237. // Параметры:
  238. // arr <array>,<fixedarray>
  239. // start <undefined>,<number>
  240. // end <undefined>,<number>,<null>
  241. //
  242. // Возвращает:
  243. // <any>,<array>
  244. //
  245. // Описание:
  246. // С указанным аргументом start, вырезает элементы с этой позиции.
  247. // С указанным аргументом end, вырезает элементы по эту позицию.
  248. // start и end могут быть отрицательными для поиска c конца.
  249. //
  250. // Для указания диапозона до конца end должен быть установлен в null.
  251. // По умолчанию, когда start и end undefined, вырезает последний элемент.
  252. //
  253. // Если результатом выборки является один элемент, то он же и возвращается,
  254. // иначе возвращается массив вырезанных элементов.
  255. //
  256. function pop(arr,val start=undefined,val end=undefined) export
  257. if not check.is_array(arr) then
  258. msg="argument 1 must be array";
  259. raise exception.TypeError(msg,
  260. new Structure("arr,start,end",arr,start,end));
  261. endif;
  262. if start<>undefined and not check.is_number(start) then
  263. msg="argument 2 must be number or undefined";
  264. raise exception.TypeError(msg,
  265. new Structure("arr,start,end",arr,start,end));
  266. endif;
  267. if not (end=undefined or end=null) and not check.is_number(end) then
  268. msg="argument 3 must be number, undefined or null";
  269. raise exception.TypeError(msg,
  270. new Structure("arr,start,end",arr,start,end));
  271. endif;
  272. len=arr.ubound();
  273. if start=undefined and end=undefined then
  274. start=len;
  275. elsif start=undefined then
  276. start=0;
  277. elsif start<0 then
  278. start=len+start+1;
  279. if start<0 then
  280. start=0;
  281. endif;
  282. endif;
  283. if end=undefined then
  284. if start>arr.ubound() then
  285. raise exception.IndexError(
  286. "Index `start` is out of range",
  287. new Structure("arr,start,end,ubound",
  288. arr,start,end,arr.ubound())
  289. );
  290. endif;
  291. v=arr[start];
  292. arr.delete(start);
  293. return v;
  294. elsif end=null then
  295. end=len;
  296. elsif end<0 then
  297. end=len+end;
  298. else
  299. end=end-start;
  300. endif;
  301. res=new Array();
  302. i=start;j=start;
  303. for i=start to end do
  304. if i>arr.ubound() or j>end then
  305. break;
  306. endif;
  307. res.add(arr[i]);
  308. arr.delete(i);
  309. i=i-1;j=j+1;
  310. enddo;
  311. return ?(res.count()=1,res[0],res);
  312. endfunction
  313.  
  314. /////////////////////////////////////////////////////////////////////////////
  315.  
  316. //function reverse(arr)
  317. // Переставляет элементы массива в обратном порядке
  318. //
  319. // Параметры:
  320. // arr <array>
  321. //
  322. // Возвращает:
  323. // arr
  324. //
  325. function reverse(arr) export
  326. if not check.is_array(arr) then
  327. raise exception.TypeError("argument 1 must be array",
  328. new Structure("arr",arr));
  329. endif;
  330. len=arr.ubound();
  331. j=int(len/2);
  332. for i=0 to j do
  333. swap(arr[i],arr[len-i]);
  334. enddo;
  335. return arr;
  336. endfunction
  337.  
  338. /////////////////////////////////////////////////////////////////////////////
  339.  
  340. //function slice(arr,start=0,end=undefined)
  341. // Возвращает произвольный набор элементов из массива
  342. //
  343. // Параметры:
  344. // arr <array>,<fixedarray>
  345. // start <undefined>,<number>
  346. // end <undefined>,<number>,<null>
  347. //
  348. // Возвращает:
  349. // <any>,<array>
  350. //
  351. // Описание:
  352. // С указанным аргументом start, выбирает элементы с этой позиции.
  353. // С указанным аргументом end, выбирает элементы по эту позицию.
  354. // start и end могут быть отрицательными для поиска c конца.
  355. //
  356. // Для указания диапозона до конца end должен быть установлен в null.
  357. // По умолчанию, когда start=0 и end=undefined, возвращает первый элемент.
  358. //
  359. // Если результатом выборки является один элемент, то он же и возвращается,
  360. // иначе возвращается массив вырезанных элементов.
  361. //
  362. function slice(arr,val start=0,val end=undefined) export
  363. if not check.is_array_or_fixedarray(arr) then
  364. msg="argument 1 must be array or fixedarray";
  365. raise exception.TypeError(msg,
  366. new Structure("arr,start,end",arr,start,end));
  367. endif;
  368. if not check.is_number(start) then
  369. msg="argument 2 must be number";
  370. raise exception.TypeError(msg,
  371. new Structure("arr,start,end",arr,start,end));
  372. endif;
  373. if not (end=undefined or end=null) and not check.is_number(end) then
  374. msg="argument 3 must be number, undefined or null";
  375. raise exception.TypeError(msg,
  376. new Structure("arr,start,end",arr,start,end));
  377. endif;
  378. len=arr.ubound();
  379. if start<0 then
  380. start=len+start+1;
  381. if start<0 then
  382. start=0;
  383. endif;
  384. endif;
  385. if end=undefined then
  386. if start>arr.ubound() then
  387. raise exception.IndexError(
  388. "Index `start` is out of range",
  389. new Structure("arr,start,end,ubound",
  390. arr,start,end,arr.ubound())
  391. );
  392. endif;
  393. return arr[start];
  394. elsif end=null then
  395. end=len;
  396. elsif end<0 then
  397. end=len+end;
  398. else
  399. end=end-start;
  400. endif;
  401. res=new Array();
  402. i=start;
  403. while i<=arr.ubound() or i<=end do
  404. res.add(arr[i]);
  405. enddo;
  406. return ?(res.count()=1,res[0],res);
  407. endfunction
  408.  
  409. /////////////////////////////////////////////////////////////////////////////
  410.  
  411. //function sort(arr)
  412. // Сортирует переданный массив по возрастанию алгоритмом quicksort
  413. //
  414. // Параметры:
  415. // arr <array>
  416. //
  417. // Возвращает:
  418. // arr
  419. //
  420. function sort(arr,left=undefined,right=undefined) export
  421. if left=undefined then left=0; endif;
  422. if right=undefined then right=arr.ubound(); endif;
  423. if right>left then
  424. pivot_index=partition(arr,left,right);
  425. sort(arr,left,pivot_index-1);
  426. sort(arr,pivot_index+1,right);
  427. endif;
  428. endfunction
  429.  
  430. function partition(a,p,r)
  431. x=a[r];
  432. j=p-1;
  433. for i=p to r-1 do
  434. if x>a[i] then
  435. j=j+1;
  436. swap(a[i],a[j]);
  437. endif;
  438. enddo;
  439. a[r]=a[j+1];
  440. a[j+1]=x;
  441. return j+1;
  442. endfunction
  443.  
  444. /////////////////////////////////////////////////////////////////////////////
  445.  
  446. //function update(arr1,arr2)
  447. // Добавляет элементы массива arr2 в массив arr1
  448. //
  449. // Параметры:
  450. // arr1 <array>
  451. // arr2 <array>,<fixedarray>
  452. //
  453. // Возвращает:
  454. // arr1
  455. //
  456. function update(arr1,arr2) export
  457. if not check.is_array(arr1) then
  458. raise exception.TypeError("argument 1 must be array",
  459. new Structure("arr1,arr2",arr1,arr2));
  460. endif;
  461. if not check.is_array_or_fixedarray(arr2) then
  462. raise exception.TypeError("argument 2 must be array or fixedarray",
  463. new Structure("arr1,arr2",arr1,arr2));
  464. endif;
  465. for each item in arr2 do
  466. arr1.add(item);
  467. enddo;
  468. return arr1;
  469. endfunction
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement