Как я могу решить это? Это касается индексации и для циклов - PullRequest
0 голосов
/ 16 мая 2018

Напишите функцию, которая принимает два списка (l1, l2) в качестве параметров. Два списка содержат целые числа. Второй список содержит числа в диапазоне [0, len (l1)), эти числа представляют индексы первый список. Функция должна возвращать сумму элементов в l1, индексы которых есть в l2. Обратите внимание, что если l2 содержит один и тот же индекс несколько раз, вы должны считать соответствующий элемент в l1 только один раз

Например: если l1 = [11, 2, 0, −3, 3] и l2 = [0, 1, 3, 0], функция должна вернуть 10, потому что 11 + 2 + (−3) = 10.

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

В 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);
}
0 голосов
/ 16 мая 2018

В Java:

import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class SumList {

    public static Integer calcualteListSum(List<Integer> elements, List<Integer> indexes) {
        Set<Integer> uniqueIndexes = new HashSet<Integer>(indexes);

        Integer sum = 0;
        for(Integer index : uniqueIndexes) {
            sum += elements.get(index);
        }

        return sum;
    }
}
0 голосов
/ 16 мая 2018

В питоне

l2 = set(l2)
summation = sum([l1[i] for i in l2])
...