Jest to inspirowane moim prawdziwym problemem na świecie. Jestem ciekawy, czy istnieje jakiś sprytny sposób na rozwiązanie tego problemu.
Otrzymujesz dwie nieposortowane tablice, A i B, każda zawierająca dowolną liczbę liczb zmiennoprzecinkowych. A i B niekoniecznie mają takie same długości. Napisz funkcję, która sekwencyjnie pobiera elementy A i znajduje najbliższą wartość w tablicy B. Wynik musi być zawarty w nowej tablicy.
Warunek wygranej
Najkrótszy kod wygrywa (jak zwykle).
Odpowiedzi:
APL, 13
17(21 bajtów w UTF-8)
Jeśli chcesz prawdziwą lambda (A jako lewy argument i B jako prawy):
Jak to działa:
{...}¨A
wywołuje funkcję lambda{...}
z każdą wartością A (zamiast wywoływać z A jako tablicą), zbierając wyniki do tablicy o tym samym kształcie|⍵-B
oblicza bezwzględne wartości różnicy między argumentem ⍵ a wszystkim w B (- to odejmowanie, | to abs).↑⍋
pobiera indeks najmniejszego elementu (⍋ sortuje tablice zwracające indeksy, ↑ dostaje pierwszy element)B[...]
pobiera tylko elementy według indeksów.Rozwiązanie jest dość jednoznaczne, chociaż wykorzystuje wspaniałą cechę funkcji sortującej APL zwracającej wektor permutacji (wskaźniki posortowanego elementu w oryginalnej tablicy) zamiast samej tablicy posortowanej.
źródło
Mathematica - 17
Jak to działa? Tak, przyznaję, że jest tu trochę oszustwa, ponieważ Mathematica ma wbudowaną najbliższą funkcjonalność. Reszta jest prosta i dotyczy uporządkowania wyniku w tablicy 1D. Wygląda brzydko tylko z powodu dodatkowego wysiłku, aby go skrócić.
źródło
C # -
1039787 bajtówNie jestem pewien, czy dobrze zrozumiałem to pytanie, ale oto moje rozwiązanie.
Użyłem list zamiast tablic, ponieważ pozwala mi to pisać krótszy kod.Tablica liczb całkowitych jest krótsza niż lista liczb całkowitych.
Wkład:
Metoda:
Wydajność:
Jeśli moja odpowiedź jest nieprawidłowa, proszę zostawić komentarz poniżej.
EDYCJA: Jak zauważył @grax, pytanie dotyczy teraz pływaków. Dlatego chciałbym również dołączyć jego odpowiedź.
95 bajtów (odpowiedź Graxa)
źródło
item
na,i
a będziesz bezpieczny 6 dodatkowych postaci;)float[] t(float[] a, float[] b) {return a.Select(d=>b.OrderBy(e=>Math.Abs(e-d)).First()).ToArray();}
R, 41 znaków
Wyjaśnienie:
outer(A,B,`-`)
oblicza dla każdego elementu x różnicyx-B
i wyprowadza wynik jako macierz (o długości wymiarowej (A) x długości (B)).which.min
wybiera indeks liczby minimalnej.apply(x, 1, f)
stosuje funkcjęf
w każdym rzędzie macierzyx
. Zwracawięc
apply(abs(outer(A,B,`-`)),1,which.min)
wskaźniki minimalnej absolutnej różnicy między każdym elementem A i elementami wektora B.Stosowanie:
źródło
CJam - 14
Główny kod znajduje się w drugim wierszu, reszta służy do użycia standardowego wejścia i ładnego wyjścia.
Wypróbuj na http://cjam.aditsu.net/
Wyjaśnienie:
q~
odczytuje i ocenia dane wejściowef{...}
wykonuje blok dla każdego elementu pierwszej tablicy i następnego obiektu (którym jest druga tablica), zbieranie wyników w tablicy{...}$
sortuje drugą tablicę za pomocą bloku do obliczenia klucza dla każdego elementu1$
kopiuje bieżący element z pierwszej tablicy-z
odejmuje następnie przyjmuje wartość bezwzględną0=
bierze pierwszą wartość z posortowanej tablicy (ta z minimalnym kluczem)\;
odrzuca element z pierwszej tablicyp
drukuje reprezentację ciągu wynikuPrzykłady (inspirowane innymi odpowiedziami):
Wejście:
[10.1 11.2 12.3 13.4 9.5] [10 12 14]
Wyjście:
[10 12 12 14 10]
Wejście:
[0 25 10 38] [3 22 15 49 2]
Wyjście:
[2 22 15 49]
źródło
JavaScript (E6) 54
56 59Minimalizuj odległość. Używając kwadratu zamiast abs, po prostu oszczędzaj znaki.
Edytuj algebrę ...
Edytuj poprawkę niepotrzebne przypisanie (pozostała część testu bez definicji funkcji)
Było
F=(A,B)=>D=A.map(a=>B.sort((x,y)=>((x-=a,y-=a,x*x-y*y))[0])
Test
Wynik:
[10, 12, 12, 14, 10]
źródło
D=
nie jest potrzebne, ponieważmap
zwraca nową tablicę. Alternatywna funkcja sortowania (o tej samej długości):(x,y)=>(x-=a)*x-(y-=a)*y
Python 3.x - 55 znaków
a
ib
są tablicami wejściowymi, a pożądana tablica jest wynikiem wyrażenia.źródło
Haskell, 55
Na początku myślałem, używać
minimumBy
icomparing
, ale od tych, którzy nie są w Prelude, zajęło mnóstwo znaków je zakwalifikować. Ukradłem również pomysł kwadratu z kilku innych odpowiedzi, aby ogolić postać.źródło
PowerShell - 44
Przykład
Za pomocą
$a
i$b
ustawić na:Dane wyjściowe to
źródło
$a|%{$n=$_;($b|sort{($n-$_)*($n-$_)})[0]}
Ruby, 40
Taki sam jak odpowiedź w Pythonie, ale kwadratowanie jest trochę bardziej skomplikowane niż jakikolwiek sposób, w jaki mógłbym wziąć wartość bezwzględną.
źródło
Pyth -
1211 bajtówUwaga: Pyth jest znacznie młodszy od tego wyzwania, więc ta odpowiedź nie kwalifikuje się do wygrania.
Prosta metoda, wykorzystuje
o
funkcję porządku, aby uzyskać minimalną odległość im
aps to na liściea
.Wypróbuj online tutaj .
źródło
TI-BASIC, 24
Nie jest zbliżony do APL, ale używa mniej wydajnych funkcji - nie używa to funkcji „posortowanej według” lub „indeksu najmniej”. Wadą TI-BASIC jest tutaj brak tych funkcji i tablic wielowymiarowych.
Nie golfowany:
Funkcja min (ma dwa zachowania: gdy jest używana z liczbami rzeczywistymi lub listami, daje najmniejszą wartość; jednak gdy jest używana z liczbami zespolonymi lub listami, daje wartość o najmniejszej wartości bezwzględnej. Dodanie
0i
lub pomnożenie przezi^2
powoduje, że interpreter użyj drugiego zachowania, więcmin(1,-2)
zwraca,-2
amin(1+0i,-2+0i)
zwraca1
.źródło
Fortran 90: 88
Wymaga to
contain
edycji w pełnym programie:Nawiasy kwadratowe deklarują tablicę, podczas gdy
(...,i=)
reprezentują domyślnądo
pętlę; Następnie zwracam wartość,b
dla której elementa(i)-b
jest zminimalizowany.źródło
Matlab: 48
Zakłada, że
A
iB
są matrycami 1D w obszarze roboczym, końcowy wynik znajduje sięC
w obszarze roboczym. Prawdopodobnie działałoby to również w Octave. Indeksowanie warunkowe czyni to dość trywialnym.źródło
C 144
163Dobra ... Myślę, że ten mały kod wymaga wyjaśnienia.
Na początku próbowałem wykonać zadanie z dwoma poziomami pętli for, znajdując różnicę minimalną i ustawiając bieżącą wartość na min wartości B. To bardzo proste.
To samo można osiągnąć dzięki qsort i funkcji komparatora. Robię to sortując B według różnicy zamiast elementów B. Zbyt wiele funkcji dla tak małego algorytmu. Zatem funkcja q służy teraz dwóm celom. Na początku jest to sam algorytm, a po drugie (gdy qsort go wywołuje) komparator. Do komunikacji między dwoma stanami musiałem ogłosić globale.
m oznacza, czy jest w stanie porównawczym, czy głównym .
przykład:
źródło
GolfScript, 49 bajtów
Uwaga: jest to częściowe rozwiązanie. Pracuję nad tym, aby było to kompletne rozwiązanie
Tak. GolfScript obsługuje zmiennoprzecinkowe. Wypróbuj tutaj . Przykład:
Wydajność:
źródło
C # 262
Program znajduje minimalne różnice i zapisuje najbliższą wartość z tablicy B. Niedługo będę pracował nad golfem.
Pełny program z kodem testowym
źródło
C #: 120
Linq jest niesamowity:
źródło