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 255
untuk bertahan -1
dan 128
bertahan -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 N
ukuran 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
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>
Jawaban:
GolfScript,
109 byteMengasumsikan 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
sumber
Mathematica, 19 byte
Kode dan golf berkat Martin Büttner.
Ini adalah fungsi murni tanpa nama yang mengambil dalam daftar bilangan bulat sebagai input. Meminta itu seperti
atau disimpan serupa ke variabel.
Kode pertama riffles nol di antara setiap dua elemen dari daftar input, yang menyisipkan
n-1
nol di antaran
elemen. Kemudian, dibutuhkan median untuk menghasilkan jawaban.Ini memberikan min-mod karena menangani setiap kasus:
Semua angka positif, dalam hal ini nol di bawahnya dan median adalah angka positif terendah.
Semua angka negatif, dalam hal ini nol di atas mereka dan median adalah angka paling negatif.
Ada angka positif dan negatif, dan elemen tengahnya adalah nol.
Jika Mathematica mengimplementasikan mediannya menggunakan algoritma seleksi linear-waktu , maka ini juga O (n).
sumber
Haskell,
6261393837 bytemenggunakan beberapa perbandingan sihir yang dipinjam dari jawaban @ Zgarb *, yaitu
x*x<=x*y
,.x*x<=x*y
benar hanya ketikax
dany
memiliki tanda yang sama dany
nilai absolut lebih besar. dicatat bahwa ketikax
adalah0
selalu benar.kami menentukan bahwa
x
ini adalah hasil jika terkandung dalams
, dan bahwa untuk semuay
dalams
x
memiliki tanda yang samay
dan lebih kecil dalam nilai absolut. jika tidak ada nilai dalams
memenuhi definisi ini, maka0
hasilnya.f
kemudian bekerja dengan mencaris
elemen untuk memenuhi ini, dan menggunakan0
sebagai default.* Meskipun dia tidak menggunakannya karena alasan saya menggunakannya, dan dia benar-benar menyingkirkannya sekarang
sumber
JavaScript (ES6), 39 byte
sumber
Python 2, 53
Idenya adalah menggunakan
reduce
untuk mengubah min-mod finder dua-input menjadin
-input satu. Saya datang dengan itu secara independen dari jawaban lain yang menggunakannya. Hanya Python 2 yang mendukungreduce
.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:
Gabungan hipotetis Python 2 dan Python 3 akan menjadi karakter yang lebih pendek, dengan penugasan berbintang dari Python 3 dan
input()
danprint
dari Python 2.Kode lama, tanpa mengurutkan:
sumber
Median
.Marbelous, 210 byte
Ada tiga papan yang digunakan di sini.
The
|
setrika (Ab
dalam 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
M
setrika (Minabs
dalam 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
M
papan juga melepaskan marmer itu memegang bawah bukan ke kiri setelah karakter terakhir dari STDIN diambil.The
M
papan 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
08
ke 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
Dp
bawah baris terakhir papan utama (sebelumnya:M
), ganti]]
denganRd
, dan tambahkan yang berikut di bagian bawah: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:
sumber
Haskell,
834039 byteIni 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 ...
Ini hanya lipatan langsung (atau kurangi, seperti beberapa bahasa menyebutnya) oleh operator biner
#
, yang menghitung median daria
,b
dan0
. 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):sumber
\a-> (signum a,a)
sama dengansignum>>=(,)
menggunakan fungsi instance monad. (lihat posting saya di "tips untuk bermain golf di haskell")TIS-100,
696526 byteBerharap 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.
sumber
CJam, 20 byte (atau 10 byte)
Menggunakan pendekatan @ xnor, kurangi kalkulasi minmod dari 2 angka sekaligus dari array.
Ini akan menjadi 19 byte jika
:z
berhasilMenggunakan aturan baru menggunakan macam pada array pendek:
yang persis sama dengan jawaban @ Peter
Asnwer 26 byte sebelumnya:
Ini bisa bermain golf lebih lanjut ...
Input (via STDIN) adalah array integer seperti:
dan output adalah minmod dari array input
Coba di sini
Jika saja
:g
dan:z
berfungsi, ini akan menjadi 4 byte lebih pendek.sumber
q~_{g}%_|:+\{z\za+_~>=}**
.Java, 84 byte
Ini adalah Java dengan segala kemuliaannya. Mengalahkan GolfScript dengan faktor sedikit di atas 900%.
Dibungkus dalam kelas:
Diperluas dengan komentar:
Catatan: Ini dapat ditingkatkan menggunakan Java 8.
Catatan: Upaya untuk meningkatkan di Java 8 gagal.
sumber
J,
2012 byteBerfungsi mengambil daftar sebagai argumen. Dicuri dari Skrip Golf / CJam / apa pun.
Minmod dari
x
dany
adalah median (urutkan/:~
dan ambil tengah1{
) dari daftar tiga item0,x,y
. Kurangi daftar ( lipat dalam bahasa J) dengan mengambil minmod ini antara elemen yang berdekatan.Digunakan di REPL. (J mengeja tanda negatifnya
_
.)Sampah lama, sebelum saya perhatikan jenis-jenis pendek diperbolehkan:
0:`<.`>.@.(*@]*0<*))/
minmod darix
dany
0 (0:
) jika 0 lebih besar atau sama dengan produk darix
dany
, selain itu min (<.
) atau maks (>.
) antarax
dany
tergantung pada tanda . Lipat ini di seluruh daftar.sumber
TI-BASIC, 19 byte
Mengasumsikan input dalam format
{-2,4,3}
.Bekerja mirip dengan jawaban xnor:
sumber
median(augment(Ans,0ΔList(Ans
hanya delapan byte, gagal pada daftar dimensi satu.If variance(Ans:augment(Ans,0ΔList(Ans:median(Ans
lebih panjang dari milikmu. Andai saja TI-BASIC mendukung daftar kosong ...Python 2,
8279716961 byteIni didasarkan pada jawaban saya, yang terinspirasi oleh jawaban Mig .
Jawaban lama:
Ini jawaban yang sangat panjang.
Saya merasa seperti memiliki 2 variabel adalah pemborosan ...?Saya benar...? ish? ; psumber
KDB / Q, 43 karakter untuk definisi fungsi tubuh
Berkat ide-ide bagus dari posting sebelumnya:
Masukkan nomor tunggal menggunakan daftar
Saya yakin beberapa guru Q dapat membuat yang lebih pendek.
sumber
{asc[0,x,y]1}/
?Pyth,
25222012Mungkin bukan novel, tetapi asli: P
Pre-sorting diperbolehkan
Pyth
Cobalah online.
Ide untuk menggunakan
reduce
dan 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:
sumber
tQ
.Q
juga akan berfungsi?
untuk*
...C #, 101 byte
Percobaan pertama saya di golf kode dan dalam bahasa bermusuhan golf cantik. Berdasarkan pengurangan (
Aggregate
dalam 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.sumber
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)]
adalahy
jikaabs(x) > abs(y)
yang lainx
.Contoh:
Cobalah online di sini.
sumber
Bahasa Game Maker, 489 byte
Tentang Bahasa Pembuat Game
Riffles the array (nol ditambahkan) dan mengembalikan median (mirip dengan jawaban saya yang lain)
sumber
32000
adalah ukuran maksimum array yang dibatasi oleh perangkat lunak.Java,
353304124 byteKumpulkan bahasa terburuk untuk golf kode dengan pegolf terburuk di dunia dan Anda ...
Lepaskan ikatannya dan Anda mendapatkan:
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.
Lepaskan ikatannya dan Anda mendapatkan:
Menerima angka tak terbatas, berhenti ketika nilai bukan angka dimasukkan, menyajikan nilai Minmon.
sumber
1 2 3
. Anda juga tampaknya mengabaikan bahwa Anda dapat menulis sebuah fungsi yang memproses argumennya daripada sebuah program yang membaca dari stdin.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 :
Kemudian saya melihat jawaban lain yang saya coba trik median genial @ xnor, yang bagus!
sumber
summary
harus dilakukan Apakahq[1]
danq[6]
min dan maks, masing-masing? Dalam hal itu, itu tidak valid, karena Anda tidak dapat menggunakan min / maks bawaan.Python, 52
Saya masih tidak dapat menahan perasaan bahwa memiliki dua
lambda
s itu buruk . Fungsi ini mengambil daftar dan kemudian mengembalikan daftar satu elemen yang berisi hasilnya.Mudah-mudahan, itu tidak akan menyebabkan sejumlah besar pelanggaran memiliki hasil dalam daftar satu elemen.
sumber
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 =)
sumber
@(x)median([0*x,x](2:end))
. Meskipun sepertinya itu byte yang sama seperti sekarang.Python,
7260 byteIni 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 menggunakan
eval
...Sunting: Mengubah lambdas ke pemahaman.
Coba di sini
Ini hanya 4 karakter lagi, tetapi masih layak dilihat, menggunakan TIP Sp3000 .
sumber
Javascript, 63
Versi yang lebih mudah dibaca:
sumber