我的价值在哪里?


20

我的老板现在要我实现一种机制,使他可以搜索数组中的项目,并为他提供该值所在的索引。

你的任务:

编写一个程序或函数,该程序或函数接收一个数组和一个值(字符串,整数,浮点数或布尔值),并返回出现该值的数组的索引(0或1索引,以您喜欢的为准)。如果该值不在数组中,则返回一个空数组。

输入:

A中可能存在或不存在的数组A和值V。

输出:

包含V在A中出现的索引的数组,如果V在A中不出现,则为空数组。

测试用例:

请注意,测试用例基于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]

得分:

这是,因此以字节为单位的最低分数获胜。


1
我们可以假设给定的数组只有一个这些类型(即混合型非数组)尽可能多的语言不支持数组或列表与多个类型。
瑕疵

1
当然,@ flawr。如果您的语言要求,则可以假定数组仅由与要检查的值相同类型的值组成。
狮phon-恢复莫妮卡

2
您所有的阵列都是一维的。假设?
亚当

1
@KevinCruijssen我的意思是要搜索的数组。它可以是多维的。
2015年

1
好的。我感到惊讶的是,还没有一种语言能够在1个字节内做到这一点!
扎卡里

Answers:


10

Pyth,2个字节

0索引。

xE

在线尝试!检查所有测试用例


说明

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

您应该返回所有事件,而不仅仅是第一次。
暴民埃里克(Erik the Outgolfer)'17年

@EriktheOutgolfer固定。只是以相反的顺序。
Xcoder先生17年

1
Pyth绝对是当时最好的工具:P
Xcoder先生,17年

7

MATL,2个字节

mf

m消耗两个参数,并且检查该阵列中的每个元素是否等于另一个参数,f返回一个阵列的truthy条目的索引。

在线尝试!


对于建议的测试用例,它似乎不起作用,对于Octave解决方案,它似乎不起作用。
Cinaski

您应该使用ismember而不是=来正确处理字符串数组。mf
Suever

@LuisMendo我们不需要考虑混合输入,请参阅OP中的说明!
瑕疵

@flawr哦,为什么只在评论中而不是在挑战文本中?:-/
路易斯·门多

您必须问问操作员,而不是我:)
更加糟糕的

7

Python 3 3,45字节

-3个字节,感谢@EriktheOutgolfer和@Chris_Rands

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

测试套件。

今天我学到了 enumerate(x) == zip(range(len(x)),x)


Python 3,47个字节

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

在线尝试!检查所有测试用例


使用enumerate()使其下降了几个字节
Chris_Rands

@Chris_Rands最终变得更长了。
Xcoder先生17年

3
lambda n,l:[x for x,y in enumerate(l)if y==n]
暴民埃里克(Erik the Outgolfer)'17年

我的意思是@EriktheOutgolfer说的
Chris_Rands

1
@JonathanAllan固定。
Xcoder先生17年

6

R(+ pryr),20个字节

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

对功能求值

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

无论在哪里a能值来寻找和b载体,或者周围的其他方法。当出现两个长度不等的向量(R中的一个值算作长度为1的向量)时,R将包裹较短的一个以匹配较长的一个的长度。然后检查相等性。这产生逻辑向量。which提供此向量为true的索引。

在线尝试!


6

JavaScript,39个字节

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

上面的代码片段可能不适用于所有浏览器,因此这里是一个TIO链接


6

JavaScript(ES6),44 43字节

划掉44仍然是常规44;(

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

@Arnauld 节省了1个字节

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]


您可以将===正常==数减少一个字节吗?我想到了实际上相同的东西,变量名等等。
kamoroso94 '17

4
===有必要与其他人区分开12"12"
Christoph

1
@ kamoroso94不,是为什么。
Pureferret

5

05AB1E,4个字节

QāsÏ

在线尝试!

1个索引。


我认为我们俩都把:12和的输入搞混了[12,'12'],除非他说对于那些不是真正的具体类型而不关心类型的语言来说是不寒而栗的。
魔术

我实际上认为05AB1E 中的12'12'是因为有时它们的行为有所不同...不确定是否有任何相等性测试可以支持这种情况。
Erik the Outgolfer '17

如果我们想测试它们的整数有效性,我们的答案将使用is_alpha (a)和像60字节一样is_number (d),但是我猜我们可以假设我们的答案是有效的,除非另行告知。
魔术章鱼缸

5

C#,88 72字节

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

@LiefdeWen节省了16个字节。

在线尝试!


令人惊讶的是,我仍在尝试找出为什么i==o不起作用。
LiefdeWen

3
@LiefdeWen装箱的值类型。
TheLethalCoder

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

@LiefdeWen不错,我不会想到要改变它。
TheLethalCoder

:你可以节省很多:) tio.run/...
digEmAll


3

Haskell, 41 39 bytes

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

Try it online!

Saved two bytes thanks to @flawr

Haskell is statically typed, so I had to use a little workaround to run the test cases.


You don't need your workaround anymore, see the comment of the OP.
flawr

1
Also define a operator v#l=... instead of f v l=..., will save you two bytes:)
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

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

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.


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!


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


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



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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.