Знайдіть найбільшу кількість 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 "це" в "цей елемент" відноситься до 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

Пітон 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))

Я все ще не можу повірити, що я зрозумів, що це такий короткий ...

Як користуватися:
вставте це в БУДЬ-яку клітинку, Окрім клітинок стовпця А. Після вставки, продовжуючи редагувати, натисніть 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

Піт, 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 за пропозиції в чаті MATL зберегти 2 символи.

Пояснення:

Загальна стратегія така ж, як і моя відповідь Octave / MATLAB, де пояснюється основна концепція: https://codegolf.stackexchange.com/a/94161/42247

Конкретний код у цій відповіді MATL складається так:

Ядром методу є побудова матриці Toeplitz, ij'th запис абс (ij). Спочатку ми побудуємо матрицю Toeplitz із записами abs (i-1) +1 за допомогою команди MATL toeplitz YT наступним чином:

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

Щоб побачити, як це працює, давайте назвемо вхідний вектор цього фрагмента коду 'v'. 'N' знаходить довжину v, тоді ':' будує вектор 1: length (v). Далі 't' робить ще одну копію 1: length (v) на стеку; ця додаткова копія потрібна через добре відому помилку у функції YT у MATL (еквівалент MATL тоепліца ()), де вона очікує двох копій вводу замість 1. Потім YT бере дві копії цього вектора 1 : length (v) від стека, і робить з них матрицю abs (ij) +1 Toeplitz.

Тепер нам потрібно відняти 1 з цієї матриці, щоб отримати матрицю Toeplitz із записами abs (ij), і знайти місця ij, де ця abs (ij) матриця Toeplitz дорівнює матриці всіх векторів стовпців, що містять стовпці-копії вводу вектор v. Це робиться так:

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

Перший 't' робить додаткову копію введення та зберігає його у стеку. 'N: tYT' робить матрицю тоеплит, як описано раніше, і виводить її в стек. Потім 'q' віднімає 1 від матриці Toeplitz, а '=' порівнює елементарно рівність матриці між 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), його не можна використовувати, оскільки зміна мови ставить перед собою завдання. Але це означає, що ваша відповідь більше не відповідає дійсності в новому випуску, який зараз живе в TIO
— Луїс Мендо

Ви можете редагувати зв'язаний код і залишити нотатку або скористатися цим посиланням до інтерпретатора MATL Online, який підтримує старіші випуски. На жаль, вам також потрібно оновити інші посилання. Вибачте за незручності
— Луїс Мендо

Незалежно від того, що ви можете зберегти 1 байт замінити n:наf
— Луїс Mendo

2

Рубін, 66 байт

->a{i=-1;a.map{|e|i+=1;[a[j=i+e]||0,a[0>(k=i-e)?j:k]||0].max}.max}

2

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

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

Вхід повинен бути векторним стовпцем.

Дякуємо Луїсу Мендо за пропозиції зберегти 3 байти (див. Коментар)

Завдяки Suever за пропозиції заощаджує ще 4 байти (замінюючи ~~ (sum ()) на будь-який ())

Пояснення:

З огляду на вхідний вектор 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
— Луїс Мендо

BTW через помилку в MATL toeplitz( YT) використовує два входи (не один) за замовчуванням
— Луїс Мендо

ОК здорово. Я переклав це на MATL і опублікував тут ще одну відповідь: codegolf.stackexchange.com/a/94183/42247
— Нік

1

Математика, 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
Вам не потрібно x & y. Просто повторно використовуйте один із них (-2). Крім того, я не думаю, що ви можете встановити r у величезному потрійному, якщо ви завжди повинні перевірити обидва випадки, зліва і справа.
— mrco

1
@mrco Спасибі, видалено ,y. І я дійсно дійшов такого ж висновку щодо єдиного потрійного, якщо. Звичайно, це можливо, але ви зробите перевірку двічі, зробивши це набагато довше.
— Kevin Cruijssen


1

Пітон, 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] не спрацювало з пропозицією Кіоса, використовуючи &&. Тепер так, дякую!
— Тоні С.

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 байти

Гольф:

;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

Безголовки:

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.