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!


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.


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!


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


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.





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


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



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.


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.

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.


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.


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


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


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


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

Siatkówka , 14 11 bajtów

^(\W|2\b)+$

Wypróbuj online!


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


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.


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.



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

1

PHP, 46 bajtów

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

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.