Zainspirowany pytaniem w Stack Overflow. Tytuł tutaj jest całkowicie moją winą.
Wyzwanie
Biorąc pod uwagę listę dodatnich liczb całkowitych zawierających co najmniej dwa wpisy, zamień każdą liczbę na minimum wszystkich wpisów oprócz samego siebie.
Przypadki testowe
[4 3 2 5] -> [2 2 3 2]
[4 2 2 5] -> [2 2 2 2]
[6 3 5 5 8] -> [3 5 3 3 3]
[7 1] -> [1 7]
[9 9] -> [9 9]
[9 8 9] -> [8 9 8]
Zasady
Algorytm powinien teoretycznie działać dla dowolnego rozmiaru wejściowego (większego niż jeden) i wartości (dodatnie liczby całkowite). Jest to akceptowane, jeśli program jest ograniczony czasem, pamięcią lub typami danych i dlatego działa tylko dla liczb do określonej wartości lub dla wielkości wejściowej do określonej wartości.
Programy lub funkcje są dozwolone w dowolnym języku programowania . Standardowe luki są zabronione.
Dane wejściowe można przyjmować dowolnymi rozsądnymi środkami ; i w dowolnym formacie. To samo dla wyniku. Formaty wejściowe i wyjściowe mogą być różne.
Najkrótszy kod w bajtach wygrywa.
źródło
[4 3 2 2 5]
wynikać?[4 3 2 2 5]
wynik byłby[2 2 2 2 2]
(podobny do drugiego przypadku testowego)Odpowiedzi:
Galaretka ,
965 bajtówWypróbuj online!
Zweryfikuj je wszystkie naraz! (lekko zmieniony)
Jestem prawie pewien, że Dennis może to prześcignąć w golfa.
Jak to działa
Algorytm jest raczej skomplikowany. Zauważmy, co to robi
[4,2,2,5]
.Po pierwsze, używamy
J
do uzyskania[1,2,3,4]
. Zauważ, że Jelly używa indeksowania 1.Potem widzimy
ṙ
. Wymaga dwóch argumentów: tablicy i liczby całkowitej. Obraca tablicę w lewo o wartość określoną przez liczbę całkowitą. Tutajṙ
zobaczysz[4,2,2,5]
po lewej i[1,2,3,4]
po prawej stronie (więcej o tym, jak to działa, można znaleźć w samouczku ). W Galaretce polecenia domyślnie wektoryzują. Dlatego to polecenie zostanie wykonane na każdym pojedynczym elemencie po prawej stronie, dlatego utworzymy tablicę 2D:Dlatego
[4,2,2,5]ṙ[1,2,3,4]
staje się[[4,2,2,5]ṙ1,[4,2,2,5]ṙ2,[4,2,2,5]ṙ3,[4,2,2,5]ṙ4]
, co staje się:Zauważ, że oryginalne elementy znajdują się w ostatnim rzędzie, ponieważ w tym rzędzie obróciliśmy w lewo o kwotę równą długości tablicy, dlatego używamy
Ṗ
obok, aby usunąć ten wiersz, aby kolumny były kolekcjami elementy tablicy, które nie są w bieżącym indeksie:Następująca operacja
«/
jest również dość skomplikowana. Po pierwsze,«
zwraca minimum dwóch liczb, które widzi po lewej i po prawej stronie. Na przykład5«3
zwraca3
. Teraz, jeśli dwa argumenty są tablicami, wówczas wektoryzowałby, jak powiedziałem powyżej. Co to oznacza, że[1,5,2,3]«[4,1,5,2]
stanie się,[1«4,5«1,2«5,3«2]
co jest[1,1,2,2]
. Teraz/
jestreduce
, co oznacza, że wykonujemy operację nad każdym rzędem do końca. Na przykład[1,2,3,4]+/
stałoby się((1+2)+3)+4
, co jest sumą tablicy[1,2,3,4]
.Tak więc, jeśli zastosujemy się
«/
do otrzymanej właśnie tablicy 2D, otrzymalibyśmy:co z powodu wektoryzacji byłoby równoważne z:
która oblicza minimum każdej tablicy bez elementu w indeksie.
źródło
Python 2 , 41 bajtów
Wypróbuj online!
Dla każdego elementu
x
sprawdzamy, czyx==min(l)
. Jeśli nie, to jestFalse
to traktowane tak, jakby było0
używane jako indeks listy dosorted(l)
, dając najmniejszy element. W przeciwnym razie jest toTrue
aka1
, podając drugi najmniejszy element, ponieważ sam ten element jest najmniejszy i należy go zignorować.źródło
False
zostanie przekonwertowany na0
iTrue
zostanie przekonwertowany,1
jest naprawdę fajne i należy się chwalić ^ W ^ WexplainedGalaretka , 5 bajtów
Wypróbuj online!
W jaki sposób?
źródło
Haskell ,
424139 bajtówEDYTOWAĆ:
f
pobiera listę liczb całkowitych (lub dowolnegoOrd
typu) i zwraca listę.Wypróbuj online!
f
powtarza się podczas obracania listy.x
jest pierwszym elementem listy iy
resztą. Ponieważ rekurencja jest nieskończona, lista wyników musi zostać odcięta:fst<$>zip...y
jest to krótszy sposób powiedzeniatake(length y)...
.źródło
@
flip list do być spakowany:f l@(x:y)=fst<$>zip(minimum...)l
.f(h:t)=minimum t:(fst<$>zip(f(t++[h]))t)
Oktawa, 26 bajtów
Podobne podejście stosowane w tej odpowiedzi , co zdarza się być taka sama, jak ta .
Naprawdę nie jestem fanem tylko przenoszenia innych odpowiedzi, dlatego chciałbym zauważyć, że miałem podobny pomysł, zanim zobaczyłem inne.
Wyjaśnienie:
Jonathan Allan przedstawił już dobre wyjaśnienie kodu Jelly, więc obejmuje on bit Octave i dlaczego działa (i nie działa w MATLAB).
Nie działa to w MATLAB, ponieważ przypisania wbudowane i bezpośrednie indeksowanie nie działają.
sort(x)(1)
podaje błąd w MATLAB, a nie pierwszy element w posortowanym wektorze.źródło
Haskell, 41 bajtów
Przykład użycia:
([]#) [4,3,2,5]
->[2,2,3,2]
. Wypróbuj online!Zacznij od pustego akumulatora
a
i spuść listę wejść. Kolejnym elementem na liście wyjściowej jest minimum akumulatoraa
i wszystkie oprócz pierwszego elementu listy wejściowej (->c
), a następnie wywołanie rekurencyjne z pierwszym elementemb
dodanym do akumulatora ic
. Zatrzymaj się, gdy dojdziesz do końca listy wprowadzania.źródło
JavaScript (ES6),
5046 bajtówEdycja: Zapisano 4 bajty dzięki @Arnauld.
źródło
a=>a.map(x=>Math.min(...a.filter(y=>x!=y)))
dla 43 bajtów.3,3,3,3
a=>a.map((_,i)=>Math.min(...a.filter(_=>i--)))
za 46.Brachylog ,
1312 bajtówWypróbuj online!
Zapisano jeden bajt dzięki @ ais523.
Wyjaśnienie
Wykorzystujemy fakt, że
⊇
łączy podzbiory od największych do najmniejszych. Na przykład[1,2,3]
, możemy uzyskać te podzbiory są w następującej kolejności:[1,2,3], [1,2], [1,3], [2,3], [1], [2], [3], []
.Widzimy, że podzbiory
[1,2], [1,3], [2,3]
są tymi, od których chcemy minimum, ale są w odwrotnej kolejności niż lista wejściowa (stąd↔
). Możemy wybrać te podzbiory tylko poprzez znalezienie pierwszychlength(Input) + 1
podzbiorów, które będą zawierały wszystkie z nich + najpierw całą listę. Odrzucamy całą listę za pomocąb
.źródło
Właściwie 13 bajtów
Używa tej samej techniki, którą odkrył także Xnor .
Wypróbuj online!
Wyjaśnienie:
źródło
R,
4631 bajtówwdraża rozwiązanie Stewie Griffin w R, niestety mój oryginalny pomysł jest o 50% dłuższy! nadal czyta listę ze standardowego wejścia, ale teraz zwraca znacznie czytelniejszy wektor numeryczny.
Wypróbuj online!
stara implementacja:
czyta na liście ze standardowego wejścia. Indeks ujemny
l[-x]
wyklucza element z listy imatch(l,l)
zwraca indeks pierwszego wystąpienia każdego elementu listy. Zwraca listę.źródło
Python 2, 51 bajtów
Wiem, że istnieje już lepsze rozwiązanie w języku Python, ale nadal chcę publikować moje.
Wypróbuj online
źródło
Mathematica 34 bajtów
źródło
PowerShell ,
6859 bajtówWypróbuj online!
Jestem pewien, że można go skrócić, będę nadal na niego patrzeć
źródło
C, 85 bajtów
Pierwszym argumentem jest wejściowa tablica liczb całkowitych. Drugi argument to wyjściowa tablica liczb całkowitych. Trzecim argumentem jest liczba elementów dla obu tablic.
Zobacz, jak działa online .
źródło
Perl 6 ,
26 2419 bajtów26
Pamiętaj, że to
∖
U + 2216, a nie\
U + 5CSpróbuj
Spróbuj
24
Spróbuj
19
Spróbuj
26
Użyłem „fantazyjnych” operatorów Unicode zamiast ekwiwalentów ascii, ponieważ wymagałyby spacji przed nimi, aby nie zostały przeanalizowane jako część
.Bag
wywołania metody.24
19
(24 i 19-bajtowe golfy zostały zainspirowane wdrożeniem Jelly )
źródło
Clojure,
36816271 bajtówNajnowszy (nie powinien tak naprawdę przesyłać ich w pośpiechu):
Wypróbuj online .
Aaa, a ten ma błąd (62 bajty), zipmap tworzy nieuporządkowaną mapę, więc nie będzie generować prawidłowej sekwencji przy większych wejściach.
v
nie jest właściwie używany do niczego, ale jest to krótszy niżi (keys c)
.Poprzednio w 81 bajtach:
Wypróbuj online .
Wypróbuj online .
Cholera, oryginalny (36 bajtów) nie działa, gdy minimalna liczba jest powtarzana,
[4 2 2 5]
powoduje to,[2 4 4 2]
że oba2
s są usuwane :(#{i}
jest zbiorem, który zawiera tylkoi
, zwraca prawdę dlai
i fałsz dla innych, co oznacza, że minimum jest obliczane na podstawie wszystkich innych liczb na liście danych wejściowych.Wypróbuj online .
źródło
Pyth,
87 bajtów-1 bajtów dzięki @isaacg
Spróbuj!
źródło
d
na końcu - jest domyślnie wypełnione.PHP, 72 bajty
Wersja online
źródło
PHP, 47 bajtów
źródło
Scala, 37 bajtów
l
jest dowolną kolekcją Int.Przypadki testowe:
Prawdopodobnie można to jeszcze pograć w golfa, nie mogłem znaleźć krótszego sposobu na usunięcie elementu z listy niż
l diff Seq(l(i))
źródło
C #, 36 bajtów
Bierze elementy (i) i przegląda elementy bez bieżącego elementu pod kątem minimalnej wartości.
To trochę smutne, że niektóre inne próby nie działają, ponieważ pracujemy z prymitywnymi typami, a zatem nie mamy list z referencjami do porównania elementów.
źródło
PowerShell ,
4938 bajtów-11 bajtów dzięki mazzy
Wypróbuj online!
Poprawiona piękna odpowiedź Sinusoidy . Zapisuje 10 bajtów, używając jawnego wyjścia zamiast budowania tablicy. Indeksuje do posortowanej tablicy w celu znalezienia 0 (tj. Najmniejszej wartości) lub 1, jeśli warunek jest prawdziwy.
źródło
Perl 5, 43 bajtów
Odpowiednik rozwiązania Python.
sort
Niestety , Perl ma niewłaściwe ustawienie domyślne liczb (wymagające jawnego komparatora) imin
nie jest wbudowane, ale prawie tosub
rekompensuje, będąc krótszym niżlambda
,map$_,
będąc krótszym niżx for x in
, oraz niejawnością list powrotu i argumentów.źródło
Rubinowy, 30 bajtów
Dla każdego elementu posortuj tablicę, usuń bieżący element i chwyć pierwszy element pozostałej tablicy.
Jest to anonimowa funkcja, której można użyć w następujący sposób:
źródło
CJam, 15 bajtów
Zasadniczo tłumaczenie algorytmu xnor na CJam.
Jest to nienazwany blok, który pobiera tablicę ze stosu i pozostawia wynik na stosie.
Wyjaśnienie:
źródło
05AB1E , 5 bajtów
Port odpowiedzi @xnor na Python 2 .
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
Java 8, 119 bajtów
Port odpowiedzi @xnor na Python 2 .
Zmienia tablicę wejściową zamiast zwracać nową, aby zapisać bajty.
Wypróbuj online.
Wyjaśnienie:
źródło
APL (Dyalog Extended) , 7 bajtów
Odpowiedź portu Python 2 na port xnor. Wymaga
⎕IO←0
:Wypróbuj online!
Wyjaśnienie:
źródło
Haskell , 76 bajtów
Jest to znacznie dłużej niż wcześniejsze wpisy Haskella, ale jest to pierwszy, który wykonuje tylko liniową liczbę porównań i liniową ilość dodatkowej pracy.
Wypróbuj online!
Wyjaśnienie
!
przyjmuje dwa argumenty: bieżące minimum i niepustą listę. Zwraca minimalną wartość z listy i wynik przetwarzania podanej listy przy użyciu działającego minimum.źródło
MathGolf ,
97 bajtówWypróbuj online!
Wyjaśnienie
Zasadniczo port odpowiedzi 05AB1E Kevina Cruijssena, ale tracę 2 bajty, ponieważ muszę robić rzeczy wyraźnie.
źródło