In der Mathematik besteht eine Möglichkeit, die Art einer gegebenen Beziehung (linear, quadratisch usw.) herauszufinden, darin, die Differenzen zu berechnen. Dazu nehmen Sie eine Liste von y-Werten, für die der Abstand zwischen den entsprechenden x-Werten gleich ist, und subtrahieren jeden einzelnen von der darüber liegenden Zahl. Dabei wird eine Liste von Zahlen erstellt, die eine Nummer kürzer als die vorherige Liste ist. Wenn die resultierende Liste vollständig aus identischen Zahlen besteht, hat die Beziehung eine Differenz von 1 (sie ist linear). Wenn sie nicht identisch sind, wiederholen Sie den Vorgang in der neuen Liste. Wenn sie jetzt identisch sind, hat die Relation eine Differenz von 2 (sie ist quadratisch). Wenn sie nicht identisch sind, setzen Sie diesen Vorgang einfach fort, bis sie identisch sind. Wenn Sie beispielsweise die Liste der y-Werte [1,6,15,28,45,66] haben, um die x-Werte schrittweise zu erhöhen, gehen Sie wie folgt vor:
First Differences:
1
6 1-6 =-5
15 6-15 =-9
28 15-28=-13
45 28-45=-17
66 45-66=-21
Second differences:
-5
-9 -5+9 =4
-13 -9+13 =4
-17 -13+17=4
-21 -17+21=4
As these results are identical, this relation has a difference of 2
Deine Aufgabe:
Schreiben Sie ein Programm oder eine Funktion, die bei Angabe eines Arrays von Ganzzahlen als Eingabe die Differenz der durch das Array beschriebenen Beziehung zurückgibt, wie oben erläutert.
Eingang:
Ein Array von Ganzzahlen, das eine beliebige Länge> 1 haben kann.
Ausgabe:
Eine Ganzzahl, die die Differenz der durch die Eingabe beschriebenen Beziehung darstellt.
Testfälle:
Input => Output
[1,2,3,4,5,6,7,8,9,10] => 1
[1,4,9,16,25,36] => 2
[1,2,1] => 2 (when there is only one value left, all values are automatically identical, so the largest difference an array can have is equal to the length of the array-1)
"Hello World" => undefined behavior (invalid input)
[1,1,1,1,1,1,1,1,1] => 0 (all elements are already identical)
[1, 3, 9, 26, 66, 150, 313, 610] => 6
Wertung:
Dies ist Code-Golf . Die niedrigste Punktzahl in Bytes in jeder Sprache gewinnt für diese Sprache. Die niedrigste Gesamtpunktzahl erhält das grüne Häkchen.
quelle
[1,2,1]
2 geben?[1,2,1] -> [1,-1] -> [-2]
[1,3,9,26,66,150,313,610]
->6
wenn SieAntworten:
Schale , 6 Bytes
Danke Leo, dass ich seine Version verwenden durfte, die für funktioniert
[1,1,1,1,1,1]
Probieren Sie es online!
Erläuterung
quelle
[1,1,1,1]
, kann ich deinen verwenden?JavaScript (ES6), 47 Byte
Testfälle
Code-Snippet anzeigen
quelle
MATL , 8 Bytes
Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
Dadurch werden aufeinanderfolgende Differenzen iterativ kompensiert, bis das Ergebnis vollständig null oder leer ist. Die Ausgabe ist die erforderliche Anzahl von Iterationen minus 1.
quelle
R ,
5044 BytesProbieren Sie es online!
Nimmt ein
diff
vonl
, setzt es aufl
und prüft, ob das Ergebnis Werte ungleich Null enthält. In diesem Fall wird inkrementiertF
(wieFALSE
implizit initialisiert ), und es wirdF*1
zur Konvertierung zurückgekehrtFALSE
,0
falls bereits allesl
identisch ist.quelle
+F
Trick für 5 Bytes . Gute Antwort übrigens!Mathematica, 49 Bytes
Danke @alephalpa für -6 Bytes und @hftf -1 Bytes
und hier ist ein anderer Ansatz von @hftf
Mathematica, 49 Bytes
quelle
(s=#;t=0;While[UnsameQ@@s,s=Differences@s;t++];t)&
UnsameQ[1,2,1]
ist falsch;!SameQ[1,2,1]
ist wahr. Ich glaube auch nicht, dass die manuelle Schleife Zeichen speichert: SieLength@NestWhileList[Differences,#,!SameQ@@#&]-1&
hat nach dem ErsetzenUnsameQ
durch bereits die gleiche Länge wie Ihre!SameQ
.Gelee , 7 Bytes
Probieren Sie es online!
Erläuterung
quelle
IÐĿE€ċ0
Japt ,
107 BytesProbieren Sie es online!
Beruht auf der Tatsache, dass das Ergebnis garantiert innerhalb der Länge des Eingabearrays liegt.
Erläuterung
Am Ende ordnet dies das Array
[1, 3, 9, 26, 66, 150, 313, 610]
zu[true, true, true, true, true, true, false, false]
,das
6
true
s enthält .Vorherige 10-Byte-Version
Probieren Sie es online!
quelle
Perl 6 , 37 Bytes
Probieren Sie es online!
Erläuterung: Die Funktion nimmt die Eingabe als eine Liste. Anschließend wird eine rekursive Sequenz wie folgt erstellt: Das erste Element ist die ursprüngliche Liste (
$_
), die nächsten Elemente werden zurückgegeben, indem{@(@$_ Z- .[1..*])}
sie für das vorherige Element aufgerufen werden, und dies wird so lange wiederholt, bis die Bedingung erfüllt*.none
ist, was nur dann der Fall ist, wenn die Liste eine der beiden ist leer oder enthält nur Nullen (oder technisch gesehen andere falsche Werte). Wir greifen dann die Liste und subtrahieren 2 davon, was sie zuerst in den numerischen Kontext zwingt (und Listen im numerischen Kontext sind gleich der Anzahl ihrer Elemente) und am Ende 2 weniger als die Anzahl der Elemente in der zurückgibt Liste.Der seltsame Block
{@(@$_ Z- .[1..*])}
nimmt einfach die angegebene Liste (.[]
sogenanntes Zen-Slice - Indizieren mit leeren Klammern ergibt die gesamte Liste), komprimiert sie mit dem Minus-Operator (Z-
) mit derselben Liste ohne das erste Element (.[1..*]
) und zwingt sie zu einer Liste (@(...)
- Wir brauchen das, weil zip nur eine Seq zurückgibt, was im Grunde eine Einwegliste ist, die nur einmal wiederholt werden kann. Das ist etwas, das wir nicht mögen.) Und das ist es.quelle
@(.[] Z- .[1..*])
auf[.[] Z-.[1..*]]
sollte zwei Bytes speichern.Java 8,
191 + 58 = 249198140 Bytes.Danke PunPun1000 für 51 Bytes.
Danke Nevay für 58 Bytes.
Probieren Sie es online!
Online testen (198-Byte-Version)
Dies ist also mein erster Beitrag hier in PPCG (und das erste Mal, dass ich eine Code-Golf-Herausforderung mache). Jede konstruktive Kritik ist willkommen und wird geschätzt. Ich habe versucht, die Richtlinien für das Posten zu befolgen. Wenn etwas nicht stimmt, kann ich Sie gerne darauf hinweisen.
Verschönerte Version:
quelle
java.util.stream.IntStream k = java.util.Arrays.stream(a);
public
muss nicht in die Byteanzahl einbezogen werden. 2) Sie sollten keinen zweiten Parameter akzeptieren, aber wenn Sie ihn entfernen, können tatsächlich Bytes eingespart werden. 3) Sie können einige nicht benötigte Klammern dort entfernenHaskell, 46 Bytes
Dies ist einfach eine Rekursion -
zipWith(-)l$last l
ist die Differenzliste vonl
. undg
ist die Funktion, die die Frage beantwortet.quelle
Kotlin , 77 Bytes
Erster Beitrag, habe 2 mal versucht, die letzte Antwort auf kotlin zu bearbeiten; D
nahm am Testen von @jrtapsell teil
TryItOnline
quelle
APL (Dyalog Classic) ,
2217 BytesProbieren Sie es online!
Danke an @ngn für -5 Bytes!
Wie?
{ ... }
, die Funktion1=≢∪⍵:0
Wenn jedes Element im Argument gleich ist, geben Sie zurück0
1+∇2-/⍵
Andernfalls geben Sie 1 +n
der Differenzen zurück (was bedeutetn-1
, dass eine dazu addiert wirdn
).quelle
{1=≢∪⍵:0⋄1+∇2-/⍵}
Gelee , 7 Bytes
Probieren Sie es online!
Erläuterung
-1 Byte danke an Jonathan Allan
quelle
IÐĿEÐḟL
für sieben (ich sehe, dass Miles auch eine sieben mit Rekursion gefunden hat).05AB1E , 7 Bytes
Probieren Sie es online!
Erläuterung
quelle
JavaScript (ES6), 58 Byte
quelle
Python 2 , 65 Bytes
-7 Bytes dank Jonathan Allan.
Probieren Sie es online!
quelle
c
zu1
, Erniedrigen und dann mitprint-c
.f=lambda l,c=1:any(l)and f([j-i for i,j in zip(l,l[1:])],c-1)or-c
max(...,0)
, um die[1, 1, 1, 1, ...]
Testfälle zu bestehen.Dyalog APL, 19 Bytes
Erläuterung:
quelle
≢-1+∘≢2-/⍣{1=≢∪⍵}⊢
k , 21 Bytes
Dies funktioniert in k, aber nicht in oK, da die while-Schleife von oK ausgeführt wird, bevor die Bedingung überprüft wird (im Gegensatz dazu, dass zuerst die Bedingung überprüft und dann der Code ausgeführt wird). Daher
1 1 1 1 1
funktioniert das Beispiel in OK nicht ordnungsgemäß.Versuchen Sie es online!
Erläuterung:
quelle
~&/1_=':
->1<#?
Haskell ,
666160 BytesProbieren Sie es online!
5 Bytes gespart dank Christian Sievers
Dank proud-haskeller 1 Byte gespart
iterate(z(-))
berechnet die Differenzlisten.or.z(/=)
prüft, ob diese Listen ungleiche Elemente enthalten.length.takeWhile
zählt die Differenzlisten mit ungleichen Elementen.quelle
or.z(/=)
z=(=<<tail).zipWith
, ein Byte kürzerJava (OpenJDK 8) ,
98 bis94 ByteProbieren Sie es online!
quelle
Japt , 7 Bytes
Gleicher Ansatz (aber unabhängig abgeleitet) wie Justin mit einer anderen Implementierung.
Probier es aus
Erläuterung
Implizite Eingabe eines Arrays
U
.Ordnen Sie jedes Element zu.
Nimm jedes sequentielle Paar (
ä
) von Elementen aufU
und reduziere es um die absolute Differenz (a
).Ordnen Sie das Array neu zu
U
.Count (
è
) Die Anzahl der Sub-Arrays, die beim Reduzieren durch Addition die Wahrheit zurückgeben (dh nicht Null).quelle
TI-Basic, 19 Bytes
Standardmäßig beginnen Variablen bei Null. Ich hätte nie gedacht, dass ich
IS>(
etwas Nützliches verwenden würde.quelle
C # (.NET Core) ,
7069 + 18 Bytes-1 Byte dank Kevin Cruijssen
Muss bei einem Anruf mit 0 angegeben werden, um ordnungsgemäß zu funktionieren. Ebenfalls in der Byteanzahl enthalten:
Probieren Sie es online!
Erläuterung:
Iterative Version 84 + 18 Bytes:
Probieren Sie es online!
quelle
(y,z)=>y-z
. Aber nette Antwort, +1 von mir.Clojure, 62 Bytes
Nizza
=
kann eine beliebige Anzahl von Argumenten annehmen, und ein einzelnes Argument ist identisch mit "sich selbst".(apply = [1 2 3])
wird ausgeführt als(= 1 2 3)
.quelle
Pyth , 15 Bytes
Überprüfen Sie alle Testfälle.
Wie?
Erklärung # 1
quelle
Wtl{Q=hZ=.+Q)Z
WP{Q=hZ=.+Q)Z
. Vielen Dank!Perl 5 , 83 + 1 (-a) = 84 Bytes
Probieren Sie es online!
Eingabe als Liste mit durch ein Leerzeichen getrennten Zahlen.
quelle
Pyke , 11 Bytes
Probieren Sie es hier aus!
quelle
Pyth, 10 Bytes
Wenn wir von 1 indexieren können, können wir ein Byte speichern, indem wir das führende Zeichen entfernen
t
.Probieren Sie es online
Erläuterung
quelle
Kotlin , 83 Bytes
Verschönert
Prüfung
TryItOnline
quelle
lang-kotlin
nicht einfachkotlin
in den Highlighter-Hinweisen.Schnelle 4 , 90 Bytes
Alternative, abschlussbasierte Implementierung:
Testfälle:
quelle