Inspiriert von und in Erinnerung an meinen lieben Freund und Kollegen,
Dan Baronet , 1956 - 2016. RIP
Er fand die kürzestmögliche APL-Lösung für diese Aufgabe:
Aufgabe
Zählen Sie anhand einer Booleschen Liste die Anzahl der nachgestellten Wahrheitswerte.
Beispielfälle
{}
→ 0
{0}
→ 0
{1}
→ 1
{0, 1, 1, 0, 0}
→ 0
{1, 1, 1, 0, 1}
→ 1
{1, 1, 0, 1, 1}
→ 2
{0, 0, 1, 1, 1}
→ 3
{1, 1, 1, 1, 1, 1}
→ 6
01100
?Antworten:
Dyalog APL,
62 BytesTesten Sie es auf TryAPL .
Wie es funktioniert
⊥ (uptack, dyadic : decode) führt eine Basiskonvertierung durch. Wenn der linke Operand ein Vektor ist, führt er eine gemischte Basiskonvertierung durch, die für diese Aufgabe perfekt ist.
Für einen Basisvektor b = b n , ⋯, b 0 und einen Ziffernvektor a = a n , ⋯, a 0 , b ⊥ a wird a in die gemischte Basis b umgewandelt , dh es wird b 0 ⋯ b n-1 a berechnet n + ⋯ + b 0 b 1 a 2 + b 0 a 1 + a 0 .
Mit ⍨ (Tildedierese, Pendeln) wird der Operator nach links wie folgt geändert. In einem monadischen Kontext wird der Operator mit den gleichen Argumenten für left und right aufgerufen.
Zum Beispiel ist ⊥⍨ a als ⊥ a definiert , das a 0 ⋯ a n + ⋯ + a 0 a 1 a 2 + a 0 a 1 + a 0 berechnet , die Summe aller kumulierten Produkte von rechts nach links .
Für k nachgestellte sind die k am weitesten rechts stehenden Produkte 1 und alle anderen 0 , sodass ihre Summe gleich k ist .
quelle
b⊥b
und⊥⍨b
geben bis zu unendlicher Geschwindigkeit-up.JavaScript (ES6), 21 Byte
Testfälle
Code-Snippet anzeigen
quelle
f(l)+1
ein Wert zurückgegeben> 2
?l.pop()?(l.pop()?(l.pop()?(...etc...)+1:0)+1:0)+1:0
.Gelee , 4 Bytes
Probieren Sie es online! oder Überprüfen Sie alle Testfälle.
Für den Fall, dass die Liste leer ist, gibt es einige merkwürdige Beobachtungen. Zunächst gibt die Lauflängencodierung der leeren Liste eine
[]
weitere leere Liste zurück[]
. Dann wird das letzte Element unter Verwendung von TailṪ
Returns0
anstelle eines Paares zurückerhalten, das[value, count]
die regulären Elemente eines lauflängencodierten Arrays sind. DannP
kehrt das Produkt zurück,0
wenn es aufgerufen0
wird. Dies ist das erwartete Ergebnis.Erläuterung
quelle
ŒgṪS
funktioniert auch!Ṫ
in Jelly implementiert als:lambda z: iterable(z).pop() if iterable(z) else 0
.iterable
Wenn eine Liste aufgerufen wird, wird nur die Liste zurückgegeben, und die leere Liste ist natürlich falsch.Brachylog ,
765 BytesProbieren Sie es online!
Erläuterung
Da
@] - Suffix
vom größten bis zum kleinsten Suffix begonnen wird, wird der längste Lauf zuerst ermittelt.quelle
CJam (8 Bytes)
Online-Testsuite
Präparation
quelle
Haskell,
2625 BytesVerwendungszweck:
Punktfreie Version (26 Bytes):
Verwenden einer Integer-Liste anstelle einer Bool-Liste (21 Bytes, danke an Christian Sievers):
Verwendungszweck:
Punktfreie Version (25 Bytes)
quelle
foldl
funktioniert die Idee mita%b=b*(a+1)
Retina ,
75 BytesProbieren Sie es online! (Die erste Zeile aktiviert eine durch Zeilenvorschub getrennte Testsuite.)
Die Definition des Eingabeformats für Retina ist nicht eindeutig. Da Retina kein Konzept außer Zeichenketten hat (und auch keinen Wert, der für unsere übliche Definition von Wahrhaftigkeit und Falschheit verwendet werden kann), benutze ich normalerweise
0
und1
(oder etwas Positives im Allgemeinen), um Wahrhaftigkeit und Falschheit zu entsprechen, wie sie darstellen Null bzw. einige Übereinstimmungen.Bei Einzelzeichendarstellungen benötigen wir auch kein Trennzeichen für die Liste (dies ist in gewisser Weise die natürlichere Listendarstellung für eine Sprache, die nur Zeichenfolgen enthält). Adám hat bestätigt, dass dies ein akzeptables Eingabeformat ist.
Der
r
reguläre Ausdruck selbst passt von rechts nach links und die\G
Anker passen jeweils zum vorherigen. Daher zählt dies, wie viele1
s ab dem Ende der Zeichenfolge übereinstimmen können.quelle
05AB1E ,
121065 Bytes1 Byte dank Carusocomputing eingespart .
Probieren Sie es online!
Erläuterung
quelle
0¡¤g
ist vier Bytes.J0¡¤g
ist auch noch kürzer;).Î
die leere Eingabe behandeln, aber es ist immer noch ein Byte gespeichert, danke :)Python, 31 Bytes
quelle
Gelee , 4 Bytes
TryItOnline! oder alle Tests
Wie?
quelle
MATL , 4 Bytes
Probieren Sie es online!
quelle
Mathematica,
2524 Bytesquelle
FromDigits[b=Boole@#,MixedRadix@b]&
(35 Bytes).Pyth, 6 Bytes
Probieren Sie es hier aus!
Hängt eine 0 an, kehrt um und findet den Index der ersten 0
quelle
C90 (gcc), 46 Bytes
Die Eingabe erfolgt über Befehlszeilenargumente (eine Ganzzahl pro Argument) und die Ausgabe über Exit-Code .
Probieren Sie es online!
Wie es funktioniert
r ist eine globale Variable. Sein Typ ist standardmäßig int und als globaler Wert standardmäßig 0 .
Das Funktionsargument c ist ebenfalls standardmäßig int . Es wird die ganze Zahl n + 1 für Arrays von n Booleschen Werten enthalten. Das erste Argument von main ist immer der Pfad der ausführbaren Datei.
Das Funktionsargument v wird als deklariert
int**
. Der tatsächliche Typ von v istchar**
, aber da wir nur das niedrigstwertige Bit jedes Arguments untersuchen, um die Zeichen 0 (Codepunkt 48 ) und 1 (Codepunkt 49 ) voneinander zu unterscheiden, ist dies für Little-Endian nicht von Bedeutung maschinen.Die while-Schleife dekrementiert c und vergleicht es mit 0 . Sobald c 0 erreicht , brechen wir aus der Schleife aus. Dies wird nur benötigt, wenn das Array keine 0 enthält .
Solange
0<--c
kehrt 1 , wir die Takes c th Befehlszeilenargument (v[c]
) und dessen erstes Zeichen durch Extrahieren mit dereferenzieren den Zeiger (*
). Wir nehmen die bitweise UND -Verknüpfung der Booleschen0<--c
und den Codepunkt des Zeichens (und drei Müll Bytes , die ihm folgen), so dass der Zustand zurückkehren 0 einmal 0 angetroffen wird, aus der Schleife zu brechen.In dem verbleibenden Fall, während die Befehlszeilenargumente sind 1 ,
r++
inkrementiert r von 1 , wodurch die Anzahl der Zählung nachlauf 1 ‚s.Schließlich
c=r
speichert den berechneten Wert von R in c . Mit den Standardeinstellungen optimiert und entfernt der Compiler die Zuordnung. es erzeugt tatsächlich diemovl %eax, -4(%rbp)
Anweisung. Daret
der Wert des EAX-Registers zurückgegeben wird, wird die gewünschte Ausgabe generiert.Beachten Sie, dass dieser Code nicht mit C99 funktioniert, das 0 von main zurückgibt, wenn das Ende von main erreicht ist.
quelle
argc
zumindest1
(mitargv[0]
dem Dateinamen)? Sie könnten ein Byte mit--c&&
anstelle von speichern0<--c&
. gcc´s Exit Code stammt vonargc
? Ordentlich.*v[c]
ist der Codepunkt 1 oder 0 , also entweder 49 oder 48 und somit immer wahr.k, 6 Bytes
Diese Funktionskomposition übersetzt
sum mins reverse
inq
, das besser lesbare Geschwisterpaar der Sprache, bei dem die Minuten ein rollendes Minimum darstellen.quelle
J,
93 BytesDies ist eine reflexive gemischte Basenumwandlung. Weil dies dasselbe ist wie eine gemischte Basenumwandlung. Nochmal.
Testfälle
quelle
R,
40 3925 BytesKomplett überarbeitete Lösung dank @Dason
Lesen Sie die Eingabe von stdin, kehren Sie den Vektor um, und wenn das erste Element von
!=0
dann die erste Länge der Lauflängencodierung (rle
) ausgibt , sonst0
.quelle
ifelse(r$v,r$l,0)[1]
. (Vectorized if, und nehmen Sie dann das erste Element.)Haskell, 24 Bytes
Durchläuft die Liste, fügt eine für jedes Element hinzu und setzt auf zurück,
0
nachdem es a getroffen hatFalse
.16 Bytes mit 0/1 Eingang:
Wenn die Liste garantiert nicht leer wäre, könnten wir 14 Bytes bekommen:
Dadurch wird das kumulative Produkt von hinten berechnet und dann summiert. Das kumulative Produkt bleibt 1, bis eine 0 erreicht wird, und wird dann zu 0. Die Einsen entsprechen also den nachfolgenden Einsen.
quelle
Pyke,
106 BytesProbieren Sie es hier aus!
quelle
C # 6,
10372 BytesDie Verwendung einer nicht generischen Liste schlägt die generische Liste um 1 Byte (lol)
-31 Bytes dank Scott
quelle
int
s verwenden, können Sie mitint a(int[] l)=>l.Reverse().TakeWhile(i=>i>0).Sum();
Func<bool[], int>
für 57 Bytes, dhusing System.Linq;l=>l.Reverse().TakeWhile(x=>x).Count();
Python, 37 Bytes
quelle
DASH , 16 Bytes
Es ist nicht die kürzestmögliche DASH-Lösung, aber die kürzestmögliche DASH-Lösung nervt mich. Ich poste diesen neuartigen Ansatz an seiner Stelle.
Verwendungszweck:
Erläuterung
quelle
Scala, 25 Bytes
Ungolfed:
Kehrt die Liste um, fügt eine 0 hinzu und ermittelt den ersten Index von 0, dh die Anzahl der Elemente vor der ersten 0
quelle
Batch, 57 Bytes
Übernimmt Eingaben als Befehlszeilenparameter. Multipliziert den Akku mit dem aktuellen Wert, bevor er hinzugefügt wird, sodass alle Nullen in der Befehlszeile den Zähler zurücksetzen. Beachten Sie, dass dies
%%n
nicht mit der Variablenn
oder identisch%n%
ist.quelle
GolfSharp, 14 Bytes
quelle
Java 7, 62 Bytes
Ungolfed & Testcode:
Probieren Sie es hier aus.
Ausgabe:
quelle
Perl 5.10, 22 Bytes
21 Bytes + 1 Byte für
-a
Flag. Da der Ausdruck auf Regex-Basis erstellt wurde ...: pDie Eingabewerte für das Array müssen durch ein Leerzeichen getrennt werden.
Probieren Sie es online!
quelle
perl -E '$_++while pop;say' 0 1 1 0 1 1 1
Dies gibt jedoch nichts aus für0
(nicht sicher, ob das ein Problem ist!)Perl, 22 Bytes
21 Byte Code + 1 Byte für
-p
Flag.Um es auszuführen:
(Eigentlich ist das Format der Eingabe keine Rolle spielt viel:
0110111
,0 1 1 0 1 1 1
,[0,1,1,0,1,1,1]
usw. würden alle Arbeit)18-Byte-Version von @Dom Hastings , die Eingabe muss jedoch als Zeichenfolge von 0 und 1 angegeben werden, was nicht zulässig ist:
quelle
;
Trick :) Wenn Format eine fortlaufende Zeichenfolge ist:perl -pE '/1*$/;$_=length$&' <<< '0110111'
für 18, nicht sicher, ob das die Regeln verbiegt oder nicht ...PHP, 50 Bytes
Seltsamerweise fiel mein erster Versuch mit einem Regex kürzer aus als mein Versuch mit Arrays ...
Verwendung wie:
quelle
Ruby
3732 BytesErstellt eine anonyme Funktion, die die am weitesten rechts stehende Instanz eines falschen Werts findet und die Größe des Subarrays ab diesem Wert zählt.
Es wird
!0
als false verwendet, da 0 in Ruby die Wahrheitswerte sind.rindex
Findet den letzten Index eines Wertes in einem Array.Verwendung :
Gibt 1 zurück
Wenn mir erlaubt wäre, eine Zeichenfolge von 0 und 1 als Befehlszeilenparameter zu übergeben (was nicht der Fall ist, wenn Ruby Listen von Booleschen Werten darstellt), könnte ich es auf 24 bringen:
Dabei werden reguläre Ausdrücke verwendet und die Länge der Zeichenfolge ausgegeben, die vom regulären Ausdruck zurückgegeben
/(1*)\z/
wird. Dabei\z
handelt es sich um das Ende der Zeichenfolge.$*[0]
wird das erste Argument übergeben und ist eine Zeichenfolge aus 0s und 1s.Verwendungszweck:
Gibt 1 zurück.
quelle