Dov'è il mio valore?


20

Il mio capo ora vuole che io implementi un meccanismo che gli permetta di cercare un oggetto in un array e gli dia l'indice / gli indici in cui si verifica quel valore.

Il tuo compito:

Scrivi un programma o una funzione che riceve un array e un valore (String, Integer, Float o Boolean) e restituisce gli indici dell'array in cui si verifica il valore (0 o 1 indicizzato, a seconda di quale preferisci). Se il valore non è nella matrice, restituire una matrice vuota.

Ingresso:

Un array A e un valore V, che possono o meno essere presenti in A.

Produzione:

Un array contenente gli indici in corrispondenza dei quali V si presenta in A o, se V non si verifica in A, un array vuoto.

Casi test:

Si noti che i casi di test sono basati su 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]

punteggio:

Questo è , quindi vince il punteggio più basso in byte.


1
Possiamo supporre che l'array specificato abbia solo uno di quei tipi (cioè nessun array con tipi misti) poiché molte lingue non supportano array o elenchi con più di un tipo.
Flawr

1
Certo, @flawr. Si può presumere che l'array sarà costituito solo da valori dello stesso tipo del valore da verificare, se la lingua lo richiede.
Gryphon - Ripristina Monica il

2
Tutti i tuoi array sono 1D. Assunzione?
Adám,

1
@KevinCruijssen Intendevo cercare l'array. Potrebbe essere multi-D.
Adám,

1
Va bene. E sono sorpreso che non ci sia ancora una lingua che possa farlo in 1 byte!
Zacharý,

Risposte:


10

Pyth , 2 byte

0-indicizzati.

xE

Provalo online! oppure Verifica tutti i casi di test


Spiegazione

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

Dovresti restituire tutte le occorrenze non solo la prima.
Erik the Outgolfer

@EriktheOutgolfer Fixed. Prendili in ordine inverso.
Mr. Xcoder,

1
Pyth è sicuramente lo strumento migliore per il lavoro allora: P
Mr. Xcoder

7

MATL , 2 byte

mf

Le mconsuma due argomenti, e controlla ogni elemento dell'array se è uguale l'altro argomento, frestituisce gli indici delle voci truthy di un array.

Provalo online!


Non sembra funzionare per i casi di test proposti, lo stesso per la soluzione Octave.
Cinaski,

È necessario utilizzare ismemberinvece di =gestire correttamente le matrici di stringhe. mf
Suever,

@LuisMendo Non abbiamo bisogno di considerare input misti, vedi chiarimenti da OP!
Flawr

@flawr Oh, perché è solo in un commento e non nel testo della sfida? : - /
Luis Mendo,

Dovresti chiedere
all'OP

7

Python 3 , 45 byte

-3 byte grazie a @EriktheOutgolfer e @Chris_Rands

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

Test Suite.

Oggi ho imparato 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]

Provalo online! oppure Verifica tutti i casi di test


Utilizzalo enumerate()per portarlo giù un paio di byte
Chris_Rands

@Chris_Rands Finì per essere più lungo.
Mr. Xcoder,

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

Volevo dire quello che ha detto @EriktheOutgolfer
Chris_Rands

1
@JonathanAllan Risolto.
Mr. Xcoder,

6

R (+ pryr), 20 byte

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

Che valuta la funzione

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

Dove uno apuò essere il valore da cercare e bil vettore o viceversa. Quando viene presentato con due vettori di lunghezze disuguali (un singolo valore conta come un vettore di lunghezza 1 in R), R avvolgerà quello più corto in modo che corrisponda alla lunghezza di quello più lungo. Quindi viene verificata l'uguaglianza. Questo genera un vettore logico. whichfornisce gli indici in cui questo vettore è vero.

Provalo online!


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

Lo snippet sopra potrebbe non funzionare su tutti i browser, quindi ecco un link TIO .


6

JavaScript (ES6), 44 43 byte

Cancellato 44 è ancora regolare 44; (

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

Salvato 1 byte grazie a @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]


Puoi rendere ===un normale ==per un byte in meno? Ho trovato letteralmente la stessa cosa, i nomi delle variabili e tutto ahah.
kamoroso94,

4
===è necessario distinguere 12da"12"
Christoph il

1
@ kamoroso94 no, ecco perché.
Pureferret,

5

05AB1E , 4 byte

QāsÏ

Provalo online!

1-indicizzati.


Penso che entrambi incasinino gli input di: 12e [12,'12'], a meno che non abbia detto che è freddo per le lingue che non sono davvero concrete da non preoccuparsi dei tipi.
Magic Octopus Urn,

In realtà penso che 12'12'in 05AB1E perché a volte si comportano diversamente ... non sono sicuro che ci sia un test di uguaglianza che possa supportare una cosa del genere.
Erik the Outgolfer,

Se volessimo testarli per la validità di numeri interi, le nostre risposte sarebbero come 60 byte usando is_alpha (a)e is_number (d), ma suppongo che possiamo supporre che le nostre siano valide fino a quando non viene detto diversamente.
Magic Octopus Urn,

5

C #, 88 72 byte

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

16 byte salvati grazie a @LiefdeWen.

Provalo online!


Incredibile, stavo ancora cercando di capire perché i==onon funziona.
Liefde:

3
@LiefdeWen Tipi di valore inscatolati.
TheLethalCoder

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

@LiefdeWen Bello, non avrei pensato di cambiarlo.
TheLethalCoder

Puoi risparmiare molto :): tio.run/…
digEmAll


3

Haskell , 41 39 byte

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

Provalo online!

Due byte salvati grazie a @flawr

Haskell è tipicamente statico, quindi ho dovuto usare un po 'di soluzione per eseguire i casi di test.


Non hai più bisogno della soluzione alternativa, vedi il commento del PO.
Flawr

1
Definisci anche un operatore v#l=...invece di f v l=..., ti farà risparmiare due byte :)
flawr

@flawr mi è venuta l'idea v!l=..., ma non ho capito se fosse stato accettato. Modificherò la risposta. Grazie!
jferard,

1
utilizzando map su qualche filterespressione è spesso un indicatore che una lista di comprensione potrebbe essere più breve: v!l=[i|(i,x)<-zip[1..]l,x==v].
Laikoni,

C'è anche un built-in, ma purtroppo è più lungo del suggerimento di Laikionis :)
flawr

3

Buccia , 5 byte

`fNm=

Provalo online!1-indicizzati.

Spiegazione

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

Questo funziona per array con stringhe, però?
officialaimm,

1
@officialaimm Funziona con elenchi contenenti solo stringhe: provalo online! Le liste di tipi misti non sono supportate da Haskell e quindi da Husk, ma OP lo ha consentito esplicitamente nei commenti.
Laikoni,

Esiste una documentazione di Husk?
Flawr

@flawr Sì, è nella wiki sulla pagina di github: github.com/barbuz/Husk/wiki
Laikoni

@flawr Se hai domande sui documenti di Husk in generale, unisciti a noi nella chatroom !
Zgarb,



3

Fogli Google, 101 byte

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

Valore Vin A1e array Ain B1con ogni voce separata da una virgola. Non sono ammessi valori null (la riga 5 in basso mostra cosa succede).

Result

Spiegazione:

Offset(A1,0,0,1,Counta(Split(B1,",")))restituisce un intervallo che è alto una riga e tante colonne quante sono le voci in A1.

=IfError(Join(",",Filter(Column(~),Exact(Split(B1,","),A1))),"")filtra i numeri di colonna di tale intervallo in base al fatto che il valore in A1sia esattamente ciascuno dei valori in B1e li concatena in un elenco delimitato da virgole.


3

Clojure , 40 byte

Primo tentativo di codice golf.

keep-indexed mappa una funzione su una raccolta qui, passando l'indice corrente nel callback e producendo valori di ritorno diversi da zero.

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

Provalo online!


3

APL (Dyalog Unicode) , 2 byte SBCS

Prende l'elemento da cercare come argomento di sinistra (deve essere scalare per trovare un elemento dell'array di ricerca anziché un subarray) e l'array di ricerca (che può avere fino a 15 dimensioni) come argomento giusto. Restituisce un elenco di indici, ognuno dei quali può avere tanti elementi quanti sono il numero di dimensioni nella matrice di ricerca.

⍸⍷

Provalo online!

ɩ ndices dove

 trovato


Stavo per dire che lega Pyth, ma sai ... Unicode. Non sarebbero 2 byte in APL Dyalog Classic (dal momento che usa SBCS)?
Mr. Xcoder,

@ Mr.Xcoder non è nel set di caratteri. Tuttavia, poiché Dyalog utilizza meno di 256 caratteri univoci, avrebbe potuto essere un singolo byte. Quando aggiungiamo nuovi glifi, ci asteniamo dal cambiare il set di caratteri in modo da mantenere la compatibilità con le versioni precedenti.
Adám,

Ah grazie! (Non ho idea di come funzioni APL / Dyalog)
Mr. Xcoder,

@ Mr.Xcoder APL è un linguaggio commerciale (non un linguaggio da golf), quindi Dyalog ha alcuni obblighi verso gli abbonati esistenti.
Adám,

APL non è un linguaggio golfistico, ma esistono implementazioni APL open-source (ngn e GNU).
Zacharý,

2

Lotto, 86 byte

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

Accetta input come parametri della riga di comando (valore quindi gli elementi dell'array come parametri separati). Nota: la quotazione di stringa è considerata parte della corrispondenza, ad esempio "1"non sarà uguale 1(costerebbe 6 byte).



2

Perl 5 , 28 byte

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

Provalo online!

L'output è 1 indicizzato.
Una funzione anonima è abbastanza inusuale per Perl, ma sembra essere la più breve che mi venga in mente. grep ..., 1 .. @_scorre gli indici dell'array di input (in realtà va oltre una cella oltre l'ultima, ma non importa), mantenendo solo l'indice che soddisfa $_[$_]eq$_[0], ad es. quelli in cui il valore dell'elemento ( $_[$_]) è uguale al valore che dobbiamo mantenere ( $_[0]).


Leggermente più lungo (31 byte (30 + -lflag)), ma come programma completo:

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

Provalo online!



2

Java 8, 146 113 112 111 110 108 byte

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 byte grazie a @TAsk usando Vectorinvece di ArrayList.
-1 byte usando Stackinvece di Vector.
-2 byte grazie a @Jakob inserendo ArrayListun array anziché un array.

0-indicizzato

Spiegazione:

Provalo qui.

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
Freddo! Se non sbaglio Vectorposso risparmiare pochi byte. :)
CoderCroc

1
@TAsk Grazie! Devo ricordare quello. Uso List+ ArrayListabbastanza spesso.
Kevin Cruijssen il

1
List r=new Vector();funzionerà anche.
CoderCroc

1
È possibile salvare 1 byte prendendo invece un elenco: TIO . Sembra un cambiamento abbastanza piccolo da non meritare una risposta separata.
Jakob,

Il cambiamento interrompe la ricerca null, ma va bene.
Jakob,

1

05AB1E , 4 byte

Qƶ0K

Provalo online!

È 1-indicizzato, come mostrato di seguito:

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 byte

Position@##&

1-indicizzato

input [Array, Value]

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

produzione

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


Perché non solo Position?
hftf

1

Haskell, 29 byte

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

Provalo online!


Funziona con i casi di input eterogenei? (Miscele di numeri interi, stringhe, un valore "vero", ecc.).
Kaz,

@Kaz: no, non lo fa. È polimorfico e funziona per ogni tipo per cui è definita l'uguaglianza, ma tutti gli elementi dell'elenco devono essere dello stesso tipo. Secondo un commento nell'OP è abbastanza.
nimi,

1

Japt , 9 byte

mȶV©YÄÃf

1-indicizzati.

L'input Japt non supporta i booleani, quindi sono stati sostituiti con 0e 1nei casi di test.

Provalo online! con il -Qflag per formattare l'output dell'array.

Soluzione 0 indicizzata, 11 byte

l o f@gX ¶V

Provalo online!


Una delle poche volte piuttosto che ¥utile: PI stava pensando di fare qualcosa del genere m@Y*(X¶V} f, ma non mi ero reso conto che non avrebbe funzionato per l'indice 0. L'indicizzazione 1 è intelligente ...
ETHproductions

1

Perl 6 , 21 byte

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

Provalo online!

L' :kavverbio grepindica che restituisce i tasti corrispondenti (indici) della sequenza di input che corrispondono al predicato* === $^v .

Se stringhe e numeri fossero considerati equivalenti, si potrebbe usare un predicato grep di just $^vinvece di * === $^v.


eqvpotrebbe essere meglio che ===dipendere da ciò che si desidera considerare valori equivalenti.
Brad Gilbert b2gills il


1

TXR Lisp , 26 byte

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

In altre parole, "Dov'è l'argomento 2 uguale all'argomento 1?"

Correre:

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 byte

#(filter(comp #{%2}%)(range(count %)))

Un po 'oscuro :) Il primo argomento di input è uno vecdi valori e il secondo è il valore cercato. %associa gli indici ai valori e l'insieme #{%2}restituisce verità (l'argomento di input %2) o falsa nilper quel valore. comp compone questi insieme.


1

C 340 362 166 115 byte

Ciao a tutti. La mia prima volta qui. Ho pensato che da quando mi piace (tentando) di scrivere un codice ottimizzato, potrei anche provarlo.

@Rodney - ~ 39 byte dalle inclusioni

@ Zacharý - 7 byte con digitazione implicita

0 indicizzato .

Come eseguire:

Come suggerito da @Arnolds, il programma prende argomenti in modo molto più amichevole. Questo mi consente di ridurre la dimensione del file di poco più della metà.

Gli argomenti devono essere passati nel seguente ordine in value [element1 ...] cui le parentesi graffe indicano argomenti facoltativi

Potrebbe essere necessario o meno aggiungere virgolette di escape a qualsiasi stringa fornita per soddisfare la condizione di 12 != "12". Sul mio sistema questo può essere fatto nel modo seguente

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
Benvenuti nel sito. Ho notato che hai un sacco di spazio extra. Soprattutto intorno agli operatori i = 0. Questi possono essere rimossi. Suggerisco di giocare un po 'con lo spazio bianco.
Wheat Wizard

Con il modo in cui gestisci l'elenco, un primo argomento ,12e un secondo argomento di [12,14,14,2,"Hello World!",3,12,12]stampe[5,6] che è tecnicamente errato.
Arnold Palmer,

@ArnoldPalmer Ho aggiornato il codice per renderlo un po 'più dettagliato nel rilevare i tipi di dati. Tuttavia, poiché C non ha tutta la conversione di tipo fantasia come JavaScript, è ancora vulnerabile ad avere una virgola in un tipo 'numero'. Praticamente l'ho lasciato ipotizzando un input formattato correttamente.
Marcos,

@Marcos È possibile che tu sia in grado di prendere ogni valore dell'array come proprio argomento della riga di comando. Non gioco mai a golf in C, quindi non sono del tutto sicuro di quali siano le regole, ma non mi sembra irragionevole che ti venga permesso di farlo. Soprattutto dal momento che accettare l'array come un elenco ti rende vulnerabile a questo problema. Inoltre, hai ancora un po 'di spazio bianco nel tuo codice golf. Non hai bisogno degli spazi sulle #includeistruzioni, strstr(h+i,n)-h ==iha uno spazio extra e puoi fare return-1invece di return -1.
Arnold Palmer,

sono consentite dichiarazioni implicite? Penso che puoi abbandonare il#include dichiarazioni
Rodney,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.