Add tasks for all the new languages

This commit is contained in:
Tina Müller 2016-12-05 23:44:36 +01:00
parent 9dc3c2bb62
commit bba7bfd280
13208 changed files with 134745 additions and 0 deletions

View file

@ -0,0 +1,18 @@
def merge_sort(a : Array(Int32)) : Array(Int32)
return a if a.size <= 1
m = a.size / 2
lt = merge_sort(a[0 ... m])
rt = merge_sort(a[m .. -1])
return merge(lt, rt)
end
def merge(lt : Array(Int32), rt : Array(Int32)) : Array(Int32)
result = Array(Int32).new
until lt.empty? || rt.empty?
result << (lt.first < rt.first ? lt.shift : rt.shift)
end
return result + lt + rt
end
a = [7, 6, 5, 9, 8, 4, 3, 1, 2, 0]
puts merge_sort(a) # => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

View file

@ -0,0 +1,92 @@
PROGRAM MERGESORT_DEMO
! Example of merge sort usage.
CONST SIZE%=100,S1%=50
DIM DTA%[SIZE%],FH%[S1%],STACK%[20,2]
PROCEDURE MERGE(START%,MIDDLE%,ENDS%)
LOCAL FHSIZE%
FHSIZE%=MIDDLE%-START%+1
FOR I%=0 TO FHSIZE%-1 DO
FH%[I%]=DTA%[START%+I%]
END FOR
I%=0
J%=MIDDLE%+1
K%=START%
REPEAT
IF FH%[I%]<=DTA%[J%] THEN
DTA%[K%]=FH%[I%]
I%=I%+1
K%=K%+1
ELSE
DTA%[K%]=DTA%[J%]
J%=J%+1
K%=K%+1
END IF
UNTIL I%=FHSIZE% OR J%>ENDS%
WHILE I%<FHSIZE% DO
DTA%[K%]=FH%[I%]
I%=I%+1
K%=K%+1
END WHILE
END PROCEDURE
PROCEDURE MERGE_SORT(LEV->LEV)
! *****************************************************************
! This procedure Merge Sorts the chunk of DTA% bounded by
! Start% & Ends%.
! *****************************************************************
LOCAL MIDDLE%
IF ENDS%=START% THEN LEV=LEV-1 EXIT PROCEDURE END IF
IF ENDS%-START%=1 THEN
IF DTA%[ENDS%]<DTA%[START%] THEN
SWAP(DTA%[START%],DTA%[ENDS%])
END IF
LEV=LEV-1
EXIT PROCEDURE
END IF
MIDDLE%=START%+(ENDS%-START%)/2
STACK%[LEV,0]=START% STACK%[LEV,1]=ENDS% STACK%[LEV,2]=MIDDLE%
START%=START% ENDS%=MIDDLE%
MERGE_SORT(LEV+1->LEV)
START%=STACK%[LEV,0] ENDS%=STACK%[LEV,1] MIDDLE%=STACK%[LEV,2]
STACK%[LEV,0]=START% STACK%[LEV,1]=ENDS% STACK%[LEV,2]=MIDDLE%
START%=MIDDLE%+1 ENDS%=ENDS%
MERGE_SORT(LEV+1->LEV)
START%=STACK%[LEV,0] ENDS%=STACK%[LEV,1] MIDDLE%=STACK%[LEV,2]
MERGE(START%,MIDDLE%,ENDS%)
LEV=LEV-1
END PROCEDURE
BEGIN
FOR I%=1 TO SIZE% DO
DTA%[I%]=RND(1)*10000
END FOR
START%=1 ENDS%=SIZE%
MERGE_SORT(0->LEV)
FOR I%=1 TO SIZE% DO
WRITE("#####";DTA%[I%];)
END FOR
PRINT
END PROGRAM

View file

@ -0,0 +1,15 @@
def
sort( [] ) = []
sort( [x] ) = [x]
sort( xs ) =
val (l, r) = xs.splitAt( xs.length()\2 )
merge( sort(l), sort(r) )
merge( [], xs ) = xs
merge( xs, [] ) = xs
merge( x:xs, y:ys )
| x <= y = x : merge( xs, y:ys )
| otherwise = y : merge( x:xs, ys )
println( sort([94, 37, 16, 56, 72, 48, 17, 27, 58, 67]) )
println( sort(['Sofía', 'Alysha', 'Sophia', 'Maya', 'Emma', 'Olivia', 'Emily']) )

View file

@ -0,0 +1,52 @@
proc merge[T](a, b: var openarray[T], left, middle, right) =
let
leftLen = middle - left
rightLen = right - middle
var
l = 0
r = leftLen
for i in left .. <middle:
b[l] = a[i]
inc l
for i in middle .. < right:
b[r] = a[i]
inc r
l = 0
r = leftLen
var i = left
while l < leftLen and r < leftLen + rightLen:
if b[l] < b[r]:
a[i] = b[l]
inc l
else:
a[i] = b[r]
inc r
inc i
while l < leftLen:
a[i] = b[l]
inc l
inc i
while r < leftLen + rightLen:
a[i] = b[r]
inc r
inc i
proc mergeSort[T](a, b: var openarray[T], left, right) =
if right - left <= 1: return
let middle = (left + right) div 2
mergeSort(a, b, left, middle)
mergeSort(a, b, middle, right)
merge(a, b, left, middle, right)
proc mergeSort[T](a: var openarray[T]) =
var b = newSeq[T](a.len)
mergeSort(a, b, 0, a.len)
var a = @[4, 65, 2, -31, 0, 99, 2, 83, 782]
mergeSort a
echo a

View file

@ -0,0 +1,34 @@
function merge(sequence left, sequence right)
sequence result = {}
while length(left)>0 and length(right)>0 do
if left[1]<=right[1] then
result = append(result, left[1])
left = left[2..$]
else
result = append(result, right[1])
right = right[2..$]
end if
end while
return result & left & right
end function
function mergesort(sequence m)
sequence left, right
integer middle
if length(m)<=1 then
return m
end if
middle = floor(length(m)/2)
left = mergesort(m[1..middle])
right = mergesort(m[middle+1..$])
if left[$]<=right[1] then
return left & right
elsif right[$]<=left[1] then
return right & left
end if
return merge(left, right)
end function
constant s = shuffle(tagset(10))
? s
? mergesort(s)

View file

@ -0,0 +1,29 @@
func merge(left, right) {
var result = [];
while (!left.is_empty && !right.is_empty) {
result.append([right,left][left.first <= right.first].shift);
};
result + left + right;
}
 
func mergesort(array) {
var len = array.len;
len < 2 && return array;
 
var mid = (len/2 -> int);
var left = array.ft(0, mid-1);
var right = array.ft(mid);
 
left = __FUNC__(left);
right = __FUNC__(right);
 
merge(left, right);
}
 
# Numeric sort
var nums = (0..7 -> shuffle);
say mergesort(nums);
 
# String sort
var strings = ('a'..'e' -> shuffle);
say mergesort(strings);

View file

@ -0,0 +1,45 @@
func mergeSort<T:Comparable>(inout list:[T]) {
if list.count <= 1 {
return
}
func merge(var left:[T], var right:[T]) -> [T] {
var result = [T]()
while left.count != 0 && right.count != 0 {
if left[0] <= right[0] {
result.append(left.removeAtIndex(0))
} else {
result.append(right.removeAtIndex(0))
}
}
while left.count != 0 {
result.append(left.removeAtIndex(0))
}
while right.count != 0 {
result.append(right.removeAtIndex(0))
}
return result
}
var left = [T]()
var right = [T]()
let mid = list.count / 2
for i in 0..<mid {
left.append(list[i])
}
for i in mid..<list.count {
right.append(list[i])
}
mergeSort(&left)
mergeSort(&right)
list = merge(left, right)
}

View file

@ -0,0 +1,22 @@
# Input: [x,y] -- the two arrays to be merged
# If x and y are sorted as by "sort", then the result will also be sorted:
def merge:
def m: # state: [x, y, array] (array being the answer)
.[0] as $x
| .[1] as $y
| if 0 == ($x|length) then .[2] + $y
elif 0 == ($y|length) then .[2] + $x
else
(if $x[0] <= $y[0] then [$x[1:], $y, .[2] + [$x[0] ]]
else [$x, $y[1:], .[2] + [$y[0] ]]
end) | m
end;
[.[0], .[1], []] | m;
def merge_sort:
if length <= 1 then .
else
(length/2 |floor) as $len
| . as $in
| [ ($in[0:$len] | merge_sort), ($in[$len:] | merge_sort) ] | merge
end;

View file

@ -0,0 +1,4 @@
( [1, 3, 8, 9, 0, 0, 8, 7, 1, 6],
[170, 45, 75, 90, 2, 24, 802, 66],
[170, 45, 75, 90, 2, 24, -802, -66] )
| (merge_sort == sort)