Ihre heutige Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die ein Array von ganzen Zahlen enthält und zählt, wie oft sich der Wert von links nach rechts ändert. Dies lässt sich leichter anhand eines Beispiels zeigen:[1 1 1 2 2 5 5 5 5 17 3] => [1 1 1 **2** 2 **5** 5 5 5 **17** **3**] => 4
Testfall:
Input | Output
[] | 0
[0] | 0
[0 1] | 1
[0 0] | 0
[1 2 3 17] | 3
[1 1 1 2 2 3] | 2
[-3 3 3 -3 0] | 3
Das ist Code-Golf , die wenigsten Bytes gewinnen!
False
wird stattdessen gedruckt?2+False
und es Fehler, ist das nicht in Ordnung, aber wenn ich es bekomme2
, ist das in Ordnung.0
akzeptabel?Antworten:
MATL , 2 Bytes
Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
quelle
Python 3 , 38 Bytes
Probieren Sie es online!
quelle
maximum recursion depth exceeded
.y>()
wird es mit False ausgewertet , sodass der folgende Codeand
nicht ausgeführt wird.Haskell , 33 Bytes
Probieren Sie es online!
Bonus: Etwas merkwürdige punktfreie Rechenversion (44 Bytes)
Probieren Sie es online!
Ein Eingang gegeben
[1,1,4,3,3,3]
, nehmen wir zuerst die Differenz benachbarter Einträge ([0,3,-1,0,0]
), dann derabs
quenten Wert:[0,3,1,0,0]
. Wenn Sie beim ersten Mal die Potenz jedes Elements auf Null setzen, wird die[1,0,0,1,1]
Liste beim zweiten Mal umgekehrt:[0,1,1,0,0]
((1-)
würde auch hier funktionieren(0^)
). Zum Schluss nehmen wir diesum
von der Liste, um sie zu bekommen2
.quelle
Python 2 , 42 Bytes
Probieren Sie es online!
quelle
Brain-Flak , 50 Bytes
Probieren Sie es online!
Gibt nichts für 0 aus, was in brain-flak äquivalent ist. Wenn dies nicht akzeptabel ist, hängen Sie dies für
+4
Bytes an:({})
Erläuterung:
quelle
-0+1 = 1
Brain-Flak , 50 Bytes
Probieren Sie es online!
quelle
Haskell , 35 Bytes
-8 Bytes dank H.PWiz.
Ausgolfen durch eine rekursive Version . Haskell ist so ziemlich der Beste in Rekursion und ich habe es verpasst. > _ <
Probieren Sie es online!
Es wäre fantastisch, wenn jemand herausfinden würde, wie man diesen Tipp einsetzt .
Alternative Lösung, 36 Bytes
Probieren Sie es online!
quelle
uncurry
die Funktion benötigenf
, um sie zum Laufen zu bringen. Diessum.map fromEnum.(zipWith(/=)=<<tail)
ist wahrscheinlich die nächstgelegene, die Sie erhalten, aber es funktioniert nicht mit[]
und ist 37 Bytes ..Java (OpenJDK 8) , 65 Byte
Nicht so kurz wie ich möchte, aber das ist nur Java für Sie.
Testen Sie, indem Sie das Array als kommagetrennte Liste übergeben.
Probieren Sie es online!
quelle
a->{int s=0,p=a[0];for(int n:a)s+=p==(p=n)?0:1;return s;}
(57 Byte).a->{int s=0;for(int i:a)s+=a[0]!=(a[0]=i)?1:0;return s;}
Schale , 3 Bytes
Probieren Sie es online!
Erläuterung
quelle
Ohm v2 , 3 Bytes
Probieren Sie es online!
Erläuterung
quelle
sign
eingebauten!Wolfram Language (Mathematica) , 23
242629BytesProbieren Sie es online!
Split[]
.eine kleine Erklärung:
Split
teilt ein Array in eine Liste von Listen (gleicher Elemente), das heißt{1, 2, 2, 3, 1, 1}
in{{1}, {2, 2}, {3}, {1, 1}}
. SoLength@Split@#
ist die Anzahl der aufeinanderfolgenden Segmente.Max[*****-1, 0]
wird verwendet, um mit{}
Eingaben umzugehen .quelle
Max[Length@Split@#-1,0]&
Length@Split@#~Max~1-1&
Retina ,
242116 BytesDanke an @MartinEnder für -3 Bytes und einen Bug
-1 Bytes dank @tsh
-4 Bytes dank @Leo
Probieren Sie es online!
quelle
Symbolisches Python ,
120 bis117 BytesGolfed 3 Bytes durch Entfernen einer expliziten Umwandlung in eine Ganzzahl (unter Verwendung von unary
+
) für die Zählervariable. Dies bedeutet, dass die AusgabeFalse
stattdessen erfolgt , wenn keine Änderungen im Array vorgenommen wurden.0
Dies ist jedoch durch Meta zulässig .Probieren Sie es online!
quelle
Gelee , 3 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
K (oK) , 8 Bytes
Lösung:
Probieren Sie es online!
Beispiele:
Erläuterung:
Interpretation von rechts nach links:
quelle
05AB1E , 3 Bytes
Probieren Sie es online!
quelle
Schale , 4 Bytes
Probieren Sie es online!
quelle
R , 24 Bytes
Probieren Sie es online!
Entspricht der MATL-Antwort, wird nur verwendet,
sum(!!diff))
da es kein gibtnnz
.quelle
rle
wäre kürzer, aber nein,length(rle()$v)
verwendet zu viele Zeichen und ist um eins aus.sum(rle()$v|1)
stattlength
sowieso. :)Cubix , 24 Bytes
Probieren Sie es online aus
Beachten Sie, dass Cubix mit 0 angibt, dass keine weiteren Eingaben vorhanden sind, sodass 0 nicht in der Liste enthalten sein kann.
Erläuterung
Entfaltet:
Wir beginnen beim
0
, indem wir den Zähler (initialisiert mit0
) und die erste Eingabe (I
) auf den Stapel legen.Wir betreten dann die Schleife. Bei jeder Iteration der Schleife erhalten wir die nächste Eingabe mit
I
. Wenn es 0 ist, haben wir keine Eingaben mehr, also drehen wir den Zähler nach oben (p
),O
utput und exit (@
).Ansonsten nehmen wir die Differenz der beiden obersten Elemente. Wenn es nicht Null ist, drehen wir den Zähler nach oben, inkrementieren ihn und drehen ihn mit nach unten zurück
p)q
. Wir machen dann den Unterschied mit,;
bevor wir zur nächsten Iteration übergehen.Alle hier nicht erwähnten Zeichen sind nur Kontrollflüsse. In Cubix-Programmen gibt es in der Regel viele davon.
quelle
0
gegen eine tauschen(
, aber das schlägt bei der leeren Eingabe fehl.Brain-Flak , 50 Bytes
Probieren Sie es online!
Da jeder seine 50-Byte-Lösungen hier veröffentlicht, ist es meine (ich habe eine 48- Byte-Lösung, aber es war eine einfache Modifikation von DjMcMayhem, so dass ich es für sinnvoll hielt, sie zu veröffentlichen)
Erläuterung
In dieser Antwort wird häufig die Wertekompensation verwendet.
Ohne Golf sieht es aus
Hier berechnen wir die Deltas, bis der Stapel ein Element übrig hat, jedes Mal, wenn wir einen Wert aus der inneren Schleife akkumulieren, wenn das Delta nicht Null ist.
Dies ist ein ziemlich direkter Weg, dies zu tun.
Um diesen Golf zu spielen, beginnen wir mit der Wertaufhebung. Der erste und derjenige, der für gehärtete Brain-Flak-Golfer offensichtlich sein sollte, sind die Stapelhöhen. Es ist eine bekannte Tatsache, dass
ist das gleiche wie
Wenn die Werte um eins geändert werden, gilt dasselbe. Das gibt uns
Sie werden vielleicht bemerken, dass uns dies nicht einmal Bytes erspart hat, aber ärgern Sie sich nicht, dass es im weiteren Verlauf nützlicher wird.
Wir können eine weitere Reduktion durchführen, wenn Sie eine Aussage sehen
Sie können es tatsächlich reduzieren
Dies funktioniert, weil, wenn wir in die Schleife eintreten
[(...)]
und{}
abbrechen, und wenn wir dies nicht tun, der Wert von[(...)]
bereits an erster Stelle Null war und nicht abgebrochen werden muss. Da dieses Muster in unserem Code vorkommt, können wir es reduzieren.Das hat uns 2 Bytes gespart, aber auch zwei Negative nebeneinander gelegt. Diese können kombiniert werden, um uns weitere 2 zu ersparen.
Und das ist unser Code.
quelle
Perl 6 , 18 Bytes
Probier es aus
Erweitert:
quelle
Gaia , 2 Bytes
Probieren Sie es online!
Dies missbraucht einen Fehler (oder eine Funktion?) Von Gaia, bei dem die Lauflängencodierung den letzten Lauf von Elementen nicht berücksichtigt. Beachten Sie, dass ich doppelt geprüft habe, es funktioniert für alle Testfälle.
ė
- Lauflängencodierung (mit dem oben beschriebenen Fehler).l
- Länge.quelle
JavaScript (ES6), 35 Byte
quelle
f=([a,...b])=>1/a?!!(a-b[0])+f(b):0
Pyth, 5 Bytes
Testsuite.
Erläuterung:
quelle
APL (Dyalog) , 8 Bytes
Probieren Sie es online!
Wie?
⊃,⊢
- die Liste, wobei der erste Wert für den Fall eines einzelnen Elements wiederholt wird2≠/
- Änderungsliste, nicht für alle 2 Elemente gleich+/
- Summequelle
Perl 5 , 37 + 2 (
-ap
) = 39 BytesProbieren Sie es online!
quelle
J 10 Bytes
Infixe der Länge 2 ... sind sie ungleich?
2 ~:/\ ]
Summiere die resultierende Liste von
0
s und1
s:+/
Probieren Sie es online!
quelle
[:+/0=-/\
sollte funktionieren, ich denke 9 Bytes.Ruby , 31 Bytes
Probieren Sie es online!
quelle
.drop(1)
Ihnen können[1..-1]
drop
einen Enumerator zurück, kein Array, so dass dies nicht funktioniert.size
sowieso nicht die eines Arrays nehmen?C (gcc 5.4.0), 61 Bytes
Probieren Sie es online!
f
ist eine Funktion, die die Länge des Arrays und einen Zeiger auf das erste Element des Arrays nimmt und die Anzahl der Änderungen im Array zurückgibt;Diese Übermittlung verwendet undefiniertes Verhalten (
*p++!=*p
, p wird zweimal in einem Ausdruck verwendet, in dem es geändert wird), das auf meinem Computer (gcc 5.4.0) und in TIO funktioniert, jedoch möglicherweise nicht auf anderen Implementierungen oder Versionen funktioniert.Erläuterung:
quelle
05AB1E , 3 Bytes
Probieren Sie es online!
Eine Alternative zu Eriks Antwort.
quelle