Où est ma valeur?


20

Mon patron veut maintenant que j'implémente un mécanisme qui lui permette de rechercher un élément dans un tableau et lui donne le ou les index où se trouve cette valeur.

Ta tâche:

Écrivez un programme ou une fonction qui reçoit un tableau et une valeur (String, Integer, Float ou Boolean) et retourne les indices du tableau auquel la valeur se produit (soit 0 soit 1 indexé, selon votre préférence). Si la valeur n'est pas dans le tableau, renvoyez un tableau vide.

Contribution:

Un tableau A et une valeur V, qui peuvent ou non être présents dans A.

Production:

Un tableau contenant le ou les indices auxquels le V se produit dans A ou, si V ne se produit pas dans A, un tableau vide.

Cas de test:

Veuillez noter que les cas de test sont basés sur 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]

Notation:

C'est le , donc le score le plus bas en octets l'emporte.


1
Pouvons-nous supposer que le tableau donné n'a qu'un seul de ces types (c'est-à-dire pas de tableaux avec des types mixtes) car de nombreuses langues ne prennent pas en charge les tableaux ou les listes avec plus d'un type.
flawr

1
Bien sûr, @flawr. Vous pouvez supposer que le tableau ne comprendra que des valeurs du même type que la valeur à vérifier, si votre langue l'exige.
Gryphon - Rétablir Monica

2
Tous vos tableaux sont 1D. Supposition?
Adám

1
@KevinCruijssen Je voulais dire que le tableau devait être recherché. Ce pourrait être multi-D.
Adám

1
D'accord. Et je suis surpris qu'il n'y ait pas encore de langue qui puisse le faire en 1 octet!
Zacharý

Réponses:


10

Pyth , 2 octets

0 indexé.

xE

Essayez-le en ligne! ou Vérifiez tous les cas de test


Explication

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

Vous êtes censé renvoyer toutes les occurrences, pas seulement la première.
Erik the Outgolfer

@EriktheOutgolfer Fixed. Prenez-les simplement dans l'ordre inverse.
M. Xcoder

1
Pyth est certainement le meilleur outil pour le travail alors: P
M. Xcoder

7

MATL , 2 octets

mf

Le mconsomme deux arguments, et vérifie si chaque élément du tableau est égal à l'autre argument, frenvoie les indices des entrées véridiques d'un tableau.

Essayez-le en ligne!


Cela ne semble pas fonctionner pour les cas de test proposés, de même pour la solution Octave.
Cinaski

Vous devez utiliser ismemberau lieu de =pour gérer correctement les tableaux de chaînes. mf
Suever

@LuisMendo Nous n'avons pas besoin de considérer les entrées mixtes, voir la clarification d'OP!
flawr

@flawr Oh, pourquoi est-ce seulement dans un commentaire, et non dans le texte du défi? : - /
Luis Mendo

Il faudrait demander au PO, pas moi :)
flawr

7

Python 3 , 45 octets

-3 octets grâce à @EriktheOutgolfer et @Chris_Rands

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

Suite de tests.

Aujourd'hui, j'ai appris enumerate(x) == zip(range(len(x)),x).


Python 3 , 47 octets

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

Essayez-le en ligne! ou Vérifiez tous les cas de test


Utilisez enumerate()pour le réduire de quelques octets
Chris_Rands

@Chris_Rands A fini par être plus long.
M. Xcoder

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

Je voulais dire ce que @EriktheOutgolfer a dit
Chris_Rands

1
@JonathanAllan Fixed.
M. Xcoder

6

R (+ pryr), 20 octets

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

Qui évalue à la fonction

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

Où soit ala valeur à rechercher et ble vecteur, ou l'inverse. Lorsqu'il est présenté avec deux vecteurs de longueurs inégales (une seule valeur compte comme un vecteur de longueur 1 dans R), R enveloppera le plus court pour correspondre à la longueur du plus long. Ensuite, l'égalité est vérifiée. Cela génère un vecteur logique. whichfournit les indices où ce vecteur est vrai.

Essayez-le en ligne!


6

JavaScript, 39 octets

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']));

L'extrait ci-dessus peut ne pas fonctionner sur tous les navigateurs, voici donc un lien TIO .


6

JavaScript (ES6), 44 43 octets

Biffé 44 est toujours régulier 44; (

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

1 octets enregistrés grâce à @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]


Pouvez-vous faire la ===normale ==pour un octet de moins? Je suis venu avec littéralement la même chose, les noms de variables et tout haha.
kamoroso94

4
===est nécessaire de distinguer 12de"12"
Christoph

1
@ kamoroso94 non, voici pourquoi.
Pureferret

5

05AB1E , 4 octets

QāsÏ

Essayez-le en ligne!

1 indexé.


Je pense que les deux nôtres gâchent les entrées de: 12et [12,'12'], à moins qu'il ne dise que c'est cool pour les langages qui ne sont pas vraiment concrets de ne pas se soucier des types.
Urne de poulpe magique du

En fait, je pense que 12'12'dans 05AB1E parce que parfois ils se comportent différemment ... je ne sais pas s'il y a un test d'égalité qui peut supporter une telle chose.
Erik the Outgolfer

Si nous voulions les tester pour la validité entière, nos réponses seraient comme 60 octets en utilisant is_alpha (a)et is_number (d), mais je suppose que nous pouvons supposer que les nôtres sont valides jusqu'à indication contraire.
Magic Octopus Urn

5

C #, 88 72 octets

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

16 octets enregistrés grâce à @LiefdeWen.

Essayez-le en ligne!


Étonnant, j'essayais toujours de comprendre pourquoi i==ocela ne fonctionnait pas.
LiefdeWen

3
@LiefdeWen Types de valeurs encadrées.
TheLethalCoder

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

@LiefdeWen Bien, je n'aurais pas pensé à le changer.
TheLethalCoder

Vous pouvez économiser beaucoup :): tio.run/…
digEmAll


3

Haskell , 41 39 octets

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

Essayez-le en ligne!

Sauvegardé deux octets grâce à @flawr

Haskell est typé statiquement, j'ai donc dû utiliser une petite solution de contournement pour exécuter les cas de test.


Vous n'avez plus besoin de votre solution de contournement, voir le commentaire de l'OP.
flawr

1
Définissez également un opérateur v#l=...au lieu de f v l=..., vous économiserez deux octets :)
flawr

@flawr J'en ai eu l'idée v!l=..., mais je ne savais pas si c'était accepté. Je vais modifier la réponse. Merci!
jferard

1
L' utilisation mapsur une filterexpression est souvent un indicateur qu'une compréhension de la liste peut être plus courte: v!l=[i|(i,x)<-zip[1..]l,x==v].
Laikoni

Il y a aussi une fonction intégrée, mais malheureusement, elle est plus longue que la suggestion de Laikionis :)
flawr

3

Husk , 5 octets

`fNm=

Essayez-le en ligne! 1 indexé.

Explication

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

Est-ce que cela fonctionne pour les tableaux avec des chaînes, cependant?
officialaimm

1
@officialaimm Cela fonctionne pour les listes ne contenant que des chaînes: essayez-le en ligne! Les listes de types mixtes ne sont pas prises en charge par Haskell et donc par Husk, mais OP l'a autorisé explicitement dans les commentaires.
Laikoni

Existe-t-il une documentation de Husk?
flawr

@flawr Oui, c'est dans le wiki sur la page github: github.com/barbuz/Husk/wiki
Laikoni

@flawr Si vous avez des questions sur les documents de Husk en général, rejoignez-nous dans le salon de discussion !
Zgarb



3

Google Sheets, 101 octets

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

La valeur Vdans A1et réseau Adans B1chaque entrée séparés par une virgule. Les entrées nulles ne sont pas autorisées (la ligne 5 ci-dessous montre ce qui se passe).

Result

Explication:

Offset(A1,0,0,1,Counta(Split(B1,",")))renvoie une plage qui est d'une ligne de hauteur et autant de colonnes de large qu'il y a d'entrées A1.

=IfError(Join(",",Filter(Column(~),Exact(Split(B1,","),A1))),"")filtre les numéros de colonne de cette plage selon que la valeur dans A1est ou non exactement chacune des valeurs dans B1et les concatène toutes dans une liste délimitée par des virgules.


3

Clojure , 40 octets

Première tentative de code golf.

keep-indexed mappe une fonction sur une collection ici, en passant l'index en cours dans le rappel et en produisant des valeurs de retour non nulles.

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

Essayez-le en ligne!


3

APL (Dyalog Unicode) , 2 octets SBCS

Takes item to look for as left argument (must be scalar to find an item of the lookup array rather than a subarray) and the lookup array (which may have up to 15 dimensions) as right argument. Returns list of indices, each of which may has as many elements as the number of dimensions in the lookup array.

⍸⍷

Try it online!

ɩndices where

 found


I was about to say it ties Pyth, but you know... Unicode. Wouldn't this be 2 bytes in APL Dyalog Classic (since it uses SBCS)?
Mr. Xcoder

@ Mr.Xcoder n'est pas dans le jeu de caractères. Pourtant, puisque Dyalog utilise bien moins de 256 caractères uniques, il aurait pu s'agir d'un seul octet. Lorsque nous ajoutons de nouveaux glyphes, nous nous abstenons de modifier le jeu de caractères afin de maintenir la compatibilité descendante.
Adám

Ah merci! (Je n'ai aucune idée du fonctionnement d'APL / Dyalog)
M. Xcoder

@ Mr.Xcoder APL est une langue commerciale (pas une langue de golf), donc Dyalog a certaines obligations envers les abonnés existants.
Adám

APL isn't a golfing language, but there do exist open-source APL implementations (ngn and GNU).
Zacharý

2

Batch, 86 bytes

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

Takes input as command line parameters (value then the array elements as separate parameters). Note: String quoting is considered part of the match e.g. "1" won't equal 1 (would cost 6 bytes).



2

Perl 5, 28 bytes

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

Try it online!

The output is 1-indexed.
An anonymous function is quite unusual for Perl, but it happens to be the shortest I could think of. grep ..., 1 .. @_ iterates over the indexes of the input array (actually it goes one cell beyond the last, but it doesn't matter), keeping only the index that satisfy $_[$_]eq$_[0], ie. the ones where the value of the element ($_[$_]) is the same as the value we need to keep ($_[0]).


Slightly longer (31 bytes (30 + -l flag)), but as a full program:

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

Try it 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 thanks to @TAsk by using Vector instead of ArrayList.
-1 byte by using Stack instead of Vector.
-2 bytes thanks to @Jakob by inputting a ArrayList instead of an array.

0-indexed

Explanation:

Try it here.

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
Cool! If I am not wrong Vector may save few bytes. :)
CoderCroc

1
@TAsk Thanks! Need to remember that one. I use List+ArrayList pretty often.
Kevin Cruijssen

1
List r=new Vector(); will work, too.
CoderCroc

1
You can save 1 byte by taking a list instead: TIO. Seems like a small enough change not to merit a separate answer.
Jakob

The change breaks searching for null, but that's fine.
Jakob

1

05AB1E, 4 bytes

Qƶ0K

Try it online!

It is 1-indexed, as shown below:

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

input [Array,Value]

[{12, 14, 14, 2, "Hello World!", 3, 12, 12}, 12]

output

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


Why not just Position?
hftf

1

Haskell, 29 bytes

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

Try it online!


Does that work with the heterogeneous input cases? (Mixtures of integers, strings, a "true" value, etc).
Kaz

@Kaz: no, it doesn't. It's polymorphic and works for every type where equality is defined for, but all list elements have to be of the same type. According to a comment in the OP that's enough.
nimi

1

Japt, 9 bytes

mȶV©YÄÃf

1-indexed.

Japt input doesn't support booleans, so they have been replaced with 0 and 1 in the test cases.

Try it online! with the -Q flag to format the array output.

0-indexed Solution, 11 bytes

l o f@gX ¶V

Try it online!


One of the few times rather than ¥ comes in handy :P I was thinking of doing something along the lines of m@Y*(X¶V} f, but I hadn't realized that wouldn't work for index 0. 1-indexing is clever...
ETHproductions

1

Perl 6, 21 bytes

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

Try it online!

The :k adverb to grep tells it to return the matching keys (indices) of the input sequence that match the predicate * === $^v.

If strings and numbers were considered equivalent, one could use a grep predicate of just $^v instead of * === $^v.


eqv might be better than === depending on what you want to consider equivalent values.
Brad Gilbert b2gills


1

TXR Lisp, 26 bytes

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

In other words, "Where is argument 2 equal to argument 1?"

Run:

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

A bit obscure :) The first input argument is a vec of values and the second one is the searched value. % maps indexes to values, and the set #{%2} returns truthy (the input argument %2) or falsy nil for that value. comp composes these together.


1

C 340 362 166 115 Bytes

Hello all. My first time here. I figured since I enjoy (attempting) to write optimized code I may as well give this a try.

@Rodney - ~39 bytes from the includes

@Zacharý - 7 bytes with implicit typing

0-indexed.

How to Run:

As per @Arnolds suggestion, the program takes arguments in a much more C friendly manner. This let me reduce the size of the file by a little more than half.

The arguments should be passed in the following order value [element1 ...] where braces indicate optional arguments

You may or may not have to add escaped quotes to any strings that are provided in order to satisfy the condition of 12 != "12". On my system the this can be done in the following manner

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

ungolfed

#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
Welcome to the site. I notice you have a lot of extra whitespace. Particularly around operators i = 0. These can be removed. I suggest playing around with the whitespace a bit.
Wheat Wizard

With the way you handle the list, a first argument of ,12 and second argument of [12,14,14,2,"Hello World!",3,12,12] prints [5,6] which is technically incorrect.
Arnold Palmer

@ArnoldPalmer I updated the code to make it a little more verbose at detecting data types. However, since C doesn't have all the fancy type conversion such as JavaScript, it is still vulnerable to having a comma in a 'number' type. I pretty much just left it assuming correctly formatted input.
Marcos

@Marcos There's a chance you may be able to take each value of the array as it's own command line argument. I don't golf in C ever, so not quite sure what the rules are, but it doesn't seem unreasonable to me that you'd be allowed to do that. Especially since accepting the array as a list leaves you vulnerable to this problem. Also, you still have a bit of white space in your golfed code. You don't need the spaces on the #include statements, strstr(h+i,n)-h ==i has an extra space, and you can do return-1 instead of return -1.
Arnold Palmer

are implicit declarations allowed? I think you can ditch the #include statements
Rodney
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.