Encontre o número maior mais próximo

30

A tarefa

Dada qualquer matriz de números inteiros, por exemplo:

[-1,476,578,27,0,1,-1,1,2]

e um índice dessa matriz (este exemplo usa indexação com base em 0 , embora você também possa usar uma indexação com base em 1 ).

         index = 5
                 v
[-1,476,578,27,0,1,-1,1,2]

Em seguida, retorne o número mais próximo maior que o elemento nesse índice . No exemplo, o número mais próximo maior que 1 é 27 (a 2 índices de distância).

         index = 5
                 v
[-1,476,578,27,0,1,-1,1,2]
            ^
Nearest greater number

Output = 27

Suposições

  • O mais próximo não inclui a embalagem.
  • O programa nunca receberá uma matriz de comprimento 1 (por exemplo; [55]).
  • Você deve assumir que sempre existe um número maior que o elemento fornecido.
  • Se houver 2 números maiores que o elemento em distâncias iguais, você poderá retornar um deles .

Pares de E / S

Input:
Index = 45
Array = [69, 43, 89, 93, 62, 25, 4, 11, 115, 87, 174, 60, 84, 58, 28, 67, 71, 157, 47, 8, 33, 192, 187, 87, 175, 32, 135, 25, 137, 92, 183, 151, 147, 7, 133, 7, 41, 12, 96, 147, 9, 134, 197, 3, 107, 164, 90, 199, 21, 71, 77, 62, 190, 122, 33, 127, 185, 58, 92, 106, 26, 24, 56, 79, 71, 24, 24, 114, 17, 84, 121, 188, 6, 177, 114, 159, 159, 102, 50, 136, 47, 32, 1, 199, 74, 141, 125, 23, 118, 9, 12, 100, 94, 166, 12, 9, 179, 147, 149, 178, 90, 71, 141, 49, 74, 100, 199, 160, 120, 14, 195, 112, 176, 164, 68, 88, 108, 72, 124, 173, 155, 146, 193, 30, 2, 186, 102, 45, 147, 99, 178, 84, 83, 93, 153, 11, 171, 186, 157, 32, 90, 57, 181, 5, 157, 106, 20, 5, 194, 130, 100, 97, 3, 87, 116, 57, 125, 157, 190, 83, 148, 90, 44, 156, 167, 131, 100, 58, 139, 183, 53, 91, 151, 65, 121, 61, 40, 80, 40, 68, 73, 20, 135, 197, 124, 190, 108, 66, 21, 27, 147, 118, 192, 29, 193, 27, 155, 93, 33, 129]
Output = 199

Input:
Index = 2
Array = [4,-2,1,-3,5]
Output = 4 OR 5

Input:
Index = 0
Array = [2124, -173, -155, 146, 193, -30, 2, 186, 102, 4545]
Output = 4545

Input:
Index = 0
Array = [1,0,2,3]
Output = 2

Input:
Index = 2
Array = [3,-1,-3,-2,5]
Output = -1 OR -2
Graviton
fonte
Você poderia adicionar um caso de teste em que ele procurasse um resultado à esquerda em vez de à direita? ie1; [7,1,-4,2]
Kevin Cruijssen
Eu acho que 2; [3,-1,-3,-2,5]é um bom caso de teste. Existem números positivos, mas o resultado é negativo.
Stewie Griffin
Posso usar 2 indexados?
Titus
@Titus, quero dizer, se você realmente quer
Graviton

Respostas:

7

MATL , 10 bytes

yt&y)>fYk)

Isso usa indexação baseada em 1. Experimente online!

Explicação

Considere entradas [4,-2,1,-3,5], 3como um exemplo.

y     % Take two inputs implicitly. Duplicate 2nd-top element in the stack
      % STACK: [4,-2,1,-3,5], 3, [4,-2,1,-3,5]
t     % Duplicate top of the stack
      % STACK: [4,-2,1,-3,5], 3, [4,-2,1,-3,5], [4,-2,1,-3,5]
&y    % Duplicate 3rd-top element in the stack
      % STACK: [4,-2,1,-3,5], 3, [4,-2,1,-3,5], [4,-2,1,-3,5], 3
)     % Index: select elements from first input as indicated by second input
      % STACK: [4,-2,1,-3,5], 3, [4,-2,1,-3,5], 1
>     % Greater than, element-wise
      % STACK: [4,-2,1,-3,5], 3, [1,0,0,0,1]
f     % Find: gives indices of non-zero entries
      % STACK: [4,-2,1,-3,5], 3, [1,5]
Yk    % Closest element: gives closest element of each entry in second input
      % ([1,5]) to each entry in the first input (3). In case of a tie it 
      % gives the left-most one
      % STACK: [4,-2,1,-3,5], 1
)     % Index: select elements from first input as indicated by second input
      % STACK: 4
      % Implicitly display
Luis Mendo
fonte
2
Você tem uma explicação?
Nick Clifford
@NickClifford Sure! Eu estava esperando um esclarecimento sobre o OP. Explicação adicionada
Luis Mendo
6

Gelatina , 10 bytes

ị<ṛTạ⁸$ÞḢị

Experimente online!

Dennis
fonte
Eu estava brincando para as idades tentando se classificar para trabalhar com o valor absoluto :(
Jonathan Allan
5

Geléia , 11 12 bytes

+1 byte - Não é permitido agrupar.

Jạż⁸ṢZṪ»\Q2ị

1 indexado.

Experimente online!


11 byter anterior (indexação de agrupamento), indexado 0:

ṙżU$Fµ>ḢTḢị
Jonathan Allan
fonte
Isso falha, por exemplo 0 [1,0,2,3].
Ørjan Johansen
@ ØrjanJohansen Ah - ele retorna 3, que é uma distância tão, hum, sim "mais próximo" não é definida ...
Jonathan Allan
1
Pedi ao OP para adicionar esse caso de teste.
Ørjan Johansen
4

JavaScript (ES6), 57 55 bytes

Pega a matriz ae o índice ina sintaxe de currying (a)(i).

a=>g=(i,p)=>(x=a[i-p])>a[i]||(x=a[i+p])>a[i]?x:g(i,-~p)

Casos de teste

Arnauld
fonte
Você não pode usar em |vez de ||?
Neil
@ Neil Não, não queremos xser substituídos quando a primeira condição for atendida.
Arnauld
3

PHP, 106 bytes

<?for($y=($a=$_GET[0])[$x=$_GET[1]];$y>=$a[$x-++$i]&&$y>=$a[$x+$i];);echo$y<$a[$x+$i]?$a[$x+$i]:$a[$x-$i];

Versão Online

Jörg Hülsermann
fonte
Parece que estes não funcionam no primeiro caso de teste.
Nick Clifford
@NickClifford Agora deve funcionar. Eu tenho uma abordagem errada
Jörg Hülsermann
3

Haskell , 48 bytes

i%l=minimum[[j*j,x]|(j,x)<-zip[-i..]l,x>l!!i]!!1

Experimente online! Estrutura de teste de Ørjan Johansen.

xnor
fonte
Você pode salvar um byte usando uma lista e, em !!1vez disso (basta alterar Integerpara Intno cabeçalho).
Ørjan Johansen
@ ØrjanJohansen Obrigado, eu tinha tentado isso e não tinha certeza por que se queixava de tipos.
Xnor
2

x86-64 Assembly, 40 bytes

Inspirado na análise das soluções Johan du Toit e C 2501 , a seguir, é uma função que pode ser montada com o MASM para plataformas x86-64.

Ele segue a convenção de chamada do Microsoft x64 para a passagem de parâmetros, para que o comprimento total da matriz seja passado ECX, a posição de interesse seja passada EDXe o ponteiro para a matriz inteira seja passado R8(é uma plataforma de 64 bits, portanto, é um ponteiro de 64 bits).

Retorna o resultado (o "número maior mais próximo") em EAX.

             FindNearestGreater PROC      
8B F2       \    mov     esi, edx     ; move pos parameter to preferred register
8B D9       |    mov     ebx, ecx     ; make copy of count (ecx == i; ebx == count)
            | MainLoop:
8B C6       |    mov     eax, esi     ; temp  = pos
2B C1       |    sub     eax, ecx     ; temp -= i
99          |    cdq
33 C2       |    xor     eax, edx
2B C2       |    sub     eax, edx     ; temp = AbsValue(temp)
            | 
41 8B 14 B0 |    mov     edx, DWORD PTR [r8+rsi*4]
41 39 14 88 |    cmp     DWORD PTR [r8+rcx*4], edx
7E 04       |    jle     KeepGoing    ; jump if (pValues[i] <= pValues[pos])
3B D8       |    cmp     ebx, eax
77 02       |    ja      Next         ; jump if (count > temp)
            | KeepGoing:
8B C3       |     mov     eax, ebx    ; temp = count
            | Next:
8B D8       |     mov     ebx, eax    ; count = temp
E2 E3       |     loop    MainLoop    ; equivalent to dec ecx + jnz, but smaller (and slower)
            | 
            |     ; Return pValues[temp + pos]
03 C6       |     add     eax, esi
41 8B 04 80 |     mov     eax, DWORD PTR [r8+rax*4]
C3          /     ret
             FindNearestGreater ENDP

Se você quisesse chamá-lo do código C, o protótipo seria:

extern int FindNearestGreater(unsigned int count,
                              unsigned int pos,
                              const    int *pValues);
Cody Gray
fonte
1

Ruby , 64 bytes

->a,i{a[(0...a.size).select{|j|a[j]>a[i]}.min_by{|j|(i-j).abs}]}

Experimente online!

Value Ink
fonte
1

Haskell , 53 bytes

(#)pega uma Intlista de Ints ou Integers (na verdade, qualquer Ordtipo) e retorna um elemento da lista.

n#l=[x|i<-[1..],x:_<-(`drop`l)<$>[n-i,n+i],x>l!!n]!!0

Como funciona

  • né o índice fornecido e lé a lista / "matriz" especificada.
  • i, assumindo valores de 1 para cima, é a distância do teste natualmente.
  • Para cada um i, verificamos os índices n-ie n+i.
  • xé o elemento de lser testado. Se passar nos testes, será um elemento da compreensão da lista resultante.
    • A indexação de índices arbitrários com !!pode gerar um erro fora dos limites, enquanto, em dropvez disso, retorna a lista inteira ou uma lista vazia. O padrão corresponde às x:_verificações de que o resultado não está vazio.
    • x>l!!ntesta se nosso elemento é maior que o elemento no índice n(que é garantido que existe).
    • !!0 no final retorna a primeira correspondência / elemento da compreensão da lista.

Experimente online!

Ørjan Johansen
fonte
1

Braquilog , 17 bytes

hH&∋₎<.&t:I≜+:H∋₍

Experimente online!

Explicação

hH                      Call the list H
  &∋₎<.                 Output is greater than the number at the specified index
       &t:I≜            Label I (0, then 1, then -1, then 2, then -2, …)
            +           Sum I with the input Index
             :H∋₍       Output is the element of H at index <the sum>
Fatalizar
fonte
1

Java (OpenJDK 8) , 98 bytes

int f(int n,int[]a){for(int s=1,i=1,x=a[n];;n+=i++*s,s=-s)if(0<=n&n<a.length&&a[n]>x)return a[n];}

Experimente online!

Verifica os índices na ordem especificada pelas somas parciais da seguinte soma:

initial value + 1 - 2 + 3 - 4 + 5 - 6 + ...
Freira Furada
fonte
Eu estava lendo a pergunta e queria começar a escrever uma resposta. Mas, por que o s=1,e ,s=-snão tem utilidade na sua resposta? Você esqueceu de removê-lo de uma abordagem antiga?
Kevin Cruijssen
1
@KevinCruijssen é um erro e estou corrigindo agora. Ele passou nos casos de teste porque, em todos esses casos, o número maior mais próximo fica à direita.
Leaky Nun
1

C, 69 bytes

t;b;f(*d,c,p){for(b=c;c--;)d[c]>d[p]&(t=abs(p-c))<b?b=t:0;*d=d[p+b];}

O primeiro argumento é um argumento de entrada / saída. A saída é armazenada em seu primeiro elemento.

Veja como funciona online .

2501
fonte
1

R, 59 bytes

function(l,i)l[j<-l>l[i]][which.min(abs(1:length(l)-i)[j])]

retorna uma função anônima. Caso haja dois elementos maiores a distâncias iguais, retornará o primeiro (índice menor).

Experimente online!

Giuseppe
fonte
1

Pitão - 28 bytes

JEehf>@T1@JQo@NZm(adQ@Jd)UlJ

Tente

Maria
fonte
1

PHP, 73 bytes

function($i,$a){for(;$b<=$a[$i];)$b=max($a[++$d+$i],$a[$i-$d]);return$b;}

encerramento leva o índice baseado em 0 e a matriz de argumentos. Verifique todos os casos de teste .

Titus
fonte
Não é o próximo valor mais alto. Você precisa de um valor com a menor distância que é maior
Jörg Hülsermann
@ JörgHülsermann Obrigado por apontar.
Titus
0

Pitão, 16 bytes

JEh>#@JQ@LJaDQUJ

Conjunto de teste .

Freira Furada
fonte
0

C, 110 bytes

c,o;e(g,l,f)int*g;{for(o=g[l],c=1;c<f;c++)l+c<f&&g[l+c]>o?o=g[l+c],c=f:0,l-c>=0&&g[l-c]>o?o=g[l-c],c=f:0;g=o;}

Experimente online

Johan du Toit
fonte
0

Java, 96 bytes

int f(int n,int[]a){for(int s=1,i=1,x=a[n];0>(n+=i++*s)|n>=a.length||a[n]<=x;s=-s);return a[n];}

Os identificadores são nomeados como a resposta de @Leaky Nun. Além disso, a maioria das partes foi alinhada para ser basicamente a mesma: em comparação, a iffoi substituída pela forcondição-(sacrificando o ponto e vírgula adicional). Os dois pontos foram removidos movendo a parte de incremento para a condição (para que os parênteses da instrução if anterior praticamente "se movessem") - alterando & para | não teve impacto na contagem de caracteres.

Johannes
fonte
0

Clojure, 95 bytes

#(%(nth(nth(sort-by first(for[i(range(count %)):when(>(% i)(% %2))][(Math/abs(- i %2))i]))0)1))

Este é o mais curto que consegui :( Eu também tentei brincar com isso, mas não consegui trazê-lo para a linha de chegada:

#(map(fn[f c](f c))[reverse rest](split-at %2 %))
NikoNyrh
fonte