Gdzie jest moja wartość?

20

Mój szef chce teraz, abym wdrożył mechanizm, który pozwala mu szukać elementu w tablicy i daje mu indeks / indeksy, w których występuje ta wartość.

Twoje zadanie:

Napisz program lub funkcję, która odbiera tablicę i wartość (String, Integer, Float lub Boolean) i zwraca indeksy tablicy, w której występuje wartość (0 lub 1 indeksowane, w zależności od tego, co wolisz). Jeśli wartości nie ma w tablicy, zwróć pustą tablicę.

Wkład:

Tablica A i wartość V, które mogą, ale nie muszą być obecne w A.

Wynik:

Tablica zawierająca indeksy, przy których V występuje w A, lub, jeśli V nie występuje w A, pusta tablica.

Przypadki testowe:

Należy pamiętać, że przypadki testowe są oparte na 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]

Punktacja:

To jest , więc wygrywa najniższy wynik w bajtach.

Gryphon - Przywróć Monikę
źródło
1
Czy możemy założyć, że dana tablica ma tylko jeden z tych typów (tj. Brak tablic z typami mieszanymi), ponieważ wiele języków nie obsługuje tablic lub list z więcej niż jednym typem.
flawr
1
Jasne, @flawr. Możesz założyć, że tablica będzie się składać tylko z wartości tego samego typu co wartość do sprawdzenia, jeśli twój język tego wymaga.
Gryphon - Przywróć Monikę
2
Wszystkie twoje tablice to 1D. Założenie?
Adám
1
@KevinCruijssen Miałem na myśli tablicę do przeszukania. Może to być multi-D.
Adám
1
W porządku. I jestem zaskoczony, że nie ma jeszcze języka, który mógłby to zrobić w 1 bajcie!
Zacharý

Odpowiedzi:

10

Pyth , 2 bajty

0-indeksowane.

xE

Wypróbuj online! lub Sprawdź wszystkie przypadki testowe


Wyjaśnienie

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
Pan Xcoder
źródło
Powinieneś zwrócić wszystkie wystąpienia, nie tylko pierwsze.
Erik the Outgolfer
@EriktheOutgolfer Naprawiono. Po prostu weź je w odwrotnej kolejności.
Pan Xcoder,
1
Pyth jest zdecydowanie najlepszym narzędziem do tego zadania: P
Mr. Xcoder
7

MATL , 2 bajty

mf

The m zużywa dwa argumenty i sprawdza każdy element tablicy, czy jest równa drugiej argumentu fzwraca indeksy wpisów truthy tablicy.

Wypróbuj online!

wada
źródło
Wydaje się, że nie działa w przypadku proponowanych przypadków testowych, tak samo w przypadku rozwiązania Octave.
Cinaski,
Powinieneś używać ismemberzamiast =poprawnie obsługiwać tablice ciągów. mf
Suever,
@LuisMendo Nie musimy brać pod uwagę mieszanych danych wejściowych, zobacz wyjaśnienie OP!
flawr
@flawr Och, dlaczego to tylko w komentarzu, a nie w tekście wyzwania? : - /
Luis Mendo
Będziesz musiał zapytać OP, a nie mnie :)
flawr
7

Python 3 , 45 bajtów

-3 bajty dzięki @EriktheOutgolfer i @Chris_Rands

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

Pakiet testowy.

Dzisiaj się nauczyłem enumerate(x) == zip(range(len(x)),x).


Python 3 , 47 bajtów

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

Wypróbuj online! lub Sprawdź wszystkie przypadki testowe

Pan Xcoder
źródło
Użyj, enumerate()aby obniżyć o kilka bajtów
Chris_Rands
@Chris_Rands Koniec końców był dłuższy.
Pan Xcoder,
3
lambda n,l:[x for x,y in enumerate(l)if y==n]
Erik the Outgolfer
Miałem na myśli to, co powiedział
@EriktheOutgolfer
1
@JonathanAllan Naprawiono.
Pan Xcoder,
6

R (+ pryr), 20 bajtów

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

Który ocenia się na funkcję

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

Gdzie albo amoże być wartością, której należy szukać, a bwektorem lub na odwrót. W przypadku przedstawienia dwóch wektorów o nierównych długościach (pojedyncza wartość liczy się jako wektor długości-1 w R), R zawinie krótszy, aby pasował do długości dłuższego. Następnie sprawdzana jest równość. To generuje logiczny wektor. whichzapewnia indeksy, w których ten wektor jest prawdziwy.

Wypróbuj online!

JAD
źródło
6

JavaScript, 39 bajtów

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

Powyższy fragment kodu może nie działać we wszystkich przeglądarkach, więc oto link do TIO .

Cristian Lupascu
źródło
6

JavaScript (ES6), 44 43 bajty

Przekreślone 44 jest nadal regularne 44; (

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

Zaoszczędzono 1 bajt dzięki @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
źródło
Czy możesz zrobić ===normalny ==za jeden bajt mniej? Wymyśliłem dosłownie to samo, nazwy zmiennych i całą haha.
kamoroso94
4
===należy odróżnić 12od"12"
Christoph
1
@ kamoroso94 nie, oto dlaczego.
Pureferret
5

05AB1E , 4 bajty

QāsÏ

Wypróbuj online!

1-indeksowany.

Erik the Outgolfer
źródło
Wydaje mi się, że obaj mamy problemy z wprowadzaniem: 12i [12,'12'], chyba że powiedział, że jest chłodny dla języków, które nie są konkretnymi typami, nie dbając o typy.
Magic Octopus Urn
Właściwie myślę, że 12'12'w 05AB1E, ponieważ czasami zachowują się inaczej ... nie jestem pewien, czy istnieje jakikolwiek test równości, który mógłby poprzeć taką rzecz.
Erik the Outgolfer
Gdybyśmy chcieli przetestować je pod kątem poprawności liczb całkowitych, nasze odpowiedzi byłyby jak przy użyciu 60 bajtów is_alpha (a)i is_number (d), ale sądzę, że możemy założyć, że nasze są poprawne, dopóki nie zostanie podane inaczej.
Magic Octopus Urn
5

C #, 88 72 bajtów

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

Zaoszczędź 16 bajtów dzięki @LiefdeWen.

Wypróbuj online!

TheLethalCoder
źródło
Niesamowite, wciąż próbowałem dowiedzieć się, dlaczego i==oto nie działa.
LiefdeWen,
3
@LiefdeWen Typy wartości w pudełkach.
TheLethalCoder
72 bajtyusing System.Linq;a=>b=>a.Select((x,i)=>x.Equals(b)?i:-1).Where(x=>x>=0)
LiefdeWen
@LiefdeWen Fajny, nie pomyślałbym o zmianie.
TheLethalCoder
Możesz dużo zaoszczędzić :): tio.run/…
digEmAll
5

Galaretka , 3 bajty

⁼€T

Wypróbuj online!

-1 dzięki Mr. Xcoder . (łańcuchy dyadyczne)

Erik the Outgolfer
źródło
1
Niezłe. Dziwi mnie, że Jelly nie ma wbudowanego czystego interfejsu, tak jak Pyth.
Pan Xcoder,
@ Mr.Xcoder Myślę, że większość nie.
Erik the Outgolfer
Ironia łańcuchów
dyadycznych
3

Haskell , 41 39 bajtów

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

Wypróbuj online!

Zaoszczędzono dwa bajty dzięki @flawr

Haskell jest wpisany statycznie, więc musiałem użyć małego obejścia, aby uruchomić przypadki testowe.

Jferard
źródło
Nie potrzebujesz już swojego obejścia, zobacz komentarz PO.
flawr
1
Zdefiniuj również operatora v#l=...zamiast f v l=..., pozwoli Ci zaoszczędzić dwa bajty :)
flawr
@flawr I had the idea of v!l=..., but didn't kow if it was accepted. I'll edit the answer. Thanks!
jferard
1
Using map on some filter expression is often an indicator that a list comprehension might be shorter: v!l=[i|(i,x)<-zip[1..]l,x==v].
Laikoni
There is also a builtin, but unfortunately it is longer than Laikionis suggestion:)
flawr
3

Husk, 5 bytes

`fNm=

Try it online! 1-indexed.

Explanation

       -- 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
źródło
Does this work for arrays with strings, though?
officialaimm
1
@officialaimm It works for lists containing only strings: Try it online! Lists of mixed types are not supported by Haskell and thus by Husk, but OP allowed this explicitly in the comments.
Laikoni
Is there a documentation of Husk?
flawr
@flawr Yes, it's in the wiki on the github page: github.com/barbuz/Husk/wiki
Laikoni
@flawr If you have questions about the docs of Husk in general, join us in the chatroom!
Zgarb
3

Ruby, 46 40 39 bytes

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

Saved 7 bytes!!! thanks to Eric Duminil.

Try it online.

Cristian Lupascu
źródło
-1 byte with !1 for false.
Eric Duminil
3

Ruby, 38 bytes

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

Try it online!

Idva
źródło
2
Welcome to PPCG!
Martin Ender
3

Google Sheets, 101 bytes

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

Value V in A1 and array A in B1 with each entry separated by a comma. Null entires are not allowed (row 5 below shows what happens).

Result

Explanation:

Offset(A1,0,0,1,Counta(Split(B1,","))) returns a range that is one row tall and as many columns wide as there are entries in A1.

=IfError(Join(",",Filter(Column(~),Exact(Split(B1,","),A1))),"") filters the column numbers of that range based on whether or not the value in A1 is exactly each of the values in B1 and concatenates them all in a comma-delineated list.

Engineer Toast
źródło
3

Clojure, 40 bytes

First attempt at code golf.

keep-indexed maps a function over a collection here, passing the current index into the callback and yielding any non-nil return values.

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

Try it online!

Devo
źródło
3

APL (Dyalog Unicode), 2 bytesSBCS

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

Adám
źródło
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 isn't in the character set. Still, since Dyalog uses way less than 256 unique chars, it could have been a single byte. When we add new glyphs, we refrain from changing the character set so that backwards compatibility is maintained.
Adám
Ah, Thanks! (I have no idea how APL / Dyalog works)
Mr. Xcoder
@Mr.Xcoder APL is a commercial language (not a golfing language), so Dyalog have certain obligations to existing subscribers.
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).

Neil
źródło
2

Python 2, 49 bytes

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

Try it online!

Not short enough, but I thought it was cool. ¯\_(ツ)_/¯

totallyhuman
źródło
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!

Dada
źródło
2

Haskell, 37 33 bytes

import Data.List
findIndices.(==)

Thanks @Laikoni for -4 bytes!

Try it online!

flawr
źródło
Pointfree is shorter: findIndices.(==)
Laikoni
Oh right, that is even more pointfree, thanks=)
flawr
1
Why not 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 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
Kevin Cruijssen
źródło
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]
Magic Octopus Urn
źródło
1

Mathematica, 12 bytes

Position@##&

1-Indexed

input [Array,Value]

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

output

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

J42161217
źródło
Why not just Position?
hftf
1

Haskell, 29 bytes

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

Try it online!

nimi
źródło
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!

Justin Mariner
źródło
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.

Sean
źródło
eqv might be better than === depending on what you want to consider equivalent values.
Brad Gilbert b2gills
1

Common Lisp, 66 bytes

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

Try it online!

Renzo
źródło
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
Kaz
źródło
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.

NikoNyrh
źródło
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;
}
Marcos
źródło
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