Funkcja minmod jest odmianą znanej min , która pojawia się w schematach wysokiej rozdzielczości ograniczających nachylenie dla równań różniczkowych cząstkowych. Biorąc pod uwagę wiele zboczy, wybiera najbardziej płaskie zbocze, jednocześnie dbając o względne znaki między zboczami.
Funkcja przyjmuje dowolną liczbę parametrów. Następnie minmod (x 1 , x 2 , ..., x n ) definiuje się jako:
- min (x 1 , x 2 , ..., x n ) , jeśli wszystkie x i są ściśle dodatnie
- max (x 1 , x 2 , ..., x n ) , jeśli wszystkie x i są ściśle ujemne
- 0 , w przeciwnym razie.
Rozważymy tylko liczby całkowite, ponieważ tak naprawdę nie wpływa to na implementację i powinno być bardziej włączające dla niektórych (ezoterycznych) języków.
Napisz program lub funkcję, która pobiera n liczb całkowitych ze znakiem (dla n> 0 ) przez STDIN, ARGV lub argument funkcji (możesz użyć tablicy, jeśli jest to wygodniejsze niż funkcja variadic), i zwraca lub wypisuje (do STDOUT) wynik od minmod (a, b) .
Nie wolno używać wbudowanych funkcji min lub max (i oczywiście nie ma też wbudowanego minmodu , jeśli można go naprawdę znaleźć). Ponadto nie wolno używać żadnych wbudowanych funkcji sortowania, z wyjątkiem sortowania ustalonej małej liczby elementów (mniej niż 5).
Jeśli twój język nie ma podpisanych typów, możesz użyć niepodpisanego typu i zinterpretować go jako uzupełnienie dwóch. Np. Jeśli twój język używa tylko niepodpisanych bajtów, możesz użyć, 255
aby zastąpić -1
i 128
zastąpić -128
, itp.
To jest kod golfowy, więc wygrywa najkrótsza odpowiedź (w bajtach).
Przypadki testowe
Input Output
2 2
-3 -3
0 0
3 -5 0
2 4 1 1
0 1 2 0
-1 1 2 0
-4 -2 -3 -2 -2
-5 0 -1 0
1 0 -1 0
Liderów
Poniższy fragment kodu generuje zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka. Więc nawet jeśli wybrany język nie pozwala ci wygrać całego wyzwania, dlaczego nie spróbować zająć miejsca na drugiej liście?
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
# Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
# Ruby, <s>104</s> <s>101</s> 96 bytes
function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);i=i.replace("{{PLACE}}",t++ +".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=42079;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var LANGUAGE_REG=/^#*\s*([^,]+)/
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src=https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js></script><link rel=stylesheet type=text/css href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id=answer-list><h2>Leaderboard</h2><table class=answer-list><thead><tr><td></td><td>Author<td>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>
Odpowiedzi:
GolfScript,
109 bajtówZakłada wejście ze standardowego wejścia w formacie
[-4 -2 -3 -2]
Korzysta z wbudowanej funkcji sortowania
$
, ale za każdym razem, gdy jest wywoływana, jest na tablicy 3 elementów, co jest dozwolone.Demo online
źródło
Mathematica, 19 bajtów
Kod i gra w golfa dzięki Martinowi Büttnerowi.
Jest to nienazwana czysta funkcja, która przyjmuje na wejściu listę liczb całkowitych. Wywołaj to jak
lub podobnie zapisane w zmiennej.
Kod najpierw riffuje zero pomiędzy każdymi dwoma elementami listy wejściowej, co wstawia
n-1
zera międzyn
elementami. Następnie mediana wymaga odpowiedzi.To daje min-mod, ponieważ obsługuje każdą skrzynkę:
Wszystkie liczby są dodatnie, w którym to przypadku zera znajdują się poniżej nich, a mediana jest najniższą liczbą dodatnią.
Wszystkie liczby są ujemne, w którym to przypadku zera są powyżej nich, a mediana jest liczbą najmniej ujemną.
Jest zarówno liczba dodatnia, jak i ujemna, więc środkowy element to zero.
Jeśli Mathematica implementuje swoją medianę za pomocą algorytmu wyboru czasu liniowego , wówczas jest to również O (n).
źródło
Haskell,
6261393837 bajtówużywając magii porównawczej zapożyczonej z odpowiedzi @ Zgarba *, mianowicie
x*x<=x*y
.x*x<=x*y
jest prawdziwe tylko wtedy, gdyx
iy
mają ten sam znak iy
„s wartość bezwzględna jest większa. zwróć uwagę, że kiedyx
jest0
to zawsze prawda.określamy, że
x
jest to wynik, w którym jest zawartys
, i że dla wszystkichy
ws
x
ma ten sam znaky
i jest mniejszy w wartości bezwzględnej. jeśli żadna wartość nies
spełnia tej definicji, to0
to wynik.f
następnie działa, wyszukującs
element spełniający ten warunek i używa0
go domyślnie.* chociaż nie używał go z powodów, dla których go używam, i właściwie się go pozbył
źródło
JavaScript (ES6), 39 bajtów
źródło
Python 2, 53
Chodzi o to, aby
reduce
przekształcić dwu-wejściową wyszukiwarkę min-mod wn
wejściową. Wymyśliłem go niezależnie od innych odpowiedzi, które go wykorzystują. Obsługuje tylko Python 2reduce
.Rozwiązanie z dwoma wejściami po prostu znajduje medianę dwóch liczb i zero. Zobacz moje odpowiedź Mathematica, aby uzyskać bardziej bezpośredni sposób użycia mediany.
Mniej golfa:
Hipotetyczna amalgamat Python 2 i Python 3 będzie znak krótsza, z gwiazdką cesją z Python 3 i
input()
aprint
od Pythonie 2.Stary kod, bez sortowania:
źródło
Median
.Cudowny, 210 bajtów
Użyto tu trzech desek.
|
Wyżywienie (Ab
w wersji czytelnej) przyjmuje wartość bezwzględną marmuru (albo przez zwrócenie przeszedł marmuru lub zero minus przeszedł marmuru, jak wszystkie działania arytmetyczne w Marbelous jest niepodpisany).M
Wyżywienie (Minabs
w czytelnej) Znajduje i wyjścia po lewej stronie pierwszego lub drugiego marmuru przechodzi (w zależności od tego ma mniejszą wartość bezwzględną), a wyjściem, jeśli inaczej podpisany marmur podjęcia.M
Płyta zwalnia również marmur, jaką posiada w dół zamiast w lewo raz ostatni znak ze standardowego wejścia jest naciągane.M
Płyta jest używana w płycie głównej, aby zapisać minmod wszystkich sprawdzanych wartości w danym momencie, gdyż zwalnia wartość do zapisanego w lewo, który jest następnie odchylony widok.Trashbins (
\/
) zostały umieszczone tylko w synchronizatorach, które w innym przypadku wydrukowałyby na STDIN.Wejścia / wyjścia używają STDIN / STDOUT. Oba dotyczą wartości 8-bitowych (jeśli chcesz przekazać + 0x30 i + 0x38, umieść
08
w STDIN).Wymagane są biblioteki i płytki cylindryczne. Zalecane jest wyświetlanie wyniku w postaci liczb dziesiętnych (zwróć uwagę, że wyświetla on niepodpisaną wartość wyniku minmod).
Sprawdź to tutaj.
Uwaga: Aby uzyskać więcej ludzi przyjaznych wejścia / wyjścia, dodać
Dp
pod ostatnim wierszu płycie głównej (przed:M
), wymienić]]
zRd
, i dodaj następujący u dołu:To po prostu zmienia wynik na 3 cyfry dziesiętne. Podobnie wprowadzenie tych zmian wymaga oddzielonej spacjami listy 3 cyfr dziesiętnych na liczbę.
Wersja do odczytu:
źródło
Haskell,
834039 bajtówTo prawdopodobnie nie jest najkrótsze możliwe rozwiązanie Haskell (i na pewno nie pokona innych tutaj), ale to początek. EDYCJA: Teraz o ponad 50% krótsza! EDIT2: Jeden bajt mniej ...
To tylko proste krotnie (lub zmniejszyć, ponieważ niektóre języki nazwać) przez operatora binarnego
#
, który oblicza medianęa
,b
a0
. Mimo że reguły pozwoliłyby mi teraz sortować małe listy, wymaga to importu w Haskell i skutkuje większą liczbą bajtów ( 49 bajtów, ale 31 bez importu):źródło
\a-> (signum a,a)
to to samo, cosignum>>=(,)
użycie instancji funkcji monad. (zobacz mój post w „poradach dotyczących gry w golfa w haskell”)TIS-100,
696526 bajtówOczekuje, że sekwencja zostanie zakończona przez
-999
. TIS-100 jest nowszy od tego pytania, ale i tak nie ma to tutaj znaczenia.Węzeł 9 śledzi, czy wszyscy jesteśmy pozytywni, wszyscy negatywni czy mieszani. Węzły 5 i 6 pracują, aby znaleźć minimum bezwzględnej wartości wszystkich liczb wejściowych. Węzeł 10 następnie wybiera minimum, minimum negowane lub 0 w zależności od stanu węzła 9.
źródło
CJam, 20 bajtów (lub 10 bajtów)
Stosując podejście @ xnor, zmniejsz obliczanie minmod 2 liczb na raz z tablicy.
Gdyby
:z
zadziałało, byłoby to 19 bajtówKorzystanie z nowej zasady używania sortowania na krótkich tablicach:
co jest dokładnie równoważne z odpowiedzią @ Peter
Poprzedni 26 bajtów asnwer:
Można to zagrać w golfa dalej ...
Dane wejściowe (przez STDIN) to tablica liczb całkowitych, takich jak:
a wyjściem jest minmod tablicy wejściowej
Wypróbuj tutaj
Jeśli tylko
:g
i:z
działało, to byłby 4 bajty krótszy.źródło
q~_{g}%_|:+\{z\za+_~>=}**
.Java, 84 bajty
To jest Java w całej okazałości. Pokonuje GolfScript ponad nieco ponad 900%.
Owinięte w klasie:
Rozszerzony o komentarze:
Uwaga: Można to poprawić za pomocą Java 8.
Uwaga: Próba ulepszenia w Javie 8 nie powiodła się.
źródło
J,
2012 bajtówFunkcja przyjmuje listę jako argument. Skradzione z Golfscript / CJam / cokolwiek.
Minmod
x
iy
jest medianą (sortuj/:~
i bierz środek1{
) z listy trzech przedmiotów0,x,y
. Zmniejsz listę ( składając w języku J), biorąc ten minmod między sąsiednie elementy.W użyciu na REPL. (J literuje swój znak ujemny
_
.)Stare śmieci, zanim zauważyłem, że dozwolone są krótkie sortowania:
0:`<.`>.@.(*@]*0<*))/
minmodx
iy
wynosi 0 (0:
), jeśli 0 jest większe lub równe iloczynowi,x
a w przeciwnym raziey
jest to min (<.
) lub max (>.
) pomiędzyx
iy
zależnie od znaku . Zwiń to na całej liście.źródło
TI-BASIC, 19 bajtów
Zakłada wejście w formacie
{-2,4,3}
.Działa podobnie do odpowiedzi xnor:
źródło
median(augment(Ans,0ΔList(Ans
tylko osiem bajtów, zawodzi na listach wymiaru pierwszego.If variance(Ans:augment(Ans,0ΔList(Ans:median(Ans
jest dłuższy niż twój. Gdyby tylko TI-BASIC obsługiwał puste listy ...Python 2,
8279716961 bajtówJest to oparte na mojej odpowiedzi pyth, która została zainspirowana odpowiedzią Mig .
Stara odpowiedź:
To bardzo długa odpowiedź.
Mam wrażenie, że posiadanie 2 zmiennych to strata ...?Miałem rację...? ish? ; pźródło
KDB / Q, 43 znaki do definicji treści funkcji
Dzięki świetnym pomysłom z poprzednich postów:
Wprowadź pojedynczy numer, używając rejestrowania
Jestem pewien, że jakiś guru Q może wymyślić krótszych.
źródło
{asc[0,x,y]1}/
?Pyth,
25222012Prawdopodobnie nie nowość, ale oryginalność: P
Wstępne sortowanie dozwolone
Pyt
Wypróbuj online.
Pomysł użycia
reduce
i wyrażeń potrójnych został bezwstydnie skradziony z odpowiedzi Mig , ale nie mam pojęcia, czy algorytmy te są w przeciwnym razie nawet podobne, ponieważ nie mogę odczytać oświadczeń potrójnych.Wyjaśnienie:
źródło
tQ
.Q
będzie również działać?
pod kątem*
...C #, 101 bajtów
Moja pierwsza próba gry w golfa kodem w dość nieprzyjaznym języku golfowym. W oparciu o redukcję (
Aggregate
w LINQ) i bardzo podobny do odpowiedzi JavaScript przez Mig . Można uruchomić jak(new System.Linq.M()).m(new[] {1, 2, 3})
. Przechodzi wszystkie przypadki testowe, ale nie obsługuje pustych tablic wejściowych.źródło
J, 12 bajtów
Funkcja zmniejsza listę (zwaną folding (
/
) w J) za pomocą wyrażenia:(signum(x) == signum(y)) * [x,y][abs(x)>abs(y)]
gdzie[x,y][abs(x)>abs(y)]
jest,y
jeśliabs(x) > abs(y)
jeszczex
.Przykład:
Wypróbuj online tutaj.
źródło
Game Maker Language, 489 bajtów
Informacje o języku Game Maker
Riffles tablicę (dodawane są zera) i zwraca medianę (podobnie do mojej innej odpowiedzi)
źródło
32000
to maksymalny rozmiar tablicy ograniczony przez oprogramowanie.Java,
353304124 bajtyZłóż najgorszy język do gry w golfa z najgorszym golfistą na świecie, a otrzymasz ...
Ungolf to, a otrzymasz:
Jest to funkcja (jeśli to nie było całkiem oczywiste), która odbiera tablicę liczb i przetwarza jej wartości, zwracając wartość minmod.
Uwzględniono również mój stary dobrodziejstwo złudzenia, które jak zwykle stanowi cały program.
Ungolf to, a otrzymasz:
Otrzymuje nieskończone liczby, zatrzymuje się po wprowadzeniu wartości nieliczbowej, prezentując wartość Minmon.
źródło
1 2 3
. Wydaje się, że nie dostrzegasz, że możesz napisać funkcję, która przetwarza jej argumenty, a nie program, który odczytuje ze standardowego wejścia.R, 20 znaków
R zwykle nie jest dobry dla codegolfa, ale używam go do mojej pracy, więc chciałem spróbować. Zanim spróbowałem, nie wiedziałem, że R jest skłonny zaakceptować taką brudną składnię! :-) 52 znaki :
Potem przejrzałem inne odpowiedzi, które wypróbowałem genialną medianą @ xnor, co jest świetne!
źródło
summary
zrobić? Czyq[1]
iq[6]
min i max, odpowiednio? W takim przypadku jest to nieprawidłowe, ponieważ nie można użyć wbudowanej wartości min / max.Python, 52
Nadal nie mogłem się oprzeć wrażeniu, że źle jest mieć dwa
lambda
s. Ta funkcja pobiera listę, a następnie zwraca listę jednoelementową zawierającą wynik.Miejmy nadzieję, że nie spowoduje to ogromnej przestępstwa, aby wynik w postaci listy składającej się z jednego elementu.
źródło
Matlab / Octave, 26
Jest to po prostu tłumaczenie odpowiedzi Mathematica autorstwa xnor. Działa poprzez dodanie jednego zera mniejszego niż długość wektora wejściowego. Pamiętaj, że dołączenie jeszcze jednego nie zadziałałoby, ponieważ wówczas wynik wynosiłby cały czas 0. Podziękowania dla MartinBüttner za -4 znaki tego rozwiązania =)
źródło
@(x)median([0*x,x](2:end))
. Chociaż wygląda na to, że ma te same bajty co teraz.Python,
7260 bajtówTo pierwsze rozwiązanie, o którym myślałem i jest dość naiwne. Druga połowa jest w zasadzie duplikatem pierwszej połowy kodu, ale nie byłam pewna, jak ją wyszczuplić. Zastanawiam się, czy można to skrócić za pomocą
eval
...Edycja: Zmieniono lambdas na zrozumienie.
Wypróbuj je tutaj
To tylko 4 znaki dłużej, ale nadal warto na nie spojrzeć, korzystając z PORADY Sp3000 .
źródło
JavaScript, 63
Bardziej czytelna wersja:
źródło