Forward difference: Difference between revisions

→‎{{header|AppleScript}}: Updated primitives
(→‎{{header|Kotlin}}: Updated example see https://github.com/dkandalov/rosettacode-kotlin for details)
(→‎{{header|AppleScript}}: Updated primitives)
Line 163:
{{Trans|JavaScript}}
 
<lang AppleScript>-- forwardDifferenceFORWARD :: IntDIFFERENCE -> [Int] -> [Int]------------------------------------------------------
 
-- rangeforwardDifference :: Int -> [Int] -> [Int]
on forwardDifference(n, xs)
set lng to length of xs
Line 172 ⟶ 174:
property ndx : n
on lambda|λ|(ds)
(atLength's fullLength) - (length of ds) ≥ atLength's ndx
end lambda|λ|
end script
-- fd :: [Int] -> [Int]
script fd
on lambda|λ|(xs)
script minus
on lambda|λ|(a, b)
a - b
end lambda|λ|
end script
zipWith(minus, tail(xs), xs)
end lambda|λ|
end script
Line 194 ⟶ 196:
 
 
-- TEST ------------------------------------------------------------------------------------------------
on run
set xs to {90, 47, 58, 29, 22, 32, 55, 5, 55, 73}
script test
on lambda|λ|(n)
intercalate(" -> [", {{n}} & intercalate(", ", forwardDifference(n, xs))) & "]"¬
{{n}} & intercalate(", ", forwardDifference(n, xs))) & "]"
end lambda|λ|
end script
intercalate(linefeed, map(test, rangeenumFromTo(1, 9)))
end run
 
 
-- GENERIC FUNCTIONS ------------------------------------------------------------------------------
 
-- enumFromTo :: Int -> Int -> [Int]
-- GENERIC FUNCTIONS ------------------------------------------------------------------------------
on rangeenumFromTo(m, n)
 
if nm <> mn then
-- zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
set d to -1
on zipWith(f, xs, ys)
set nx to length of xs
set ny to length of ys
if nx < 1 or ny < 1 then
{}
else
set lngd to cond(nx < ny, nx, ny)1
set lst to {}
tell mReturn(f)
repeat with i from 1 to lng
set end of lst to lambda(item i of xs, item i of ys)
end repeat
return lst
end tell
end if
set nylst to length of ys{}
end zipWith
repeat with i from m to n by d
set end of lst to i
end repeat
return lst
end enumFromTo
 
-- untilintercalate :: (aText -> Bool)[Text] -> (a -> a) -> a -> aText
on |until|intercalate(pstrText, f, xlstText)
set {dlm, my text item delimiters} to {my text item delimiters, strText}
set mp to mReturn(p)
set vstrJoined to xlstText as text
set my text item delimiters to dlm
tellreturn mReturn(f)strJoined
end intercalate
repeat until mp's lambda(v)
set v to lambda(v)
end repeat
end tell
return v
end |until|
 
-- map :: (a -> b) -> [a] -> [b]
Line 248 ⟶ 241:
set lst to {}
repeat with i from 1 to lng
set end of lst to lambda|λ|(item i of xs, i, xs)
end repeat
return lst
end tell
end map
 
-- min :: Ord a => a -> a -> a
on min(x, y)
if nxy < 1 or ny < 1x then
{}y
else
x
end if
end rangemin
 
-- Lift 2nd class handler function into 1st class script wrapper
Line 261 ⟶ 263:
else
script
property lambda|λ| : f
end script
end if
end mReturn
 
-- range :: Int -> Int -> [Int]
on range(m, n)
if n < m then
set d to -1
else
set d to 1
end if
set lst to {}
repeat with i from m to n by d
set end of lst to i
end repeat
return lst
end range
 
-- intercalate :: Text -> [Text] -> Text
on intercalate(strText, lstText)
set {dlm, my text item delimiters} to {my text item delimiters, strText}
set strJoined to lstText as text
set my text item delimiters to dlm
return strJoined
end intercalate
 
-- tail :: [a] -> [a]
Line 297 ⟶ 277:
end tail
 
-- conduntil :: (a -> Bool) -> (a -> a) -> a -> a
on cond|until|(boolp, f, gx)
ifset boolmp thento mReturn(p)
set v to fx
else
tell gmReturn(f)
repeat until mp's lambda|λ|(v)
end if
set mpv to mReturn|λ|(pv)
end cond</lang>
end repeat
end tell
return v
end |until|
 
-- zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
on zipWith(f, xs, ys)
set nxlng to min(length of xs, length of ys)
set lst to {}
tell mReturn(f)
repeat with i from 1 to lng
set end of lst to lambda|λ|(item i of xs, item i of ys)
end repeat
return lst
end tell
end zipWith</lang>
{{Out}}
<pre>1 -> [-43, 11, -29, -7, 10, 23, -50, 50, 18]
9,655

edits