Onde está o meu valor?


20

Meu chefe agora quer que eu implemente um mecanismo que permita que ele procure por um item em uma matriz e forneça a ele os índices / índices onde esse valor ocorre.

Sua tarefa:

Escreva um programa ou função que receba uma matriz e um valor (String, Inteiro, Flutuante ou Booleano) e retorne os índices da matriz na qual o valor ocorre (0 ou 1 indexado, o que você preferir). Se o valor não estiver na matriz, retorne uma matriz vazia.

Entrada:

Uma matriz A e um valor V, que podem ou não estar presentes em A.

Saída:

Uma matriz contendo o (s) índice (s) no qual o V ocorre em A ou, se V não ocorrer em A, uma matriz vazia.

Casos de teste:

Observe que os casos de teste são baseados em 0.

12, [12,14,14,2,"Hello World!",3,12,12]         -> [0,6,7]
"Hello World", ["Hi", "Hi World!", 12,2,3,True] -> []
"a", ["A",True,False,"aa","a"]                  -> [4]
12, [12,"12",12]                                -> [0,2]

Pontuação:

Isso é , então a pontuação mais baixa em bytes vence.


1
Podemos supor que a matriz fornecida tenha apenas um desses tipos (ou seja, sem matrizes com tipos mistos), pois muitos idiomas não suportam matrizes ou listas com mais de um tipo.
flawr

1
Claro, @flawr. Você pode assumir que a matriz consistirá apenas em valores do mesmo tipo que o valor a ser verificado, se o seu idioma exigir.
Gryphon - Restabelece Monica

2
Todas as suas matrizes são 1D. Suposição?
Adám 03/08/19

1
@KevinCruijssen, quis dizer que a matriz a ser pesquisada. Pode ser multi-D.
Adám 03/08/19

1
OK. E estou surpreso que ainda não exista um idioma capaz de fazê-lo em 1 byte!
Zachary

Respostas:


10

Pitão , 2 bytes

Indexado a 0.

xE

Experimente online! ou Verifique todos os casos de teste


Explicação

xEQ  - Full Program. Takes Input from standard input. Q means evaluated input and is implicit at the end of the program.

x   - Get all the indexes of x in y
 E  - Evaluated Input #2 - The value
  Q - The list - Evaluated Input #1

Você deve retornar todas as ocorrências, não apenas a primeira.
Erik the Outgolfer

@EriktheOutgolfer Fixed. Basta levá-los na ordem inversa.
Xcoder

1
Pyth é definitivamente a melhor ferramenta para o trabalho, então: P
O Sr. Xcoder

7

MATL , 2 bytes

mf

Ele mconsome dois argumentos e verifica se cada elemento da matriz é igual ao outro argumento, fretorna os índices das entradas verdadeiras de uma matriz.

Experimente online!


Parece não funcionar para os casos de teste propostos, o mesmo para a solução Octave.
Cinaski # 03/17

Você deve usar em ismembervez de =manipular adequadamente matrizes de seqüências de caracteres. mf
Suever 3/08

@LuisMendo Não precisamos considerar dados mistos, veja esclarecimentos do OP!
flawr

@ flawr Oh, por que isso é apenas em um comentário, e não no texto do desafio? : - /
Luis Mendo

Você teria que perguntar ao OP, não me :)
flawr

7

Python 3 , 45 bytes

-3 bytes graças a @EriktheOutgolfer e @Chris_Rands

lambda y,x:[i for i,j in enumerate(x)if j==y]

Suíte de teste.

Hoje eu aprendi enumerate(x) == zip(range(len(x)),x).


Python 3 , 47 bytes

lambda n,l:[x for x in range(len(l))if l[x]==n]

Experimente online! ou Verifique todos os casos de teste


Use enumerate()para derrubá-lo um par de bytes
Chris_Rands

@Chris_Rands Acabou sendo mais longo.
Mr. Xcoder

3
lambda n,l:[x for x,y in enumerate(l)if y==n]
Erik the Outgolfer

Eu quis dizer o @EriktheOutgolfer disse
Chris_Rands

1
@JonathanAllan Fixed.
Mr. Xcoder

6

R (+ pryr), 20 bytes

pryr::f(which(a==b))

Que avalia a função

function (a, b) 
which(a == b)

Onde qualquer um apode ser o valor a ser procurado e bo vetor, ou o contrário. Quando apresentado com dois vetores de comprimentos desiguais (um valor único conta como um vetor de comprimento 1 em R), R envolverá o menor com o comprimento do maior. Então a igualdade é verificada. Isso gera um vetor lógico. whichfornece os índices onde esse vetor é verdadeiro.

Experimente online!


6

JavaScript, 39 bytes

e=>a=>[...a.keys()].filter(i=>a[i]===e)

f=
e=>a=>[...a.keys()].filter(i=>a[i]===e)

console.log(f(12)([12,14,14,2,"Hello World!",3,12,12]));
console.log(f("Hello World")(["Hi", "Hi World!", 12,2,3,true]));
console.log(f("a")(["A",true,false,"aa","a"])); 
console.log(f(12)([12,14,14,2,"Hello World!",3,12,'12']));

O snippet acima pode não funcionar em todos os navegadores, então aqui está um link TIO .


6

JavaScript (ES6), 44 43 bytes

O riscado 44 ainda é regular 44;

v=>a=>a.map((x,i)=>x===v&&++i).filter(x=>x)

Guardado 1 bytes graças a @Arnauld

let f=
v=>a=>a.map((x,i)=>x===v&&++i).filter(x=>x)
;

console.log(f(12)([12,14,14,2,"Hello World!",3,12,12]));         // => [1,7,8]
console.log(f("Hello World")(["Hi", "Hi World!", 12,2,3,true])); // => []
console.log(f("a")(["A",true,false,"aa","a"]));                  // => [5]


Você pode tornar o ===normal ==por um byte a menos? Eu inventei literalmente a mesma coisa, nomes de variáveis ​​e tudo haha.
precisa saber é o seguinte

4
===é necessário distinguir 12de"12"
Christoph

1
@ kamoroso94 não, aqui está o porquê.
Pureferret 4/17/17

5

05AB1E , 4 bytes

QāsÏ

Experimente online!

1 indexado.


Eu acho que nós dois bagunçamos as entradas de: 12e [12,'12'], a menos que ele diga que é frio para linguagens que não são realmente concretas, não se importam com os tipos.
Urna de polvo mágico

Eu realmente acho que 12'12'em 05AB1E porque às vezes eles se comportam de maneira diferente ... não tenho certeza se há algum teste de igualdade que pode suportar tal coisa embora.
Erik the Outgolfer

Se quiséssemos testá-los quanto à validade inteira, nossas respostas seriam como 60 bytes usando is_alpha (a)e is_number (d), mas acho que podemos assumir que as nossas são válidas até que seja dito o contrário.
Magic Octopus Urn

5

C #, 88 72 bytes

using System.Linq;a=>o=>a.Select((i,n)=>o.Equals(i)?n:-1).Where(n=>n>=0)

Economizou 16 bytes graças a @LiefdeWen.

Experimente online!


Incrível, eu ainda estava tentando descobrir por i==oque não funciona.
precisa saber é o seguinte

3
@LiefdeWen Tipos de valor em caixa.
TheLethalCoder

72 bytesusing System.Linq;a=>b=>a.Select((x,i)=>x.Equals(b)?i:-1).Where(x=>x>=0)
LiefdeWen

@LiefdeWen Nice, eu não teria pensado em mudar isso.
TheLethalCoder

Você pode economizar muito :): tio.run/…
digEmAll


3

Haskell , 41 39 bytes

v!l=fst<$>(filter((==v).snd)$zip[1..]l)

Experimente online!

Salvou dois bytes graças a @flawr

Haskell é digitado estaticamente, então tive que usar um pouco de solução alternativa para executar os casos de teste.


Você não precisa mais da sua solução alternativa, consulte o comentário do OP.
flawr

1
Também definir um operador v#l=...em vez de f v l=..., você vai economizar dois bytes :)
flawr

Flawr @ eu tive a idéia de v!l=..., mas não sabia se foi aceito. Vou editar a resposta. Obrigado!
jferard

1
Usando mapem alguma filterexpressão é muitas vezes um indicador de que uma compreensão da lista pode ser mais curto: v!l=[i|(i,x)<-zip[1..]l,x==v].
Laikoni

Há também um embutido, mas, infelizmente, é mais do que sugestão Laikionis :)
flawr

3

Casca , 5 bytes

`fNm=

Experimente online! 1 indexado.

Explicação

       -- implicitly input a value v and a list L
   m=  -- map "equals v" over the list L, resulting in a list of truthy and falsy values
`fN    -- filter the natural numbers N by discarding the numbers at falsy positions 
          and keeping the ones at truthy positions

Isso funciona para matrizes com seqüências de caracteres?
officialaimm

1
@officialaimm Ele funciona para listas que contêm apenas strings: Experimente online! Listas de tipos mistos não são suportadas por Haskell e, portanto, por Husk, mas o OP permitiu isso explicitamente nos comentários.
Laikoni

Existe uma documentação do Husk?
flawr

@flawr Sim, é no wiki na página github: github.com/barbuz/Husk/wiki
Laikoni

@flawr Se você tiver dúvidas sobre os documentos da Husk em geral, junte-se a nós na sala de bate - papo !
Zgarb



3

Planilhas Google, 101 bytes

=IfError(Join(",",Filter(Column(Offset(A1,0,0,1,Counta(Split(B1,",")))),Exact(Split(B1,","),A1))),"")

Valor Vem A1e matriz Ano B1com cada entrada separadas por uma vírgula. Entradas nulas não são permitidas (a linha 5 abaixo mostra o que acontece).

Resultado

Explicação:

Offset(A1,0,0,1,Counta(Split(B1,",")))retorna um intervalo com uma linha de altura e tantas colunas de largura quanto entradas A1.

=IfError(Join(",",Filter(Column(~),Exact(Split(B1,","),A1))),"")filtra os números de coluna desse intervalo com base em se o valor in A1é exatamente cada um dos valores B1e concatena todos eles em uma lista delimitada por vírgulas.


3

Clojure , 40 bytes

Primeira tentativa de código de golfe.

keep-indexed mapeia uma função sobre uma coleção aqui, passando o índice atual para o retorno de chamada e produzindo valores de retorno diferentes de zero.

(fn[a b](keep-indexed #(if(= %2 a)%1)b))

Experimente online!


3

APL (Dyalog Unicode) , SBCS de 2 bytes

Leva o item a ser procurado como argumento à esquerda (deve ser escalar para localizar um item da matriz de pesquisa em vez de uma sub-matriz) e a matriz de pesquisa (que pode ter até 15 dimensões) como argumento correto. Retorna a lista de índices, cada um dos quais pode ter tantos elementos quanto o número de dimensões na matriz de pesquisa.

⍸⍷

Experimente online!

descobre onde

 encontrado


Eu estava prestes a dizer que vincula Pyth, mas você sabe ... Unicode. Isso não seria 2 bytes no APL Dyalog Classic (já que ele usa o SBCS)?
Mr. Xcoder

@ Mr.Xcoder não está no conjunto de caracteres. Ainda assim, como o Dyalog usa muito menos que 256 caracteres únicos, poderia ter sido um único byte. Quando adicionamos novos glifos, evitamos alterar o conjunto de caracteres para manter a compatibilidade com versões anteriores.
Adám 03/08/19

Ah, obrigado! (Eu não tenho nenhuma idéia de como APL / Dyalog funciona)
Mr. Xcoder

@ Mr.Xcoder APL é uma linguagem comercial (não uma linguagem de golfe), portanto a Dyalog tem certas obrigações para com os assinantes existentes.
Adám 03/08/19

APL não é uma linguagem de golfe, mas existem implementações de APL de código aberto (ngn e GNU).
Zacharý

2

Lote, 86 bytes

@set i=0
:g
@if "%~2"=="" exit/b
@if %1==%2 echo %i%
@set/ai+=1
@shift/2
@goto g

Recebe a entrada como parâmetros da linha de comando (valor e os elementos da matriz como parâmetros separados). Nota: A citação de string é considerada parte da correspondência, por exemplo "1", não será igual 1(custaria 6 bytes).



2

Perl 5 , 28 bytes

sub{grep$_[$_]eq$_[0],1..@_}

Experimente online!

A saída é indexada em 1.
Uma função anônima é bastante incomum para Perl, mas é a mais curta possível. grep ..., 1 .. @_itera sobre os índices da matriz de entrada (na verdade, vai uma célula além da última, mas não importa), mantendo apenas o índice que satisfaz $_[$_]eq$_[0], ou seja. aqueles em que o valor do elemento ( $_[$_]) é igual ao valor que precisamos manter ( $_[0]).


Um pouco mais (31 bytes (30 + -lsinalizador)), mas como um programa completo:

$@=<>;$@eq$_&&print$.-1while<>

Experimente online!



2

Java 8, 146 113 112 111 110 108 bytes

import java.util.*;l->o->{List r=new Stack();for(int i;(i=l.indexOf(o))>-1;l.set(i,null))r.add(i);return r;}

-2 bytes graças a @TAsk usando em Vectorvez de ArrayList.
-1 byte usando em Stackvez de Vector.
-2 bytes graças a @Jakob inserindo umArrayList vez de uma matriz.

Indexado a 0

Explicação:

Experimente aqui.

import java.util.*;    // Required import for Vector and Vector
l->o->{                // Method with List and Object parameters
  List r=new Stack();  //  Result-list
  for(int i;(i=l.indexOf(o))>=-1;
                       //  Loop as long as we can find the object in the list
    l.set(i,null))     //   After every iteration, remove the found item from the list
      r.add(i);        //    Add the index to the result-list
                       //  End of loop (implicit / single-line body)
  return r;            //  Return the result-List
}                      // End of method

1
Legal! Se não estou errado, Vectorpode economizar alguns bytes. :)
CoderCroc

1
@TAsk Obrigado! Precisa se lembrar dessa. Eu uso List+ com ArrayListbastante frequência.
Kevin Cruijssen

1
List r=new Vector();vai funcionar também.
CoderCroc

1
Você pode economizar 1 byte fazendo uma lista: TIO . Parece uma mudança pequena o suficiente para não merecer uma resposta separada.
Jakob

A mudança interrompe a busca null, mas tudo bem.
Jakob

1

05AB1E , 4 bytes

Qƶ0K

Experimente online!

É indexado 1, como mostrado abaixo:

IN A-#------------------------> [2,3,3,3,4]
IN B-#------------------------> 3
-----#------------------------+-----------------
Q    # Vectorized equivalence | [0,1,1,1,0]
 ƶ   # Lift by index          | [0,2,3,4,0]
  0K # Remove zeros           | [2,3,4]

1

Mathematica, 12 bytes

Position@##&

1-Indexado

entrada [Matriz, Valor]

[{12, 14, 14, 2, "Olá, mundo!", 3, 12, 12}, 12]

saída

{{1}, {7}, {8}}


Por que não apenas Position?
Hftf 25/09

1

Haskell, 29 bytes

e#l=[i|(i,h)<-zip[0..]l,h==e]    

Experimente online!


Isso funciona com os casos de entrada heterogêneos? (Misturas de números inteiros, strings, um valor "verdadeiro", etc).
Kaz

@ Kaz: não, não. É polimórfico e funciona para todos os tipos nos quais a igualdade é definida, mas todos os elementos da lista devem ser do mesmo tipo. Segundo um comentário no OP, isso é suficiente.
nimi

1

Japonês , 9 bytes

mȶV©YÄÃf

1 indexado.

A entrada Japt não suporta booleanos; portanto, eles foram substituídos por 0e 1nos casos de teste.

Experimente online! com o -Qsinalizador para formatar a saída da matriz.

Solução indexada em 0, 11 bytes

l o f@gX ¶V

Experimente online!


Uma das poucas vezes em que não ¥é útil: o PI estava pensando em fazer algo do tipo m@Y*(X¶V} f, mas eu não tinha percebido que isso não funcionaria para o índice 0. A indexação 1 é inteligente ...
ETHproductions

1

Perl 6 , 21 bytes

{grep :k,*===$^v,@^z}

Experimente online!

O :kadvérbio para grepdiz para retornar as chaves (índices) correspondentes da sequência de entrada que correspondem ao predicado* === $^v .

Se seqüências de caracteres e números forem considerados equivalentes, pode-se usar um predicado grep de apenas em $^vvez de * === $^v.


eqvpode ser melhor do que ===depender do que você deseja considerar valores equivalentes.
Brad Gilbert b2gills


1

TXR Lisp , 26 bytes

(op where(op equal @@1)@2)

Em outras palavras, "Onde o argumento 2 é igual ao argumento 1?"

Corre:

1> (op where(op equal @@1) @2)
#<interpreted fun: lambda (#:arg-01-0166 #:arg-02-0167 . #:rest-0165)>
2> [*1 12 #(12 14 14 2 "Hello world!" 3 12 12)]
(0 6 7)
3> [*1 "Hello World" #("Hi" "Hi world!" 12 2 3 t)]
nil

1

Clojure, 39 38 bytes

#(filter(comp #{%2}%)(range(count %)))

Um pouco obscuro :) O primeiro argumento de entrada é um vecdos valores e o segundo é o valor pesquisado. %mapeia os índices para valores e o conjunto #{%2}retorna verdade (o argumento de entrada %2) ou falso nilpara esse valor. comp os compõe juntos.


1

C 340 362 166 115 bytes

Olá a todos. Minha primeira vez aqui. Eu percebi que, como eu gosto (tentando) de escrever código otimizado, também posso tentar.

@Rodney - ~ 39 bytes das inclusões

@ Zacharý - 7 bytes com digitação implícita

Indexado a 0 .

Como executar:

Conforme sugestão do @Arnolds, o programa aceita argumentos de uma maneira muito mais amigável em C. Isso me permite reduzir o tamanho do arquivo em pouco mais da metade.

Os argumentos devem ser passados ​​na seguinte ordem value [element1 ...] que chaves indicam argumentos opcionais

Você pode ou não ter que adicionar aspas escapadas a quaisquer strings fornecidas para satisfazer a condição de 12 != "12". No meu sistema, isso pode ser feito da seguinte maneira

prog-name.exe 12 3 "Hello" 12 4 "12"
Returns [2,4]     < This is incorrect

prog-name.exe 12 3 "\"Hello\"" 12 4 "\"12\""
Returns [2]       < Correct

golfed

#define P printf(
b=0;main(int c,char**v){P"[");for(--c;c-1;c--)b|=strcmp(v[1],v[c])?0:P b?",%i":"%i",c-2);P"]");}

destroçado

#define P printf(

//Implicit only works in global(I totally knew this after almost 4 years of C :P)
b = 0;
main(int c,char**v)
{

    P"[");

    //match loop
    //b is used to determine if this is the first iteration. it can be assumed that printf will always return >0
    //subract two from c to get correct index number of match
    for(--c; c-1; c--)
        b |= strcmp(v[1], v[c]) ? 0 : P b ? ",%i" : "%i", c-2);

    P"]");

    return 0;
}

1
Bem vindo ao site. Percebo que você tem muito espaço em branco extra. Particularmente em torno dos operadores i = 0. Estes podem ser removidos. Sugiro brincar um pouco com o espaço em branco.
Wheat Wizard

Com a maneira como você lida com a lista, um primeiro argumento ,12e um segundo argumento de [12,14,14,2,"Hello World!",3,12,12]impressões [5,6]tecnicamente incorretos.
Arnold Palmer

@ArnoldPalmer Atualizei o código para torná-lo um pouco mais detalhado na detecção de tipos de dados. No entanto, como C não possui toda a conversão de tipos extravagantes, como o JavaScript, ainda é vulnerável a vírgula no tipo 'número'. Eu praticamente o deixei assumindo a entrada formatada corretamente.
Marcos

@Marcos Há uma chance de você poder pegar cada valor da matriz como seu próprio argumento de linha de comando. Eu nunca jogo golfe em C, então não tenho muita certeza de quais são as regras, mas não me parece razoável que você possa fazer isso. Especialmente porque aceitar a matriz como uma lista deixa você vulnerável a esse problema. Além disso, você ainda tem um pouco de espaço em branco no seu código de golfe. Você não precisa dos espaços nas #includeinstruções, strstr(h+i,n)-h ==item um espaço extra e pode fazê-lo em return-1vez de return -1.
Arnold Palmer

são permitidas declarações implícitas? Eu acho que você pode abandonar as #includedeclarações
Rodney
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.