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.

Gryphon - Restabelecer Monica
fonte
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
Mr. Xcoder
fonte
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!

flawr
fonte
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

Mr. Xcoder
fonte
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!

JAD
fonte
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 .

Cristian Lupascu
fonte
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]

Johan Karlsson
fonte
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.

Erik, o Outgolfer
fonte
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!

TheLethalCoder
fonte
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
5

Gelatina , 3 bytes

⁼€T

Experimente online!

-1 graças ao Sr. Xcoder . (cadeias diádicas)

Erik, o Outgolfer
fonte
1
Agradável. Estou surpreso que Jelly não tenha um puro embutido, como Pyth.
Mr. Xcoder
@ Mr.Xcoder Eu acho que a maioria não.
Erik the Outgolfer
A ironia de cadeias diádicas :)
Mr. Xcoder
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.

jferard
fonte
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
Laikoni
fonte
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

Ruby, 46 40 39 bytes

->e,a{i=-1;a.map{|x|i+=1;x==e&&i}-[!1]}

Salvo 7 bytes !!! graças a Eric Duminil.

Experimente online.

Cristian Lupascu
fonte
-1 byte com !1for false.
Eric Duminil
3

Ruby, 38 bytes

->e,a{a.each_index.select{|x|a[x]==e}}

Experimente online!

Idva
fonte
2
Bem-vindo ao PPCG!
Martin Ender
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.

Engenheiro Toast
fonte
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!

Devo
fonte
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

Adão
fonte
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).

Neil
fonte
2

Python 2 , 49 bytes

lambda l,v:filter(lambda i:l[i]==v,range(len(l)))

Experimente online!

Não é curto o suficiente, mas achei legal. ¯ \ _ (ツ) _ / ¯

totalmente humano
fonte
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!

dada
fonte
2

Haskell , 37 33 bytes

import Data.List
findIndices.(==)

Obrigado @Laikoni por -4 bytes!

Experimente online!

flawr
fonte
O Pointfree é mais curto:findIndices.(==)
Laikoni
Ah, certo, que é ainda mais pointfree, graças =)
flawr
1
Por que não elemIndices?
nimi
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
Kevin Cruijssen
fonte
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]
Urna de polvo mágico
fonte
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}}

J42161217
fonte
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!

nimi
fonte
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!

Justin Mariner
fonte
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.

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

Lisp comum, 66 bytes

(lambda(x s)(loop as i in s as j from 0 when(equal i x)collect j))

Experimente online!

Renzo
fonte
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
Kaz
fonte
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.

NikoNyrh
fonte
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;
}
Marcos
fonte
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