Bestimmen Sie, ob ein Array etwas anderes als 2 enthält


20

Nehmen Sie ein Array, das aus Zahlen oder Arrays besteht, und geben Sie es aus, wenn es nur 2s enthält .

Die Ausgabe sollte ein wahrer oder falscher Wert sein. (Entschuldigung, wenn dies die Antworten zerstört.)

Wahrheitstestfälle

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

Falsche Testfälle

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

Standardlücken sind verboten.

Es gelten die Standard-E / A- Regeln.

Code-Golf, nur wenige Bytes gewinnen!


Können wir einen String aufnehmen, der das Array repräsentiert?
Weizen-Zauberer

Gibt es andere Objekte als Zahlen und andere Arrays in den Arrays
Wheat Wizard

Es gibt nur Arrays und Zahlen, und eine Zeichenfolge, die das Array darstellt, ist in Ordnung.
ATaco

2
Was für Zahlen? Compex int, compex float, float int, int, nicht negativ?
RosLuP

1
FTR und im Namen des richtigen mathematischen Denkens: Das Array [[2]]enthält keine Zwei.
hörte

Antworten:


8

MATL , 3 Bytes

2=p

Probieren Sie es online!

Technisch könnte dies nur sein

2=

Da ein Array, das keine Nullelemente enthält, falsch ist, scheint dies aber billig zu sein.


Eine Liste mit 0 ist falsch? Oh Mann.
Erik der Outgolfer

Ich glaube nicht , das 2-Byte - Version gültig ist, da in den Kommentaren ATACO sagte , dass ein eindeutiges Ausgangspaar gültig ist.
Erik der Outgolfer

Ich glaube 2=scheitert bei leeren matrizen, oder?
Stewie Griffin

@stewiegriffin Das scheint ein seltsamer Randfall zu sein, aber praktisch funktioniert es: Online
DJMcMayhem

Ja, 2=pfunktioniert gut. Die kürzere Version am Ende 2=nicht. Auch "die seltsamen Randfälle" sind zwei der Testfälle. :-)
Stewie Griffin

15

Python 2 , 43 40 Bytes

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

Probieren Sie es online!


Zum Zeitpunkt der Veröffentlichung dieser Antwort war es weiterhin gemäß diesem Metakonsens zulässig , einen Fehler auszulösen bzw. keinen Fehler auszulösen. Daher war diese Antwort bei 26 Bytes gültig:

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

Probieren Sie es online!


1
So können Sie auf einfache Weise überprüfen, ob es sich bei einem Element um eine Liste handelt.
Adnan

Deshalb mag ich diesen Konsens nicht. Es ruiniert wirklich das Python-Golfen.
Weizen-Zauberer

Da Sie jedoch den Exit-Code verwenden, benötigen Sie den Code nicht all. Alles andere als ein Fehler ist wahr.
Weizen-Zauberer

11

Prolog (SWI) , 43 33 Bytes

Ich rieche ... Rekursion .

Vielen Dank an Emigna und Leaky Nun für das Speichern von 10 Bytes!

Code

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

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

Erläuterung:

Für Nicht-Prolog Benutzer wird eine Liste in der folgenden Weise formatiert: [Head | Tail].

Dies Headist das erste Element der Liste, und tail ist die verbleibende Liste. Teste es hier! . Ein wichtiger Fall hier ist , dass der Schwanz einer Liste mit 1 Elemente gleich []. Das können Sie hier testen .

% 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

Oktave, 13 Bytes

@(x)~any(x-2)

Überprüfen Sie alle Testfälle.

Dies ist eine anonyme Funktion, die ein Eingabeargument verwendet x. Es subtrahiert 2von allen Elementen und prüft, ob es Elemente ungleich Null gibt. Es negiert die Ausgabe truefür Fälle, in denen alle Werte Null sind.

Dies funktioniert, weil es x-2für Matrizen aller Größen funktioniert, einschließlich der leeren Matrix [].

x-2 wäre ausreichend, wenn die Eingabe keine leeren Matrizen enthalten könnte.





6

JavaScript (ES6), 22 19 23 22 Byte

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

Probier es aus

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


Schön! Ich frage mich, ob es noch etwas gekürzt werden könnte, aber ich bezweifle es.
Arnauld

Danke, @Arnauld; Ich habe immer noch keinen Weg gefunden, mich zu verbessern.
Shaggy



4

Mathematica, 24 Bytes

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

Reine Funktionsrückgabe Trueoder False. Nach Flattendem Aufrufen des verschachtelten Arrays twird Cases[t,2]die Liste der Elemente zurückgegeben, die dem "Muster" entsprechen 2, und es wird ==tgeprüft, ob dies die gesamte Liste ist.

Mathematica, 29 Bytes

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

Nicht so kurz, aber mehr Spaß. Ausgehend von der Eingabe #werden zwei Ersetzungsregeln angewendet, bis sich das Ergebnis nicht mehr ändert ( //.): Zuerst werden alle 2s durch {}s ersetzt. und dann wird jede Liste, deren Einträge alle leere Mengen ( {{}..}) sind, (wiederholt) durch leere Mengen ersetzt. Wenn der Rest eine leere Menge ist ( =={}), gewinnen wir.


Enttäuscht , aber ich möchte immer noch wissen, was hier gemacht wird.
Pavel

4

Haskell , 36 Bytes

Eine anonyme Funktion nimmt ein Stringund gibt ein zurück Bool.

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

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

Probieren Sie es online!

Wie es funktioniert

  • In Haskell sind keine Listen mit gemischten Typen integriert, daher nehmen wir einen String als Argument.
  • scanr(:)[] generiert eine Liste aller Suffixe des Strings.
  • (reads=<<)versucht, am Anfang jedes Suffixes eine Zahl zu parsen, wobei die Erfolge in einer Liste von Tupeln zusammengefasst werden (n,restOfString).
  • all((==2).fst)prüft, ob alle geparsten Zahlen vorhanden sind 2.

Wie wäre es einfach not.all(`elem`"2,[]")?
zbw

@zbw Das scheitert an Zahlen wie 22 .
Ørjan Johansen

4

Python 2 , 38 Bytes

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

Probieren Sie es online!

Übernimmt einen String ohne Leerzeichen und gibt einen Bool aus.

Überprüft, ob alle Zeichen entfernt wurden '[],2' von ldie leere Zeichenfolge ergibt. Überprüft auch, 22ob es sich nicht um eine Teilzeichenfolge handelt. Wenn dies der Fall ist, wird die Eingabe lanstelle der leeren Zeichenfolge verwendet, um sie mit dem Ergebnis der Entfernung zu vergleichen. Dies schlägt immer fehl.


4

Rubin, 28 23 22 Bytes - 5 Bytes, die von GB gespeichert wurden

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

Obwohl "flatten" sehr lang ist, ist es immer noch kürzer als auf Regex basierende Lösungen oder rekursives Material, das Fehler im Basisfall beheben muss. Rubys eingebaute Vereinigung von Mengen und Arrays ist jedoch manchmal erstaunlich nützlich.


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

1
@NickM - das geht bei Testfällen wie []oder nicht [[],[]]. [2,*x].flatten.uniq==[2]ist etwas länger
ymbirtt

1
x.flatten | [2] == [2] wäre kürzer.
GB

@GB und x.flatten-[2]==[]ist noch kürzer. Danke für den Tipp!
Ymbirtt

1
Und doch gewinnt Regex: codegolf.stackexchange.com/a/120781/18535 :-)
GB

3

JavaScript (ES6), 26 Byte

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

Testfälle


Sie müssen zählen, f=weil Sie sich darauf bezogen haben.
Undichte Nonne

@LeakyNun In der Tat. Fest.
Arnauld

3

MATL , 4 Bytes

2-a~

Probieren Sie es online!

Nervenzusammenbruch:

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

Na ja, outgolfed . Aber ich behalte das, da ich ziemlich glücklich bin, dass ich das alles alleine geschafft habe (obwohl die Aufgabe super einfach ist).


3

R, 28 Bytes

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

unlist(x)verwandelt eine (verschachtelte) Liste in einen Vektor. Dann 2wird von diesem Vektor abgezogen. anywandelt (mit einer Warnung) numerisch in logisch um und prüft, ob es irgendwelche TRUEs gibt. Dies wird mit invertiert !und ausgegeben.

Dies funktioniert mit verschachtelten Listen, da unliststandardmäßig alle Listeneinträge der ursprünglichen Liste rekursiv gelöscht werden.

Dies funktioniert auch mit leeren Listen, da dies unlist(list())zu numeric()einem leeren numerischen Vektor wird. Zwang durch anymacht es logical(), was als FALSEvon interpretiert wird any, und dann umgekehrt zu TRUEvon !.


1
pryr::f(!any(unlist(x)-2))spart ein paar Bytes.
BLT

das ist auch die gleiche Länge all(unlist(x)==2).
Giuseppe

oder man könnte auch sagen, any(unlist(x)-2)was ein konsistentes TRUEFALSE2
Giuseppe,

1
@ Giuseppe Ich bin mir nicht sicher, ob dies TRUEals Falschgeld gilt: /
JAD




2

Retina , 14 11 Bytes

^(\W|2\b)+$

Probieren Sie es online!


\Wscheint kein so gutes Kriterium zu sein: 2.2Ist eine Zahl, die nicht stimmt 2, aber ich nehme an, dass sie übereinstimmt
Aaron

@ Aaron Ich habe gerade das OP gefragt, ob das Array Dezimalzahlen enthalten darf. Wenn sie angeben, dass Gleitkommazahlen im Array vorhanden sind, ändere ich meine Übermittlung.
Kritixi Lithos

Ja, ich sehe, dass RosLup gestern die gleiche Frage gestellt hat und noch keine Antwort hat. Ich hoffe, OP wird bald zur Klärung kommen!
Aaron


2

JavaScript (ES6), 53 50 48 Bytes

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

5 Bytes gespart, dank @Shaggy!

Testfälle:

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([])und f([[],[]])sollte wahr sein
Arnauld

@Arnauld Stimmt das jetzt?
Arjun

Ich glaube schon. :-)
Arnauld

Denken Sie ein paar Bytes mit speichern können !cstatt c=="".
Shaggy

@ Arnauld Danke für den Hinweis. Diese Herausforderung wurde tatsächlich als CMC im neunzehnten Byte veröffentlicht. Das CMC hatte nichts zu [[], []] usw. Art von Testfällen zu sagen. Als die Herausforderung auf der Hauptseite veröffentlicht wurde, fügte ich schnell meine Lösung hinzu (es hat mich sogar nach CAPTCHA gefragt!), Ohne auf Regeln zu achten! Noch einmal vielen Dank! :)
Arjun


2

Java 8, 126 55 27 Bytes

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

Port von @KritixiLithos 'erstaunlicher Retina-Antwort , mit Ausnahme der ^...$, da String#matchesimmer die gesamte Zeichenfolge übereinstimmt und die ^...$implizit hinzufügt .

-2 Bytes Dank an @Jakob für die Erinnerung ^...$ist nicht notwendig für String#matches.

Probieren Sie es hier aus.


Ich hasse es, all Ihre Arbeit an der Listenlösung zunichte zu machen, aber konnten Sie nicht eine Zeichenfolge erzwingen und die Zeichenfolgenlösung verwenden?
Jakob

@ Jakob Du meinst in der Erklärung? Ich verwende derzeit eine reguläre String-Lösung. Ich habe gerade meine ursprüngliche List-Antwort und ihre Erklärung beibehalten, da die String-Lösung ein Port ist. Möchten Sie nur die List-Lösung entfernen? Oder eine Erklärung für die String-Lösung hinzufügen?
Kevin Cruijssen

Ich meine, solange Sie eine Listenlösung haben, können Sie diese auch mit der darin enthaltenen String-Lösung verkürzen. Wie boolean c(java.util.List l){return(l+"").matches("^(\\W|2\\b)+$");}würde es funktionieren, oder? Ich wollte nur darauf hinweisen, falls Sie vorhaben, die Listenlösung weiter zu verbessern.
Jakob

1
Oh und Sie können 2 Bytes durch Entfernen ^und $in der Regex verlieren , da String.matchesnur Tests gegen die gesamte Zeichenfolge.
Jakob

@Jakob Entfernte die Antwort "Liste" vollständig, konvertierte nach Java 8 und entfernte die Antwort "Liste" ^...$. Das habe ich vergessen, obwohl ich es in der Vergangenheit ziemlich oft benutzt habe.
Kevin Cruijssen

1

Python 2 , 44 43 42 Bytes

Nimmt xals Zeichenfolgendarstellung der Liste. Dies setzt auch voraus, wie im Beispiel, dass die Darstellungen keine Leerzeichen haben.

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

Probieren Sie es online!


Erläuterung

In beiden Fällen werden die Zeichen in der Zeichenfolgendarstellung der Eingabe verwendet, um festzustellen, ob andere Zeichen als [], 2die darin enthaltenen vorhanden sind. Sie tun dies, indem sie in eine Menge umwandeln und mit der Menge dieser Zeichen vergleichen. Dies schlägt jedoch fehl, wenn wir eine andere Zahl als 2 haben, die nur 2 Ziffern hat (z. B. 22 oder 222). Um diesen Fall zu patchen, multiplizieren wir die Zeichenfolge, die zum Erstellen der Menge verwendet wird, mit der Negation, ob sie xenthält oder nicht "22". Wenn es es enthält, ist dies das leere Set, ansonsten ist es das gleiche wie zuvor.



Scheitert an[22]
Undichte Nonne

@LeakyNun Behoben
Weizen-Assistent

@LeakyNun Ihr Vorschlag für[]
Wheat Wizard

lambda x:set(x)<=set("[],2"*-~-("22"in x))für -1
Ovs

1

Ohm, 6 Bytes

∙e]Å2N

Verwendet CP-437Codierung.

Erläuterung:

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

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

@ JörgHülsermann Könnten Sie bitte ein Beispiel geben? Alle Testfälle scheinen zu funktionieren. Übergeben Sie skalare Werte $_GETals Zeichenfolgen, wenn Sie es nicht über einen Browser testen ?
user63956

<?=!preg_match('/:"(?!2")/',$argn);und input ist eine Stringdarstellung des serialisierten Arrays - 11 Bytes
Jörg Hülsermann

1

PHP <7.0, 29 Bytes

Eingabe als String-Array JSON-codiert

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

PHP <7.0, 42 Bytes

benutze die veraltete Funktion ereg

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

PHP, 50 Bytes

Gibt 1 für wahr und nichts für falsch aus

-1 Byte für andernfalls entfernen !

oder + 1 Byte für wahr 1, falsch 0 +vorher addieren!

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

Probieren Sie es online!


2
Sie brauchen nicht auf die $rVariable: <?array_walk_recursive($_GET,function($i){$i-2&&die;})?>1.
user63956

1

Pyth, 6 Bytes

!-.nQ2

Sehr ähnlich zu meiner CJam-Antwort. Ich bin noch neu in Pyth, also sag mir bitte, ob ich irgendetwas ausprobieren kann.

Erläuterung:

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