Fungsi Minmod Terpendek

24

Fungsi minmod adalah varian dari min yang familier , yang muncul dalam skema resolusi tinggi yang membatasi-lereng untuk persamaan diferensial parsial. Diberikan sejumlah lereng, ia mengambil kemiringan yang paling rata, sambil menjaga tanda relatif di antara lereng.

Fungsi ini mengambil sejumlah parameter yang berubah-ubah. Kemudian minmod (x 1 , x 2 , ..., x n ) didefinisikan sebagai:

  • min (x 1 , x 2 , ..., x n ) , jika semua x i benar-benar positif
  • maks (x 1 , x 2 , ..., x n ) , jika semua x i benar-benar negatif
  • 0 , jika tidak.

Kami hanya akan mempertimbangkan input integer, karena itu tidak benar-benar mempengaruhi implementasi dan harus lebih inklusif untuk beberapa bahasa (esoterik).

Tulis sebuah program atau fungsi, yang mengambil n bilangan bulat yang ditandatangani (untuk n> 0 ) melalui STDIN, ARGV atau argumen fungsi (Anda dapat menggunakan array jika itu lebih nyaman daripada fungsi variadic), dan mengembalikan atau mencetak (ke STDOUT) hasilnya dari minmod (a, b) .

Anda tidak boleh menggunakan fungsi min atau maks bawaan (dan jelas, tidak ada minmod bawaan juga, jika Anda dapat menemukannya). Selain itu, Anda tidak harus menggunakan built-in menyortir fungsi, kecuali untuk mengurutkan tetap sejumlah kecil item (kurang dari 5).

Jika bahasa Anda tidak memiliki tipe yang ditandatangani, Anda dapat menggunakan tipe yang tidak ditandatangani dan menafsirkannya sebagai pelengkap dari dua bahasa. Misalnya, jika bahasa Anda hanya menggunakan byte yang tidak ditandatangani, Anda dapat menggunakannya 255untuk bertahan -1dan 128bertahan -128, dll.

Ini kode golf, jadi jawaban tersingkat (dalam byte) menang.

Uji Kasus

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

Papan peringkat

Cuplikan Stack berikut menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa. Jadi, bahkan jika bahasa pilihan Anda tidak membiarkan Anda memenangkan seluruh tantangan, mengapa tidak mencoba merebut tempat di daftar kedua?

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Martin Ender
sumber
1
Mungkin tambahkan kolom untuk berapa banyak jawaban yang ada di setiap bahasa
bangga haskeller
1
@proudhaskeller Hmm, saya suka bahwa dua tabel saat ini cocok bersebelahan tanpa harus membuka layar penuh potongan - saya pikir itu akan sedikit terlalu penuh jika saya menambahkan kolom lain. Jika komentar Anda mendapat lebih banyak suara daripada komentar saya, saya akan melihat apa yang bisa saya lakukan. ;)
Martin Ender
1
@Optimizer Saya memutuskan bahwa versi aturan sebelumnya lebih merusak kreativitas jawaban orang daripada yang saya maksudkan. Selain itu, saya akan memberikan hadiah untuk jawaban yang memimpin sebelum peraturan berubah jadi saya tidak berpikir ada salahnya dalam hal rep dilakukan. (Ya, saya setuju bahwa perubahan aturan bukanlah ide yang bagus, tapi saya pikir itu akan sangat berguna dalam kasus ini.)
Martin Ender
1
@ MartinBüttner - Saya tidak melihat kreativitas dalam jawaban yang lebih baru sekarang. Itu semua harus dikurangi menjadi minmod berpasangan. Kreativitas ada dalam jawaban xnor atau pendekatan Mig tempat banyak jawaban lain dipengaruhi.
Pengoptimal
2
@Optimizer, tidak selalu memungkinkan untuk mengetahui apakah jawaban baru sama kreatifnya dengan yang lebih tua yang mirip atau apakah itu port yang tidak imajinatif.
Peter Taylor

Jawaban:

13

GolfScript, 10 9 byte

~{0]$1=}*

Mengasumsikan input dari stdin dalam format [-4 -2 -3 -2]

Ini menggunakan fungsi sortir built-in $, tetapi setiap kali dipanggil itu pada array 3 elemen, yang diizinkan.

Demo online

Peter Taylor
sumber
Keren, jawaban kami kurang dari 1 detik, yang artinya jawaban saya dulu paling pendek. ;)
Timtech
1
+1, ini jauh lebih pendek dan lebih pintar dari solusi saya. (Mz. Jika ada yang meragukannya, ya, solusi ini benar, dan itu cukup mudah untuk dibuktikan dengan induksi. Apa yang dilakukan kode Peter adalah berulang kali menghitung median dari nilai minmod sebelumnya, nilai input berikutnya dan nol; pemeriksaan kasus yang mungkin menunjukkan bahwa ini memang menghasilkan nilai minmod baru.)
Ilmari Karonen
Apa ... yah, selalu ada BANYAK hal untuk
dicurahkan
24

Mathematica, 19 byte

Median[#~Riffle~0]&

Kode dan golf berkat Martin Büttner.

Ini adalah fungsi murni tanpa nama yang mengambil dalam daftar bilangan bulat sebagai input. Meminta itu seperti

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

atau disimpan serupa ke variabel.

Kode pertama riffles nol di antara setiap dua elemen dari daftar input, yang menyisipkan n-1nol di antara nelemen. Kemudian, dibutuhkan median untuk menghasilkan jawaban.

Ini memberikan min-mod karena menangani setiap kasus:

  1. Semua angka positif, dalam hal ini nol di bawahnya dan median adalah angka positif terendah.

  2. Semua angka negatif, dalam hal ini nol di atas mereka dan median adalah angka paling negatif.

  3. Ada angka positif dan negatif, dan elemen tengahnya adalah nol.

Jika Mathematica mengimplementasikan mediannya menggunakan algoritma seleksi linear-waktu , maka ini juga O (n).

Tidak
sumber
11

Haskell, 62 61 39 38 37 byte

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

menggunakan beberapa perbandingan sihir yang dipinjam dari jawaban @ Zgarb *, yaitu x*x<=x*y,.

x*x<=x*ybenar hanya ketika xdan ymemiliki tanda yang sama dan ynilai absolut lebih besar. dicatat bahwa ketika xadalah 0selalu benar.

kami menentukan bahwa xini adalah hasil jika terkandung dalam s, dan bahwa untuk semua ydalam s xmemiliki tanda yang sama ydan lebih kecil dalam nilai absolut. jika tidak ada nilai dalam smemenuhi definisi ini, maka 0hasilnya.

fkemudian bekerja dengan mencari selemen untuk memenuhi ini, dan menggunakan 0sebagai default.

* Meskipun dia tidak menggunakannya karena alasan saya menggunakannya, dan dia benar-benar menyingkirkannya sekarang

haskeller bangga
sumber
Jarang Haskell golf seperti ini (dan, ironisnya, masih bisa dibaca). Suka.
Isiah Meadows
10

JavaScript (ES6), 39 byte

a=>a.reduce((p,c)=>p*c>0?p*p>c*c?c:p:0)
Michael M.
sumber
1
Suka ini. Penggunaan ES6 yang bagus.
Qix
6

Python 2, 53

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

Idenya adalah menggunakan reduceuntuk mengubah min-mod finder dua-input menjadi n-input satu. Saya datang dengan itu secara independen dari jawaban lain yang menggunakannya. Hanya Python 2 yang mendukung reduce.

Solusi dua input hanya menemukan median dari dua angka dan nol. Lihat jawaban Mathematica saya untuk cara yang lebih langsung untuk menggunakan median.

Kurang bermain golf:

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

Gabungan hipotetis Python 2 dan Python 3 akan menjadi karakter yang lebih pendek, dengan penugasan berbintang dari Python 3 dan input()dan printdari Python 2.

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

Kode lama, tanpa mengurutkan:

lambda l:reduce(lambda a,b:[a,b][a*a>b*b]*(a*b>0),l,l[0])
Tidak
sumber
Hm, ya, saya perhatikan efek sampingnya sementara itu, tapi saya merasa sudah terlambat untuk memperbaikinya sekarang. Mathematica memiliki built-in Median.
Martin Ender
Pendekatan terakhir Anda sekarang juga valid.
Martin Ender
6

Marbelous, 210 byte

@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
\/

Ada tiga papan yang digunakan di sini.

The |setrika ( Abdalam versi dibaca) mengambil nilai absolut dari kelereng (baik oleh mengembalikan marmer lulus atau nol minus marmer berlalu, karena semua aritmatika di Marbelous adalah unsigned).

The Msetrika ( Minabsdalam versi dibaca) temuan dan output ke kiri baik pertama atau kedua marmer lulus (mana memiliki nilai absolut yang lebih kecil), dan keluar jika marmer ditandatangani berbeda dilewatkan.

The Mpapan juga melepaskan marmer itu memegang bawah bukan ke kiri setelah karakter terakhir dari STDIN diambil.

The Mpapan digunakan dalam papan utama untuk menyimpan minmod dari semua nilai diperiksa pada waktu tertentu, karena melepaskan nilai yang akan disimpan ke kiri, yang kemudian dibelokkan kembali.

Tempat sampah ( \/) hanya ditempatkan di bawah penyinkron yang akan mencetak ke STDIN.

Input / Output menggunakan STDIN / STDOUT. Keduanya berurusan dengan nilai 8-bit (jika Anda ingin memberikan + 0x30 dan + 0x38, masukkan 08ke dalam STDIN).

Perpustakaan dan papan silindris keduanya diperlukan. Dianjurkan untuk melihat output sebagai angka desimal (perhatikan bahwa ini menampilkan nilai yang tidak ditandai dari hasil minmod).

Uji di sini.

Catatan: Untuk input / output yang lebih ramah manusia, tambahkan di Dpbawah baris terakhir papan utama (sebelumnya :M), ganti ]]dengan Rd, dan tambahkan yang berikut di bagian bawah:

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

Ini hanya mengubah output menjadi 3 angka desimal. Demikian juga, input dengan perubahan ini membutuhkan daftar yang dipisahkan spasi 3 digit desimal per angka.

Versi yang Dapat Dibaca:

Gambar Papan

es1024
sumber
5

Haskell, 83 40 39 byte

Ini mungkin bukan solusi Haskell sesingkat mungkin (dan tentu saja tidak akan mengalahkan yang lain di sini), tapi ini awal. EDIT: Sekarang lebih dari 50% lebih pendek! EDIT2: Satu byte lebih sedikit ...

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

Ini hanya lipatan langsung (atau kurangi, seperti beberapa bahasa menyebutnya) oleh operator biner #, yang menghitung median dari a, bdan 0. Meskipun aturan sekarang memungkinkan saya untuk mengurutkan daftar kecil, ini membutuhkan impor di Haskell dan menghasilkan jumlah byte yang lebih tinggi ( 49 byte, tetapi 31 tanpa impor):

import Data.List
a#b=sort[a,b,0]!!1
m=foldr1(#)
Zgarb
sumber
\a-> (signum a,a)sama dengan signum>>=(,)menggunakan fungsi instance monad. (lihat posting saya di "tips untuk bermain golf di haskell")
bangga haskeller
Terima kasih atas tipnya, tapi sekarang sudah bisa diperdebatkan. :)
Zgarb
@ Zgarb Ah oke.
Pengoptimal
5

TIS-100, 696 526 byte

@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

Berharap urutan diakhiri oleh -999. TIS-100 lebih baru dari pertanyaan ini, tapi bukan itu yang penting di sini.

Node 9 melacak apakah kita semua positif, semua negatif atau campuran. Node 5 dan 6 berfungsi untuk menemukan nilai absolut minimum dari semua angka input. Node 10 kemudian memilih minimum, negasi minimum, atau 0 tergantung pada keadaan node 9.

masukkan deskripsi gambar di sini

Sp3000
sumber
Saya telah menerapkan emulator TIS untuk TIO, jadi sekarang Anda dapat mencobanya secara online!
Phlarx
4

CJam, 20 byte (atau 10 byte)

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

Menggunakan pendekatan @ xnor, kurangi kalkulasi minmod dari 2 angka sekaligus dari array.

Ini akan menjadi 19 byte jika :zberhasil


Menggunakan aturan baru menggunakan macam pada array pendek:

q~{0]$1=}*

yang persis sama dengan jawaban @ Peter


Asnwer 26 byte sebelumnya:

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

Ini bisa bermain golf lebih lanjut ...

Input (via STDIN) adalah array integer seperti:

[-4 -2 -3 -2]

dan output adalah minmod dari array input

Coba di sini

Jika saja :gdan :zberfungsi, ini akan menjadi 4 byte lebih pendek.

Pengoptimal
sumber
25 byte: q~_{g}%_|:+\{z\za+_~>=}**.
jimmy23013
Gagal untuk array int tunggal. Saya mencobanya juga :)
Pengoptimal
Meskipun ada solusi 26 byte di sana. Terima kasih untuk itu :)
Pengoptimal
4

Java, 84 byte

Ini adalah Java dengan segala kemuliaannya. Mengalahkan GolfScript dengan faktor sedikit di atas 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;}

Dibungkus dalam kelas:

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;}

}

Diperluas dengan komentar:

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;
    }

}

Catatan: Ini dapat ditingkatkan menggunakan Java 8.

Catatan: Upaya untuk meningkatkan di Java 8 gagal.

TheNumberOne
sumber
Saya masih harus banyak belajar. +1.
Rodolfo Dias
4

J, 20 12 byte

Berfungsi mengambil daftar sebagai argumen. Dicuri dari Skrip Golf / CJam / apa pun.

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

Minmod dari xdan yadalah median (urutkan /:~dan ambil tengah 1{) dari daftar tiga item 0,x,y. Kurangi daftar ( lipat dalam bahasa J) dengan mengambil minmod ini antara elemen yang berdekatan.

Digunakan di REPL. (J mengeja tanda negatifnya _.)

   (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

Sampah lama, sebelum saya perhatikan jenis-jenis pendek diperbolehkan: 0:`<.`>.@.(*@]*0<*))/minmod dari xdan y0 ( 0:) jika 0 lebih besar atau sama dengan produk dari xdan y, selain itu min ( <.) atau maks ( >.) antara xdan ytergantung pada tanda . Lipat ini di seluruh daftar.

algoritme hiu
sumber
4

TI-BASIC, 19 byte

Mengasumsikan input dalam format {-2,4,3}.

Bekerja mirip dengan jawaban 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
sumber
3
Cara menarik menghitung ukuran kode ...
Ypnypn
Kode saya, serta median(augment(Ans,0ΔList(Anshanya delapan byte, gagal pada daftar dimensi satu. If variance(Ans:augment(Ans,0ΔList(Ans:median(Anslebih panjang dari milikmu. Andai saja TI-BASIC mendukung daftar kosong ...
lirtosiast
Kamu benar. Sepertinya itu menabrak ukuran kode saya dari 12 hingga 15 byte.
Timtech
Saya kira Anda benar. +4 byte di sana.
Timtech
3

Python 2, 82 79 71 69 61 byte

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

Ini didasarkan pada jawaban saya, yang terinspirasi oleh jawaban Mig .


Jawaban lama:

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

Ini jawaban yang sangat panjang. Saya merasa seperti memiliki 2 variabel adalah pemborosan ...? Saya benar...? ish? ; p

FryAmTheEggman
sumber
3

KDB / Q, 43 karakter untuk definisi fungsi tubuh

Berkat ide-ide bagus dari posting sebelumnya:

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

Masukkan nomor tunggal menggunakan daftar

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]

Saya yakin beberapa guru Q dapat membuat yang lebih pendek.

space889
sumber
Mungkin kira-kira seperti itu {asc[0,x,y]1}/?
algoritme
3

Pyth, 25 22 20 12

uhtS[0GH)QhQ

Mungkin bukan novel, tetapi asli: P


Pre-sorting diperbolehkan

u*?Gx>GH>G0H>*GHZQhQ

Pyth

Cobalah online.

Ide untuk menggunakan reducedan pernyataan ternary dicuri dari jawaban Mig tanpa malu-malu , tapi saya tidak tahu apakah algoritma ini bahkan serupa, karena saya tidak bisa membaca pernyataan ternary.

Penjelasan:

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
sumber
Tidak perlu tQ. Qjuga akan berfungsi
Pengoptimal
Benar sekali! Saya juga berpikir saya dapat menghapus salah satu ?untuk *...
FryAmTheEggman
3

C #, 101 byte

Percobaan pertama saya di golf kode dan dalam bahasa bermusuhan golf cantik. Berdasarkan pengurangan ( Aggregatedalam LINQ) dan sangat mirip dengan jawaban JavaScript oleh Mig . Dapat dijalankan seperti (new System.Linq.M()).m(new[] {1, 2, 3}). Lewati semua kasus uji, tetapi tidak menangani array input kosong.

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
sumber
1
Tidak perlu menangani input kosong, karena saya bahkan tidak mendefinisikan fungsi untuk kasus itu.
Martin Ender
3

J, 12 byte

   (=&**>&|{,)/

Fungsi ini mengurangi daftar (disebut lipat ( /) dalam J) dengan ekspresi:

(signum(x) == signum(y)) * [x,y][abs(x)>abs(y)] dimana

[x,y][abs(x)>abs(y)]adalah yjika abs(x) > abs(y)yang lainx .

Contoh:

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

Cobalah online di sini.

randomra
sumber
2

Bahasa Game Maker, 489 byte

Tentang Bahasa Pembuat Game

Riffles the array (nol ditambahkan) dan mengembalikan median (mirip dengan jawaban saya yang lain)

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
sumber
@ MartinBüttner 2.5 baris pertama menjalankan riffle, dan sisanya menemukan median. Ini 32000adalah ukuran maksimum array yang dibatasi oleh perangkat lunak.
Timtech
@ MartinBüttner Ya, di bagian median, seluruh daftar tidak diurutkan.
Timtech
@ MartinBüttner itu diurutkan setiap iterasi ... jadi 3
Timtech
Ohhh, begitu. Secara mengejutkan kode itu sulit dibaca untuk bahasa bertele-tele seperti itu. ^^
Martin Ender
@ MartinBüttner Golf ini cukup bagus untuk bermain golf (sintaksisnya sangat longgar) tetapi tidak mengandung banyak fungsi bawaan bawaan ( ini berorientasi pada desain game).
Timtech
2

Java, 353 304 124 byte

Kumpulkan bahasa terburuk untuk golf kode dengan pegolf terburuk di dunia dan Anda ...

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;}}

Lepaskan ikatannya dan Anda mendapatkan:

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;
}

Ini adalah fungsi (jika tidak cukup jelas) yang menerima array angka dan memproses nilainya, mengembalikan nilai minmod.

Benemoth lama saya tentang solusi juga termasuk, yang merupakan keseluruhan program - seperti biasa.

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);}}}

Lepaskan ikatannya dan Anda mendapatkan:

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);
        }
    }
}

Menerima angka tak terbatas, berhenti ketika nilai bukan angka dimasukkan, menyajikan nilai Minmon.

Rodolfo Dias
sumber
Kode Anda tampaknya membuang nilai pertama, sehingga akan memberikan jawaban yang salah untuk mis 1 2 3. Anda juga tampaknya mengabaikan bahwa Anda dapat menulis sebuah fungsi yang memproses argumennya daripada sebuah program yang membaca dari stdin.
Peter Taylor
@PeterTaylor Foolishly, insting pertama saya adalah selalu menulis program penuh walaupun dinyatakan bahwa itu bisa menjadi fungsi. Tentang bug itu, ternyata saya tidak cukup mengujinya, tikus. Akan mencoba untuk memperbaikinya sekarang - dan membuat versi hanya fungsi ...
Rodolfo Dias
2

R, 20 karakter

R biasanya tidak baik untuk codegolf, tetapi saya menggunakannya untuk pekerjaan saya, jadi saya ingin mencoba. Sebelum saya mencoba, saya tidak tahu bahwa R bersedia menerima sintaks yang kotor! :-) 52 karakter :

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

Kemudian saya melihat jawaban lain yang saya coba trik median genial @ xnor, yang bagus!

median(c(x-x,x)[-1])
Tomas
sumber
Bagaimana cara kerja versi pertama Anda? Apa yang summaryharus dilakukan Apakah q[1]dan q[6]min dan maks, masing-masing? Dalam hal itu, itu tidak valid, karena Anda tidak dapat menggunakan min / maks bawaan.
Martin Ender
@ MartinBüttner pada dasarnya menyediakan vektor kuantil dan rata-rata. 1 dan 6 adalah 0 dan 1 kuantil. Saya belum pernah menggunakan fungsi min / max bawaan, sesuai aturan Anda.
Tomas
2

Python, 52

Saya masih tidak dapat menahan perasaan bahwa memiliki dua lambdas itu buruk . Fungsi ini mengambil daftar dan kemudian mengembalikan daftar satu elemen yang berisi hasilnya.

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

Mudah-mudahan, itu tidak akan menyebabkan sejumlah besar pelanggaran memiliki hasil dalam daftar satu elemen.

feersum
sumber
1

Matlab / Oktaf, 26

Ini pada dasarnya hanya terjemahan dari jawaban Mathematica oleh xnor. Ia bekerja dengan menambahkan satu nol kurang dari panjang vektor input. Perhatikan bahwa menambahkan satu lagi tidak akan berhasil, karena hasilnya akan menjadi 0 sepanjang waktu. Terima kasih kepada MartinBüttner untuk -4 karakter dari solusi ini =)

@(x)median([x,0*x(2:end)])
cacat
sumber
@ MartinBüttner Anda benar sekali. Saya sekarang mengubahnya: Program hanya akan menambahkan satu nol lebih sedikit dari input. Dengan cara ini dipastikan bahwa kita selalu memiliki jumlah elemen ganjil dan median mengurus sisanya.
flawr
atau pop 0 terakhir dari solusi Anda sebelumnya.
Pengoptimal
@ MartinBüttner Terima kasih, tentu saja itu jauh lebih baik. @ Pengoptimal Bagaimana Anda melakukannya?
flawr
Saya tidak punya ide. Saya pikir pasti ada cara untuk menghilangkan elemen terakhir, seperti @(x)median([0*x,x](2:end)). Meskipun sepertinya itu byte yang sama seperti sekarang.
Pengoptimal
@ Opptizer Saya sudah berpikir saya melewatkan fitur penting dari Matlab =) Sayang sekali bahwa notasi yang Anda sarankan tidak berfungsi, kadang-kadang akan sangat berguna!
flawr
1

Python, 72 60 byte

Ini adalah solusi pertama yang saya pikirkan, dan itu cukup naif. Babak kedua pada dasarnya merupakan duplikat dari bagian pertama dari kode, tetapi saya tidak yakin bagaimana cara melangsingkannya. Saya ingin tahu apakah itu bisa disingkat menggunakaneval ...

Sunting: Mengubah lambdas ke pemahaman.

Coba di sini

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

Ini hanya 4 karakter lagi, tetapi masih layak dilihat, menggunakan TIP Sp3000 .

lambda l:eval("+m%s%s(l)*all(x%s0for x in l)"*2%tuple("ax<in>"))
mbomb007
sumber
1

Javascript, 63

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

Versi yang lebih mudah dibaca:

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
sumber