Sprawdź, czy tablica zawiera coś innego niż 2

20

Weź tablicę, która składa się z liczb lub tablic, wyprowadzaj, jeśli zawiera tylko 2s.

Dane wyjściowe powinny być zgodne z prawdą lub falsey (Przepraszam, jeśli to niszczy odpowiedzi)

Prawdziwe przypadki testowe

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

Przypadki testowe Falsey

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

Standardowe luki są zabronione.

Obowiązują domyślne reguły we / wy .

Code-golf, wygrywa najmniej bajtów!

ATaco
źródło
Czy możemy pobrać ciąg znaków reprezentujący tablicę?
Kreator pszenicy
Czy w tablicach będą znajdować się obiekty inne niż liczby i inne tablice
Wheat Wizard
Będą tylko tablice i liczby, a łańcuch reprezentujący tablicę jest w porządku.
ATaco
2
Jakie liczby? Compex int, float intex, float int, int, a nie ujemny?
RosLuP
1
FTR i w imię prawidłowego myślenia matematycznego: tablica [[2]]ma nie zawierać dwa.
przestał się obracać przeciwnie do zegara

Odpowiedzi:

8

MATL , 3 bajty

2=p

Wypróbuj online!

Technicznie może to być po prostu

2=

Ponieważ tablica zawierająca dowolne elementy zerowe jest fałszem, ale wydaje się tania.

DJMcMayhem
źródło
Lista zawierająca 0 to fałsz? O stary.
Erik the Outgolfer
Nie sądzę, aby wersja 2-bajtowa była poprawna, ponieważ w komentarzach ATaco powiedział, że poprawna jest unikalna para wyjściowa .
Erik the Outgolfer
Wierzę, że 2=zawiedzie dla pustych matryc, czy?
Stewie Griffin
@stewiegriffin To wydaje się dziwna sprawa, którą trzeba poradzić, ale wygodnie to działa: Wypróbuj online!
DJMcMayhem
Tak, 2=pdziała dobrze. Krótsza wersja ostatecznie 2=nie. Ponadto „przypadki dziwnych krawędzi” to dwa przypadki testowe. :-)
Stewie Griffin
15

Python 2 , 43 40 bajtów

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

Wypróbuj online!


W chwili opublikowania tej odpowiedzi zgodnie z tym meta konsensem nadal można było generować dane wyjściowe przez zgłoszenie błędu / nieprzekazanie błędu. Dlatego odpowiedź na 26 bajtów była poprawna:

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

Wypróbuj online!

ovs
źródło
1
To fajny sposób na sprawdzenie, czy element jest listą.
Adnan
Dlatego nie podoba mi się ten konsensus. To naprawdę rujnuje golfa pytona.
Kreator pszenicy
Ponieważ jednak korzystasz z kodu wyjścia, nie potrzebujesz go all, nic poza błędem jest zgodne z prawdą.
Kreator pszenicy
11

Prolog (SWI) , 43 33 bajty

Czuję ... rekurencję .

Dzięki Emignie i Dziurawej Zakonnicy za uratowanie 10 bajtów!

Kod

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

Wypróbuj online! lub Zweryfikuj wszystkie przypadki testowe!

Wyjaśnienie:

Dla użytkowników spoza Prolog, lista jest sformatowany w następujący sposób: [Head | Tail].

Jest Headto pierwszy element listy, a ogon to pozostała lista. Sprawdź to tutaj! . Ważnym przypadkiem jest tutaj to, że ogon listy z 1 elementem jest równy []. Możesz to przetestować tutaj .

% 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).
Adnan
źródło
10

Galaretka , 4 bajty

F;2E

Wypróbuj online!

Jak to działa

F;2E
F    flatten
 ;2  append 2
   E all elements are equal
Leaky Nun
źródło
9

Oktawa, 13 bajtów

@(x)~any(x-2)

Sprawdź wszystkie przypadki testowe.

Jest to anonimowa funkcja biorąc jeden argument wejściowy x. Odejmuje 2od wszystkich elementów, sprawdza, czy są jakieś niezerowe elementy. Neguje dane wyjściowe truedla przypadków, w których wszystkie wartości są równe zero.

To działa, ponieważ x-2prace dla macierzy o różnej wielkości, w tym pustym matrycy [].

x-2 byłoby wystarczające, gdyby na wejściu nie było pustych matryc.

Stewie Griffin
źródło
7

Matematyka , 28 bajtów

Select[Flatten@#,#!=2&]=={}&

Wypróbuj online!

Pavel
źródło
Myślę, że dane wejściowe {0}są dozwolone; spowoduje to fałszywie dodatni wynik.
Greg Martin
6

05AB1E , 4 bajty

˜YQP

Wypróbuj online!

Wyjaśnienie

˜      # flatten list
 YQ    # check each element for equality to 2
   P   # product of list
Emigna
źródło
Dlaczego nie miałby 2działać zamiast Y?
Erik the Outgolfer
@EriktheOutgolfer: 2działa również. Podoba mi się fakt, że nie ma w nim liczb :)
Emigna
6

JavaScript (ES6), 22 19 23 22 bajtów

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

Sprawdź to

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

Kudłaty
źródło
Niezłe! Zastanawiam się, czy można to jeszcze trochę skrócić, ale wątpię w to.
Arnauld
Dzięki, @Arnauld; wciąż nie wymyśliłem sposobu na poprawę tego.
Shaggy
5

Mathematica, 15 bajtów

FreeQ[x_/;x!=2]

Działa również w matematyce. Wypróbuj online!

alephalpha
źródło
4

APL (Dyalog) , 5 bajtów

∧/2=∊

Wypróbuj online!

Wyjaśnienie

∧/                         Only
  2=                       2s are equal to
                          any of the elements in the enlisted form of the right argument
Kritixi Lithos
źródło
4

Mathematica, 24 bajty

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

Czysta funkcja powraca Truelub False. Po Flattening zagnieżdżony tablicę i nazywając ją t, Cases[t,2]zwraca listę elementów, które pasują do „wzorca” 2i ==tsprawdza, czy to jest cała lista.

Mathematica, 29 bajtów

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

Nie tak krótki, ale bardziej zabawny. Począwszy od danych wejściowych #, stosowane są dwie reguły zastępowania, aż wynik przestanie się zmieniać ( //.): po pierwsze, wszystkie 2s są zastępowane przez {}s; a następnie każdą listę, której wpisy są pustymi zestawami ( {{}..}), zastępuje się (wielokrotnie) pustymi zestawami. Jeśli reszta to pusty set ( =={}), wygrywamy.

Greg Martin
źródło
Rozgolf , ale nadal bardzo chcę wiedzieć, co się tutaj dzieje.
Pavel
4

Haskell , 36 bajtów

Anonimowa funkcja przyjmuje Stringi zwraca a Bool.

Użyj jako (all((==2).fst).(reads=<<).scanr(:)[]) "[2,2,2,1]"

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

Wypróbuj online!

Jak to działa

  • Haskell nie ma wbudowanych list mieszanych, więc bierzemy ciąg znaków jako argument.
  • scanr(:)[] generuje listę wszystkich sufiksów ciągu.
  • (reads=<<)próbuje przeanalizować liczbę na początku każdego sufiksu, łącząc sukcesy w listę krotek (n,restOfString).
  • all((==2).fst)sprawdza, czy wszystkie parsowane liczby są 2.
Ørjan Johansen
źródło
A może po prostu not.all(`elem`"2,[]")?
zbw
@zbw To się nie udaje z powodu liczb takich jak 22.
Ørjan Johansen
4

Python 2 , 38 bajtów

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

Wypróbuj online!

Bierze ciąg bez spacji, generuje bool.

Sprawdza, czy usunięcie wszystkich znaków '[],2'z ldaje pusty łańcuch. Sprawdza również, czy 22nie jest to podciąg - jeśli tak, to dane wejściowe lsą używane zamiast pustego ciągu w celu porównania z wynikiem usunięcia, a to zawsze kończy się niepowodzeniem.

xnor
źródło
4

Ruby, 28 23 22 bajtów - 5 bajtów zapisanych przez GB

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

Mimo że „spłaszczanie” jest naprawdę długie, jest ono nadal krótsze niż rozwiązania oparte na wyrażeniach regularnych lub rekursywne rzeczy, które muszą ratować błędy w przypadku podstawowym. Jednak wbudowane zestawienie zestawów i tablic Ruby jest czasem niezwykle przydatne.

ymbirtt
źródło
1
x.flatten.uniq == [2]
Nick M
1
@NickM - to nie działa na przypadkach testowych takich jak []lub [[],[]]. [2,*x].flatten.uniq==[2]jest nieco dłuższy
ymbirtt
1
x.flatten | [2] == [2] byłby krótszy.
GB
@GB i x.flatten-[2]==[]jest jeszcze krótszy. Dzięki za wskazówkę!
ymbirtt
1
A jednak regex wygrywa: codegolf.stackexchange.com/a/120781/18535 :-)
GB
3

JavaScript (ES6), 26 bajtów

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

Przypadki testowe

Arnauld
źródło
Musisz liczyć, f=bo o tym mówiłeś.
Leaky Nun
@LeakyNun Rzeczywiście. Naprawiony.
Arnauld
3

MATL , 4 bajty

2-a~

Wypróbuj online!

Awaria:

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

Cóż, obezwładniony . Ale zachowuję to, ponieważ jestem całkiem szczęśliwy, że udało mi się to wszystko samodzielnie (mimo że zadanie jest bardzo proste).

Stewie Griffin
źródło
3

R, 28 bajtów

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

unlist(x)zamienia (zagnieżdżoną) listę w wektor. Następnie 2odejmuje się od tego wektora. anykonwertuje (z ostrzeżeniem) numeryczną na logiczną i sprawdza, czy są jakieś TRUEs. Jest to odwrócone z !i wyjście.

Działa to z listami zagnieżdżonymi, ponieważ unlistdomyślnie działa rekurencyjnie, aby usunąć listę wszystkich pozycji listy początkowej.

Działa to również z pustymi listami, ponieważ unlist(list())staje numeric()się pustym wektorem numerycznym. Przymus przez anyczyni to logical(), co jest interpretowane jako FALSEprzez any, a następnie odwracane TRUEprzez przez !.

JAD
źródło
1
pryr::f(!any(unlist(x)-2))oszczędza kilka bajtów.
BLT
jest to również ta sama długość all(unlist(x)==2).
Giuseppe
lub można również powiedzieć, any(unlist(x)-2)która zwraca spójną wartość, TRUEjeśli w spłaszczonej tablicy występuje wartość inna niż 2, i spójną, FALSEjeśli wszystkie wartości są 2...
Giuseppe
1
@Giuseppe Nie jestem pewien, czy TRUEliczy się jako falsey: /
JAD
1
cóż, nadal nie ma konsensusu w sprawie meta, ale codegolf.meta.stackexchange.com/a/2192/67312
Giuseppe
2

Python 3 , 55 bajtów

Bez oszukiwania. Używa zagnieżdżonej listy jako danych wejściowych.

f=lambda a:all(type(x)!=int and f(x)for x in a if x!=2)

Wypróbuj online!

Leaky Nun
źródło
-1 bajt:int!=type(x)and
Mego
2

Galareta , 4 bajty

F=2Ạ

Wypróbuj online!

Nieco inny niż algorytm Leaky'ego.

Wyjaśnienie:

F=2Ạ
F    Flatten
 =2  Check if equal to 2 (vectorizes)
   Ạ Check if there isn't any falsey value
Erik the Outgolfer
źródło
2

Siatkówka , 14 11 bajtów

^(\W|2\b)+$

Wypróbuj online!

Kritixi Lithos
źródło
\Wnie wydaje się tak dobrym kryterium: 2.2to liczba, która nie jest 2, ale przypuszczam, że pasowałaby
Aaron
@Aaron Właśnie zapytałem OP o to, czy tablica może zawierać liczby dziesiętne. Jeśli stwierdzą, że liczby zmiennoprzecinkowe będą obecne w tablicy, zmienię sposób przesyłania.
Kritixi Lithos
Tak, widzę, że RosLup zadała wczoraj to samo pytanie i nie ma jeszcze odpowiedzi. Mam nadzieję, że wkrótce przyjdzie OP, aby to wyjaśnić!
Aaron
2

JavaScript (ES6), 53 50 48 bajtów

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

Zaoszczędź 5 bajtów dzięki @Shaggy!

Przypadki testowe :

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

Arjun
źródło
f([])i f([[],[]])powinno być prawdą
Arnauld
@Arnauld Czy to jest poprawne teraz?
Arjun
Chyba tak. :-)
Arnauld
Pomyśl, że możesz zaoszczędzić kilka bajtów !czamiast c=="".
Shaggy
@Arnauld Dzięki za zwrócenie na to uwagi. To wyzwanie zostało faktycznie opublikowane jako CMC w dziewiętnastym bajcie. Że CMC nie ma nic do powiedzenia na temat przypadków testowych [[], []] itp. Kiedy wyzwanie pojawiło się na stronie głównej, szybko dodałem swoje rozwiązanie (nawet poprosiło mnie CAPTCHA!), Nie patrząc na zasady! Jeszcze raz dziękuję! :)
Arjun
2

Java 8, 126 55 27 bajtów

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

Port niesamowitej odpowiedzi Retina @KritixiLithos , z wyjątkiem ^...$, ponieważ String#matcheszawsze pasuje do całego ciągu i dodaje ^...$domyślnie.

-2 bajty dzięki @Jakob za przypomnienie mi ^...$nie jest konieczne String#matches.

Wypróbuj tutaj.

Kevin Cruijssen
źródło
Nienawidzę niszczyć całej twojej pracy nad rozwiązaniem listy, ale czy nie możesz przymusić się do ciągu i użyć rozwiązania ciągu?
Jakob,
@Jakob Masz na myśli wyjaśnienie? Obecnie używam regex String. Właśnie zachowałem swoją oryginalną odpowiedź na Listę i jej wyjaśnienie, ponieważ rozwiązanie String jest portem. Czy chcesz tylko usunąć rozwiązanie listy? Lub dodaj wyjaśnienie rozwiązania String?
Kevin Cruijssen
Mam na myśli to, że dopóki masz rozwiązanie listy, równie dobrze możesz je skrócić, używając w nim rozwiązania łańcuchowego. Jakby boolean c(java.util.List l){return(l+"").matches("^(\\W|2\\b)+$");}działało, prawda? Chciałem tylko wskazać to na wypadek, gdybyś planował dalej grać w golfa na liście.
Jakob
1
Aha, możesz stracić 2 bajty przez usunięcie ^i $wyrażenie regularne, ponieważ String.matchestestuje tylko cały ciąg.
Jakob
@Jakob Całkowicie usunął odpowiedź z listy, przekonwertował na Javę 8 i usunął ^...$. Zapomniałem o tym, chociaż w przeszłości korzystałem z niego dość często ...
Kevin Cruijssen
1

Python 2 , 44 43 42 bajtów

Przyjmuje xjako ciąg znaków reprezentujący listę. Zakłada to również, jak w przykładzie, reprezentacje nie mają spacji.

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

Wypróbuj online!


Wyjaśnienie

Oba pobierają znaki reprezentujące ciąg wejściowy i określają, czy [], 2są w nim znaki inne niż te. Robią to, rzucając na zestaw i porównując do zestawu tylko tych postaci. Nie powiedzie się to jednak, jeśli mamy liczbę inną niż 2, która ma tylko cyfry 2 (np. 22 lub 222), aby załatać ten przypadek, mnożymy ciąg znaków użyty do utworzenia zestawu przez zanegowanie, czy xzawiera "22". Jeśli go zawiera, będzie to pusty zestaw, w przeciwnym razie będzie taki sam jak poprzednio.

Kreator pszenicy
źródło
Nie działa za[22]
Leaky Nun
@LeakyNun Naprawiono
Kreator pszenicy
@LeakyNun Twoja sugestia się nie udaje[]
Kreator pszenicy
lambda x:set(x)<=set("[],2"*-~-("22"in x))dla -1
ovs
1

Ohm, 6 bajtów

∙e]Å2N

Używa CP-437 kodowania.

Wyjaśnienie:

∙e]Å2E
∙e           ■Evaluate the input to form an array
   Å         ■any(              ,             )
  ]          ■    flatten(input)
    2N       ■                   lambda x:x!=2
             ■implict end of any and print
Roman Gräf
źródło
1

PHP, 46 bajtów

<?=!preg_match('/:"(?!2")/',serialize($_GET));
użytkownik63956
źródło
@ JörgHülsermann Czy mógłbyś podać przykład? Wszystkie przypadki testowe wydają się działać. Jeśli testujesz go nie przez przeglądarkę, czy przekazujesz wartości skalarne $_GETjako łańcuchy?
user63956
<?=!preg_match('/:"(?!2")/',$argn);a wejście jest ciągiem reprezentującym szeregową tablicę - 11 bajtów
Jörg Hülsermann
1

PHP <7.0, 29 bajtów

Wprowadź jako zakodowaną tablicę łańcuchową JSON

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

PHP <7.0, 42 bajtów

użyj przestarzałej funkcji ereg

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

PHP, 50 bajtów

drukuje 1 za prawdę i nic za fałsz

-1 bajt do usunięcia w inny sposób !

lub + 1 bajt dla true 1, false 0 dodaj +wcześniej!

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

Wypróbuj online!

Jörg Hülsermann
źródło
2
Nie potrzebujemy $rzmiennej: <?array_walk_recursive($_GET,function($i){$i-2&&die;})?>1.
user63956
1

Pyth, 6 bajtów

!-.nQ2

Bardzo podobny do mojej odpowiedzi CJam. Wciąż jestem nowy w Pyth, więc powiedz mi, czy mogę coś grać w golfa.

Wyjaśnienie:

    Q   Input:     [[[], [2]], [1]]
  .n    Flatten:   [2, 1]
 -   2  Remove 2s: [1]
!       Not:       False
Esolanging Fruit
źródło