Найти наибольшее количество n позиций от n


29

Продолжение этого вопроса .

задача

По массиву натуральных чисел найдите самый большой элемент k, для которого:

Существует некоторое положительное целое расстояние n , так что элемент в массиве, расположенный в n  местах слева или справа от k, равен n .

Массив гарантированно содержит хотя бы один элемент, удовлетворяющий этому условию.

Самый короткий код (в байтах) выигрывает. Вы можете выбрать любой формат ввода / вывода, который вам нравится.

пример

Учитывая вход

[4, 6, 7, 9, 3, 6, 5, 7, 2]

Допустимые значения:

  • То 4, как есть 7расположенные справа 7 позиций
  • Первый 6, так как есть 3расположенные 3 позиции справа от него
  • То 3, как есть 4расположенные 4 позиции слева от него
  • То 5, как есть 2расположенные 2 позиции справа от него
  • Второе 7, так как есть 3расположенные 3 позиции слева от него.

Из этих значений наибольшим является 7.

Контрольные примеры

[1, 13] → 13
[2, 9, 8, 3, 72, 2] → 8
[5, 28, 14, 5, 6, 3, 4, 7] → 14
[1, 3, 5, 15, 4, 1, 2, 6, 7, 7] → 7
[5, 1, 3, 5, 2, 5, 5, 8, 5, 1, 5, 1, 2, 3] → 5
[5, 12, 2, 5, 4, 7, 3, 3, 6, 2, 10, 5, 5, 5, 4, 1, 8, 5] → 10

Еще два (хотя и несколько избыточных) случая в этом примере: первые 6 (опять же), поскольку справа находится 5 пять позиций; или второй 7 (снова), так как слева осталось 6 позиций.
Джонатан Аллан

1. На моем телефоне заголовок выглядит так: «Найти наибольшее количество позиций от». 2. Указанное условие состоит в том, что существует некоторое k такое, что (свойство, не зависящее от k). Это, безусловно, должно быть неправильно.
Питер Тейлор

@PeterTaylor «this» в «this element» относится к k.
Taemyr

1
@Taemyr, это не имеет смысла по двум причинам: во-первых, потому что k не указано как элемент; и во-вторых, потому что нас просят « найти самый большой элемент, удовлетворяющий » условию, поэтому « этот элемент » имеет антецедент вне условия.
Питер Тейлор,

2
Может быть, вы могли бы избежать путаницы, сказав «найдите самый большой элемент k такой, что», а затем используйте k вместо этого элемента в определении?
Мартин Эндер,

Ответы:


3

Желе , 9 байт

Jạþ`=ḅa¹Ṁ

Попробуйте онлайн! или проверьте все контрольные примеры .

Как это работает

Jạþ`=ḅa¹Ṁ  Main link. Argument: A (array)

J          Indices; yield [1, ..., len(A)].
   `       Use the previous return value as left and right argument:
 ạþ        Absolute difference table; take the absolute value of the difference
           of each pair of indices, yielding a 2D array.
    =      Compare each absolute difference with the corresponding item of A.
     ḅ     Base; convert each Boolean list from base i to integer, where i is the
           corresponding item of A. The value of i is not important; we only care
           if the list contains a 1, which will result in a non-zero integer.
       ¹   Identity; yield A.
      a    Logical AND; replace non-zero values with the corresponding items of A.
        Ṁ  Take the maximum.

1
Хм, не уверен, какова политика в этом отношении, но теперь у вас есть два разных подхода в отдельных ответах на одном и том же языке программы одним и тем же пользователем. Разве не было бы более целесообразно поместить 9- и 10-байтовые фрагменты в один и тот же ответ, поскольку это один и тот же язык программирования, и вы оба? Я могу понять несколько ответов на одном и том же языке программирования несколькими пользователями, но лично я думаю, что разные подходы одного и того же пользователя на одном и том же языке программирования будут лучше подходить для редактирования. Просто мое мнение.
Кевин Круйссен

5
Это был мой первый мета-вопрос , и, по-видимому, все согласились с тем, что в разных ответах должны быть разные подходы. В этом случае мои подходы не имеют ничего общего, кроме максимума в конце, поэтому я пошел на отдельный пост.
Деннис

8

05AB1E , 21 байт

vyN+Ny-})¹gL<Ãv¹yè})Z

объяснение

v      }               # for each num in input
 yN+                   # push index + num
    Ny-                # push index - num
        )              # wrap stack in a list
         ¹gL<Ã         # remove indices outside the range of input
              v¹yè})   # get list of elements in input at the remaining indices
                    Z  # get max

Попробуйте онлайн!


Вы, вероятно, используете это все время, но я только что заметил "обернуть стек в список". Ухоженная.
GreenAsJade

@GreenAsJade: Да, это одна из команд, которые я использую больше всего :)
Emigna

7

Haskell, 61 57 55 байт

f x=maximum[a|(n,a)<-x,(i,b)<-x,b==abs(n-i)]
f.zip[0..]

Пример использования: (f.zip[0..]) [5,28,14,5,6,3,4,7]-> 14.

(Более или менее) прямая реализация определения: для каждого индекса nвходного списка xсохраните, a := x!!nесли есть индекс, iгде b := x!!iравен abs(n-i). Найди максимум.

Редактировать: @xnor сохранил два байта. Благодарность!


Так как вы не используете x, это должно быть короче, чтобы определить функцию zи составить в zip[0..].
xnor

6

Желе , 10 байт

,N+JFfJị¹Ṁ

Попробуйте онлайн! илипроверьте все контрольные примеры .

Как это работает

,N+JFfJị¹Ṁ  Main link. Argument: A (array)

,N          Pair A with -A (element-wise negative).
   J        Yield the indices of A [1, ..., len(A)].
  +         Add the elements of A (and their negatives) with the corr. indices.
    F       Flatten the resulting 2D array.
     fJ     Filter indices; remove invalid indices (not in [1, ..., len(A)]) from
            the generated array. The result is the list of all indices of eligible
            elements of A.
       ị¹   Retrieve the corresponding elements of A.
         Ṁ  Take the maximum.

5

Python 3, 85 80 72 байта

lambda l,e=enumerate:max(i for p,i in e(l)for s,j in e(l)if j==abs(s-p))

Редактировать: -8 байт благодаря @Dennis


5

EXCEL: 32 30 байт

=MAX(IF(A:A-ROW(A:A)<0,A:A,0))

Я до сих пор не могу поверить, что я так коротко ...

Как использовать:
вставьте это в ЛЮБУЮ ячейку, КРОМЕ ячеек столбца A. После вставки, все еще редактируя, нажмите control+ shift+, enterчтобы правильно ввести его.
поместите ваши значения в столбец A, 1 значение на ячейку (согласно записи CSV).

Если вы хотите узнать, как это работает, я разместил дополнительный совет в разделе « Советы по игре в гольф в Excel» .


Я люблю эти превосходные игры в гольф - кто бы мог подумать !!
GreenAsJade,

4

JavaScript (ES6), 61 байт

a=>Math.max(...a.filter((_,i)=>a.some((e,j)=>e==i-j|e==j-i)))

4

Perl, 45 байт

Включает +2 для -ap

Дайте числа в строке на STDIN:

largest.pl <<< "5 12 2 5 4 7 3 3 6 2 10 5 5 5 4 1 8 5"

largest.pl:

#!/usr/bin/perl -ap
($_)=sort{$b-$a}map@F[$^P=$n-$_,$n+++$_],@F

Еще один байт можно получить, заменив ^P его буквальным управляющим символом, но это приводит к предупреждению о STDERR о последних perls.

Предполагает largest number + array length < 2^32


3

Pyth, 19 17 байт

Спасибо @ Pietu1998 за -2 байта

eS@LQ@UQs.e,-kb+b

Программа, которая принимает ввод списка в STDIN и печатает результат.

Попробуйте онлайн

Как это работает

eS@LQ@UQs.e,-kb+b  Program. Input: Q
         .e        Map over Q (implicit input fill) with elements as b and indices as k:
            -kb     k-b
               +b   k+b (Implicit fill with k)
           ,        2-element list of those (possible indices)
        s          Flatten that
      UQ           Yield [0, 1, 2, 3..., len(Q)-1]
     @             Filter the flattened list by presence in the above, removing invalid
                   indices
  @LQ              Index into Q at those indices
 S                 Sort that
e                  Yield the last element of that, giving the maximum
                   Implicitly print

}#так же, как @. Кроме того, если вы переставляете последний бит, ,-kb+bkвы можете удалить последний, kтак как Pyth автоматически вставит его.
PurkkaKoodari

@ Pietu1998 Спасибо. Я не знал о неявном заполнении перечисления; это работает для любых других функций типа карты?
TheBikingViking

Работает для любой лямбды, она автоматически заполняет остальные лямбды первой лямбда-переменной.
PurkkaKoodari

3

MATL, 13 байт

ttn:tYTq=a)X>

На входе должен быть вектор столбца. Т.е. входные данные разделяются точкой с запятой, как [1; 2; 3], или запятыми, которые разделяются галочкой транспонирования в конце, как [1,2,3] '.

Попробуйте онлайн!

Все тестовые случаи: (A) , (B) , (C) , (D) , (E) , (F)

Спасибо Suever за предложения по сохранению 2 персонажей в чате MATL .

Объяснение:

Общая стратегия аналогична моему ответу на Octave / MATLAB, где объясняется основная концепция: https://codegolf.stackexchange.com/a/94161/42247

Конкретный код в этом ответе MATL построен следующим образом:

Суть метода - построение матрицы Теплица, i-ая запись которой - abs (ij). Сначала мы построим матрицу Тёплица с элементами abs (i-1) +1 с помощью команды toptlitz для MATL следующим образом:

n:tYT % Equivalent to @(v)toeplitz(1:length(v))

Чтобы увидеть, как это работает, давайте назовем входной вектор для этого фрагмента кода v. 'N' находит длину v, затем ':' создает вектор 1: length (v). Затем 't' делает еще одну копию 1: length (v) в стеке; эта дополнительная копия необходима из-за хорошо известной ошибки в функции YT в MATL (эквивалент toeplitz () в MATL), в которой она ожидает две копии ввода вместо 1. Затем YT берет две копии этого вектора 1 : длина (v) вне стека и делает из них матрицу Аэса (ij) +1 Тёплица.

Теперь нам нужно вычесть 1 из этой матрицы, чтобы получить матрицу Тёплица с записями abs (ij) и найти местоположения ij, где эта матрица Теплица abs (ij) равна матрице всех векторов столбцов, содержащих столбцы-копии входных данных. вектор v. Это делается следующим образом:

t n:tYT q=
% t [code] q= is equivalent to @(v) [code](v)-1 == v

Первый 't' делает дополнительную копию ввода и сохраняет ее в стеке. 'N: tYT' создает матрицу тепловых эффектов, как описано ранее, и выводит ее в стек. Затем 'q' вычитает 1 из матрицы Тёплица, а '=' выполняет поэлементное сравнение на равенство между матрицей abs (ij) и вектором, столбцы которого являются копиями входных данных. Обратите внимание, что, сравнивая вектор столбца с матрицей, мы неявно используем преимущества правил вещания операторов MATLAB / MATL (вектор сравнения в столбце копируется для создания матрицы без каких-либо команд).

Наконец, нам нужно найти индексы строк i, где есть столбец j, такой, что ij-я запись в разности матриц, построенной выше, равна 1, затем получить значение входного вектора, соответствующего этим индексам, и затем взять максимум. Это в следующие три шага:

1) Найти индексы для любой строки, которая содержит ненулевое значение:

tn:tYTq= a
% [code] a is equivalent to @(v) any([code](v))

2) Извлечь элементы входного вектора, соответствующие этим индексам:

t tn:tYTq= a ) X>
% t [code] ) is equivalent to @(v) v([code](v)]

3) Найти и вернуть максимальный элемент:

t tn:tYTq= a ) X>
% [code] X> is equivalent to @(v) max(v).

Поведение функции YTизменилось в выпуске 20.2.2 . Теперь он использует 1 ввод по умолчанию (что в целом более полезно). Несмотря на то, что это сэкономит вам 1 байт (удалить tдо YT), его нельзя использовать, потому что смена языка ставит задачу на задний план. Но это приводит к тому, что ваш ответ больше не действителен в новом выпуске, который теперь
Луис Мендо

Вы можете либо отредактировать связанный код и оставить заметку, либо использовать эту ссылку для интерпретатора MATL Online, который поддерживает более старые выпуски. К сожалению, вам также необходимо обновить другие ссылки. Приносим извинения за неудобства
Луис Мендо

Независимо от этого, вы можете сохранить 1 байт, заменив n:наf
Луис Мендо


2

Октава / MATLAB, 40 байт

@(v)max(v(any(toeplitz(1:nnz(v))-v==1)))

На входе должен быть вектор столбца.

Спасибо Луису Мендо за предложения по экономии 3 байта (см. Комментарий)

Спасибо Suever за предложения по сохранению еще 4 байтов (замена ~~ (sum ()) на any ())

Объяснение:

При заданном входном векторе v эта задача эквивалентна нахождению всех решений i, j следующего дискретного уравнения,

abs(i-j) = v(i),   i,j both in 1..k,

где abs () - функция абсолютного значения. Каждое v (i), для которого решается это уравнение, является одним из возможных решений, которое мы можем максимизировать.

Как дискретная функция от i и j, все возможности для левой части могут быть упорядочены в матрице Теплица, которая выглядит примерно так:

[0, 1, 2, 3, 4]
[1, 0, 1, 2, 3]
[2, 1, 0, 1, 2]    <--- abs(i-j)
[3, 2, 1, 0, 1]
[4, 3, 2, 1, 0]

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

[v(1), v(1), v(1), v(1), v(1)]
[v(2), v(2), v(2), v(2), v(2)]
[v(3), v(3), v(3), v(3), v(3)]   <--- v(i)
[v(4), v(4), v(4), v(4), v(4)]
[v(5), v(5), v(5), v(5), v(5)]

Чтобы найти все решения уравнения, мы вычитаем эти две матрицы и находим места, где есть ноль. Строки, где есть ноль, соответствуют желаемым индексам i, где есть aj такой, что abs (ij) = v (i).

Другие хитрости:

  • Требуется меньше символов, чтобы построить функцию абсолютного значения плюс один, abs (ij) +1, а затем проверить места, где разница равна 1, вместо того, чтобы построить функцию абсолютного значения (без сдвига).
  • Использует автоматическое операторское вещание, чтобы неявно делать копии столбца v
  • Получает длину входных данных с помощью nnz () вместо length (), которая работает, поскольку входные данные называются положительными в постановке задачи.

Формат ввода по умолчанию гибкий. Вы можете взять vв качестве вектора столбца, просто укажите это в ответе. Кроме того, вы заменяете findна, ~~чтобы сохранить еще два байта
Луис Мендо

@ LuisMendo Спасибо, я отредактировал пост, чтобы включить ваши предложения!
Ник Алджер

Для разных языков (или существенно разных подходов на одном языке) вы должны опубликовать другой ответ . Если у вас есть какие-либо вопросы относительно языка , есть чат MATL
Луис Мендо,

Кстати, из-за ошибки в MATL toeplitz( YT), он использует два входа (не один) по умолчанию
Luis Mendo

Ладно, круто. Я перевел его в MATL и разместил еще один ответ здесь: codegolf.stackexchange.com/a/94183/42247
Ник Алджер,

1

Mathematica, 69 байт

Max@MapIndexed[{If[#2[[1]]>#,a[[#2-#]],{}],a[[#2+#]]~Check~{}}&,a=#]&

Анонимная функция. Принимает список целых чисел в качестве входных данных и возвращает целое число в качестве выходных данных. Игнорировать любые сгенерированные сообщения.


1

Скала, 94 байта

a=>a.zipWithIndex.filter(p=>a.zipWithIndex.exists(x=>x._1==Math.abs(p._2-x._2))).unzip._1.max


1

Java 7, 125 123 байта

int c(int[]a){int r=0,i=0,l=a.length,x;for(;i<l;r=l>(x=i+a[i])?a[x]>r?a[x]:r:r,r=(x=i-a[i++])>0?a[x]>r?a[x]:r:r);return r;}

2 байта сохранены благодаря @mrco .

Ungolfed (вроде) и тестовый код:

Попробуй это здесь.

class M{
  static int c(int[] a){
    int r = 0,
        i = 0,
        l = a.length,
        x;
    for(; i < l; r = l > (x = i + a[i])
                      ? a[x] > r
                         ? a[x]
                         : r
                      : r,
                 r = (x = i - a[i++]) > 0
                      ? a[x] > r
                         ? a[x]
                         : r
                      : r);
    return r;
  }

  public static void main(String[] a){
    System.out.println(c(new int[]{ 1, 13 }));
    System.out.println(c(new int[]{ 2, 9, 8, 3, 72, 2 }));
    System.out.println(c(new int[]{ 5, 28, 14, 5, 6, 3, 4, 7 }));
    System.out.println(c(new int[]{ 1, 3, 5, 15, 4, 1, 2, 6, 7, 7 }));
    System.out.println(c(new int[]{ 5, 1, 3, 5, 2, 5, 5, 8, 5, 1, 5, 1, 2, 3 }));
    System.out.println(c(new int[]{ 5, 12, 2, 5, 4, 7, 3, 3, 6, 2, 10, 5, 5, 5, 4, 1, 8, 5 }));
  }
}

Выход:

13
8
14
7
5
10

1
Вам не нужно х & у. Просто используйте один из них (-2). Также я не думаю, что вы можете установить r в огромной троице, потому что вам всегда нужно проверять оба случая, левый и правый.
Мистер

1
@mrco Спасибо, удалил ,y. И я действительно пришел к такому же выводу относительно единственного троичного, если. Конечно, это возможно, но вы будете делать проверку дважды, делая это намного дольше.
Кевин Круйссен

1

Ява, 118 байт

int f(int[]a){int t=0,i,j,z=0,l=a.length;while(t<l*l){i=t/l;j=t++%l;z=a[i]>z&&((i<j?j-i:i-j)==a[j])?a[i]:z;}return z;}

Добро пожаловать в PPCG! :)
Мартин Эндер

1

Python, 58 байт

На основе рубинового ответ Тони С., . Этот ответ работает в Python 2 и 3. Приветствуются предложения по игре в гольф.

lambda n:max([n[i+v]for i,v in enumerate(n)if i+v<len(n)])

Ungolfing

def f(array):
    result = []
    for index, value in enumerate(array):
        if index + value < len(array):
            result.append(array[index + value])
    return max(result)

1

Рубин 56 байтов

Мое самое маленькое рубиновое решение.

->n{x=[];i=0;n.map{|v|x<<n[v+i]&&v+i<n.size;i+=1};x.max}

Довольно легко проверить в консоли рельсы

a = ->n{x=[];i=0;n.map{|v|x<<n[v+i]&&v+i<n.size;i+=1};x.max}
a[[1, 13]
=> 13
a[[2, 9, 8, 3, 72, 2]]
=> 8
a[[5, 12, 2, 5, 4, 7, 3, 3, 6, 2, 10, 5, 5, 5, 4, 1, 8, 5]]
=> 10

Это началось в 63 байта, спасибо за предложения, чтобы помочь урезать это!


Вы можете использовать .mapвместо.each
Cyoce

также (x) if (y)можно заменить на(y)&&(x)
Cyoce

Вы можете использовать a<<bвместоa+=[b]
Sherlock9

@ Sherlock9 Я забыл о <<. Использование + = [b] не работало с предложением Cyoce, использующим &&. Теперь, спасибо!
Тони С.

1

На самом деле 17 байт

Этот ответ на самом деле является портом моего Python-ответа . Предложения по игре в гольф приветствуются. Попробуйте онлайн!

;╗ñ♂Σ⌠╜l>⌡░⌠╜E⌡MM

Ungolfing

         Implicit input L.
;╗       Duplicate L and save a copy of L to register 0.
ñ        enumerate() the other copy of L.
♂Σ       sum() all the pairs of [index, value of n]. Call this list Z.
⌠...⌡░   Push values of Z where the following function returns a truthy value. Variable v_i.
  ╜        Push L from register 0.
  l        Push len(L).
  >        Check if len(L) > v_i.
⌠...⌡M   Map the following function over Z_filtered. Variable i.
  ╜        Push L from register 0.
  E        Take the ith index of L.
M        max() the result of the map.
         Implicit return.

0

T-SQL (sqlserver 2016), 132 байта

Golfed:

;WITH C as(SELECT value*1v,row_number()over(order by 1/0)n FROM STRING_SPLIT(@,','))SELECT max(c.v)FROM C,C D WHERE abs(D.n-C.n)=D.v

Ungolfed:

DECLARE @ varchar(max)='2, 9, 8, 3, 72, 2'

;WITH C as
(
  SELECT
    value*1v,
    row_number()over(order by 1/0)n
  FROM
    STRING_SPLIT(@,',')
)
SELECT
  max(c.v)
FROM
  C,C D
WHERE
  abs(D.n-C.n)=D.v

скрипка


0

JavaScript (ES6), 56 54 байта

let f =
    
l=>l.map((n,i)=>m=Math.max(m,l[i+n]|0,l[i-n]|0),m=0)|m

console.log(f([1, 13])); // → 13
console.log(f([2, 9, 8, 3, 72, 2])); // → 8
console.log(f([5, 28, 14, 5, 6, 3, 4, 7])); // → 14
console.log(f([1, 3, 5, 15, 4, 1, 2, 6, 7, 7])); // → 7
console.log(f([5, 1, 3, 5, 2, 5, 5, 8, 5, 1, 5, 1, 2, 3])); // → 5
console.log(f([5, 12, 2, 5, 4, 7, 3, 3, 6, 2, 10, 5, 5, 5, 4, 1, 8, 5])); // → 10


0

Clojure, 68 байт

#(apply max(map(fn[i](get % i 0))(flatten(map-indexed(juxt - +)%))))

Например (map-indexed (juxt - +) [3 4 1 2]), ([-3 3] [-3 5] [1 3] [1 5])(индексировать +/-его значение), они используются для поиска значений из исходного вектора (вне диапазона по умолчанию 0), и найдено максимальное значение. Все еще чувствует себя немного многословно, но по крайней мере я должен использовать juxt:)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.