Wo ist mein Wert?


20

Mein Chef möchte jetzt, dass ich einen Mechanismus implementiere, mit dem er nach einem Element in einem Array suchen und ihm den Index / die Indizes geben kann, in denen dieser Wert vorkommt.

Deine Aufgabe:

Schreiben Sie ein Programm oder eine Funktion, die ein Array und einen Wert (String, Integer, Float oder Boolean) empfängt, und geben Sie die Indizes des Arrays zurück, an dem der Wert auftritt (entweder 0 oder 1 indiziert, je nachdem, was Sie bevorzugen). Wenn der Wert nicht im Array enthalten ist, geben Sie ein leeres Array zurück.

Eingang:

Ein Array A und ein Wert V, die in A vorhanden sein können oder nicht.

Ausgabe:

Ein Array, das die Indizes enthält, bei denen V in A vorkommt, oder, falls V in A nicht vorkommt, ein leeres Array.

Testfälle:

Bitte beachten Sie, dass die Testfälle auf 0 basieren.

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]

Wertung:

Das ist , also gewinnt die niedrigste Punktzahl in Bytes.


1
Können wir annehmen, dass das angegebene Array nur einen dieser Typen hat (dh keine Arrays mit gemischten Typen), da viele Sprachen keine Arrays oder Listen mit mehr als einem Typ unterstützen.
Fehler

1
Sicher, @flawr. Sie können davon ausgehen, dass das Array nur dann aus Werten des gleichen Typs wie der zu überprüfende Wert besteht, wenn Ihre Sprache dies erfordert.
Gryphon - Wiedereinsetzung von Monica

2
Alle Ihre Arrays sind 1D. Annahme?
Adám

1
@ KevinCruijssen Ich meinte das Array durchsucht werden. Es könnte Multi-D sein.
Adám

1
Okay. Und ich bin überrascht, dass es noch keine Sprache gibt, die das in 1 Byte kann!
Zacharý

Antworten:


10

Pyth , 2 Bytes

0-indiziert.

xE

Probieren Sie es online! oder Überprüfen Sie alle Testfälle


Erläuterung

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

Sie sollen alle Vorkommen zurückgeben, nicht nur die ersten.
Erik der Outgolfer

@EriktheOutgolfer Behoben. Nehmen Sie sie einfach in umgekehrter Reihenfolge.
Mr. Xcoder

1
Pyth ist definitiv das beste Werkzeug für diesen Job: P
Mr. Xcoder

7

MATL , 2 Bytes

mf

Das mkonsumiert zwei Argumente und prüft jedes Element im Array, ob es dem anderen Argument entspricht. Es fgibt die Indizes der wahrheitsgemäßen Einträge eines Arrays zurück.

Probieren Sie es online!


Es scheint nicht für die vorgeschlagenen Testfälle zu funktionieren, wie auch für die Octave-Lösung.
Cinaski

Sie sollten ismemberstattdessen verwenden =, um Zeichenfolgenarrays ordnungsgemäß zu behandeln. mf
Suever

@ LuisMendo Wir müssen gemischte Eingaben nicht berücksichtigen, siehe Erläuterung von OP!
Fehler

@flawr Oh, warum steht das nur in einem Kommentar und nicht im Aufforderungstext ? : - /
Luis Mendo

Sie
müssten

7

Python 3 , 45 Bytes

-3 Bytes dank @EriktheOutgolfer und @Chris_Rands

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

Test Suite.

Heute habe ich gelernt 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]

Probieren Sie es online! oder Überprüfen Sie alle Testfälle


Verwenden Sie enumerate(), um es ein paar Bytes nach unten zu bringen
Chris_Rands

@Chris_Rands Wurde länger.
Mr. Xcoder

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

Ich meinte, was @EriktheOutgolfer sagte
Chris_Rands

1
@ JonathanAllan behoben.
Mr. Xcoder

6

R (+ Pryr), 20 Bytes

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

Welches zur Funktion auswertet

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

Wobei entweder ader zu suchende Wert und bder Vektor sein können oder umgekehrt. Wenn zwei Vektoren ungleicher Länge angezeigt werden (ein einzelner Wert zählt als ein Vektor der Länge 1 in R), wird R den kürzeren Vektor so umschließen, dass er der Länge des längeren Vektors entspricht. Dann wird die Gleichheit geprüft. Dies erzeugt einen logischen Vektor. whichLiefert die Indizes, bei denen dieser Vektor wahr ist.

Probieren Sie es online!


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

Das obige Snippet funktioniert möglicherweise nicht in allen Browsern. Hier ist ein TIO-Link .


6

JavaScript (ES6), 44 43 Byte

Durchgestrichen 44 ist immer noch regulär 44; (

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

1 Byte dank @Arnauld gespeichert

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]


Kannst du das für ein Byte weniger ===normal machen ==? Ich habe mir im wahrsten Sinne des Wortes das Gleiche ausgedacht, Variablennamen und alles haha.
Kamoroso94

4
===ist nötig, um zu unterscheiden 12von"12"
Christoph

1
@ kamoroso94 nein, hier ist warum.
Pureferret

5

05AB1E , 4 Bytes

QāsÏ

Probieren Sie es online!

1-indiziert.


Ich denke, beide von uns vermasseln Eingaben von: 12und [12,'12'], es sei denn, er sagte, es ist kalt für Sprachen, die keinen konkreten Typ haben, um sich nicht um Typen zu kümmern.
Magic Octopus Urn

Ich glaube tatsächlich , dass 12'12'in 05AB1E weil sie manchmal anders verhalten ... nicht sicher , ob es irgendeine Gleichheit Test, obwohl so etwas unterstützen kann.
Erik der Outgolfer

Wenn wir sie auf ganzzahlige Gültigkeit testen wollten, wären unsere Antworten wie 60 Bytes mit is_alpha (a)und is_number (d), aber ich denke, wir können davon ausgehen, dass unsere gültig sind, bis etwas anderes gesagt wird.
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)

16 Bytes dank @LiefdeWen eingespart.

Probieren Sie es online!


Erstaunlich, ich habe immer noch versucht herauszufinden, warum i==oes nicht funktioniert.
LiefdeWen

3
@LiefdeWen Boxed-Werttypen.
TheLethalCoder

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

@LiefdeWen Netter, ich hätte nicht gedacht, es umzuschalten.
TheLethalCoder

Sie können viel sparen :): tio.run/…
digEmAll


3

Haskell , 41 39 Bytes

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

Probieren Sie es online!

Zwei Bytes dank @flawr gespart

Haskell ist statisch typisiert, daher musste ich die Testfälle mit einer kleinen Umgehungslösung ausführen.


Sie brauchen Ihren Workaround nicht mehr, siehe den Kommentar des OP.
Fehler

1
Definieren Sie auch einen Operator v#l=...anstelle von f v l=..., sparen Sie zwei Bytes :)
Fehler

@flawr Ich hatte die Idee v!l=..., wusste aber nicht, ob es akzeptiert wurde. Ich werde die Antwort bearbeiten. Vielen Dank!
Jferard

1
Mit mapauf einigen filterAusdruck ist häufig ein Indikator dafür , dass eine Liste Verständnis könnte kürzer sein: v!l=[i|(i,x)<-zip[1..]l,x==v].
Laikoni

Es gibt auch eine eingebaute, aber leider ist es länger als Laikionis Vorschlag :)
Fehler

3

Schale , 5 Bytes

`fNm=

Probieren Sie es online! 1-indiziert.

Erläuterung

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

Funktioniert dies jedoch für Arrays mit Strings?
Amtszeit

1
@officialaimm Funktioniert für Listen, die nur Zeichenfolgen enthalten: Probieren Sie es online aus! Listen gemischter Typen werden von Haskell und damit von Husk nicht unterstützt, OP hat dies jedoch ausdrücklich in den Kommentaren zugelassen.
Laikoni

Gibt es eine Dokumentation von Husk?
Fehler

@flawr Ja, es ist im Wiki auf der Github-Seite: github.com/barbuz/Husk/wiki
Laikoni

@flawr Wenn Sie Fragen zu den Dokumenten von Husk im Allgemeinen haben, besuchen Sie uns im Chatroom !
Zgarb



3

Google Sheets, 101 Bytes

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

Wert Vin A1und Array Ain, B1wobei jeder Eintrag durch ein Komma getrennt ist. Null-Einträge sind nicht zulässig (Zeile 5 unten zeigt, was passiert).

Ergebnis

Erläuterung:

Offset(A1,0,0,1,Counta(Split(B1,",")))Gibt einen Bereich zurück, der eine Zeile hoch und so viele Spalten breit ist, wie Einträge in vorhanden sind A1.

=IfError(Join(",",Filter(Column(~),Exact(Split(B1,","),A1))),"")filtert die Spaltennummern dieses Bereichs basierend darauf, ob der Wert in A1genau einem der Werte in entspricht, B1und verknüpft sie alle in einer durch Kommas getrennten Liste.


3

Clojure , 40 Bytes

Erster Versuch, Code Golf zu spielen.

keep-indexed ordnet hier eine Funktion einer Auflistung zu, übergibt den aktuellen Index an den Callback und gibt alle Nicht-Null-Rückgabewerte zurück.

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

Probieren Sie es online!


3

APL (Dyalog Unicode) , 2 Byte SBCS

Nimmt das zu suchende Element als linkes Argument (muss skalar sein, um ein Element des Lookup-Arrays anstelle eines Subarrays zu finden) und das Lookup-Array (das bis zu 15 Dimensionen haben kann) als rechtes Argument. Gibt eine Liste von Indizes zurück, von denen jeder so viele Elemente wie die Anzahl der Dimensionen im Nachschlage-Array haben kann.

⍸⍷

Probieren Sie es online!

Findet heraus, wo

 gefunden


Ich wollte gerade sagen, dass es Pyth verbindet, aber Sie wissen schon ... Unicode. Wäre dies nicht 2 Byte in APL Dyalog Classic (da es SBCS verwendet)?
Mr. Xcoder

@ Mr.Xcoder ist nicht im Zeichensatz. Da Dyalog jedoch weit weniger als 256 eindeutige Zeichen verwendet, könnte es sich um ein einzelnes Byte handeln. Wenn wir neue Glyphen hinzufügen, dürfen wir den Zeichensatz nicht so ändern, dass die Abwärtskompatibilität erhalten bleibt.
Adám

Ah danke! (Ich habe keine Ahnung, wie APL / Dyalog funktioniert)
Mr. Xcoder

@ Mr.Xcoder APL ist eine Handelssprache (keine Golfsprache), daher hat Dyalog bestimmte Verpflichtungen gegenüber bestehenden Abonnenten.
Adám

APL ist keine Golfsprache, aber es gibt Open-Source-APL-Implementierungen (ngn und 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

Übernimmt Eingaben als Befehlszeilenparameter (wertet dann die Array-Elemente als separate Parameter). Hinweis: Das Zitieren von Zeichenfolgen wird als Teil der Übereinstimmung betrachtet, z. B. "1"nicht gleich 1(würde 6 Byte kosten).



2

Perl 5 , 28 Bytes

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

Probieren Sie es online!

Die Ausgabe ist 1-indiziert.
Eine anonyme Funktion ist für Perl ziemlich ungewöhnlich, aber es ist die kürzeste, die ich mir vorstellen kann. grep ..., 1 .. @_iteriert über die Indizes des Eingabearrays (tatsächlich geht es eine Zelle über die letzte hinaus, aber es spielt keine Rolle) und behält nur den Index bei, der erfüllt $_[$_]eq$_[0], d. h. Diejenigen, bei denen der Wert des Elements ( $_[$_]) dem Wert entspricht, den wir behalten müssen ( $_[0]).


Etwas länger (31 Bytes (30 + -lFlag)), aber als volles Programm:

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

Probieren Sie es 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 dank @TAsk mit Vectoranstelle von ArrayList.
-1 Byte mit Stackanstelle von Vector.
-2 Bytes dank @Jakob durch Eingabe von a ArrayListanstelle eines Arrays.

0-indiziert

Erläuterung:

Probieren Sie es hier aus.

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! Wenn ich mich nicht irre, Vectorkönnen einige Bytes gespart werden. :)
CoderCroc

1
@TAsk Danke! Muss mich daran erinnern. Ich benutze List+ ArrayListziemlich oft.
Kevin Cruijssen

1
List r=new Vector();wird auch funktionieren.
CoderCroc

1
Sie können 1 Byte speichern, indem Sie stattdessen eine Liste erstellen: TIO . Scheint eine kleine Änderung zu sein, die keine separate Antwort verdient.
Jakob

Die Änderung bricht das Suchen ab null, aber das ist in Ordnung.
Jakob

1

05AB1E , 4 Bytes

Qƶ0K

Probieren Sie es online!

Es ist 1-indiziert, wie unten gezeigt:

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

Eingang [Array, Wert]

[{12, 14, 14, 2, "Hallo Welt!", 3, 12, 12}, 12]

Ausgabe

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


Warum nicht einfach Position?
HFTF

1

Haskell, 29 Bytes

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

Probieren Sie es online!


Funktioniert das mit den heterogenen Eingabefällen? (Mischungen aus ganzen Zahlen, Zeichenketten, einem "wahren" Wert usw.).
Kaz

@ Kaz: Nein, tut es nicht. Es ist polymorph und funktioniert für jeden Typ, für den Gleichheit definiert ist, aber alle Listenelemente müssen vom gleichen Typ sein. Laut einem Kommentar im OP ist das genug.
nimi

1

Japt , 9 Bytes

mȶV©YÄÃf

1-indiziert.

Die Japt-Eingabe unterstützt keine Booleschen Werte, daher wurden sie durch 0und 1in den Testfällen ersetzt.

Probieren Sie es online! mit dem -QFlag, um die Array-Ausgabe zu formatieren.

0-indizierte Lösung, 11 Bytes

l o f@gX ¶V

Probieren Sie es online!


Eines der wenigen Male, anstatt sich als ¥nützlich zu erweisen: PI dachte darüber nach, etwas in der Art zu tun m@Y*(X¶V} f, aber ich hatte nicht bemerkt, dass dies für den Index nicht funktionieren würde 0. 1-Indizierung ist clever ...
ETHproductions

1

Perl 6 , 21 Bytes

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

Probieren Sie es online!

Das :kAdverb to grepweist es an, die übereinstimmenden Schlüssel (Indizes) der Eingabesequenz zurückzugeben, die mit dem Prädikat übereinstimmen * === $^v.

Wenn Zeichenfolgen und Zahlen als gleichwertig angesehen würden, könnte man ein grep-Prädikat von just $^vanstelle von verwenden * === $^v.


eqvist möglicherweise besser als ===abhängig davon, was Sie als äquivalente Werte betrachten möchten.
Brad Gilbert b2gills


1

TXR Lisp , 26 Bytes

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

Mit anderen Worten: "Wo ist Argument 2 gleich Argument 1?"

Lauf:

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

Ein bisschen dunkel :) Das erste Eingabeargument ist ein vecvon Werten und das zweite ist der gesuchte Wert. %ordnet Indizes Werten zu, und die Menge #{%2}gibt für diesen Wert " truthy" (das Eingabeargument %2) oder "falsy" zurück nil. comp setzt diese zusammen.


1

C 340 362 166 115 Bytes

Hallo alle. Mein erstes Mal hier. Ich dachte, da es mir Spaß macht (zu versuchen), optimierten Code zu schreiben, kann ich dies auch versuchen.

@ Rodney - ~ 39 Bytes aus dem Includes

@ Zacharý - 7 Bytes mit impliziter Eingabe

0-indiziert .

Wie man läuft:

Gemäß dem @Arnolds-Vorschlag nimmt das Programm Argumente auf eine viel C-freundlichere Art und Weise entgegen. Dadurch konnte ich die Größe der Datei um etwas mehr als die Hälfte reduzieren.

Die Argumente sollten in der folgenden Reihenfolge übergeben werden, value [element1 ...] wobei geschweifte Klammern optionale Argumente angeben

Möglicherweise müssen Sie den angegebenen Zeichenfolgen Anführungszeichen hinzufügen, um die Bedingung von zu erfüllen 12 != "12". Auf meinem System kann dies auf folgende Weise erfolgen

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

Golf gespielt

#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
Willkommen auf der Seite. Ich stelle fest, dass Sie viel mehr Leerzeichen haben. Besonders um Betreiber i = 0. Diese können entfernt werden. Ich schlage vor, ein bisschen mit dem Leerzeichen herumzuspielen.
Weizen-Zauberer

Bei der Art und Weise, wie Sie mit der Liste umgehen, handelt es sich um ein erstes Argument ,12und ein zweites Argument für [12,14,14,2,"Hello World!",3,12,12]Ausdrucke, [5,6]die technisch inkorrekt sind.
Arnold Palmer

@ArnoldPalmer Ich habe den Code aktualisiert, um ihn beim Erkennen von Datentypen etwas ausführlicher zu gestalten. Da C jedoch nicht über die gesamte Konvertierung ausgefallener Typen wie JavaScript verfügt, ist es immer noch anfällig, ein Komma in einem 'Zahlen'-Typ zu haben. Ich habe es so ziemlich einfach verlassen, vorausgesetzt, die Eingabe ist korrekt formatiert.
Marcos

@Marcos Möglicherweise können Sie jeden Wert des Arrays als eigenes Befehlszeilenargument verwenden. Ich spiele in C nie Golf, bin mir also nicht ganz sicher, wie die Regeln lauten, aber es erscheint mir nicht unvernünftig, dass Sie das dürfen. Zumal Sie durch das Akzeptieren des Arrays als Liste für dieses Problem anfällig werden. Außerdem haben Sie in Ihrem Golf-Code noch ein wenig Leerraum. Sie benötigen keine Leerzeichen in den #includeAnweisungen, strstr(h+i,n)-h ==ihaben ein zusätzliches Leerzeichen und können dies return-1anstelle von tun return -1.
Arnold Palmer

sind implizite deklarationen erlaubt? Ich denke, Sie können die #includeAussagen fallen lassen
Rodney
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.