Encontre o maior número de n posições longe de n


29

Uma sequela para esta pergunta .

Tarefa

Dada uma matriz de números inteiros positivos, encontre o maior elemento k para o qual:

Existe alguma distância inteira positiva n , de modo que o elemento na matriz localizado n é  posicionado à esquerda ou à direita de k igual a n .

A matriz é garantida para conter pelo menos um elemento que atenda a essa condição.

O código mais curto (em bytes) vence. Você pode escolher o formato de E / S que desejar.

Exemplo

Dada a entrada

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

Os valores elegíveis são:

  • O 4, como há 77 posições localizadas à sua direita
  • A primeira 6, como existem 33 posições localizadas à sua direita
  • O 3, como há 44 posições localizadas à sua esquerda
  • O 5, como existem 22 posições localizadas à sua direita
  • A segunda 7, como há 33 posições localizadas à sua esquerda.

Desses valores, o maior é 7.

Casos de teste

[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

Mais dois casos (embora um pouco redundantes) no exemplo: os 6 primeiros (novamente), pois há 5 cinco posições à sua direita; ou o segundo 7 (novamente), pois há 6 seis posições à esquerda.
Jonathan Allan

1. No meu telefone, o título parece ser "Encontre o maior número de posições longe de um". 2. A condição declarada é a existência de alguns k tais que (uma propriedade que não depende de k). Certamente deve estar errado.
Peter Taylor

@PeterTaylor "this" em "this element" refere-se a k.
Taemyr 22/09/16

11
@ Taemyr, isso não faz sentido por duas razões: primeiro, porque k não é considerado um elemento; e segundo, porque somos solicitados a " encontrar o maior elemento que satisfaça " a condição, para que " esse elemento " tenha um antecedente fora da condição.
Peter Taylor

2
Talvez você possa evitar toda confusão dizendo "encontre o maior elemento k tal que" e use k em vez desse elemento na definição?
Martin Ender

Respostas:


3

Geléia , 9 bytes

Jạþ`=ḅa¹Ṁ

Experimente online! ou verifique todos os casos de teste .

Como 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.

11
Hmm, não sei qual é a política sobre isso, mas agora você tem duas abordagens diferentes em respostas separadas, na mesma linguagem de programa pelo mesmo usuário. Não seria mais aconselhável colocar trechos de 9 e 10 bytes na mesma resposta, já que é a mesma linguagem de programação e os dois por você? Eu posso entender várias respostas na mesma linguagem de programação por vários usuários, mas pessoalmente acho que abordagens diferentes do mesmo usuário na mesma linguagem de programação seriam mais adequadas para edições. Apenas minha opinião.
Kevin Cruijssen 22/09/16

5
Essa foi minha primeira meta questão , e o consenso parecia ser que diferentes abordagens deveriam ser postadas em respostas diferentes. Nesse caso, minhas abordagens não têm nada além do máximo no final em comum, então fui para um post separado.
Dennis

8

05AB1E , 21 bytes

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

Explicação

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

Experimente online!


Você provavelmente o usa o tempo todo, mas eu só notei "empilhar pilha em uma lista". Arrumado.
GreenAsJade 23/09

@GreenAsJade: Sim, é um dos comandos que eu uso o mais :)
Emigna

7

Haskell, 61 57 55 bytes

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

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

(Mais ou menos) a execução directa da definição: para cada índice nda lista de entrada xkeep a := x!!nse há um índice ionde b := x!!iiguais abs(n-i). Encontre o máximo.

Edit: @xnor salvou dois bytes. Obrigado!


Como você não está usando x, deve ser mais curto definir uma função ze compor zip[0..].
Xnor

6

Gelatina , 10 bytes

,N+JFfJị¹Ṁ

Experimente online! ou verifique todos os casos de teste .

Como 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.

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

Edit: -8 Bytes graças a @Dennis


5

EXCEL: 32 30 bytes

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

Ainda não consigo acreditar que consegui ser tão curto ...

Como usar:
cole-o em QUALQUER célula, EXCETO as células da coluna A. Após colar, enquanto ainda edita, pressione control+ shift+ enterpara inseri-lo corretamente.
coloque seus valores na coluna A, 1 valor por célula (conforme entrada de CSV).

Se você quiser descobrir como isso funciona, postamos uma dica adicional nas minhas perguntas sobre Dicas para jogar golfe no Excel .


Estou amando esses excelentes golfs - quem pensou !!
GreenAsJade 23/09

4

JavaScript (ES6), 61 bytes

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

4

Perl, 45 bytes

Inclui +2 para -ap

Dê números em uma linha no 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

Mais um byte pode ser obtido com a substituição ^Pdo caractere de controle literal, mas isso leva a um aviso no STDERR sobre os perls recentes.

Assume largest number + array length < 2^32


3

Pitão, 19 17 bytes

Obrigado a @ Pietu1998 por -2 bytes

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

Um programa que recebe a entrada de uma lista no STDIN e imprime o resultado.

Experimente online

Como funciona

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

}#é o mesmo que @. Além disso, se você reorganizar o último bit, ,-kb+bkpoderá removê k-lo, pois o Pyth o insere automaticamente.
PurkkaKoodari 22/09

@ Pietu1998 Obrigado. Eu não sabia sobre o preenchimento implícito para enumerar; isso funciona para outras funções do tipo mapa?
TheBikingViking

Funciona para qualquer lambda, ele preenche automaticamente o restante de qualquer lambda com a primeira variável lambda.
PurkkaKoodari 22/09

3

MATL, 13 bytes

ttn:tYTq=a)X>

A entrada deve ser um vetor de coluna. Ou seja, a entrada é separada por ponto-e-vírgula como [1; 2; 3] ou vírgula separada com uma marca de transposição no final como [1,2,3] '.

Experimente online!

Todos os casos de teste: (A) , (B) , (C) , (D) , (E) , (F)

Agradecemos a Suever pelas sugestões na sala de bate - papo do MATL para salvar 2 caracteres.

Explicação:

A estratégia geral é a mesma da minha resposta Octave / MATLAB, onde o conceito básico é explicado: https://codegolf.stackexchange.com/a/94161/42247

O código específico nesta resposta MATL é criado da seguinte maneira:

O núcleo do método é a construção da matriz de Toeplitz, cuja i-ésima entrada é abs (ij). Primeiro construímos a matriz Toeplitz com as entradas abs (i-1) +1 com o comando toeplitz YL do MATL, da seguinte maneira:

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

Para ver como isso funciona, vamos chamar o vetor de entrada para esse trecho de código 'v'. O 'n' encontra o comprimento de v, então ':' constrói o vetor 1: length (v). Em seguida, o 't' faz outra cópia de 1: length (v) na pilha; essa cópia extra é necessária devido a um bug bem conhecido na função YT em MATL (o equivalente MATL de toeplitz ()), em que espera duas cópias da entrada em vez de 1. Então YT pega as duas cópias desse vetor 1 : length (v) da pilha e faz com que a matriz abs (ij) +1 Toeplitz a partir delas.

Agora, precisamos subtrair 1 dessa matriz para obter a matriz Toeplitz com as entradas abs (ij) e encontrar os locais ij em que essa matriz abs (ij) Toeplitz é igual à matriz de todos os vetores de coluna que contêm cópias de coluna da entrada vetor v. Isso é feito da seguinte maneira:

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

O primeiro 't' faz uma cópia extra da entrada e a armazena na pilha. O 'n: tYT' cria a matriz toeplitz como descrito anteriormente e a envia para a pilha. Então 'q' subtrai 1 da matriz Toeplitz e '=' faz a comparação de igualdade elementar entre a matriz abs (ij) e o vetor cujas colunas são cópias da entrada. Observe que, ao comparar um vetor de coluna a uma matriz, estamos tirando proveito implícito das regras de transmissão do operador do MATLAB / MATL (o vetor da coluna na comparação é copiado para criar uma matriz sem emitir nenhum comando).

Finalmente, precisamos encontrar os índices de linha i onde existe uma coluna j, de modo que a i-ésima entrada na diferença de matriz construída acima seja igual a 1, depois obtenha o valor do vetor de entrada correspondente a esses índices e, em seguida, tome o máximo. Isso nas três etapas a seguir:

1) Encontre os índices para qualquer linha que contenha um valor diferente de zero:

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

2) Extraia os elementos do vetor de entrada correspondentes a esses índices:

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

3) Encontre e retorne o elemento máximo:

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

O comportamento da função YTmudou na liberação 20.2.2 . Agora, ele usa 1 entrada por padrão (o que é mais útil em geral). Embora isso economize 1 byte aqui (remova tantes YT), ele não pode ser explorado porque a alteração no idioma pós o desafio. Mas tem o efeito de que a sua resposta não será mais válida na nova versão, que agora é ao vivo no TIO é
Luis Mendo

Você pode editar o código vinculado e deixar uma anotação ou usar esse link para o intérprete do MATL Online, que suporta versões mais antigas. Infelizmente, você também precisa atualizar os outros links. Desculpe pelo transtorno
Luis Mendo

Independentemente disso, você pode salvar 1 byte substituindo 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}

2

Octave / MATLAB, 40 bytes

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

A entrada deve ser um vetor de coluna.

Obrigado a Luis Mendo pelas sugestões de salvar 3 bytes (ver comentário)

Agradecemos a Suever pelas sugestões de salvar mais 4 bytes (substituindo ~~ (sum ()) por any ())

Explicação:

Dado um vetor de entrada v, esse problema é equivalente a encontrar todas as soluções i, j da seguinte equação discreta,

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

onde abs () é a função de valor absoluto. Cada v (i) para o qual esta equação é resolvida é uma das soluções candidatas que podemos maximizar.

Como uma função discreta de iej, todas as possibilidades para o lado esquerdo podem ser organizadas na matriz toeplitz que se parece com isso:

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

E como o lado direito não depende de i, todas as possibilidades podem ser organizadas em uma matriz onde as colunas são todas cópias da 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 as soluções para a equação, subtraímos essas duas matrizes e localizamos onde há um zero. As linhas onde existe um zero correspondem aos índices desejados i e onde há aj tal que abs (ij) = v (i).

Outros truques:

  • São necessários menos caracteres para construir a função de valor absoluto mais um, abs (ij) +1 e, em seguida, verifique os locais onde a diferença é 1, em vez de construir a função de valor absoluto verdadeiro (sem deslocamento).
  • Utiliza a transmissão automática do operador para fazer cópias de coluna implicitamente de v
  • Obtém o comprimento da entrada via nnz () em vez de length (), que funciona porque as entradas são consideradas positivas na declaração do problema.

O formato de entrada é flexível por padrão. Você pode usar vcomo vetor de coluna, apenas afirme isso na resposta. Além disso, você substitui findpor ~~para salvar mais dois bytes
Luis Mendo

@LuisMendo Obrigado, editei o post para incorporar suas sugestões!
Nick Alger

Para idiomas diferentes (ou uma abordagem significativamente diferente no mesmo idioma), você deve postar outra resposta . Há uma sala de chat MATL você deve ter dúvidas em relação à linguagem
Luis Mendo

BTW, devido a um bug no MATL de toeplitz( YT), ele usa duas entradas (não um) por padrão
Luis Mendo

OK legal. Eu traduzi-lo para MATL e postou outra resposta aqui: codegolf.stackexchange.com/a/94183/42247
Nick Alger

1

Mathematica, 69 bytes

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

Função anônima. Pega uma lista de números inteiros como entrada e retorna um número inteiro como saída. Ignore todas as mensagens geradas.


1

Scala, 94 bytes

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

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;

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 salvos graças a @mrco .

Ungolfed (tipo de) e código de teste:

Experimente aqui.

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

Saída:

13
8
14
7
5
10

11
Você não precisa de x e y. Apenas reutilize um deles (-2). Também não acho que você possa definir r em um ternário enorme - se porque você sempre tem que testar os dois casos, esquerdo e direito.
Mrco 23/09/16

11
@ Mrco Obrigado, removido o ,y. E, de fato, cheguei à mesma conclusão em relação ao ternário único se. Claro que é possível, mas você fará a verificação duas vezes, tornando-a muito mais longa.
Kevin Cruijssen 23/09/16

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

Bem-vindo ao PPCG! :)
Martin Ender

1

Python, 58 bytes

Com base na resposta de Tony S. rubi . Esta resposta funciona em Python 2 e 3. Sugestões de golfe são bem-vindas.

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

Ruby 56 bytes

Minha menor solução de rubi.

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

Muito fácil de testar no console de trilhos

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

Isso começou em 63 bytes, obrigado pelas sugestões para ajudar a reduzi-lo!


você pode usar em .mapvez de.each
Cyoce 23/09/16

também (x) if (y)pode ser substituído por(y)&&(x)
Cyoce

Você pode usar a<<bem vez dea+=[b]
Sherlock9

@ Sherlock9 eu esqueci <<. Usar a + = [b] não funcionou com a sugestão de Cyoce usando &&. Agora sim, obrigado!
Tony S.

1

Na verdade , 17 bytes

Esta resposta é realmente uma porta da minha resposta Python . Sugestões de golfe são bem-vindas. Experimente online!

;╗ñ♂Σ⌠╜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 bytes

Golfe:

;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

Violino


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


0

Clojure, 68 bytes

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

Por exemplo, (map-indexed (juxt - +) [3 4 1 2])é ([-3 3] [-3 5] [1 3] [1 5])(indexe +/-seu valor), eles são usados ​​para pesquisar valores do vetor original (fora do intervalo padrão 0) e o valor máximo é encontrado. Ainda parece um pouco detalhado, mas pelo menos eu tenho que usar juxt:)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.