En kısa Minmod İşlevi


24

Minmod fonksiyonu bilinen bir çeşididir dakika kısmi diferansiyel denklemler eğim sınırlayıcı yüksek çözünürlüklü şemalarında görünür. Birkaç eğim verildiğinde, eğimler arasındaki göreceli işaretlere bakarken en düz eğimi seçer.

İşlev isteğe bağlı sayıda parametre alır. Sonra minmod (x 1 , x 2 , ..., x n ) şöyle tanımlanır:

  • min (x 1 , x 2 , ..., x n ) , eğer tüm x i kesinlikle pozitifse
  • max (x 1 , x 2 , ..., x n ) , tüm x eğer ben kesinlikle negatif
  • Aksi halde 0 .

Yalnızca tamsayı girişlerini dikkate alacağız çünkü bu, uygulamayı gerçekten etkilememektedir ve bazı (ezoterik) diller için daha kapsayıcı olmalıdır.

STDIN, ARGV veya işlev argümanı ile n işaretli tamsayıları ( n> 0 için ) alan (değişkenli bir işlevden daha uygunsa bir diziyi kullanabilirsiniz) ve sonucu (STDOUT'a) döndüren veya basan bir program veya işlev yazın arasında (a, b) minmod .

Sen dahili kullanmayın gerekir dk ya max fonksiyonları (ve tabii ki, hiçbir yerleşik minmod ya, aslında o bulabilirse). Ayrıca, az sayıda sabit öğeyi (5'den küçük) sıralamak dışında , yerleşik sıralama işlevlerini kullanmamalısınız .

Dilinizde imzalı tür yoksa, imzasız bir tür kullanabilir ve onu ikisinin tamamlayıcısı olarak yorumlayabilirsiniz . Örneğin, diliniz yalnızca işaretsiz bayt kullanıyorsa, içeride 255durmak -1ve 128içeride durmak için kullanabilirsiniz -128.

Bu kod golf, yani en kısa cevap (bayt cinsinden) kazanır.

Test Kılıfları

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

Liderler

Aşağıdaki Stack Snippet'i hem düzenli bir lider tablosu hem de kazananların dile göre genel bir incelemesini oluşturur. Öyleyse, seçtiğiniz dil tüm mücadeleyi kazanmanıza izin vermese bile, neden ikinci listedeki bir noktayı yakalamaya çalışmıyorsunuz?

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

# Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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


1
Belki her dilde kaç tane cevap bulunduğunu gösteren bir sütun ekleyebilirsin
proud haskeller

1
@ proudhaskeller Hmm, snippet tam ekranını açmadan şu anda birbirine yakın olan iki masanın hoşuna gittiğini düşünüyorum - başka bir sütun eklersem biraz fazla tıkanacağını düşünüyorum. Yorumunuz benimkinden çok daha fazla puan alırsa ne yapabileceğime bakarım. ;)
Martin Ender

1
@Optimizer Kuralların önceki sürümünün, insanların cevaplarının yaratıcılığına istediğimden daha fazla zarar verdiğine karar verdim. Ayrıca, yine de kural değişikliğinden önce yol açan cevaba bir ödül verecektim, bu yüzden de temsil açısından zarar vereceğini sanmıyorum. (Evet, kural değişikliklerinin bu kadar iyi bir fikir olmadığı konusunda hemfikirim, ancak bu durumda buna değeceğini düşündüm.)
Martin Ender

1
@ MartinBüttner - Artık yeni cevaplarda yaratıcılık göremiyorum. Her şey çift yönlü bir minmod'a indirgendi. Yaratıcılık, xnor'ın cevaplarında ya da Mig'in diğer birçok yanıtın etkilendiği yaklaşımındaydı.
Doktor

2
@Optimizer, yeni bir cevabın tamamen benzeyen eski bir cevap kadar yaratıcı olup olmadığını ya da yaratıcı olmayan bir liman olup olmadığını söylemek her zaman mümkün değildir.
Peter Taylor

Yanıtlar:


13

GolfScript, 10 9 bayt

~{0]$1=}*

Stdin'den girdiyi formatta kabul eder [-4 -2 -3 -2]

Bu yerleşik sıralama işlevini kullanır $, ancak her çalıştırıldığında izin verilen 3 öğenin bir dizisindedir.

Çevrimiçi demo


Harika, cevaplarımız 1 saniyeden kısa, bu da benim cevabımın en kısa olduğu anlamına geliyor. ;)
Timtech

1
+1, bu benim çözümümden çok daha kısa ve daha akıllı. (Ps. Herhangi birinin şüphe etmesi durumunda, evet, bu çözüm doğrudur ve endüksiyonla kanıtlamak oldukça kolaydır. Peter'in kodunun yaptığı şey, önceki minmod değerinin medyanı, bir sonraki giriş değeri ve sıfırın tekrar tekrar hesaplanması; olası davalar bunun gerçekten de yeni minmod değerini verdiğini gösteriyor.)
Ilmari

Ne ... iyi, her zaman
yalınacak

24

Mathematica, 19 bayt

Median[#~Riffle~0]&

Martin Büttner sayesinde kod ve golf oynayın.

Bu, tamsayılar listesini girdi olarak alan adlandırılmamış bir saf işlevdir. Gibi davet et

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

veya benzer şekilde değişkene kaydedildi.

Kod ilk önce girdi listesinin her iki elemanı arasında sıfir, elemanlar n-1arasında sıfır ekler n. Ardından, cevabı üretmek için medyanı alır.

Bu min-mod verir çünkü her durumu ele alır:

  1. Tüm sayılar pozitif, bu durumda sıfırlar altlarındadır ve ortanca en düşük pozitif sayıdır.

  2. Tüm sayılar negatif, bu durumda sıfırlar onların üzerindedir ve ortanca en düşük negatif sayıdır.

  3. Hem pozitif hem de negatif bir sayı var ve bu nedenle orta eleman sıfırdır.

Mathematica, medyanını doğrusal zaman seçim algoritmasını kullanarak uygularsa , o zaman bu da O (n) 'dir.


11

Haskell, 62 61 39 38 37 bayt

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

@ Zgarb'ın cevabından ödünç alınan bazı karşılaştırma sihirlerini kullanarak, yani x*x<=x*y.

x*x<=x*ysadece aynı işarete sahip olduğunda geçerlidir xve mutlak değeri daha büyüktür. zaman unutmayın olduğunu her zaman doğrudur.yyx0

biz belirlemek xbunun içinde yer alır IFF sonucudur sherkes için ve bu yiçinde s xişaretine yve mutlak değer olarak küçüktür. eğer hiçbir değer sbu tanımı sağlamıyorsa, 0sonuç budur.

fsonra sbunu tatmin etmek için bir eleman arayarak çalışır ve 0varsayılan olarak kullanır .

* kullandığım nedenlerden dolayı kullanmadığı halde, şimdiye kadar ondan kurtuldu


Haskell'in bu golf oynamak için nadir olması (ve ironik olarak hala okunabilir olması). Sevdim.
Isiah Meadows,

10

JavaScript (ES6), 39 bayt

a=>a.reduce((p,c)=>p*c>0?p*p>c*c?c:p:0)

1
Bunu sev. ES6'nın iyi kullanımı.
Qix

6

Python 2, 53

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

Buradaki fikir reduceiki girişli min-mod bulucuyu giriş-girişine dönüştürmek için kullanmaktır n. Onu kullanan diğer cevaplardan bağımsız olarak buldum. Sadece Python 2 destekliyor reduce.

İki girişli çözüm basitçe iki sayının ortancasını ve sıfırı bulur. Medyanı kullanmanın daha doğrudan bir yolu için Mathematica cevabımı görün .

Daha az golf oynadı:

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

Python 2 ve Python 3 bir varsayımsal amalgam Python 3 ve gelen yıldız işaretli atama ile, bir karakter daha kısa olacağını input()ve printPython 2'den.

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

Eski kod, sıralama yapmadan:

lambda l:reduce(lambda a,b:[a,b][a*a>b*b]*(a*b>0),l,l[0])

Hm, evet, bu arada bu yan etkiyi fark ettim, ama şimdi düzeltmek için çok geç kalmış gibi hissediyorum. Mathematica'nın yerleşik bir fikri var Median.
Martin Ender

İkinci yaklaşımınız şimdi de geçerlidir.
Martin Ender

6

Mermer, 210 bayt

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

Burada kullanılan üç tahta var.

|(Kartı Ab(Marbelous tüm aritmetik işaretsiz olarak, geçirilen mermer veya sıfır eksi geçirilen mermer dönen ya göre) okunabilir versiyonu) bir mermer mutlak değerini alır.

M(Kurulu Minabs, sol ya da (daha kuçuk bir mutlak değere sahiptir hangisi) geçen birinci veya ikinci mermer ve farklı imza mermer geçirilir, çıkan tespit etmekte ve bu çıkışlar okunabilir versiyon).

MSTDIN'den son karakteri getirilen bir kez tahta ayrıca tutan mermer aşağıya doğru yerine sola doğru serbest bırakır.

MTahtası daha sonra geri saptırılır sola kaydedilecek değeri, serbest olarak, herhangi bir zamanda her kontrol değerlerinin minmod depolamak için ana kart kullanılmaktadır.

Çöp kovaları (\/ ) yalnızca yazdıracak olan senkronizörlerin altına

Giriş / Çıkış, STDIN / STDOUT öğesini kullanır. Her ikisi de 8 bitlik değerlerle ilgilidir (+ 0x30 ve + 0x38 geçmek istiyorsanız,08 ).

Hem kütüphaneler hem de silindirik panolar gereklidir. Çıktıyı ondalık sayılar olarak görmek önerilir (bunun, minmod sonucunun işaretsiz değerini gösterdiğini unutmayın).

Burada test et.

Not: Daha fazla insan dostu giriş / çıkış için eklemek Dpana kartı (önceki son sınırının altında :M,) değiştirin ]]ile Rd, ve altta aşağıdakileri ekleyin:

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

Bu basitçe çıkışı 3 ondalık basamak olarak değiştirir. Aynı şekilde, bu değişikliklerle yapılan giriş, sayı başına 3 ondalık basamaktan oluşan bir boşluk ayrılmış liste gerektirir.

Okunabilir sürüm:

Board Picture


5

Haskell, 83 40 39 bayt

Bu muhtemelen mümkün olan en kısa Haskell çözümü değildir (ve kesinlikle burada diğerlerini yenmeyecektir), ama bu bir başlangıç. EDIT: Şimdi% 50'den daha kısa! EDIT2: Bir bayt daha az ...

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

Bu sadece basit bir kat (veya bazı diller dediğimiz gibi azaltmak) ikili operatör tarafından edilir #ortancasını hesaplar, a, bve 0. Kurallar şimdi küçük listeleri sıralamama izin verse de, bu Haskell'de bir içe aktarma gerektiriyor ve daha yüksek bir bayt sayısıyla sonuçlanıyor ( 49 bayt, ancak 31 olmadan):

import Data.List
a#b=sort[a,b,0]!!1
m=foldr1(#)

\a-> (signum a,a)signum>>=(,)işlev monad örneğini kullanmakla aynıdır . ("
haskell'de

Tavsiyen için teşekkürler, ama şimdi tartışma değil. :)
Zgarb

@ Zgarb Ah tamam.
Doktor

5

TIS-100, 696 526 bayt

@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

Dizisinin sonlandırılmasını bekler. -999 . TIS-100 bu sorudan daha yeni, ancak yine de burada önemi yok.

Düğüm 9, hepimizin olumlu mu, hepimizin olumsuz mu, karma mı olduğunu izler. Düğüm 5 ve 6, tüm giriş numaralarının mutlak değerinin minimumunu bulmak için çalışır. Düğüm 10 daha sonra, düğüm 9'un durumuna bağlı olarak minimum, minimum negatif veya 0 seçer.

enter image description here


TIO için bir TIS öykünücüsü kullandım, artık çevrimiçi deneyebilirsiniz!
Phlarx

4

CJam, 20 bayt (veya 10 bayt)

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

@ Xnor yaklaşımını kullanarak, diziden bir anda 2 sayının minimum değerini hesaplamayı azaltın.

Bu :zişe yaradıysa 19 bayt olurdu


Türleri kısa dizilerde kullanma yeni kuralını kullanarak:

q~{0]$1=}*

@ Peter'ın cevabına tam olarak eşdeğer


Önceki 26 bayt asnwer:

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

Bu daha çok golf oynayabilir ...

Giriş (STDIN aracılığıyla) aşağıdaki gibi bir tamsayı dizisidir:

[-4 -2 -3 -2]

ve çıktı, giriş dizisinin minododudur.

Burada dene

Sadece :gve :zçalıştı, bu 4 bayt daha kısa olurdu.


25 bayt: q~_{g}%_|:+\{z\za+_~>=}**.
jimmy23013

Tek int dizisi için başarısız. Ben de denedim :)
Doktor

Orada bir 26 byte çözüm olmasına rağmen. Bunun için teşekkürler :)
Doktor

4

Java, 84 bayt

Bu, tüm görkemiyle Java. GolfScript'i% 900'ün biraz üzerinde bir faktörle yener.

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

Sınıfta sarılmış:

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

}

Yorumlarla genişletildi:

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

}

Not: Bu, Java 8 kullanılarak geliştirilebilir.

Not: Java 8'de geliştirme çabası başarısız oldu.


Henüz öğreneceğim çok şey var. +1.
Rodolfo Dias

4

J, 20 12 bayt

Listeyi argüman olarak alan işlev. Golfscript / CJam / 'dan çalındı.

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

Minmod xve üç madde listesinin medyanıdır y(sırala /:~ve ortala 1{) 0,x,y. Listeyi azaltın ( katlama bitişik elemanlar arasındaki minmod alarak J dilinde).

REPL'de kullanımda. (J, negatif işaretini heceleyerek gösterir _.)

   (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

: Eski çöp fark ettim önce, kısa türlü izin verilir 0:`<.`>.@.(*@]*0<*))/ve minmod xve y0 (olduğu 0:veya ürüne eşit büyüktür) 0 ise xve ybaşka o dakika (olduğunu <.) ya da max ( >.arasında) xve yişarete göre . Bunu tüm listeye katla.


4

TI-BASIC, 19 bayt

Giriş biçimini kabul eder {-2,4,3} .

Xnor'ın cevabına benzer şekilde çalışır:

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

3
Kod boyutunu saymanın ilginç yolu ...
Ypnypn


median(augment(Ans,0ΔList(AnsKodum, yalnızca sekiz bayt olduğu gibi , birinci boyut listelerinde başarısız oluyor. If variance(Ans:augment(Ans,0ΔList(Ans:median(Ansseninkinden daha uzun Keşke sadece TI-BASIC boş listeleri destekliyorsa ...
lirtosiast

Haklısın. Kod büyüklüğümü 12 ila 15 bayt arasında gösteriyor gibi görünüyor.
Timtech

Sanırım haklısın. +4 bayt var.
Timtech

3

Python 2, 82 79 71 69 61 bayt

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

Bu esinlenerek benim pyth cevap, off dayanır Mig adlı cevabı.


Eski cevap:

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

Bu çok uzun bir cevap. İki değişkene sahip olmak bir atık gibi hissediyorum ...? Haklı mıydım? imsi? s


3

KDB / Q, işlev gövdesi tanımı için 43 karakter

Önceki yayınlardan gelen harika fikirler sayesinde:

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

Listeyi kullanarak tek numarayı girin

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]

Eminim bazı Q gurusu daha kısa olanlarla gelebilir.


Belki de böyle bir şey {asc[0,x,y]1}/?
algoritmshark

3

Pyth, 25 22 20 12

uhtS[0GH)QhQ

Muhtemelen yeni değil, orijinal: P


Ön sıralama yapılmasına izin verilir

u*?Gx>GH>G0H>*GHZQhQ

Pyth

Çevrimiçi deneyin.

Kullanım reduceve üçlü ifadeler fikri utanmadan Mig'ın cevabından çalındı , ancak üçlü ifadeleri okuyamadığım için bu algoritmaların benzer olup olmadığı konusunda hiçbir fikrim yok.

Açıklama:

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

Gerek yok tQ. Qayrıca çalışacak
Doktor

Oldukça doğru! Ben de birini kaldırmak düşünüyorum ?bir için *...
FryAmTheEggman

3

C #, 101 bayt

İlk olarak kod golfünde ve oldukça golf düşmanca bir dilde denemeliyim. Azaltmaya dayanarak ( AggregateLINQ'da) ve Mig'ın JavaScript yanıtına çok benzer . Gibi çalıştırılabilir (new System.Linq.M()).m(new[] {1, 2, 3}). Tüm test durumlarını geçer, ancak boş giriş dizilerini işlemez.

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

1
Boş girişi işlemeye gerek yok, çünkü o durumda fonksiyon tanımlamamıştım.
Martin Ender

3

J, 12 bayt

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

İşlev listeyi azaltır (katlanır/ , aşağıdaki ifadeyle ) olarak ):

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

[x,y][abs(x)>abs(y)]olup yolmadığını abs(x) > abs(y)başka x.

Örnek:

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

Burada çevrimiçi deneyin.


2

Oyun Makinesi Dili, 489 bayt

Game Maker Language hakkında

Diziyi karıştırır (sıfırlar eklenir) ve medyanı (diğer cevabımdaki gibi) döndürür

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}

@ MartinBüttner İlk 2,5 satır tüfek yapar ve gerisi medyanı bulur. 32000Yazılım ile sınırlandırılmış olarak dizinin boyutudur.
Timtech

@ MartinBüttner Evet, medyan bölümünde, tüm liste sıralanmamış.
Timtech

@ MartinBüttner her yinelemede sıralanır ... yani 3
Timtech

Ohhh, anlıyorum. Bu kod böyle bir iş dili için okumak şaşırtıcı derecede zor. ^^
Martin Ender

MartinBüttner It bayağı golf için iyi (çok gevşek sözdizimi), ancak @ o yerleşik işlevleri (birçok standart içermiyor olduğu oyun tasarımı yönelik).
Timtech

2

Java, 353 304 124 bayt

Dünyanın en kötü golf oyuncusu ile kod golf için en kötü dili bir araya getirin ve ...

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 onu ve sen olsun:

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

Bu (çok açık olmasa bile) bir dizi sayı alan ve minmod değerini döndüren değerlerini işleyen bir işlevdir.

Eski bir kirlilik düşüncem de dahil edildi, ki bu da her zaman olduğu gibi bütün bir 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 onu ve sen olsun:

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

Sonsuz sayıları alır, sayı olmayan bir değer girildiğinde durur, Minmon değerini gösterir.


Kodunuz ilk değeri atıyor gibi görünüyor, bu nedenle örneğin için yanlış cevaplar verecek 1 2 3. Ayrıca, stdin'den okuyan bir program yerine, argümanlarını işleyen bir fonksiyon yazabileceğinizi düşünüyor gibi görünüyorsunuz.
Peter Taylor

@PeterTaylor Aptalca, ilk içgüdüm, bir işlev olabileceği belirtilse bile her zaman tam bir program yazmaktır. Bu hata hakkında, görünüşe göre yeterince test etmedim, fareler. Şimdi düzeltmeye çalışacağım - hem de sadece işlevli bir sürüm ...
Rodolfo Dias

2

R, 20 karakter

R genellikle kod yazarı için iyi değildir, ancak çalışmam için kullanıyorum, bu yüzden denemek istedim. Denemeden önce, R'nin böyle kirli bir sözdizimini kabul etmeye istekli olduğunu bilmiyordum! :-) 52 karakter :

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

Sonra @ xnor'ın cinsel medyan hilesini denediğim diğer cevaplara baktım, bu harika!

median(c(x-x,x)[-1])

İlk versiyonunuz nasıl çalışıyor? Ne yapar summary? Are q[1]ve q[6]minimum ve maksimum sırasıyla? Bu durumda, bu geçerli değil çünkü yerleşik min / maks kullanamazsınız.
Martin Ender

@MartinBüttner it basicly provides a vector of quantiles and a mean. 1 and 6 are 0 and 1 quantiles. I have not used built-in min/max function, as per your rules.
Tomas

2

Python, 52

I still couldn't help feeling that it's bad to have two lambdas. This function takes in a list and then returns a one-element list containing the result.

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

Hopefully, it will not cause an enormous amount of offense to have the result in a one-element list.


1

Matlab/Octave, 26

This is basically just a translation of the Mathematica answer by xnor. It works by appending one zeros less than the length of the input vector. Note that appending one more would not work, since then the result would be 0 all the time. Thanks to MartinBüttner for the -4 chars of this solution=)

@(x)median([x,0*x(2:end)])

@MartinBüttner You are absolutely right. I now altered it: The program will only append one zero less than the input. This way it is ensured that we have always an odd number of elements and the median takes care fo the rest.
flawr

or pop the last 0 from your previous solution.
Optimizer

@MartinBüttner Thanks, of course thats way better. @ Optimizer How would you do that?
flawr

I have no idea. I thought there must be a way to simply pop off the last element, something like @(x)median([0*x,x](2:end)) . Although it seems like that its the same bytes as now.
Optimizer

@Optimizer I already thought I missed an important feature of Matlab=) It is too bad that the notation you suggested does not work, it would be really handy sometimes!
flawr

1

Python, 72 60 bytes

This is the first solution I thought of, and it's quite naive. The second half is basically a duplicate of the first half of the code, but I wasn't sure how to slim it. I wonder if it can be shortened using eval...

Edit: Changed lambdas to comprehensions.

Try them here

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

This is only 4 chars longer, but still worth looking at, using Sp3000's TIP.

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

1

Javascript, 63

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

A more readable version:

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;
            }
        }
    });
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.