Giá trị của tôi ở đâu?


20

Bây giờ ông chủ của tôi muốn tôi thực hiện một cơ chế cho phép anh ta tìm kiếm một mục trong một mảng và đưa cho anh ta chỉ mục / chỉ số nơi giá trị đó xảy ra.

Nhiệm vụ của bạn:

Viết chương trình hoặc hàm nhận một mảng và một giá trị (String, Integer, Float hoặc Boolean) và trả về các chỉ số của mảng mà giá trị xảy ra (0 hoặc 1 được lập chỉ mục, tùy theo bạn thích). Nếu giá trị không nằm trong mảng trả về một mảng trống.

Đầu vào:

Một mảng A và một giá trị V, có thể có hoặc không có trong A.

Đầu ra:

Một mảng chứa các chỉ số mà tại đó V xảy ra trong A hoặc, nếu V không xảy ra trong A, một mảng trống.

Các trường hợp thử nghiệm:

Xin lưu ý rằng các trường hợp thử nghiệm là 0 dựa.

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]

Ghi điểm:

Đây là , vì vậy điểm thấp nhất tính bằng byte sẽ thắng.


1
Chúng ta có thể giả sử rằng mảng đã cho chỉ có một trong các loại đó (tức là không có mảng nào có loại hỗn hợp) vì nhiều ngôn ngữ không hỗ trợ mảng hoặc danh sách có nhiều hơn một loại.
flawr

1
Chắc chắn rồi, @flawr. Bạn có thể giả định rằng mảng sẽ chỉ bao gồm các giá trị cùng loại với giá trị cần kiểm tra, nếu ngôn ngữ của bạn yêu cầu nó.
Gryphon - Tái lập Monica

2
Tất cả các mảng của bạn là 1D. Giả định?
Adám

1
@KevinCruijssen Ý tôi là mảng cần tìm. Nó có thể là đa D.
Adám

1
Đuợc. Và tôi ngạc nhiên là chưa có một ngôn ngữ nào có thể làm điều đó trong 1 byte!
Zacharý

Câu trả lời:


10

Bình thường , 2 byte

Chỉ số 0.

xE

Hãy thử trực tuyến! hoặc Kiểm tra tất cả các trường hợp kiểm tra


Giải trình

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

Bạn phải trả lại tất cả các lần xuất hiện không chỉ lần đầu tiên.
Erik the Outgolfer

@EriktheOutgolfer Đã sửa. Chỉ cần đưa chúng theo thứ tự ngược lại.
Ông Xcoder

1
Pyth chắc chắn là công cụ tốt nhất cho công việc sau đó: P
Ông Xcoder

7

MATL , 2 byte

mf

Việc mtiêu thụ hai đối số và kiểm tra từng phần tử trong mảng xem có bằng với đối số khác không, ftrả về các chỉ số của các mục trung thực của một mảng.

Hãy thử trực tuyến!


Nó dường như không hoạt động cho các trường hợp thử nghiệm được đề xuất, tương tự cho giải pháp Octave.
Cinaski

Bạn nên sử dụng ismemberthay vì =để xử lý đúng các chuỗi của chuỗi. mf
Suever

@LuisMendo Chúng tôi không cần xem xét đầu vào hỗn hợp, xem làm rõ từ OP!
flawr

@flawr Ồ, tại sao chỉ trong một bình luận chứ không phải trong văn bản thách thức? : - /
Luis Mendo

Bạn sẽ phải hỏi OP chứ không phải tôi :)
flawr

7

Python 3 , 45 byte

-3 byte nhờ @EriktheOutgolfer và @Chris_Rands

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

Phòng thử nghiệm.

Hôm nay tôi học được enumerate(x) == zip(range(len(x)),x).


Python 3 , 47 byte

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

Hãy thử trực tuyến! hoặc Kiểm tra tất cả các trường hợp kiểm tra


Sử dụng enumerate()để đưa nó xuống một vài byte
Chris_Rands

@Chris_Rands Đã kết thúc lâu hơn.
Ông Xcoder

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

Ý tôi là những gì @EriktheOutgolfer đã nói
Chris_Rands

1
@Jonathan ALLan Đã sửa.
Ông Xcoder

6

R (+ pryr), 20 byte

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

Mà đánh giá chức năng

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

Trường hợp có athể là giá trị cần tìm và bvectơ, hoặc ngược lại. Khi được trình bày với hai vectơ có độ dài không bằng nhau (một giá trị duy nhất được tính là vectơ có độ dài-1 trong R), R sẽ quấn một vectơ ngắn hơn để phù hợp với độ dài của phần dài hơn. Sau đó, đẳng thức được kiểm tra. Điều này tạo ra một vectơ logic. whichcung cấp các chỉ số trong đó vectơ này là đúng.

Hãy thử trực tuyến!


6

JavaScript, 39 byte

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ạn mã trên có thể không hoạt động trên tất cả các trình duyệt, vì vậy đây là liên kết TIO .


6

JavaScript (ES6), 44 43 byte

Vượt qua 44 vẫn là 44 thường xuyên (

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

Đã lưu 1 byte nhờ @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]


Bạn có thể làm cho ===một bình thường ==cho một byte ít hơn? Tôi đã nghĩ ra cùng một thứ theo nghĩa đen, tên biến và tất cả haha.
kamoroso94

4
===là cần thiết để phân biệt 12với"12"
Christoph

1
@ kamoroso94 không, đây là lý do.
Pureferret

5

05AB1E , 4 byte

QāsÏ

Hãy thử trực tuyến!

1 chỉ mục.


Tôi nghĩ rằng cả hai chúng ta đều nhầm lẫn về các yếu tố đầu vào của: 12[12,'12'], trừ khi anh ấy nói rằng đó là những ngôn ngữ không thực sự cụ thể để không quan tâm đến các loại.
Bạch tuộc ma thuật Urn

Tôi thực sự nghĩ rằng 12'12'trong 05AB1E bởi vì đôi khi họ cư xử khác nhau ... không chắc có bất kỳ bài kiểm tra công bằng nào có thể hỗ trợ một điều như vậy không.
Erik the Outgolfer

Nếu chúng tôi muốn kiểm tra tính hợp lệ của số nguyên, câu trả lời của chúng tôi sẽ giống như 60 byte bằng cách sử dụng is_alpha (a)is_number (d), nhưng tôi đoán chúng tôi có thể cho rằng giá trị của chúng tôi là hợp lệ cho đến khi được nói khác đi.
Bạch tuộc ma thuật Urn

5

C #, 88 72 byte

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

Đã lưu 16 byte nhờ @LiefdeWen.

Hãy thử trực tuyến!


Amazing, I was still trying to figure out why i==o doesn't work.
LiefdeWen

3
@LiefdeWen Boxed value types.
TheLethalCoder

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

@LiefdeWen Nice one, I wouldn't have thought of switching it around.
TheLethalCoder

You can save a lot :) : 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 byte

Chào mọi người. Lần đầu tiên của tôi ở đây. Tôi hình dung từ khi tôi thích (cố gắng) viết mã được tối ưu hóa, tôi cũng có thể thử cái này.

@Rodney - ~ 39 byte từ bao gồm

@ Zacharý - 7 byte với kiểu gõ ngầm

Chỉ số 0 .

Cách chạy:

Theo đề xuất của @Arnold, chương trình lấy các đối số theo cách thân thiện hơn nhiều so với C. Điều này cho phép tôi giảm kích thước của tập tin xuống hơn một nửa.

Các đối số phải được truyền theo thứ tự sau value [element1 ...] trong đó dấu ngoặc chỉ ra các đối số tùy chọn

Bạn có thể hoặc không phải thêm dấu ngoặc kép vào bất kỳ chuỗi nào được cung cấp để đáp ứng điều kiện 12 != "12". Trên hệ thống của tôi, điều này có thể được thực hiện theo cách sau

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

đánh gôn

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

vô dụng

#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 Có một cơ hội bạn có thể lấy từng giá trị của mảng làm đối số dòng lệnh của riêng nó. Tôi không chơi golf ở C bao giờ, vì vậy không chắc chắn các quy tắc là gì, nhưng dường như không hợp lý với tôi rằng bạn sẽ được phép làm điều đó. Đặc biệt kể từ khi chấp nhận mảng như một danh sách khiến bạn dễ gặp phải vấn đề này. Ngoài ra, bạn vẫn có một chút khoảng trắng trong mã golf của mình. Bạn không cần khoảng trắng trên #includebáo cáo, strstr(h+i,n)-h ==icó thêm khoảng trắng và bạn có thể thực hiện return-1thay vì return -1.
Arnold Palmer

khai báo ngầm được phép? Tôi nghĩ bạn có thể bỏ qua các #includetuyên bố
Rodney
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.