Dies ist inspiriert von einem realen Problem, das ich hatte. Ich bin gespannt, ob es dafür einen klugen Weg gibt.
Sie erhalten zwei unsortierte Arrays, A und B, die jeweils eine beliebige Anzahl von Floats enthalten. A und B müssen nicht unbedingt gleich lang sein. Schreiben Sie eine Funktion, die die Elemente von A nacheinander aufnimmt und den nächsten Wert in Array B findet. Das Ergebnis muss in einem neuen Array enthalten sein.
Gewinnbedingung
Der kürzeste Code gewinnt (wie üblich).
Antworten:
APL,
13-17(21 Byte in UTF-8)
Wenn Sie wahres Lambda wollen (A als linkes Argument und B als rechtes):
Wie es funktioniert:
{...}¨A
Ruft die Lambda-Funktion{...}
mit jedem A-Wert auf (anstatt mit A als Array aufzurufen) und sammelt die Ergebnisse in Arrays derselben Form|⍵-B
Berechnet die absoluten Differenzwerte zwischen dem Argument ⍵ und all in B (- ist Subtraktion, | ist abs).↑⍋
Nimmt den Index des kleinsten Elements (⍋ sortiert das Array, das die Indizes zurückgibt, ↑ erhält das erste Element)B[...]
ruft nur Elemente nach Index (en) ab.Die Lösung ist recht unkompliziert, obwohl sie die wunderbare Funktion der APL-Sortierfunktion verwendet, die den Permutationsvektor (die Indizes der sortierten Elemente im ursprünglichen Array) zurückgibt, anstatt das Array selbst zu sortieren.
quelle
Mathematica - 17
Wie funktioniert es? Ja, ich gebe zu, dass hier ein bisschen geschummelt wird, weil Mathematica die nächstgelegene Funktionalität eingebaut hat . Der Rest ist unkompliziert und befasst sich mit der Anordnung des Ergebnisses in einem 1D-Array. Es sieht nur wegen des zusätzlichen Aufwands, es kurz zu machen, hässlich aus.
quelle
C # -
1039787 BytesIch bin mir nicht ganz sicher, ob ich diese Frage richtig verstanden habe, aber hier ist trotzdem meine Lösung.
Ich habe Listen anstelle von Arrays verwendet, weil ich damit kürzeren Code schreiben kann.Ein Integer-Array ist kürzer als eine Integer-Liste.
Eingang:
Methode:
Ausgabe:
Wenn meine Antwort nicht korrekt ist, hinterlassen Sie bitte einen Kommentar darunter.
EDIT: Wie @grax betonte, geht es jetzt um Floats. Deshalb möchte ich auch seine Antwort aufnehmen.
95 Bytes (Grax Antwort)
quelle
item
ini
und Siefloat[] t(float[] a, float[] b) {return a.Select(d=>b.OrderBy(e=>Math.Abs(e-d)).First()).ToArray();}
R, 41 Zeichen
Erläuterung:
outer(A,B,`-`)
berechnet für jedes Element x von A die Differenzx-B
und gibt das Ergebnis als Matrix (der Dimension Länge (A) x Länge (B)) aus.which.min
wählt den Index der minimalen Zahl.apply(x, 1, f)
Wendet die Funktionf
auf jede Matrixzeile anx
.So
apply(abs(outer(A,B,`-`)),1,which.min)
gibt die Indizes der minimalen absoluten Differenz zwischen jedem Element von A und die Elemente des Vektors B.Verwendung:
quelle
CJam - 14
Der Hauptcode steht in der zweiten Zeile, der Rest dient der Verwendung der Standardeingabe und der hübschen Ausgabe.
Versuchen Sie es unter http://cjam.aditsu.net/
Erläuterung:
q~
liest und bewertet die Eingabef{...}
des Blocks für jedes Element der ersten Anordnung und dem nächsten Objekt (das das zweite Array ist) ausführt, die in einem Array um die Ergebnisse zu sammeln{...}$
den Block sortiert die zweite Anordnung mit einem Schlüssel für jeden Artikel zu berechnen ,1$
kopiert die aktuelle item vom ersten Array-z
subtrahiert dann den absoluten Wert0=
nimmt den ersten Wert des sortierten Arrays (der mit dem minimalen Schlüssel)\;
verwirft das Item vom ersten Arrayp
druckt die String-Darstellung des ErgebnissesBeispiele (inspiriert von anderen Antworten):
Eingabe:
[10.1 11.2 12.3 13.4 9.5] [10 12 14]
Ausgabe:
[10 12 12 14 10]
Eingabe:
[0 25 10 38] [3 22 15 49 2]
Ausgabe:
[2 22 15 49]
quelle
Javascript (E6) 54
56 59Abstand minimieren. Verwenden Sie Quadrat anstelle von Bauchmuskeln, um Zeichen zu sparen. Algebra
bearbeiten ... Fix unbrauchbare Zuordnung
bearbeiten (Rest eines Tests ohne Funktionsdefinition)
War
F=(A,B)=>D=A.map(a=>B.sort((x,y)=>((x-=a,y-=a,x*x-y*y))[0])
Prüfung
Ergebnis:
[10, 12, 12, 14, 10]
quelle
D=
wird nicht benötigt, damap
ein neues Array zurückgegeben wird. Alternative (gleiche Länge)(x,y)=>(x-=a)*x-(y-=a)*y
Python 3.x - 55 Zeichen
a
undb
sind die Eingabearrays, und das gewünschte Array ist das Ergebnis des Ausdrucks.quelle
Haskell, 55
Zuerst dachte ich verwenden
minimumBy
undcomparing
, aber da diese nicht in Prelude sind, dauerte es eine Tonne Zeichen , sie zu qualifizieren. Habe auch die Quadraturidee aus anderen Antworten gestohlen, um einen Charakter abzuschaben.quelle
PowerShell - 44
Beispiel
Mit
$a
und$b
eingestellt auf:Ausgabe ist
quelle
$a|%{$n=$_;($b|sort{($n-$_)*($n-$_)})[0]}
Rubin, 40
Wie die Python-Antwort, aber das Quadrieren ist ein wenig schärfer als ich es mir vorstellen kann, um einen absoluten Wert zu erhalten.
quelle
Pyth -
1211 BytesHinweis: Pyth ist viel jünger als diese Herausforderung, daher ist diese Antwort nicht gewinnberechtigt.
Einfache Methode, benutzt die Bestellfunktion
o
, um die minimale Distanz zu ermitteln undm
die Liste zu überschreibena
.Probieren Sie es hier online aus .
quelle
TI-BASIC, 24
Kommt nicht an APL heran, verwendet aber weniger leistungsfähige Funktionen - dies verwendet keine Funktion "sortiert nach" oder "Index der wenigsten". Der Nachteil von TI-BASIC ist das Fehlen dieser Funktionen und mehrdimensionaler Arrays.
Ungolfed:
Die min (Funktion zwei Verhalten hat: wenn mit reellen Zahlen oder Listen verwendet, gibt es den kleinsten Wert, aber wenn mit komplexen Zahlen oder Listen verwenden, wird den Wert mit dem kleinsten Absolutwert gibt Hinzufügen.
0i
Oder Multiplikation miti^2
Ursachen der Dolmetscher verwende das zweite Verhalten, alsomin(1,-2)
kehre zurück,-2
wohingegenmin(1+0i,-2+0i)
kehre zurück1
.quelle
Fortran 90: 88
Dies setzt voraus, dass es
contain
in einem vollständigen Programm bearbeitet wird:Die eckigen Klammern deklarieren ein Array, während
(...,i=)
sie eine implizitedo
Schleife darstellen. Ich gebe dann den Wert zurück,b
für den das Elementa(i)-b
minimiert ist.quelle
Matlab: 48
Geht davon aus, dass
A
undB
1D Matrizen im Arbeitsbereich sind, ist endgültigC
in dem Arbeitsbereich. Dies würde wahrscheinlich auch in Octave funktionieren. Die bedingte Indizierung macht dies ziemlich trivial.quelle
C 144
163Okay ... Ich denke, dieser kleine Code muss erklärt werden.
Zuerst habe ich versucht, die Arbeit mit zwei Ebenen von for loop zu erledigen, um die minimale Differenz zu ermitteln und den aktuellen Wert auf min von B's Wert zu setzen. Das ist sehr einfach.
Dasselbe kann mit qsort und einer Komparatorfunktion erreicht werden. Ich sorge dafür, dass B nach dem Unterschied sortiert wird und nicht nach den Elementen von B. Zu viele Funktionen für einen so kleinen Algorithmus. Die Funktion q dient also nun zwei Zwecken. Erstens ist es der Algorithmus selbst, zweitens (wenn qsort ihn aufruft) ein Komparator. Für die Kommunikation zwischen den beiden Staaten musste ich Globals deklarieren.
m steht für, ob es im Komparatorzustand oder im Hauptzustand ist .
Beispiel:
quelle
GolfScript, 49 Bytes
Hinweis: Dies ist eine Teillösung. Ich arbeite daran, daraus eine Komplettlösung zu machen
Ja. GolfScript unterstützt Gleitkommazahlen. Probieren Sie es hier aus . Beispiel:
Ausgabe:
quelle
C # 262
Das Programm findet minimale Unterschiede und speichert den nächsten Wert von Array B. Ich werde in Kürze mit dem Golfen beginnen.
Volles Programm mit Testcode
quelle
C #: 120
Linq ist großartig:
quelle