Nano Hash - криптовалюты, майнинг, программирование

Перечислить NSArray, начиная с заданного индекса, ища в обоих направлениях (обернуть)

Пример. У меня есть массив с 15 объектами. Я хочу начать перечисление с заданного индекса. Скажем, начните с индекса 5, а затем индекс выше, индекс ниже, выше, ниже и т. д. Я хочу, чтобы он обернулся.

Таким образом, порядок индексов в моем примере будет таким. 5, 6, 4, 7, 3, 8, 2, 9, 1, 10, 0, 11, 14, 12, 13

Было бы здорово иметь сигнатуру метода, похожую на следующую строку, но я не требую этого, чтобы одобрить ответ:

- (void)enumerateFromIndex:(NSUInteger)index wrapAroundAndGoBothWays:(void (^)(id obj, NSUInteger idx, BOOL *stop))block

Как это может быть сделано? Хотелось бы избежать копирования массива и т.д.

В этом посте мы делаем это без переноса: Перечисление NSArray, начиная с заданного индекса, ища в обоих направлениях (без переноса вокруг)


Ответы:


1

Заимствуя у @omz, вот еще более простой вариант упаковки:

@implementation NSArray (Extensions)

- (void)enumerateFromIndex:(NSUInteger)index wrapAroundAndGoBothWays:(void (^)(id obj, NSUInteger idx, BOOL *stop))block
{
    BOOL stop = NO;
    NSUInteger actual = index;
    for (NSUInteger i = 0; i < self.count && !stop; i++) {
        actual += (2*(i%2)-1)*i;
        actual = (self.count + actual)%self.count;
        block([self objectAtIndex:actual], actual, &stop);
    }
}

@end
16.01.2013
  • :) это немного трудно читать, но оно точно красивое и маленькое! Это кажется очень эффективным! 16.01.2013

  • 2

    Это математическая задача. Есть красивое решение. Однако это предполагает предварительную сортировку списка индексов.

    Идея состоит в том, чтобы разложить целые числа от 0 до 15 по кругу и взять элементы в том порядке, в котором они появляются на оси.

    Поскольку делать это в ObjC очень утомительно, я представляю решение на Python:

    from math import pi, cos
    
    def circlesort(N, start):
        eps = 1e-8
        res = range(N)
        def f(x):
            return -cos(2*pi*(x-start-eps)/N)
        res.sort( lambda x,y:cmp(f(x), f(y)) )
        return res
    

    тогда

    print circlesort(15, 5)
    

    выходы

    [5, 6, 4, 7, 3, 8, 2, 9, 1, 10, 0, 11, 14, 12, 13]
    

    что является желаемым результатом.

    ИЗМЕНИТЬ

    Хорошо, вот реализация C:

    #include <stdlib.h>
    #include <math.h>
    #define sign(x) ((x)>0?1:(x)<0?-1:0)
    
    void circlesort(int* values, int N, int start){
        double f(int x)
        {
            return -cos(2*M_PI*((double)(x-start)-.25)/N);
        }
        int compare (const void * a, const void * b)
        {
            return sign( f(*(int*)a) - f(*(int*)b) );
        }
        qsort (values, N, sizeof(int), compare);
    }
    

    Это отсортирует по кругу массив целых чисел длины N. Используйте это так:

    int i, N = 15;
    int indexes[N];
    for (i=0;i<N;i++) 
        indexes[i] = i;
    circlesort(indexes, N, 5);
    

    Теперь массив indexes отсортирован в нужном порядке. Поскольку существуют вложенные функции, вы должны добавить -fnested-functions к флагам компилятора.

    ИЗМЕНИТЬ 2

    Учитывая тот факт, что есть гораздо более простое решение (см. мой другой ответ), это довольно академическое решение.

    16.01.2013
  • Прохладный! Было бы здорово увидеть порт этого на Objective-C или C. 16.01.2013
  • Эй, так как вы думаете, что это круто, а я думаю, что это круто, я потратил полчаса, чтобы сделать порт на C. 16.01.2013
  • Пришлось дорисовывать, что же на самом деле происходит. Какая блестящая идея поставить их на круг! Кто бы мог подумать!??!?!? Так здорово!! 16.01.2013
  • Я всегда ценю сведение задачи к математической, когда это возможно. 16.01.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..