Najkrótsza funkcja Minmod

24

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ć, 255aby zastąpić -1i 128zastą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 Njest 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

Martin Ender
źródło
1
Może dodaj kolumnę z liczbą odpowiedzi w każdym języku
dumny haskeller
1
@proudhaskeller Hmm, podoba mi się to, że dwie tabele pasują do siebie obok siebie, bez konieczności otwierania pełnego ekranu fragmentu - myślę, że byłoby trochę zbyt ciasno, gdybym dodał kolejną kolumnę. Jeśli twój komentarz zyska znacznie więcej głosów pozytywnych niż mój, zobaczę, co mogę zrobić. ;)
Martin Ender,
1
@Optimizer zdecydowałem, że poprzednia wersja zasad wyrządziła więcej szkody kreatywności odpowiedzi ludzi, niż zamierzałem. Ponadto zamierzałem przyznać nagrodę za odpowiedź, która prowadziła jeszcze przed zmianą reguły, więc nie sądzę, aby wyrządzono jakiekolwiek szkody w zakresie powtórzeń. (Tak, zgadzam się, że zmiany zasad nie są tak dobrym pomysłem, ale pomyślałem, że byłoby warto w tym przypadku.)
Martin Ender
1
@ MartinBüttner - Nie widzę teraz żadnej kreatywności w nowszych odpowiedziach. Wszystko sprowadza się do sprowadzenia do parowego minmodu. Kreatywność polegała na odpowiedziach xnora lub podejściu Mig, na które wpływa wiele innych odpowiedzi.
Optymalizator
2
@Optimizer, nie zawsze można stwierdzić, czy nowa odpowiedź jest dokładnie tak kreatywna jak starsza, podobna do niej, czy też jest to niewyobrażalny port.
Peter Taylor,

Odpowiedzi:

13

GolfScript, 10 9 bajtów

~{0]$1=}*

Zakł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

Peter Taylor
źródło
Fajnie, nasze odpowiedzi są w odstępie krótszym niż 1 sekunda, co oznacza, że ​​moja odpowiedź była najkrótsza. ;)
Timtech
1
+1, jest to o wiele krótsze i mądrzejsze niż moje rozwiązanie. (Ps. W przypadku, gdy ktoś w to wątpi, tak, to rozwiązanie jest poprawne i dość łatwo można to udowodnić przez indukcję. To, co robi kod Piotra, wielokrotnie oblicza medianę poprzedniej wartości minmod, następnej wartości wejściowej i zera; badanie możliwe przypadki pokazują, że rzeczywiście daje to nową wartość minmod.)
Ilmari Karonen
Co do ... cóż, zawsze jest
DUŻO
24

Mathematica, 19 bajtów

Median[#~Riffle~0]&

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

Median[#~Riffle~0]&[{-2, -3, -2, -4}]

lub podobnie zapisane w zmiennej.

Kod najpierw riffuje zero pomiędzy każdymi dwoma elementami listy wejściowej, co wstawia n-1zera między nelementami. Następnie mediana wymaga odpowiedzi.

To daje min-mod, ponieważ obsługuje każdą skrzynkę:

  1. Wszystkie liczby są dodatnie, w którym to przypadku zera znajdują się poniżej nich, a mediana jest najniższą liczbą dodatnią.

  2. Wszystkie liczby są ujemne, w którym to przypadku zera są powyżej nich, a mediana jest liczbą najmniej ujemną.

  3. 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).

xnor
źródło
11

Haskell, 62 61 39 38 37 bajtów

f s=last[x|x<-0:s,and[x*x<=x*y|y<-s]]

używając magii porównawczej zapożyczonej z odpowiedzi @ Zgarba *, mianowicie x*x<=x*y.

x*x<=x*yjest prawdziwe tylko wtedy, gdy xi ymają ten sam znak i y„s wartość bezwzględna jest większa. zwróć uwagę, że kiedy xjest 0to zawsze prawda.

określamy, że xjest to wynik, w którym jest zawarty s, i że dla wszystkich yw s xma ten sam znak yi jest mniejszy w wartości bezwzględnej. jeśli żadna wartość nie sspełnia tej definicji, to0 to wynik.

fnastępnie działa, wyszukując selement spełniający ten warunek i używa 0go domyślnie.

* chociaż nie używał go z powodów, dla których go używam, i właściwie się go pozbył

dumny haskeller
źródło
Rzadko zdarza się, że Haskell gra w golfa (i, o ironio, wciąż jest czytelny). Kocham to.
Isiah Meadows,
10

JavaScript (ES6), 39 bajtów

a=>a.reduce((p,c)=>p*c>0?p*p>c*c?c:p:0)
Michael M.
źródło
1
Kocham to. Niezłe użycie ES6.
Qix
6

Python 2, 53

lambda l:reduce(lambda a,b:sorted([a,b,0])[1],l,l[0])

Chodzi o to, aby reduceprzekształcić dwu-wejściową wyszukiwarkę min-mod w nwejściową. Wymyśliłem go niezależnie od innych odpowiedzi, które go wykorzystują. Obsługuje tylko Python 2 reduce.

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:

def f(l):
 A=l[0]
 for x in l:A=sorted([a,b,0])[1]
 return A

Hipotetyczna amalgamat Python 2 i Python 3 będzie znak krótsza, z gwiazdką cesją z Python 3 i input()a printod Pythonie 2.

#Not real code!
A,*l=input()
for x in l:A=sorted([A,x,0])[1]
print A

Stary kod, bez sortowania:

lambda l:reduce(lambda a,b:[a,b][a*a>b*b]*(a*b>0),l,l[0])
xnor
źródło
Hm, tak, w międzyczasie zauważyłem ten efekt uboczny, ale wydaje mi się, że jest już za późno, aby go naprawić. Mathematica ma jednak wbudowaną funkcję Median.
Martin Ender,
Twoje drugie podejście jest teraz również aktualne.
Martin Ender,
6

Cudowny, 210 bajtów

@0
00
]]\\&002
/\..//&0@0
00..02
MMMMMM//\\
:M
}0}1}0}1}0}1}0}2..}2
^7^7||||&0&1&4<3&0=2{>
EqalLteq{0{<{<<2&1--
&2..&3..}100..&2\/{>
>0&6=0&4&5&6..\/
&3..&5\/{<{0
\/..\/
:|
}000}0
&0Subt
{0&1
}0{0
^7
=0&1
&0
\/

Użyto tu trzech desek.

|Wyżywienie ( Abw 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).

MWyż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.

MPłyta zwalnia również marmur, jaką posiada w dół zamiast w lewo raz ostatni znak ze standardowego wejścia jest naciągane.

MPł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ć Dppod ostatnim wierszu płycie głównej (przed :M), wymienić ]]z Rd, i dodaj następujący u dołu:

:Rd
}0}0}0
]]]]]]{>
-O-O-O
-O-O-O
*A
Plus
\\*A
..Plus
..{0
:*A
}0}0
<<<<
<<
<<
Plus
{0

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:

Board Picture

es1024
źródło
5

Haskell, 83 40 39 bajtów

To 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 ...

a#b|a*b<0=0|a*a<b*b=a|1<2=b
m=foldr1(#)

To tylko proste krotnie (lub zmniejszyć, ponieważ niektóre języki nazwać) przez operatora binarnego #, który oblicza medianę a, ba 0. 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):

import Data.List
a#b=sort[a,b,0]!!1
m=foldr1(#)
Zgarb
źródło
\a-> (signum a,a)to to samo, co signum>>=(,)użycie instancji funkcji monad. (zobacz mój post w „poradach dotyczących gry w golfa w haskell”)
dumny haskeller
Dzięki za podpowiedź, ale teraz jest sporna. :)
Zgarb
@Zgarb Ah w porządku.
Optymalizator
5

TIS-100, 696 526 bajtów

@1
MOV UP ACC
SAV
ADD 999
JEZ A
SWP
MOV 1 ANY
MOV ACC ANY
JRO -7
A:MOV 12 ANY
@5
S:JRO UP
MOV UP ACC
JLZ A
JEZ B
MOV 1 DOWN
JMP B
A:MOV 7 DOWN
NEG
B:MOV 1 RIGHT
MOV ACC RIGHT
MOV ACC RIGHT
JMP S
MOV 14 DOWN
MOV 9 RIGHT
@6
MOV 999 ACC
L:JRO LEFT
SAV
SUB ANY
JGZ A
MOV ANY NIL
SWP
JMP L
A:MOV ANY ACC
JMP L
MOV ACC ANY
@9
S:JRO UP
JEZ A
SUB 1
JEZ A
JMP X
A:MOV 1 ACC
JMP S
JEZ B
SUB 2
JEZ B
X:MOV 6 ACC
JMP S
B:MOV 2 ACC
JMP S
MOV ACC ANY
@10
MOV LEFT ACC
ADD 1
JRO ACC
JRO 6
MOV UP ANY
MOV UP ACC
NEG
MOV ACC ANY
!NOP
MOV 0 ANY

Oczekuje, ż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.

enter image description here

Sp3000
źródło
Wdrożyłem emulator TIS dla TIO, więc możesz teraz wypróbować go online!
Phlarx
4

CJam, 20 bajtów (lub 10 bajtów)

q~{]__~z\z<=\~*0>*}*

Stosując podejście @ xnor, zmniejsz obliczanie minmod 2 liczb na raz z tablicy.

Gdyby :zzadziałało, byłoby to 19 bajtów


Korzystanie z nowej zasady używania sortowania na krótkich tablicach:

q~{0]$1=}*

co jest dokładnie równoważne z odpowiedzią @ Peter


Poprzedni 26 bajtów asnwer:

q~_{g}%_|:+\(z\{za+_~>=}/*

Można to zagrać w golfa dalej ...

Dane wejściowe (przez STDIN) to tablica liczb całkowitych, takich jak:

[-4 -2 -3 -2]

a wyjściem jest minmod tablicy wejściowej

Wypróbuj tutaj

Jeśli tylko :gi :zdziałało, to byłby 4 bajty krótszy.

Optymalizator
źródło
25 bajtów: q~_{g}%_|:+\{z\za+_~>=}**.
jimmy23013
Nie działa w przypadku tablicy single int. Też tego próbowałem :)
Optimizer
Chociaż istnieje 26-bajtowe rozwiązanie. Dzięki za to :)
Optimizer
4

Java, 84 bajty

To jest Java w całej okazałości. Pokonuje GolfScript ponad nieco ponad 900%.

int f(int[]a){int b=a[0],c;for(int d:a)b=(c=d<0?-1:1)*b<0?0:d*c<b*c?d:b;return b;}

Owinięte w klasie:

public class MinModGolfed{

    public static void main(String[] args){
        int[] numbers = new int[args.length];
        for (int i = 0; i < args.length; i++){
            numbers[i] = Integer.parseInt(args[i]);
        }
        System.out.println(new MinModGolfed().f(numbers));
    }

    int f(int[]a){int b=a[0],c;for(int d:a)b=(c=d<0?-1:1)*b<0?0:d*c<b*c?d:b;return b;}

}

Rozszerzony o komentarze:

public class MinModExpandedGolfed{

    public static void main(String[] args){
        int[] numbers = new int[args.length];
        for (int i = 0; i < args.length; i++){
            numbers[i] = Integer.parseInt(args[i]);
        }
        System.out.println(new MinModExpandedGolfed().f(numbers));
    }

    int f(int[]a){                  //a is the input numbers
        int b=a[0],c;             //b is the best number found so far.
        for(int d:a)               //Iterate over a with current element as d.
            b=(c=d<0?-1:1)         //c is equal to the sign of d.
                    *b<0?
                        0:          //If b has opposite sign of d, b = 0.
                        d*c<b*c?d:b;//If the absolute value of d is less than b, b = d. 
        return b;
    }

}

Uwaga: Można to poprawić za pomocą Java 8.

Uwaga: Próba ulepszenia w Javie 8 nie powiodła się.

Numer jeden
źródło
Muszę się jeszcze wiele nauczyć. +1.
Rodolfo Dias,
4

J, 20 12 bajtów

Funkcja przyjmuje listę jako argument. Skradzione z Golfscript / CJam / cokolwiek.

(1{0/:~@,,)/

Minmod xi yjest medianą (sortuj /:~i bierz środek 1{) z listy trzech przedmiotów 0,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 _.)

   (1{0/:~@,,)/ _4 _2 _3 _2
_2
   f =: (1{0/:~@,,)/    NB. give it a name
   f 1 1 2
1
   f 0 1 2
0
   f _1 1 2
0

Stare śmieci, zanim zauważyłem, że dozwolone są krótkie sortowania: 0:`<.`>.@.(*@]*0<*))/minmod xi ywynosi 0 ( 0:), jeśli 0 jest większe lub równe iloczynowi, xa w przeciwnym razie yjest to min ( <.) lub max ( >.) pomiędzy xi yzależnie od znaku . Zwiń to na całej liście.

algorytmshark
źródło
4

TI-BASIC, 19 bajtów

Zakłada wejście w formacie {-2,4,3} .

Działa podobnie do odpowiedzi xnor:

Input L₁              get user input into the L1 array
dim(L₁)2-1→dim(L₁     get the length of the array; multiply by 2 and subtract 1
                      make this the new length (new elements always default to 0)
median(L₁             calculate and return (since it's the last line) median of new array
Timtech
źródło
3
Interesujący sposób liczenia rozmiaru kodu ...
Ypnypn
3
@Ypnypn okazuje się, że nic nam nie jest
Martin Ender
Mój kod, podobnie jak median(augment(Ans,0ΔList(Anstylko osiem bajtów, zawodzi na listach wymiaru pierwszego. If variance(Ans:augment(Ans,0ΔList(Ans:median(Ansjest dłuższy niż twój. Gdyby tylko TI-BASIC obsługiwał puste listy ...
lirtosiast
Masz rację. Wygląda na to, że powoduje to wzrost wielkości mojego kodu z 12 do 15 bajtów.
Timtech,
Chyba masz rację. +4 bajty tam.
Timtech,
3

Python 2, 82 79 71 69 61 bajtów

lambda l:reduce(lambda G,H:[H,G][(G>H)^(G>0)]*(G*H>0),l,l[0])

Jest to oparte na mojej odpowiedzi pyth, która została zainspirowana odpowiedzią Mig .


Stara odpowiedź:

l=input()
m=l[0]
k=1-2*(m<0)
for i in l:m=[m,i][m>i*k]
print(k*m>0)*m

To bardzo długa odpowiedź. Mam wrażenie, że posiadanie 2 zmiennych to strata ...? Miałem rację...? ish? ; p

FryAmTheEggman
źródło
3

KDB / Q, 43 znaki do definicji treści funkcji

Dzięki świetnym pomysłom z poprzednich postów:

f:{$[all 1_0<(*':)x;{$[<[x*x;y*y];x;y]}/[x];0]}

Wprowadź pojedynczy numer, używając rejestrowania

f[enlist 2]
f[enlist 0]
f[enlist -2]
f[2 4 1]
f[0 1 2]
f[1 0 2]
f[-1 1 2]
f[-4 -2 -3 -2]
f[-5 0 -1]
f[-5 -0 -1]
f[1 0 -1]

Jestem pewien, że jakiś guru Q może wymyślić krótszych.

space889
źródło
Może coś takiego {asc[0,x,y]1}/?
algorytm
3

Pyth, 25 22 20 12

uhtS[0GH)QhQ

Prawdopodobnie nie nowość, ale oryginalność: P


Wstępne sortowanie dozwolone

u*?Gx>GH>G0H>*GHZQhQ

Pyt

Wypróbuj online.

Pomysł użycia reducei 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:

Q=eval(input)         : implicit
u                QhQ  : print reduce(lambda G,H: ..., Q, Q[0])
 *          >*GHZ     : ... * (G*H>0)
  ?G       H          : G if ... else H
    x>GH>G0           : G>H xor G>0
FryAmTheEggman
źródło
Nie ma potrzeby tQ. Qbędzie również działać
Optimizer
Całkiem dobrze! Myślę też mogę usunąć jedną z ?pod kątem *...
FryAmTheEggman
3

C #, 101 bajtów

Moja pierwsza próba gry w golfa kodem w dość nieprzyjaznym języku golfowym. W oparciu o redukcję ( Aggregatew 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.

namespace System.Linq{class M{public int m(int[]i){return i.Aggregate((a,b)=>a*b>0?a*a<b*b?a:b:0);}}}
Jacob Bundgaard
źródło
1
Nie ma potrzeby obsługiwać pustych danych wejściowych, ponieważ nawet nie zdefiniowałem funkcji dla tego przypadku.
Martin Ender,
3

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, yjeśli abs(x) > abs(y)jeszcze x.

Przykład:

   (=&**>&|{,)/ 5 2 6
2

Wypróbuj online tutaj.

randomra
źródło
2

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)

i=0a=argument0
while(variable_local_array_get(a,i))i++
for(j=0;j++;j<i-1)a[j+i]=0var i,j,d,m=0d=ds_list_create()if variable_local_exists(a){if variable_local_array_get(a,0){for(i=0;i<32000;i++){if variable_local_array_get(a,i)=0break
ds_list_add(d,variable_local_array_get(a,i))}ds_list_sort(d,0)i=ds_list_find_value(d,ds_list_size(d) div 2)j=ds_list_find_value(d,(ds_list_size(d) div 2)-1)m=ds_list_find_value(ds,ds_list_size(d) mod 2)ds_list_destroy(d)}if m return (i+j)/2return i
break}
Timtech
źródło
@ MartinBüttner Pierwsze 2,5 wiersza wykonuje karabin, a reszta znajduje medianę. Jest 32000to maksymalny rozmiar tablicy ograniczony przez oprogramowanie.
Timtech,
@ MartinBüttner Tak, w części środkowej cała lista nie jest sortowana.
Timtech,
@ MartinBüttner jest posortowane przy każdej iteracji ... więc 3
Timtech
Ohhh, rozumiem. Ten kod jest zaskakująco trudny do odczytania w przypadku tak trudnego języka. ^^
Martin Ender
@ MartinBüttner Jest całkiem dobry do gry w golfa (bardzo luźna składnia), ale nie zawiera wielu standardowych wbudowanych funkcji ( jest zorientowany na projektowanie gier).
Timtech,
2

Java, 353 304 124 bajty

Złóż najgorszy język do gry w golfa z najgorszym golfistą na świecie, a otrzymasz ...

int m(int[]a){int m=a[0];if(m<0)for(int i:a){m=(i>m)?i:m;m=(i>0)?0:m;}else for(int i:a){m=(i<m)?i:m;m=(i<0)?0:m;}return m;}}

Ungolf to, a otrzymasz:

int m(int[] a) {
    int m = a[0];
    if (m < 0) {
        for (int i : a) {
            m = (i > m) ? i : m;
            m = (i > 0) ? 0 : m;
        }
    } else {
        for (int i : a) {
            m = (i < m) ? i : m;
            m = (i < 0) ? 0 : m;
        }
    }
    return m;
}

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.

class M{public static void main(String[]a){java.util.Scanner s=new java.util.Scanner(System.in);int n,m=0;try{m=s.nextInt();if(m<0)while(true){n=s.nextInt();m=(n>m)?n:m;m=(n>0)?0:m;}else while(true){n=s.nextInt();m=(n<m)?n:m;m=(n<0)?0:m;}}catch(java.util.InputMismatchException e){System.out.print(m);}}}

Ungolf to, a otrzymasz:

class M {

    public static void main(String[] a) {
        java.util.Scanner s = new java.util.Scanner(System.in);
        int n = 0, m = 0;
        try {
            m = s.nextInt();
            if (m < 0) {
                do {
                    n = s.nextInt();
                    m = (n > m) ? n : m;
                    m = (n > 0) ? 0 : m;
                } while (true);
            } else {
                do {
                    n = s.nextInt();
                    m = (n < m) ? n : m;
                    m = (n < 0) ? 0 : m;
                } while (true);
            }
        } catch (java.util.InputMismatchException e) {
            System.out.print(m);
        }
    }
}

Otrzymuje nieskończone liczby, zatrzymuje się po wprowadzeniu wartości nieliczbowej, prezentując wartość Minmon.

Rodolfo Dias
źródło
Twój kod wydaje się odrzucać pierwszą wartość, więc daje niepoprawne odpowiedzi np 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.
Peter Taylor,
@PeterTaylor Głupio, moim pierwszym instynktem jest zawsze pisanie pełnego programu, nawet jeśli jest napisane, że może to być funkcja. Co do tego błędu, najwyraźniej nie przetestowałem go wystarczająco, szczury. Spróbuje to teraz poprawić - i stworzy również wersję tylko dla funkcji ...
Rodolfo Dias,
2

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 :

if((q=summary(x))[6]<0)q[6]else if(q[1]>0)q[1]else 0

Potem przejrzałem inne odpowiedzi, które wypróbowałem genialną medianą @ xnor, co jest świetne!

median(c(x-x,x)[-1])
Tomas
źródło
Jak działa Twoja pierwsza wersja? Co ma summaryzrobić? Czy q[1]i q[6]min i max, odpowiednio? W takim przypadku jest to nieprawidłowe, ponieważ nie można użyć wbudowanej wartości min / max.
Martin Ender,
@ MartinBüttner zasadniczo zapewnia wektor kwantyli i średnią. 1 i 6 to kwantyle 0 i 1. Nie korzystałem z wbudowanej funkcji min / max, zgodnie z twoimi regułami.
Tomas
2

Python, 52

Nadal nie mogłem się oprzeć wrażeniu, że źle jest mieć dwa lambdas. Ta funkcja pobiera listę, a następnie zwraca listę jednoelementową zawierającą wynik.

f=lambda a:a[1:]and[sorted([a.pop(),0]+f(a))[1]]or a

Miejmy nadzieję, że nie spowoduje to ogromnej przestępstwa, aby wynik w postaci listy składającej się z jednego elementu.

feersum
źródło
1

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 =)

@(x)median([x,0*x(2:end)])
wada
źródło
@ MartinBüttner Masz absolutną rację. Teraz to zmieniłem: program doda tylko jedno zero mniej niż dane wejściowe. W ten sposób zapewnia się, że zawsze mamy nieparzystą liczbę elementów, a mediana zajmuje się resztą.
flawr
lub wpisz ostatnie 0 z poprzedniego rozwiązania.
Optymalizator
@ MartinBüttner Dzięki, oczywiście, że jest o wiele lepiej. @ Optimizer Jak byś to zrobił?
flawr
Nie mam pojęcia. Pomyślałem, że musi istnieć sposób, aby po prostu zrzucić ostatni element, coś w rodzaju @(x)median([0*x,x](2:end)). Chociaż wygląda na to, że ma te same bajty co teraz.
Optymalizator
@Optimizer Już myślałem, że przegapiłem ważną funkcję Matlaba =) Szkoda, że ​​zaproponowana przez ciebie notacja nie działa, czasem bywa naprawdę przydatna!
flawr
1

Python, 72 60 bajtów

To 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

lambda l:min(l)*all(x>0for x in l)+max(l)*all(x<0for x in l)

To tylko 4 znaki dłużej, ale nadal warto na nie spojrzeć, korzystając z PORADY Sp3000 .

lambda l:eval("+m%s%s(l)*all(x%s0for x in l)"*2%tuple("ax<in>"))
mbomb007
źródło
1

JavaScript, 63

a=>a.reduce((p,c)=>p<0?c<0?Math.max(p,c):0:c>0?Math.min(p,c):0)

Bardziej czytelna wersja:

function (arr) {
    return arr.reduce(function (p, c) {
        if (p < 0) {
            if (c < 0) {
                return Math.max(p, c);
            } else {
                return 0;
            }
        } else {
            if (c > 0) {
                return Math.min(p, c);
            } else {
                return 0;
            }
        }
    });
}
Afonso Matos
źródło