Hintergrund
Inspiriert von Octaves (und, im weiteren Sinne, MATLs) sehr praktischer Interpretation von Wahrheits- / Falschmatrizen, erhielt Jelly das Ȧ- Atom (Octave-style all ).
Ȧ nimmt ein Array als Eingabe und gibt 1 zurück, wenn das Array nicht leer ist und an keiner Stelle in der Baumstruktur die Zahl 0 (Integer, Float oder Complex) enthält . Andernfalls wird 0 zurückgegeben .
Beispielsweise ist das Array [[]] wahr, weil es nicht leer ist und keine Nullen enthält, aber [[0]] ist falsch, weil es auf der innersten Ebene eine 0 enthält .
Aufgabe
Schreiben Sie in einer Programmiersprache Ihrer Wahl ein vollständiges Programm oder eine Funktion, die ein möglicherweise leeres, möglicherweise gezacktes Array von Ganzzahlen als Eingabe verwendet und einen wahren oder falschen Wert ausgibt oder zurückgibt , der angibt, ob Ȧ 1 oder 0 zurückgeben würde .
Ihr Beitrag muss den folgenden Regeln entsprechen.
Die Wahrheits- und Falschwerte müssen für alle Eingaben konsistent sein , dh alle Arrays, für die Ȧ 1 zurückgibt, müssen demselben Wahrheitswert zugeordnet sein, und alle Arrays, für die Ȧ 0 zurückgibt, müssen demselben Falschwert zugeordnet sein.
Da vollständige Programme nur Zeichenfolgendarstellungen von Arrays als Eingabe verwenden können, ist dies zulässig. Sie müssen jedoch die kanokische Darstellung Ihrer Sprache verwenden, wie sie von
repr
oder ähnlich zurückgegeben wurde.Insbesondere können Sie nicht davon ausgehen, dass vor dem ersten Element des Arrays ein Leerzeichen steht.
Wenn (und nur wenn) Ihre Sprache keine gezackten Arrays nativ darstellen kann, können Sie eine Zeichenfolgendarstellung der Eingabe unter Verwendung der kanonischen Syntax einer vorhandenen Programmiersprache vornehmen.
Wenn Ihre Sprache über mehrere Darstellungsmöglichkeiten für gezackte Arrays verfügt (z. B. Listen und Tupel), müssen Sie nur eines davon unterstützen.
Wenn Ihre Sprache über eine integrierte Funktion verfügt, die selbst eine gültige Vorlage für diese Herausforderung darstellt, können Sie sie in Ihrer Antwort möglicherweise nicht verwenden . Alle anderen Einbauten sind erlaubt.
Es wird empfohlen, Antworten sowohl mit Array- als auch mit String-Manipulation zu veröffentlichen, auch wenn eine deutlich kürzer ist als die andere.
Es gelten alle gängigen Code-Golf- Regeln.
Möge der kürzeste Code in Bytes gewinnen!
Wahrheitstestfälle
[1]
[10]
[[]]
[[[[1]]]]
[[], [1], [1, 2]]
[[1], [1, [2]], [1, [2, [3]]]]
[[8], [8, [9]], [8, [9, [10]]]]
Falsche Testfälle
[]
[0]
[0, -1]
[-1, 0]
[[[[0]]]]
[[0], [1, 2], [3, 4, 5]]
[[8], [8, [9]], [8, [9, [1, 0]]]]
[-1, 0, 0, 0]
Object
... Mein Favorit ist Haskell, wo es nicht ist. Auch in C nicht, zumindest nicht so, dass Sie Arrays und Ints sicher mischen können. Beide Sprachen sind durchaus in der Lage, gezackte Arrays zu erstellen, können sie jedoch für dieses Problem nicht verwenden.Antworten:
Gelee, 3 Bytes
F
verflacht die Eingabeliste.ṭ
die ursprüngliche Eingabeliste als Element anheftet, was genau dann falsch ist, wenn es leer ist.Ạ
prüft dann, ob ein Element in der reduzierten Liste oder die ursprüngliche Liste selbst falsch ist.(Originalantwort)
Vielen Dank an Dennis für die Anregung, eine zu ihm passende Lösung zu finden.
FẠ
Gibt 0, wenn die Eingabe einen falschen Wert in einer beliebigen Tiefe enthält, andernfalls 1. Dies istȦ
, mit Ausnahme von leeren Listen, der Fall.Ṇ
Gibt 1, wenn die Eingabe ein falscher Wert ist, andernfalls 0. Die einzige falsche Liste ist die leere Liste.XOR-Verknüpfung der beiden gibt die Antwort.
Dies entspricht in etwa dem von Dennis
F;LẠ
, aber anstattL
eine Null in die Liste einzufügen, wenn die Liste leer ist, wirdW
die leere Liste in sich selbst[[]]
eingefügt (produziert ), sodass sie ein falsches Element enthält.quelle
Retina , 10 Bytes
Probieren Sie es online!
Zuerst entfernen wir die Eingabe, wenn sie eine Null enthält. Wir versuchen, mindestens drei Zeichen vom Anfang des Strings an abzugleichen (um sicherzustellen, dass die Eingabe in der vorherigen Phase nicht beseitigt wurde oder nur
[]
von Anfang an erfolgte).quelle
Ruby,
2524231816 BytesBenötigt das
-n
Flag in der Kommandozeile (+1 Byte,-e
->-ne
).Probieren Sie es online!
Dies ist ein vollständiges Programm, das Eingaben in Rubys kanonischem Array-Format für STDIN und Ausgaben
true
oderfalse
für STDOUT akzeptiert.23 Byte Funktionsversion:
Dies ist ein Prozess, der ein Argument akzeptiert, das zu testende Array.
Danke an Martin Ender für ein Byte und an Ventero für zwei Byte!
quelle
p$_!~/\D0|^..$/
(oderp ! ~/\D0|^..$/
, yay signifikantes Leerzeichen) zusammen mit dem-n
Flag verwenden.Gelee , 4 Bytes
Probieren Sie es online!
Ȧ
ergibt,0
wenn die Eingabe leer ist oder a enthält0
, sonst ist es1
.FẠ
Ergibt,0
wenn die abgeflachte Eingabe a enthält0
, und lässt nur den Kantenfall eines leeren Arrays (da garantiert wird, dass die Eingabe ein Array ist).Ṇ
ist eine nicht vektorisierende logische Nicht-Monade und gibt daher0
für jede nicht leere Liste und1
für die leere Liste zurück. Als solches kann dies einfach vom Ergebnis derFẠ
Verwendung abgezogen werden_
.quelle
FẠạṆ
, oder?05AB1E ,
98 Bytes-1 Bytes dank Emigna
Erläuterung:
Probieren Sie es online!
quelle
[[]]
.Mathematica, 17 Bytes
FreeQ
prüft0
für uns gegen , aber natürlich würde esTrue
zur Eingabe zurückkehren{}
, also müssen wir diesen Fall separat prüfen.quelle
APL (Dyalog),
21127 BytesGolf 5 Bytes dank Adám mit Gabeln
Probieren Sie es online!
Dies ist mein erster Versuch bei Dyalog. Golftipps sind willkommen!
Erläuterung
quelle
⍬∘≡
ist der linke Test (leere Menge gebunden an identisch mit) und0∊∊
der rechte Test (selbst eine Gabel; null Mitglied der eingetragenen Form). Legen Sie es zusammen:⍬∘≡⍱0∊∊
. Probieren Sie es online!Operation Flashpoint- Skriptsprache,
199188 ByteRufen Sie an mit:
oder mit:
Erläuterung:
In der Skriptsprache des Spiels kann jeder String mit Code aufgerufen werden. Die geschweiften Klammern
{}
kennzeichnen den Anfang und das Ende einer Zeichenfolge. (Anführungszeichen funktionieren auch, aber das wird chaotisch, wenn sie verschachtelt sind.) Weist der Variablen alsoA={...}
eine Zeichenfolge zuA
, und die Variable kann dann wie eine Funktion mit den folgenden Befehlen aufgerufen werden:<argument> call A
. Grundsätzlich kann jede Zeichenfolge als Codeblock behandelt werden.Dann
A
definieren wir innerhalb der "Funktion" eine andere Funktionf
.private
deklariert die beiden Variablen_i
und_r
local zu functionf
. Der Name einer lokalen Variablen muss mit einem Unterstrich beginnen.while {} do {}
ist eine Schleife, in der der erste String (bezeichnet mit{}
) den Code für die Schleifenbedingung und die zweite den Code für den Schleifenkörper enthält._this
ist das Argument, das mit dercall
Funktion übergeben wurde._this
kann von jedem Typ sein, aber hier nehmen wir an, dass es sich um ein Array handelt.o=_this select _i
Greift in der Schleife auf das Element _i: th des Arrays zu und weist es der Variablen zuo
.if (o in [o])
ist ein Trick, um festzustellen, obo
es sich um ein anderes Array handelt oder nicht. Wenno
es sich um eine Zahl (oder etwas anderes als ein Array) handelt,o in [o]
wirdtrue
derin
Wert auf ausgewertet , da die Funktion einen Wert findet, der mito
dem Array übereinstimmt[o]
. Wenno
es sich um ein Array handelt, liefert der Ausdruckfalse
, da derin
Vergleich von Arrays verweigert wird.Wenn
o
es sich nicht um ein Array handelt, prüfen wir, ob es gleich Null ist. Wenn dies der Fall ist, setzen wir die Variable_r
, die wir als Rückgabewert verwenden, auf Null. Andernfallso
weisen wir , wenn es sich um ein Array handelt,_r
den Rückgabewert des rekursiven Aufrufsf
mit dem neuen Array zuo
als Argument zu.Nach der Schleife wird am Ende der Funktion
f
der Ausdruck ausgewertet_r
, der den Wert von ergibt. Da_r
dies der letzte auszuwertende Ausdruck ist, gibt der Funktionsaufruf diesenf
zurück.Nachdem wir definiert haben
f
(f
müssen nicht drinnen seinA
, aber auf diese Weise hätten wir es als lokale Variable / Funktion deklarieren können (kein Unterschied),A
wenn wir nicht einige Bytes speichern wollten), gehen wir zurückA
.if (count _this == 0)
prüft, obA
das Eingabearray leer ist undA
gibt ansonsten 0 zurück. Andernfalls wird die Funktionf
aufgerufen und ihr Rückgabewert wirdA
Rückgabewert.Man könnte bemerken, dass an einigen Stellen ein Semikolon fehlen würde, aber dies ist nicht der Fall, da ein Semikolon nur nach einer Anweisung benötigt wird, wenn eine andere Anweisung innerhalb desselben Codeblocks (dh einer Zeichenfolge) darauf folgt.
quelle
Perl 5 , 15 Bytes
Mit derselben Technik wie bei der Ruby-Antwort von Doorknob wurden 2 Byte gespeichert .
14 Byte Code +
-p
FlagProbieren Sie es online!
/.../
sichergestellt , dass das Array nicht leer ist (es wird auf jedem Array entsprechen aber[]
./\b0/
wird übereinstimmen nur , wenn es eine ist ,0
in der Anordnung. (Die\b
sichergestellt , dass die0
nicht ein Teil einer anderen Zahl , sondern eine ganze Zahl ist).quelle
Haskell , 48 Bytes
Probieren Sie es online!
Vielen Dank an Lynn für die Testfälle und den
x<"[]"
Trick.Die äußere Ungleichung muss
(x<"[]")
True (nicht leere Liste) undor[elem c"[,"|c:'0':_<-scanr(:)[]x]
False (keine Nullen) sein.Zeichen von
0
werden als nach,
oder stehend erkannt[
, im Gegensatz zu einer Zahl wie20
. Der Ausdruckscanr(:)[]x
generiert alle ausreichenl
undc:'0':_<-
erfasst diejenigen, deren zweites Zeichen ist'0'
.elem c"[,"
Überprüft dann, ob das erste Zeichen,
oder ist[
.Ich gehe hier davon aus, dass Listen im Haskell-Stil keine Leerzeichen enthalten, sondern
','
nur durch ersetzt werden können' '
.Hier ist ein direktes 48-Byte - Verfahren, obwohl es produziert
0
‚s und1
‘ s, die nicht truthy / Falsey in Haskell.quelle
Gelee , 4 Bytes
Probieren Sie es online!
Wie es funktioniert
Beachten Sie, dass sich das Ạ-Atom wie das von Python verhält
all
und sich daher stark von dem verbotenen Ȧ unterscheidet.quelle
L;FẠ
. Wer kann noch einen finden?JavaScript (ES6), 34 Byte
Testfälle
Code-Snippet anzeigen
quelle
!!a[0]
anstelle von verwendena.length
. (Sie müssen sich keine Sorgen uma[0]
die Null machen , da das Ergebnis in diesem Fall ohnehin falsch sein muss.)Julia, 45 Bytes
Dadurch wird eine Funktion erstellt
g
, die durch Aufrufen einer rekursiven Funktion angibt, ob Ȧ 1 oder 0 ista
. Um ein passendes zu machena
, verwenden wir mehrere Versandarten:Die Funktion
all
nimmt ein Funktionsargument an, also rufen wir aufa
jedes Element der Eingabe auf. Dann definieren wir einfach die Funktion für die Einreichung alsGrundsätzlich brauchen wir nur
a
aber mit einem Scheck richtig umgehen[]
.Probieren Sie es online!
quelle
a(x)
oderg(x)
als!x
stattdessen?Schmutz ,
161411 BytesVielen Dank an Zgarb für das Speichern von 5 Bytes.
Probieren Sie es online!
Das
e
weist Grime an, zu versuchen, die gesamte Eingabe abzugleichen und0
oder zu drucken1
je nachdem, ob dies möglich ist.Das
|!
ist quasi ein "Keinen" Operator, weilx|!y
es eine Abkürzung für ist(x|y)!
. Wir stellen also sicher, dass die Eingabe weder eine Null mit vorangestelltem Symbol enthält, noch eine Zeichenfolge mit nur zwei Zeichen ([]
) ist.Ein Hinweis zur zweiten Hälfte:
P#
Stimmt mit einem Rechteck überein, das mindestens eine Übereinstimmung von enthältP
. In unserem FallP
besteht es jedoch aus beidems
und\0
das würde normalerweise Klammern erfordern:(s\0)#
(weil die Priorität von#
zu hoch ist). Aber Grime hat eine wirklich nette Funktion, mit der Sie die Priorität von Operatoren mit^
und ändern könnenv
. Wenn Sie also die Priorität vonv#
wir#
verringern, ist sie niedriger als die eines anderen Operators (einschließlich Verkettung), wodurch wir ein Byte in den Klammern speichern können.quelle
Pip , 12 Bytes
Nimmt das Array als Befehlszeilenargument in Pips Repr-Form wie
[1;[2;3]]
. Returns1
für truthy,0
für Falsey. Probieren Sie es online aus oder überprüfen Sie alle Testfälle .Erläuterung
Bonusantwort, 12 Bytes
Hier ist eine Funktion, die stattdessen eine Liste annimmt:
TIO
quelle
Röda ,
5944 BytesProbieren Sie es online!
f
Nimmt die Eingabe aus seinem Stream als Liste, die andere Listen und ganze Zahlen enthalten kann. Es kehrt zurück,1
wenna
es wahr ist und sonst nichts. Die Hilfsfunktiong
prüft, oba
Nullen enthalten sind.Erläuterung:
Eine Lösung, die reguläre Ausdrücke verwendet, könnte sehr wahrscheinlich kürzer sein.
Diese Antwort hätte kürzer sein können, wenn mehrere Werte zurückgegeben werden könnten . Dies wurde bereits in einer meiner Antworten besprochen , und es wurde der Schluss gezogen, dass es in den Standardregeln zulässig ist, unterschiedliche wahrheitsgemäße und falsche Werte für unterschiedliche Eingaben zurückzugeben, aber aus irgendeinem Grund verbietet OP dies hier und da. :(
quelle
Wunder , 15 Bytes
Verwendung:
Eingabe reduzieren, alle Vorkommen von 0, logisches NICHT, logisches UND mit Eingabe abrufen.
quelle
Haskell , 62 Bytes
Probieren Sie es online!
Dies ist eine Funktion
String -> Bool
. Haskells Listen sind heterogen, so dass es keine eingebaute Möglichkeit gibt, Listen wie diese darzustellen[0, [0]]
.quelle
,
`` genauso funktionieren .Python 2 ,
45 3938 BytesProbieren Sie es online!
-6 danke an @BenFrankel
Vorgängerversion, ohne Konvertierung der Liste in String Repr, 68 Bytes:
quelle
[]
. Folgendes spart 6 Bytes und ist erfolgreich bei[]
:lambda a:bool(a)^(' 0'in`a`or'[0'in`a`)
MATLAB, 49 Bytes
Da MATLAB (wie auch Octave) diese Art von verschachtelten Arrays nicht zulässt, interpretieren wir es als String.
Zuerst ersetzen wir alle nichtstelligen Zeichen durch ein Leerzeichen. Dann
str2num
konvertieren wir es in ein (1D) -Array, auf das wir anwenden könnenall
(was erlaubt ist, da es diese Aufgabe nicht vollständig alleine löst.)quelle
egrep, 7 + 3 = 10 Bytes
+3 Bytes für das erforderliche
-v
Flag zum Invertieren des Ergebnisses.Grep kennt kein Array-Konzept, daher wird eine in der Frage angegebene Zeichenfolgendarstellung verwendet. Übernimmt die Eingabe in einer Zeile von stdin und kehrt über den Exit-Code zurück (ignoriere stdout).
(Jetzt mit einer Version, die nicht berücksichtigt
01
und ähnlich ist, da Gottes Wort ist, dass es in Ordnung ist)Ursprünglicher bash / grep Eintrag:
Findet
0
s überall (mit den Wortbegrenzungsprüfungen\<
und\>
um Dinge wie zu diskontieren10
odera1
) oder eine ganze Zeichenfolge, die übereinstimmt[]
abzuwerten und invertiert die Übereinstimmung.Nervenzusammenbruch:
quelle
\<0\|^.]
plus-v
würde als 11-Byte-Lösung gelten.egrep
anstatt esgrep
zu speichern. Der Name der Sprache zählt nicht für die Anzahl der Bytes!)Javascript ES6, 24 Zeichen
Funktioniert mit Array, Retouren
1
oder0
:Prüfung:
quelle
!!
(obwohl dann müssen Sie&
auf&&
). Speichert ein Byte.&
. Im Falle&&
ohne!!
konsistente Ausgabe wird gebrochen:undefined
für[]
,0
für[0]
und[0,1,2]
undfalse
für andere.&&
ist, dass Sie dies benötigen würden, wenn Sie meinen ersten Vorschlag übernehmen würden, da2 & 1 == 0
.√ å ı ¥ ® Ï Ø ¿ ,
124 BytesErläuterung
Wenn das Ergebnis ausgegeben werden muss ...
Vorherige Lösung
Ich hatte dies gepostet, bevor mir klar wurde, dass stapelbasierte Sprachen den Wert als Ausgabeform auf dem Stapel belassen können
Erläuterung
quelle
Haskell, 45
Wie Lynn und xnor bemerkten, wird Haskell nicht mit einem heterogen verschachtelten Listentyp geliefert . Es ist jedoch einfach, sie als benutzerdefinierten Datentyp hinzuzufügen und die Funktion auf diesen Typ anwenden zu lassen. Dies ist der Verwendung von (urgh!) - Zeichenfolgen weitaus vorzuziehen .
Um solche Listen tatsächlich als Literale mit
[1, [2]]
Syntax ausschreiben zu können , benötigen Sie auch Typeclass Fu. Vollständiger Testfall:Probieren Sie es online!
quelle
Vim, 23 Bytes
Probieren Sie es online!
Gibt eine leere Zeichenfolge für false oder
1
true aus. Dies kann kürzer sein, wenn ich eine leere Zeichenfolge ausgeben kann oder[]
falsch (beides sind falsche Werte in vim).quelle
Gestapelt , 20 Bytes
Probieren Sie es online!
Alternativ können Sie eine Zeichenfolge verwenden:
Probieren Sie es online!
quelle
Lithp , 74 Bytes
Probieren Sie es online!
Nun, das war länger, als ich gehofft hatte. Der
[]
Fall löste mich aus und fügte ein paar Bytes hinzu. Die Liste wird einfach geglättet und es wird ein Fold darüber ausgeführt. Wenn eine 0 gefunden wird, wird der Akku auf 0 gesetzt.quelle
Ruby ,
2422 BytesProbieren Sie es online!
Ja, ich weiß, es gibt eine bessere Lösung in Ruby, aber ich wollte eine finden, die das Array in der Eingabe anstelle einer Zeichenfolge verwendet.
quelle
tinylisp ,
7064 BytesDie letzte Zeile ist eine unbenannte Lambda-Funktion, die eine Liste aufnimmt und
1
für "truthy under Ȧ" und0
für "falsey" zurückgibt. Probieren Sie es online!Ungolfed
Die rekursive Hilfsfunktion
_Ȧ
erledigt den größten Teil der Arbeit. Wenn sein Argument eine Liste ist,map
_Ȧ
kehren wir zu seinen Elementen zurück und prüfen, ob1
sieall
wahr sind oder ob sie falsch0
sind. (Praktischerweiseall
zurückkehrt ,1
wenn die leere Liste angegeben.) Ansonsten müssen ganzzahlig sein; wir geben es so zurück, wie es ist (0
ist falsch und alle anderen ganzen Zahlen sind in tinylisp wahr).Die Hauptfunktion
Ȧ
prüft, ob die Liste nicht leer ist. Wenn ja, ruft es an_Ȧ
; Wenn nicht, kehrt es zurück0
.Die Golf-Version nutzt ein undefiniertes Verhalten: Anstatt
(e(type X)List)
zu testen, obX
es sich um eine Ganzzahl oder eine Liste handelt(c()X)
, versucht sie,cons
die leere Liste voranzustellenX
. WennX
es sich um eine Liste handelt, wird eine nicht leere Liste erstellt, die der Wahrheit entspricht. WennX
es sich um eine Ganzzahl handelt, gibt tinylisp eine Fehlermeldung aus und gibt eine leere Liste zurück, die falsch ist. Da stderr ignoriert wird, ist dieser Ansatz gültig.quelle
PHP,
6354 Bytes9 Bytes gespeichert von @ user63956
nimmt ein Array als Eingabe; gibt zurück
true
oderfalse
: Wenn$a
nicht leer ist,überprüfen Sie, ob die
print_r
Ausgabe a enthält0
Wert .Array-Lösung, 83 Bytes
rekursive Funktion gibt zurück
1
oder zurück0
.Nervenzusammenbruch
quelle
strpos(print_r($a,1)," 0")
stattpreg_match(...)
.print_r
Parameter war mir nicht bekannt . Groß!