Знайдіть найбільшу кількість 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.