В Perl,
use List::Util qw(sum0 uniqnum);
sub ($l1, $l2) {
sum0 @$l1[uniqnum @$l2]
}
В Хаскеле,
fmap (fmap sum) (fmap (flip fmap nub) (fmap fmap (!!)))
В Хаскеле,
{-# LANGUAGE ParallelListComp #-}
\l1 l2 -> sum [ x * fromEnum (i `elem` l2) | x <- l1 | i <- [0 ..]]
В Python,
lambda l1, l2: sum([l1[i] for i in range(len(l1)) if i in l2])
В С,
#include <stddef.h>
#include <stdbool.h>
static bool h(const long *v, size_t n, long k) {
return !n || *v != k && h(v + 1, n - 1, k);
}
static long g(const long *u, const long *w, size_t n, size_t c) {
return c >= n ? 0 : h(w, c, w[c]) * u[w[c]] + g(u, w, n, c + 1);
}
static long f(const long *l1, const long *l2, size_t n) {
return g(l1, l2, n, 0);
}
В С,
#include <stddef.h>
#include <setjmp.h>
static long f(const long *l1, const long *l2, size_t n) {
volatile long r = 0;
volatile size_t c = 0;
jmp_buf d;
setjmp(d);
if (c >= n) return r;
volatile size_t i = c;
jmp_buf e;
setjmp(e);
if (!i--) r += l2[c][l1]; else
if (l2[i] != c[l2]) longjmp(e, 0);
c++;
longjmp(d, 1);
}