Für diese Aufgabe sollte Ihr Code zwei sortierte Arrays von Ganzzahlen X und Y als Eingabe verwenden. Es sollte die Summe der absoluten Abstände zwischen jeder ganzen Zahl in X und ihrer nächsten Zahl in Y berechnen.
Beispiele:
X = (1 5,9)
Y = (3,4,7)
Der Abstand beträgt 2 + 1 + 2.
X = (1,2,3)
Y = (0,8)
Der Abstand beträgt 1 + 2 + 3.
Ihr Code kann auf jede bequeme Weise eingegeben werden.
Die Haupteinschränkung besteht darin, dass Ihr Code in linearer Zeit in der Summe der Länge der beiden Arrays ausgeführt werden muss. . (Sie können davon ausgehen, dass das Hinzufügen von zwei Ganzzahlen eine konstante Zeit benötigt.)
1 + 2 + 3
vonX = (1,2,3)
und abgeleitetY = (0,8)
?1
,2
und3
inY
heißt0
. So sind die Unterschiede sind1-0
,2-0
,3-0
.Antworten:
Haskell ,
7064 BytesProbieren Sie es online aus!
Erläuterung
Zuerst definieren wir
(%)
den absoluten Unterschied zwischen zwei Zahlen. Dann definieren wir(#)
die interessante Funktion. In der ersten Zeile stimmen wir überein, wenn beide Listen nicht leer sind:Bei unserem ersten Fall von hier aus binden wir uns
d
ane:_
mite:_<-d
. Dies stellt sicher, dassd
es nicht leer ist und setzt sein erstes Element aufe
.Wenn dann das zweite Element von ( ) näher als das erste ( ) am ersten Element von X ( ) liegt, kehren wir zurück, entfernen das erste Element von Y und rufen erneut mit demselben X auf .Y X Y X
e
c
a
x#d
Wenn wir dem Muster entsprechen, aber die Bedingung nicht erfüllen, tun wir Folgendes:
Haskell , 34 Bytes
Probieren Sie es online aus!
quelle
Python 2 ,
124120 BytesProbieren Sie es online aus!
Sparte 4 Bytes, indem Sie zu Programm versus Funktion wechseln.
Die Einhaltung der zeitlichen Komplexitätsbeschränkung ist möglich, da beide Listen sortiert sind. Beachten Sie, dass jedes Mal um die Schleife herum entweder
i
inkrementiert oderj
inkrementiert wird. Somit wird die Schleife meistens ausgeführtlen(X)+len(Y)
.quelle
C (gcc), 82 Bytes
Dies nimmt die Eingabe als zwei ganzzahlige Arrays und ihre Längen (da C sonst keine Möglichkeit hat, ihre Länge zu erhalten). Es kann gezeigt werden, dass dies ausgeführt wird,
O(a+b)
weil entwedera
oderb
bei jeder Iteration der Schleife dekrementiert wird, die beia
Erreichen endet0
(undb
unten nicht dekrementiert werden kann0
).Probieren Sie es online aus!
Einige Notizen:
Anstatt in die Arrays zu indizieren, werden durch Inkrementieren der Zeiger und direktes Dereferenzieren genügend Bytes gespeichert, damit es sich lohnt (
*x
vsx[a]
undy[1]
vsy[b+1]
).Die
--b&&
Bedingung wird aufb>1
Umwegen überprüft. Wenn dies der Fallb
ist1
, wird sie auf Null ausgewertet. Da dies geändert wirdb
, müssen wir es nicht im ersten Zweig des Ternärs ändern (der voranschreitety
), sondern im zweiten Zweig (der voranschreitetx
).Es
return
ist keine Aussage erforderlich, weil schwarze Magie. (Ich denke , das liegt daran, dass die letzte auszuwertende Anweisung immer dern+=...
Ausdruck ist, der dasselbe Register verwendet wie das für Rückgabewerte verwendete.)quelle
Ruby, 88 Bytes
Probieren Sie es online aus!
Zum Spaß auch eine kürzere anonyme Funktion, die die Komplexitätsbeschränkungen nicht ganz erfüllt:
quelle
[5, 6], [0, 1, 5]
.JavaScript (Node.js) , 80 Byte
x
,y
werden als Referenz übergeben, die den Inhalt nicht kopieren1/v
ist falsch, wennx[i]
außerhalb der Reichweite, sonst wahrt
->d>y[j+1]-v
->v+v>y[j]+y[j+1]
ist falsch, solange folgende Bedingungen erfüllt sind. Und was bedeutet,y[j]
ist die Zahl, diev
in am nächsten isty
v
ist kleiner als(y[j]+y[j+1])/2
odery[j+1]
liegt außerhalb des Bereichs, der sichNaN
inNaN
Ertrag umwandeln und mit diesem vergleichen würdefalse
>
Vorzeichen nicht umdrehen , um 1 weiteres Byte zu sparent
ist immer ein boolescher Wert und*
konvertiert ihn in0
/1
vor der BerechnungProbieren Sie es online aus!
quelle
Mathematica, 40 Bytes
Wenn Sie ein vollständiges Programm mit Eingaben erstellen müssen:
Hier ist der Zeitpunkt für bis zu 1.000.000 Punkte (alle 10.000 abgetastet) für
y
:Nahezu linear.
quelle