Determina se un array contiene qualcosa di diverso da 2


20

Prendi un array composto da numeri o array, emesso se contiene solo 2s.

L'output dovrebbe essere un valore di verità o falsità (scusate se questo distrugge le risposte)

Test Verità

[2]
[2,2]
[[2],[2,2],2]
[]
[[],[]]

Casi di prova Falsey

[1]
[22]
[2,2,2,1]
[[1,2],2]

Sono vietate le scappatoie standard .

Si applicano le regole IO predefinite .

Code-golf, vince il minor numero di byte!


Possiamo prendere una stringa che rappresenta l'array?
Wheat Wizard

Ci saranno oggetti diversi dai numeri e dagli altri array negli array
Wheat Wizard

Ci saranno solo matrici e numeri e una stringa che rappresenta l'array va bene.
ATaco,

2
Che tipo di numeri? Compex int, compex float, float int, int, non negativo?
RosLuP

1
FTR e in nome di una corretta pensiero matematico: la matrice [[2]]non non contiene due.
cessò di girare in senso antiorario

Risposte:


8

MATL , 3 byte

2=p

Provalo online!

Tecnicamente, questo potrebbe essere

2=

Dal momento che una matrice contenente elementi zero è falsa, ma questo sembra economico.


Un elenco contenente 0 è errato? Oddio.
Erik the Outgolfer

Non penso che la versione a 2 byte sia valida, poiché nei commenti ATaco ha affermato che è valida una coppia di output univoca .
Erik the Outgolfer,

Credo che 2=fallisca per le matrici vuote, o?
Stewie Griffin,

@stewiegriffin Sembra uno strano caso limite da maneggiare, ma convenientemente funziona: provalo online!
DJMcMayhem

Sì, 2=pfunziona benissimo. La versione più corta alla fine, 2=no. Inoltre, "gli strani casi limite" sono due dei casi di test. :-)
Stewie Griffin

15

Python 2 , 43 40 byte

f=lambda l:l>=[]and all(map(f,l))or l==2

Provalo online!


Al momento della pubblicazione di questa risposta, per questo meta consenso era ancora consentito l' output tramite il lancio di un errore / non un errore. Pertanto questa risposta a 26 byte era valida:

f=lambda l:l==2or map(f,l)

Provalo online!


1
È un modo semplice per verificare se un elemento è un elenco.
Adnan,

Ecco perché non mi piace quel consenso. Rovina davvero il golf del pitone.
Wheat Wizard

Tuttavia, poiché si utilizza il codice di uscita, non è necessario all, qualsiasi cosa diversa da un errore è veritiera.
Wheat Wizard

11

Prolog (SWI) , 43 33 byte

Sento odore ... ricorsione .

Grazie a Emigna e Leaky Nun per aver salvato 10 byte!

Codice

a([]).
a([X|T]):-(X=2;a(X)),a(T).

Provalo online! oppure Verifica tutti i casi di test!

Spiegazione:

Per gli utenti non-Prolog, un elenco è formattato nel seguente modo: [Head | Tail].

Il Headè il primo elemento della lista, e la coda è la lista rimanente. Provalo qui! . Un caso importante qui è che la coda di una lista con 1 elemento è uguale a []. Puoi provarlo qui .

% State that an empty array is truthy.
a([]).

% If the list is not empty (covered by the previous line), we need to check
% whether the Head is equal to 2 or whether the head is truthy.
% After that, we only need to check if the remaining list is truthy.
a([Head | Tail]) :- (Head = 2; a(Head)), a(Tail).


9

Ottava, 13 byte

@(x)~any(x-2)

Verifica tutti i casi di test.

Questa è una funzione anonima prendere un argomento di input, x. Sottrae 2da tutti gli elementi, controlla se ci sono elementi diversi da zero. Nega l'output da ottenere trueper i casi in cui tutti i valori sono zero.

Questo funziona perché x-2lavori per matrici di ogni dimensione, comprese la matrice vuota, [].

x-2 sarebbe sufficiente se non ci fossero matrici vuote nell'input.





6

JavaScript (ES6), 22 19 23 22 byte

a=>!/[^2,]|22/.test(a)

Provalo

f=
a=>!/[^2,]|22/.test(a)
console.log(" "+f([2])+": "+JSON.stringify([2]))
console.log(" "+f([2,2])+": "+JSON.stringify([2,2]))
console.log(" "+f([[2],[2,2],2])+": "+JSON.stringify([[2],[2,2],2]))
console.log(" "+f([])+": "+JSON.stringify([]))
console.log(" "+f([[],[]])+": "+JSON.stringify([[],[]]))
console.log(f([1])+": "+JSON.stringify([1]))
console.log(f([22])+": "+JSON.stringify([22]))
console.log(f([2,2,2,1])+": "+JSON.stringify([2,2,2,1]))
console.log(f([[1,2],2])+": "+JSON.stringify([[1,2],2]))


Ben fatto! Mi chiedo se potrebbe essere abbreviato un po 'di più, ma ne dubito.
Arnauld,

Grazie, @Arnauld; non ho ancora trovato un modo per migliorarlo.
Shaggy,



4

Mathematica, 24 byte

Cases[t=Flatten@#,2]==t&

Funzione pura di ritorno Trueo False. Dopo aver Flatteninserito l'array nidificato e averlo chiamato t, Cases[t,2]restituisce l'elenco di elementi che corrispondono al "modello" 2e==t verifica se si tratta dell'intero elenco.

Mathematica, 29 byte

(#//.{2->{},{{}..}->{}})=={}&

Non così breve, ma più divertente. A partire dall'input #, vengono applicate due regole di sostituzione fino a quando il risultato non smette di cambiare ( //.): in primo luogo, tutte le 2s vengono sostituite da {}s; e quindi qualsiasi elenco le cui voci sono tutte serie vuote ( {{}..}) vengono sostituite (ripetutamente) da serie vuote. Se il resto è un set vuoto ( =={}), vinciamo.


Superato , ma voglio ancora davvero sapere cosa si sta facendo qui.
Pavel

4

Haskell , 36 byte

Una funzione anonima, accetta a Stringe restituisce a Bool.

Usare come (all((==2).fst).(reads=<<).scanr(:)[]) "[2,2,2,1]"

all((==2).fst).(reads=<<).scanr(:)[]

Provalo online!

Come funziona

  • Haskell non ha elenchi di tipi misti incorporati, quindi prendiamo una stringa come argomento.
  • scanr(:)[] genera un elenco di tutti i suffissi della stringa.
  • (reads=<<)cerca di analizzare un numero all'inizio di ogni suffisso, combinando i successi in un elenco di tuple (n,restOfString).
  • all((==2).fst)controlla se tutti i numeri analizzati sono 2.

Che ne dici di solo not.all(`elem`"2,[]")?
zbw,

@zbw Che fallisce a causa di numeri come 22.
Ørjan Johansen,

4

Python 2 , 38 byte

lambda l:l.strip('[],2')==l*('22'in l)

Provalo online!

Accetta una stringa senza spazi, genera un valore booleano.

Verifica se la rimozione di tutti i caratteri '[],2'di ldà la stringa vuota. Controlla anche che 22non sia una sottostringa: in caso affermativo, l'input lviene utilizzato al posto della stringa vuota per confrontarsi con il risultato della rimozione e ciò non sempre riesce.


4

Ruby, 28 23 22 byte - 5 byte salvati da GB

->x{x.flatten-[2]==[]}

Nonostante "appiattire" sia molto lungo, è ancora più breve delle soluzioni basate su regex o di cose ricorsive che devono salvare errori nel caso di base. La confusione integrata di ruby ​​di set e matrici, tuttavia, a volte è incredibilmente utile.


1
x.flatten.uniq == [2]
Nick M

1
@NickM - che non funzionerà su casi di test come []o [[],[]]. [2,*x].flatten.uniq==[2]è leggermente più lungo
ymbirtt

1
x.flatten | [2] == [2] sarebbe più corto.
GB,

@GB ed x.flatten-[2]==[]è ancora più corto. Grazie per il consiglio!
ymbirtt,

1
GB

3

JavaScript (ES6), 26 byte

f=a=>a.map?a.every(f):a==2

Casi test


Devi contare f=perché ti sei riferito ad esso.
Leaky Nun,

@LeakyNun Infatti. Fisso.
Arnauld,

3

MATL , 4 byte

2-a~

Provalo online!

Abbattersi:

           % Implicit input
2-         % Push 2 to the stack, and subtract from input
  a        % Any non-zero elements?
    ~      % Negate to get true for cases where all elements are zero.

Bene, superato . Ma lo sto mantenendo, dal momento che sono abbastanza felice di averlo gestito da solo (anche se il compito è super semplice).


3

R, 28 byte

function(x)!any(unlist(x)-2)

unlist(x)trasforma un elenco (nidificato) in un vettore. Quindi 2viene sottratto da quel vettore. anyconverte (con un avviso) numerico in logico e controlla se ci sono messaggi TRUE. Questo è invertito con !e in uscita.

Funziona con gli elenchi nidificati perché, unlistper impostazione predefinita, ricorsivamente ricorre all'elenco di tutte le voci dell'elenco dell'elenco iniziale.

Questo funziona anche con liste vuote, perché unlist(list())diventa numeric()un vettore numerico vuoto. La coercizione anylo rende logical(), che viene interpretato come FALSEda any, e quindi invertito TRUEda !.


1
pryr::f(!any(unlist(x)-2))salva un paio di byte.
BLT,

anche questa è la stessa lunghezza all(unlist(x)==2).
Giuseppe,

oppure si potrebbe anche dire any(unlist(x)-2)che restituisce un valore coerente TRUEse esiste un valore diverso da 2 nell'array appiattito e un valore coerente FALSEse tutti i valori sono 2...
Giuseppe,

1
@Giuseppe Non sono sicuro TRUEche valga come falso: /
JAD

1
bene, non c'è ancora consenso su meta, ma codegolf.meta.stackexchange.com/a/2192/67312
Giuseppe,



2

Retina , 14 11 byte

^(\W|2\b)+$

Provalo online!


\Wnon sembra un buon criterio: 2.2è un numero che non lo è 2, ma suppongo che corrisponderebbe
Aaron,

@Aaron Ho appena chiesto all'OP se l'array può contenere numeri decimali. Se affermano che nell'array saranno presenti numeri in virgola mobile, cambierò la mia richiesta.
Kritixi Lithos,

Sì, vedo che RosLup ha fatto la stessa domanda ieri e non ha ancora una risposta. Spero che OP verrà presto per chiarire!
Aaron,


2

JavaScript (ES6), 53 50 48 byte

_=>(_+"").split`,`.map(c=>!c?2:c).every(c=>c==2)

5 byte salvati, grazie a @Shaggy!

Casi test :

let f =

_=>(_+"").split`,`.map(c=>!c?2:c).every(c=>c==2)

console.log(f([2]))
console.log(f([2,2]))
console.log(f([[2],[2,2],2]))
console.log(f([]))
console.log(f([[],[]]))

console.log(f([1]))
console.log(f([22]))
console.log(f([2,2,2,1]))
console.log(f([[1,2],2]))


f([])e f([[],[]])dovrebbe essere vero
Arnauld

@Arnauld È corretto adesso?
Arjun,

Credo di si. :-)
Arnauld

Pensi di poter salvare un paio di byte con !cinvece di c=="".
Shaggy,

@Arnauld Grazie per averlo sottolineato. Questa sfida è stata effettivamente pubblicata come CMC nel diciannovesimo byte. Che la CMC non avesse nulla da dire sul tipo di casi di test [[], []] ecc. Quando la sfida è stata pubblicata sul sito principale, ho rapidamente aggiunto la mia soluzione (mi ha persino chiesto CAPTCHA!) Senza guardare le regole! Grazie ancora! :)
Arjun,


2

Java 8, 126 55 27 byte

s->s.matches("(\\W|2\\b)+")

La straordinaria risposta Retina di Port di @KritixiLithos , escluso il ^...$, poiché String#matchescorrisponde sempre all'intera stringa e aggiunge ^...$implicitamente.

-2 byte grazie a @Jakob per avermelo ricordato ^...$non è necessarioString#matches .

Provalo qui.


Odio annullare tutto il tuo lavoro sulla soluzione elenco, ma non potresti forzare una stringa e usare la soluzione stringa?
Jakob,

@Jakob Intendi nella spiegazione? Al momento sto usando una soluzione String regex. Ho appena mantenuto la mia risposta alla Lista originale ed è una spiegazione, perché la soluzione String è una porta. Stai chiedendo di rimuovere semplicemente la soluzione Elenco? Oppure aggiungi una spiegazione per la soluzione String?
Kevin Cruijssen,

Voglio dire che finché hai una soluzione elenco puoi accorciarla usando la soluzione stringa in essa contenuta. Come boolean c(java.util.List l){return(l+"").matches("^(\\W|2\\b)+$");}avrebbe funzionato, vero? Volevo solo evidenziarlo nel caso in cui avessi intenzione di approfondire ulteriormente la soluzione dell'elenco.
Jakob,

1
Oh, e puoi perdere 2 byte rimuovendo ^e $nella regex, dal momento String.matchesche verifica solo l'intera stringa.
Jakob,

@Jakob Ha rimosso completamente la risposta all'elenco, convertita in Java 8 e rimosso il file ^...$. Dimenticato questo, anche se l'ho usato molte volte in passato ..
Kevin Cruijssen,

1

Python 2 , 44 43 42 byte

Prende x come rappresentazione di stringa dell'elenco. Ciò presuppone anche che nell'esempio le rappresentazioni non abbiano spazi.

lambda x:set(x)<=set("[],2"*0**("22"in x))

Provalo online!


Spiegazione

Entrambi prendono i caratteri nella rappresentazione di stringa dell'input e determinano se vi sono caratteri diversi da quello [], 2. Lo fanno lanciando su un set e confrontando il set con solo quei personaggi. Tuttavia, ciò non riesce se abbiamo un numero diverso da 2 che ha solo cifre di 2 (ad es. 22 o 222), per correggere questo caso moltiplichiamo la stringa utilizzata per creare l'insieme per la negazione del fatto che xcontenga o meno "22". Se lo contiene, questo sarà l'insieme vuoto, altrimenti sarà lo stesso di prima.



Non riesce[22]
Leaky Nun,

@LeakyNun Fixed
Wheat Wizard

@LeakyNun Il tuo suggerimento fallisce per[]
Wheat Wizard

lambda x:set(x)<=set("[],2"*-~-("22"in x))per -1
ovs

1

Ohm, 6 byte

∙e]Å2N

Usa la CP-437codifica.

Spiegazione:

∙e]Å2E
∙e           ■Evaluate the input to form an array
   Å         ■any(              ,             )
  ]          ■    flatten(input)
    2N       ■                   lambda x:x!=2
             ■implict end of any and print

1

PHP, 46 byte

<?=!preg_match('/:"(?!2")/',serialize($_GET));

@ JörgHülsermann Potresti fare un esempio, per favore? Tutti i casi di test sembrano funzionare. Se non lo testate attraverso un browser, passate valori scalari $_GETcome stringhe?
user63956

<?=!preg_match('/:"(?!2")/',$argn);e input è una rappresentazione in formato stringa dell'array serializzato - 11 byte
Jörg Hülsermann

1

PHP <7.0, 29 byte

Input come array di stringhe codificato JSON

<?=!ereg("22|[013-9]",$argn);

PHP <7.0, 42 byte

usa la funzione obsoleta ereg

<?=!ereg("22|[013-9]",json_encode($_GET));

PHP, 50 byte

stampa 1 per vero e niente per falso

-1 byte per altri saggi rimuovere !

o + 1 byte per true 1, false 0 aggiungi +prima!

<?=!preg_match('#22|[013-9]#',json_encode($_GET));

Provalo online!


2
Non è necessario il $rvariabile: <?array_walk_recursive($_GET,function($i){$i-2&&die;})?>1.
user63956

1

Pyth, 6 byte

!-.nQ2

Molto simile alla mia risposta CJam. Sono ancora nuovo su Pyth, quindi per favore dimmi se c'è qualcosa su cui posso giocare a golf.

Spiegazione:

    Q   Input:     [[[], [2]], [1]]
  .n    Flatten:   [2, 1]
 -   2  Remove 2s: [1]
!       Not:       False
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.