Encuentra el número más grande n posiciones lejos de n

29

Una secuela de esta pregunta .

Tarea

Dada una matriz de enteros positivos, encuentre el elemento k más grande para el cual:

Existe cierta distancia entera positiva n , de modo que el elemento en la matriz ubicado n  lugares a la izquierda o derecha de k es igual a n .

Se garantiza que la matriz contiene al menos un elemento que cumple esta condición.

El código más corto (en bytes) gana. Puede elegir el formato de E / S que desee.

Ejemplo

Dada la entrada

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

Los valores elegibles son:

  • El 4, ya que hay 77 posiciones ubicadas a su derecha
  • El primero 6, ya que hay 33 posiciones ubicadas a su derecha
  • El 3, ya que hay 44 posiciones ubicadas a su izquierda
  • El 5, ya que hay 22 posiciones ubicadas a su derecha
  • El segundo 7, ya que hay 33 posiciones ubicadas a su izquierda.

De estos valores, el mayor es 7.

Casos de prueba

[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
Lynn
fuente
Dos casos más (aunque ligeramente redundantes) dentro del ejemplo: los primeros 6 (nuevamente) ya que hay 5 cinco posiciones a la derecha; o el segundo 7 (de nuevo) ya que hay un 6 seis posiciones a la izquierda.
Jonathan Allan
1. En mi teléfono, el título parece ser "Encuentra el mayor número de posiciones lejos de un". 2. La condición indicada es que existe algo de k tal que (una propiedad que no depende de k). Seguramente debe estar equivocado.
Peter Taylor
@PeterTaylor "this" en "este elemento" se refiere a k.
Taemyr
1
@Taemyr, eso no tiene sentido por dos razones: en primer lugar, porque no se dice que k sea ​​un elemento; y en segundo lugar porque se nos pide " encontrar el elemento más grande que satisfaga " la condición, por lo que " este elemento " tiene un antecedente fuera de la condición.
Peter Taylor
2
¿Quizás podría evitar toda confusión diciendo "encuentre el elemento más grande k tal que" y luego use k en lugar de este elemento en la definición?
Martin Ender

Respuestas:

3

Jalea , 9 bytes

Jạþ`=ḅa¹Ṁ

Pruébalo en línea! o verificar todos los casos de prueba .

Cómo funciona

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.
Dennis
fuente
1
Hmm, no estoy seguro de cuál es la política sobre esto, pero ahora tiene dos enfoques diferentes en respuestas separadas, en el mismo lenguaje de programa por el mismo usuario. ¿No sería más aconsejable poner fragmentos de 9 y 10 bytes en la misma respuesta, ya que es el mismo lenguaje de programación y ambos? Puedo entender múltiples respuestas en el mismo lenguaje de programación por parte de múltiples usuarios, pero personalmente creo que diferentes enfoques del mismo usuario en el mismo lenguaje de programación serían más adecuados como ediciones. Solo es mi opinión.
Kevin Cruijssen
55
Esa fue mi primera meta pregunta , y el consenso parecía ser que los diferentes enfoques deberían publicarse en diferentes respuestas. En este caso, mis enfoques no tienen nada más que el máximo al final en común, así que fui por una publicación separada.
Dennis
8

05AB1E , 21 bytes

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

Explicación

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

Pruébalo en línea!

Emigna
fuente
Probablemente lo use todo el tiempo, pero acabo de notar "apilar la pila en una lista". Ordenado.
GreenAsJade
@GreenAsJade: Sí, es uno de los comandos que más uso :)
Emigna
7

Haskell, 61 57 55 bytes

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

Ejemplo de uso: (f.zip[0..]) [5,28,14,5,6,3,4,7]-> 14.

(Más o menos) una implementación directa de la definición: para cada índice nde la lista de entrada, xmantenga a := x!!nsi hay un índice idonde sea b := x!!iigual abs(n-i). Encuentra el máximo.

Editar: @xnor guardó dos bytes. ¡Gracias!

nimi
fuente
Como no está utilizando x, debería ser más corto definir una función zy componerla zip[0..].
xnor
6

Jalea , 10 bytes

,N+JFfJị¹Ṁ

Pruébalo en línea! o verificar todos los casos de prueba .

Cómo funciona

,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.
Dennis
fuente
5

Python 3, 85 80 72 bytes

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

Editar: -8 Bytes gracias a @Dennis

Elvorfirilmathredia
fuente
5

EXCEL: 32 30 bytes

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

Todavía no puedo creer que sea tan corto ...

Cómo usar:
pegue esto en CUALQUIER celda, EXCEPTO las celdas de la columna A. Después de pegar, mientras sigue editando, presione control+ shift+ enterpara ingresarlo correctamente.
ponga sus valores en la columna A, 1 valor por celda (según la entrada CSV).

Si desea saber cómo funciona esto, he publicado un consejo adicional en mi pregunta Consejos para jugar al golf en Excel .

Comunidad
fuente
Me encantan estos excelentes campos de golf, ¡quién lo hubiera pensado!
GreenAsJade
4

JavaScript (ES6), 61 bytes

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

Perl, 45 bytes

Incluye +2 para -ap

Dé números en una línea en 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

Se puede obtener un byte más reemplazándolo ^Ppor el carácter de control literal, pero eso lleva a una advertencia en STDERR en perls recientes.

Asume largest number + array length < 2^32

Ton Hospel
fuente
3

Pyth, 19 17 bytes

Gracias a @ Pietu1998 por -2 bytes

eS@[email protected],-kb+b

Un programa que toma la entrada de una lista en STDIN e imprime el resultado.

Pruébalo en línea

Cómo funciona

eS@[email protected],-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
TheBikingViking
fuente
}#es el mismo que @. Además, si reorganiza el último bit ,-kb+bk, puede eliminar el último kya que Pyth lo inserta automáticamente.
PurkkaKoodari
@ Pietu1998 Gracias. No sabía sobre el relleno implícito para enumerar; ¿funciona eso para otras funciones de tipo mapa?
TheBikingViking
Funciona para cualquier lambda, rellena automáticamente el resto de cualquier lambda con la primera variable lambda.
PurkkaKoodari
3

MATL, 13 Bytes

ttn:tYTq=a)X>

La entrada debe ser un vector de columna. Es decir, la entrada está separada por punto y coma como [1; 2; 3], o separada por comas con una marca de transposición al final como [1,2,3] '.

Pruébalo en línea!

Todos los casos de prueba: (A) , (B) , (C) , (D) , (E) , (F)

Gracias a Suever por las sugerencias en la sala de chat de MATL para guardar 2 personajes.

Explicación:

La estrategia general es la misma que mi respuesta Octave / MATLAB, donde se explica el concepto básico: https://codegolf.stackexchange.com/a/94161/42247

El código específico en esta respuesta MATL se construye de la siguiente manera:

El núcleo del método es la construcción de la matriz de Toeplitz cuya entrada ij es abs (ij). Primero construimos la matriz Toeplitz con entradas abs (i-1) +1 con el comando toeplitz de MATL YT de la siguiente manera:

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

Para ver cómo funciona esto, llamemos al vector de entrada a este fragmento de código 'v'. La 'n' encuentra la longitud de v, luego ':' construye el vector 1: longitud (v). Luego, la 't' hace otra copia de 1: longitud (v) en la pila; esta copia adicional es necesaria debido a un error conocido en la función YT en MATL (el equivalente MATL de toeplitz ()), en el que espera dos copias de la entrada en lugar de 1. Luego, YT toma las dos copias de este vector 1 : longitud (v) fuera de la pila, y hace que la matriz Toeplitz abs (ij) +1 a partir de ellos.

Ahora necesitamos restar 1 de esta matriz para obtener la matriz de Toeplitz con las entradas abs (ij), y encontrar las ubicaciones de ij donde esta matriz de Toeplitz de abs (ij) es igual a la matriz de todos los vectores de columna que contienen copias de columna de la entrada vector v. Esto se hace de la siguiente manera:

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

La primera 't' hace una copia extra de la entrada y la almacena en la pila. El 'n: tYT' crea la matriz toeplitz como se describió anteriormente y la envía a la pila. Entonces 'q' resta 1 de la matriz de Toeplitz, y '=' hace la comparación de igualdad de elementos entre la matriz abs (ij) y el vector cuyas columnas son copias de la entrada. Tenga en cuenta que al comparar un vector de columna con una matriz, estamos aprovechando implícitamente las reglas de transmisión del operador de MATLAB / MATL (el vector de columna en la comparación se copia para hacer una matriz sin emitir ningún comando).

Finalmente, necesitamos encontrar los índices de fila i donde hay una columna j tal que la entrada ij en la diferencia de matriz construida arriba sea igual a 1, luego obtenga el valor del vector de entrada correspondiente a estos índices, luego tome el máximo. Esto en los siguientes tres pasos:

1) Encuentre los índices para cualquier fila que contenga un valor distinto de cero:

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

2) Extraiga los elementos del vector de entrada correspondientes a esos índices:

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

3) Encuentra y devuelve el elemento máximo:

t tn:tYTq= a ) X>
% [code] X> is equivalent to @(v) max(v).
Nick Alger
fuente
El comportamiento de la función YTha cambiado en la versión 20.2.2 . Ahora usa 1 entrada por defecto (que es más útil en general). Si bien eso le ahorraría 1 byte aquí (eliminar tantes YT), no se puede explotar porque el cambio en el idioma es posterior al desafío. Pero tiene el efecto de que su respuesta ya no es válida en la nueva versión, que ahora está en vivo en TIO
Luis Mendo
Puede editar el código vinculado y dejar una nota, o usar este enlace al intérprete de MATL Online, que admite versiones anteriores. Lamentablemente, también necesita actualizar los otros enlaces. Disculpe las molestias
Luis Mendo
Independientemente de eso, puede guardar 1 byte reemplazando n:porf
Luis Mendo
2

Ruby, 66 bytes

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

Octava / MATLAB, 40 Bytes

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

La entrada debe ser un vector de columna.

Gracias a Luis Mendo por las sugerencias para guardar 3 bytes (ver comentario)

Gracias a Suever por las sugerencias para guardar 4 bytes más (reemplazando ~~ (sum ()) con any ())

Explicación:

Dado un vector de entrada v, este problema es equivalente a encontrar todas las soluciones i, j de la siguiente ecuación discreta,

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

donde abs () es la función de valor absoluto. Cada v (i) para el que se resuelve esta ecuación es una de las soluciones candidatas que podemos maximizar.

Como una función discreta de i y j, todas las posibilidades para el lado izquierdo se pueden organizar en la matriz toeplitz que se parece a esto:

[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]

Y dado que el lado derecho no depende de i, todas las posibilidades se pueden organizar en una matriz donde las columnas son todas copias de la entrada,

[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)]

Para encontrar todas las soluciones a la ecuación, restamos estas dos matrices y encontramos las ubicaciones donde hay un cero. Las filas donde hay un cero corresponden a los índices deseados i donde hay aj tal que abs (ij) = v (i).

Otros trucos:

  • Se necesitan menos caracteres para construir la función de valor absoluto más uno, abs (ij) +1, luego verifique las ubicaciones donde la diferencia es 1, en lugar de construir la función de valor absoluto verdadero (sin desplazamiento).
  • Utiliza la transmisión automática del operador para hacer implícitamente copias en columna de v
  • Obtiene la longitud de la entrada a través de nnz () en lugar de length (), que funciona ya que se dice que las entradas son positivas en la declaración del problema.
Nick Alger
fuente
El formato de entrada es flexible por defecto. Puede tomarlo vcomo un vector de columna, solo dígalo en la respuesta. Además, reemplaza findpor ~~para guardar dos bytes más
Luis Mendo
@LuisMendo ¡Gracias, edité la publicación para incorporar sus sugerencias!
Nick Alger
Para diferentes idiomas (o un enfoque significativamente diferente en el mismo idioma) debe publicar otra respuesta . Hay una sala de chat MATL si tiene alguna pregunta sobre el idioma
Luis Mendo
Por cierto, debido a un error en MATL toeplitz( YT), utiliza dos entradas (no una) de forma predeterminada
Luis Mendo el
Está bien. Lo traduje a MATL
Nick Alger el
1

Mathematica, 69 bytes

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

Función anónima. Toma una lista de enteros como entrada y devuelve un entero como salida. Ignora cualquier mensaje generado.

LegionMammal978
fuente
1

Scala, 94 bytes

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

PHP, 128 bytes

<?foreach(($i=$_GET[i])as$k=>$v){$k-$v<0?:!($i[$k-$v]>$m)?:$m=$i[$k-$v];if($k+$v<count($i))if($i[$k+$v]>$m)$m=$i[$k+$v];}echo$m;
Jörg Hülsermann
fuente
1

Java 7, 125 123 bytes

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 bytes guardados gracias a @mrco .

Ungolfed (tipo de) y código de prueba:

Pruébalo aquí.

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 }));
  }
}

Salida:

13
8
14
7
5
10
Kevin Cruijssen
fuente
1
No necesitas x & y. Simplemente reutilice uno de ellos (-2). Además, no creo que pueda configurar r en un enorme ternario, porque siempre tiene que probar ambos casos, izquierdo y derecho.
mrco
1
@mrco Gracias, eliminé el ,y. Y de hecho llegué a la misma conclusión con respecto al ternario único if. Por supuesto que es posible, pero hará la verificación dos veces, lo que lo hará mucho más largo.
Kevin Cruijssen
1

Java, 118 bytes

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;}
Ekeko
fuente
Bienvenido a PPCG! :)
Martin Ender
1

Python, 58 bytes

Sobre la base de la respuesta de Tony S. Rubí . Esta respuesta funciona en Python 2 y 3. Las sugerencias de golf son bienvenidas.

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

No golfista

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

Ruby 56 bytes

Mi solución de rubí más pequeña.

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

Bastante fácil de probar en la consola de rieles

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

Esto comenzó en 63 bytes, ¡gracias por las sugerencias para ayudar a recortarlo!

Tony S.
fuente
puede usar en .maplugar de.each
Cyoce
también (x) if (y)se puede reemplazar con(y)&&(x)
Cyoce
Puede usar en a<<blugar dea+=[b]
Sherlock9
@ Sherlock9 Me olvidé de <<. Usar a + = [b] no funcionó con la sugerencia de Cyoce usando &&. Ahora sí, gracias!
Tony S.
1

En realidad , 17 bytes

Esta respuesta es en realidad un puerto de mi respuesta de Python . Sugerencias de golf bienvenidas. Pruébalo en línea!

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

No golfista

         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.
Sherlock9
fuente
0

T-SQL (sqlserver 2016), 132 bytes

Golfizado:

;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

Sin golf:

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

Violín

t-clausen.dk
fuente
0

JavaScript (ES6), 56 54 bytes

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

Arnauld
fuente
0

Clojure, 68 bytes

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

Por ejemplo, (map-indexed (juxt - +) [3 4 1 2])es ([-3 3] [-3 5] [1 3] [1 5])(indexe +/-su valor), estos se utilizan para buscar valores del vector original (por defecto fuera del rango 0) y se encuentra el valor máximo. Todavía se siente un poco detallado, pero al menos tengo que usar juxt:)

NikoNyrh
fuente