최단 Minmod 기능


24

minmod 함수 친숙한 변형이다 편미분 방정식에 대한 기울기 제한 고해상도 구조에서 나타난다. 여러 개의 경사면이 주어지면 경사면 사이의 상대적 표시를 처리하면서 가장 평평한 경사를 선택합니다.

이 함수는 임의의 수의 매개 변수를 사용합니다. 그런 다음 minmod (x 1 , x 2 , ..., x n ) 은 다음과 같이 정의됩니다.

  • 모든 x i 가 엄격하게 양수인 경우 min (x 1 , x 2 , ..., x n )
  • 모든 x i 가 엄격히 음수 인 경우 max (x 1 , x 2 , ..., x n )
  • 그렇지 않으면 0 입니다.

정수 입력 만 고려할 것입니다. 정수 입력은 실제로 구현에 영향을 미치지 않으며 일부 (비밀 한) 언어에보다 포괄적이어야하기 때문입니다.

STDIN, ARGV 또는 함수 인수를 통해 n 개의 부호있는 정수 ( n> 0 )를 취하는 프로그램 또는 함수를 작성하고 ( 가변 함수보다 편리한 경우 배열을 사용할 수 있음) 결과를 반환하거나 인쇄합니다 (STDOUT에) 의 (a, b) minmod .

내장 min 또는 max 기능을 사용해서는 안됩니다 ( 실제로 그것을 찾을 수 있다면 내장 minmod 도 없습니다 ). 또한 고정 된 소수의 항목 (5 미만) 을 정렬하는 경우제외하고 내장 정렬 기능을 사용해서는 안됩니다 .

언어에 부호있는 유형이없는 경우 부호없는 유형을 사용하여 2의 보수로 해석 할 수 있습니다 . 언어는 부호없는 바이트를 사용 예, 당신은 사용할 수 있습니다 255에 대한에 서서 -1128에에 서서 -128, 등

이것은 코드 골프이므로 가장 짧은 대답 (바이트)이 이깁니다.

테스트 사례

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

리더 보드

다음 스택 스 니펫은 일반 리더 보드와 언어 별 수상자 개요를 모두 생성합니다. 따라서 선택한 언어로도 모든 도전에서 이길 수는 없지만 두 번째 목록에서 자리를 잡아보십시오.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

# Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

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


1
어쩌면 각 언어에 몇 개의 답변이 있는지에 대한 열을 추가하십시오.
자랑스러운 haskeller

1
@ proudhaskeller 흠, 나는 스 니펫 전체 화면을 열지 않고 두 테이블이 현재 서로 옆에 맞는 것을 좋아합니다. 다른 열을 추가하면 너무 좁아 질 것입니다. 귀하의 의견이 제 의견보다 상당히 많이지지된다면, 제가 할 수있는 일을 보게 될 것입니다. ;)
Martin Ender

1
@Optimizer 나는 이전 버전의 규칙이 내가 생각했던 것보다 사람들의 답변의 창의성에 더 해를 끼치도록 결정했습니다. 또한, 나는 어쨌든 규칙이 바뀌기 전에 이끌어 낸 답변에 현상금을 수여하기로 했으므로 담당자 측면에서도 해를 끼치 지 않는다고 생각합니다. (예, 규칙 변경이 그렇게 좋은 아이디어는 아니지만이 경우에는 가치가 있다고 생각합니다.)
Martin Ender

1
@ MartinBüttner-새로운 답변에서 창의력을 보지 못했습니다. 그것은 모두 쌍으로 minmod로 감소되었습니다. 창의성은 xnor의 답변이나 Mig의 접근 방식에 있었으며 다른 많은 답변에 영향을 미쳤습니다.
Optimizer

2
@Optimizer, 새 답변이 이전 답변과 비슷한 독창적인지 또는 상상력이없는 포트인지 항상 알 수는 없습니다.
피터 테일러

답변:


13

GolfScript, 10 9 바이트

~{0]$1=}*

stdin의 입력을 형식으로 가정합니다. [-4 -2 -3 -2]

내장 정렬 함수 $를 사용하지만 호출 할 때마다 3 개의 요소 배열에 있으며 이는 허용됩니다.

온라인 데모


멋지다. 우리의 대답은 1 초도 채 걸리지 않았다. 이것은 나의 대답이 가장 짧았다는 것을 의미한다. ;)
Timtech

1
+1, 이것은 내 솔루션보다 훨씬 짧고 똑똑합니다. (Ps. 누군가가 그것을 의심하는 경우, 그렇습니다.이 솔루션은 정확하며 유도에 의해 증명하기가 쉽습니다 .Peter의 코드는 이전 minmod 값의 중간 값, 다음 입력 값 및 0을 반복적으로 계산하는 것입니다. 가능한 경우는 이것이 실제로 새로운 minmod 값을 산출한다는 것을 보여줍니다.)
Ilmari Karonen

무엇 ... 음, 항상 기댈 물건이 많이 있습니다 : O
TheBlastOne

24

매스 매 티카, 19 바이트

Median[#~Riffle~0]&

Martin Büttner 덕분에 코드와 골프.

이것은 정수 목록을 입력으로 사용하는 명명되지 않은 순수 함수입니다. 처럼 불러

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

또는 유사하게 변수에 저장됩니다.

이 코드는 먼저 입력 목록의 두 요소마다 n-10을 작성하여 n요소 사이에 0 을 삽입 합니다. 그런 다음 답을 생성하는 데 중앙값이 필요합니다.

각 경우를 처리하기 때문에 min-mod를 제공합니다.

  1. 모든 숫자는 양수이며,이 경우 0은 그 아래이고 중앙값은 가장 낮은 양수입니다.

  2. 모든 숫자는 음수입니다.이 경우 0이 0보다 크며 중앙값이 가장 작은 음수입니다.

  3. 양수와 음수가 모두 있으므로 중간 요소는 0입니다.

Mathematica가 선형 시간 선택 알고리즘을 사용하여 중앙값을 구현하는 경우 O (n)이기도합니다.


11

하스켈, 62 61 39 38 37 바이트

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

@ Zgarb 's answer *에서 빌린 비교 마법을 사용합니다 x*x<=x*y.

x*x<=x*yxy같은 부호를 가지며 y절대 값이 더 큰 경우에만 적용됩니다 . 언제 x인지 0항상 주의하십시오 .

우리 x는 그것이 그것이 포함 된 경우의 결과이며 s, 모든 yin s x에 대해 동일한 부호를 y가지며 절대 값이 더 작은 것을 결정한다. 값 s이이 정의 를 만족 하지 않으면 0결과입니다.

f그런 다음 s이를 충족시킬 요소를 검색 하여 작동 0하고 기본값으로 사용합니다.

* 그는 내가 그것을 사용하는 이유 때문에 그것을 사용하지 않았지만 실제로는 그것을 없애 버렸습니다.


Haskell이 골프를 할 수있는 (그리고 아이러니하게도 여전히 읽을 수있는) 것은 드 for니다. 그것을 사랑하십시오.
Isiah Meadows

10

자바 스크립트 (ES6), 39 바이트

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

1
이거 너무 좋아. ES6를 잘 사용합니다.
Qix

6

파이썬 2, 53

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

아이디어는 reduce2- 입력 min-mod 파인더를 n-input 하나로 바꾸는 데 사용하는 것입니다. 나는 그것을 사용하는 다른 답변과 독립적으로 그것을 생각해 냈습니다. Python 2 만 지원합니다 reduce.

2 입력 솔루션은 단순히 두 숫자의 중앙값과 0을 찾습니다. 중앙값을 사용하는 더 직접적인 방법 은 내 Mathematica 답변 을 참조하십시오 .

덜 골프 :

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

파이썬이 파이썬 3의 가상 아말감은 파이썬 3에서 별표 할당과, 문자 짧은 것 input()print파이썬 2에서.

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

정렬하지 않고 이전 코드 :

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

흠, 예, 그 동안 부작용이 있음을 알았지 만 지금 고치기에는 너무 늦었습니다. Mathematica는 내장되어 Median있습니다.
Martin Ender

후자의 접근 방식도 이제 유효합니다.
Martin Ender

6

놀라운, 210 바이트

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

여기에는 세 개의 보드가 사용됩니다.

|(기판 Ab(Marbelous 모든 산술 부호이므로, 전달 대리석 또는 마이너스 제로 전달 대리석 복귀 하나에 의해) 판독 버전)는 대리석의 절대 값을 취한다.

M(보드 Minabs왼쪽 중 (절대 값이 작은 쪽을 갖는다) 전달 제 또는 제 대리석과 다른 서명 대리석이 전달되는 경우에 종료 발견 및 출력 판독 버전).

MSTDIN에서 마지막 문자를 가져올되면 이사회는 또한이 보유하고 대리석 아래로 대신 왼쪽을 해제합니다.

M보드는 메인 보드에서 사용되어 주어진 시간에 모든 체크 된 값의 최소 모드를 저장합니다. 왼쪽으로 저장할 값을 해제 한 후 다시 편향시킵니다.

휴지통 ( \/)은 STDIN으로 인쇄 할 수있는 동기화 장치에만 배치되었습니다.

입력 / 출력은 STDIN / STDOUT을 사용합니다. 둘 다 8 비트 값을 처리합니다 (+ 0x30 및 + 0x38을 전달하려는 경우 08STDIN에 배치 ).

라이브러리 및 원통형 보드가 모두 필요합니다. 출력을 10 진수로 보는 것이 좋습니다 (이는 minmod 결과의 부호없는 값을 표시합니다).

여기에서 테스트하십시오.

참고 : 보다 인간 친화적 인 입 / 출력 Dp을 위해 메인 보드의 마지막 줄 (이전 :M)을 추가하고로 교체 ]]Rd후 하단에 다음을 추가하십시오.

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

이것은 단순히 출력을 소수점 3 자리로 변경합니다. 마찬가지로, 이러한 변경 사항을 입력하려면 숫자 당 3 자리 10 진수로 공백으로 구분 된 목록이 필요합니다.

읽을 수있는 버전 :

보드 사진


5

하스켈, 83 40 39 바이트

이것은 아마도 가장 짧은 Haskell 솔루션이 아니며 (여기서 다른 솔루션을 이길 수는 없습니다) 시작입니다. 편집 : 이제 50 % 이상 짧습니다! EDIT2 : 1 바이트 이하 ...

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

이건 그냥 간단는 배 (또는 언어가 부르는 감소) 바이너리 연산자입니다 #의 평균을 계산, a, b0. 규칙에 따라 작은 목록을 정렬 할 수 있지만 Haskell에서 가져 오기가 필요하고 더 높은 바이트 수 ( 49 바이트이지만 가져 오기없이 31 )가 발생합니다.

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

\a-> (signum a,a)signum>>=(,)monad 인스턴스 함수 를 사용 하는 것과 같습니다 . ( "
하스켈

팁 주셔서 감사합니다,하지만 지금은 바보입니다. :)
Zgarb

@Zgarb 아 알았어.
Optimizer

5

TIS-100, 696526 바이트

@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

로 끝나는 시퀀스를 예상합니다 -999. TIS-100은이 질문보다 새로운 것이지만, 여기서 중요한 것은 아닙니다.

노드 9는 우리가 모두 긍정적인지, 부정인지 또는 혼합인지를 추적합니다. 노드 5와 6은 모든 입력 숫자의 절대 값의 최소값을 찾기 위해 작동합니다. 그런 다음 노드 10은 노드 9의 상태에 따라 최소, 최소 또는 0을 선택합니다.

여기에 이미지 설명을 입력하십시오


TIO 용 TIS 에뮬레이터를 구현 했으므로 이제 온라인으로 사용해 볼 수 있습니다!
Phlarx

4

CJam, 20 바이트 (또는 10 바이트)

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

@xnor의 접근 방식을 사용하면 배열에서 한 번에 2 개의 숫자를 계산하는 것을 줄일 수 있습니다.

:z작동 하면 이것은 19 바이트 였을 것입니다


짧은 배열에서 정렬을 사용하는 새로운 규칙 사용 :

q~{0]$1=}*

@Peter의 답변과 정확히 동일합니다.


이전 26 바이트의 답변 :

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

이것은 더 골프 수 있습니다 ...

STDIN을 통한 입력은 다음과 같은 정수 배열입니다.

[-4 -2 -3 -2]

출력은 입력 배열의 최소 모드입니다

여기 사용해보십시오

만약 작동 :g하고 :z작동 한다면 , 이것은 4 바이트 더 짧았을 것입니다.


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

단일 int 배열에 실패합니다. 나도 그것을 시도했다 :)
Optimizer

거기에 26 바이트 솔루션이 있지만. 고마워 :)
Optimizer

4

자바, 84 바이트

이것은 모든 영광에서 자바입니다. 900 % 이상의 GolfScript를 능가합니다.

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

수업에 싸여 :

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

}

주석으로 확장 :

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

}

참고 : 이것은 Java 8을 사용하여 개선 될 수 있습니다.

참고 : Java 8에서 개선하려는 노력이 실패했습니다.


아직 배울 것이 많다. +1.
Rodolfo Dias

4

J, 20 12 바이트

리스트를 인수로 취하는 함수. Golfscript / CJam / what에서 도난당했습니다.

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

의 minmod xy중간이다 (일종의 /:~중간을 1{) 세 가지 항목 목록의 0,x,y. 인접한 요소 사이 에서이 minmod를 사용 하여 목록을 줄입니다 ( J 말로 접힘 ).

REPL에서 사용 중입니다. (J는 음수 부호를 표시 _합니다.)

   (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

: 오래된 쓰레기는 내가 발견하기 전에, 짧은 종류가 허용됩니다 0:`<.`>.@.(*@]*0<*))/의 minmod xy0 (인 0:또는 제품에 동일보다 큰) 0 경우 xy그렇지는 분입니다 (, <.) 또는 최대가 ( >.사이) xy기호에 따라 . 이것을 전체 목록에 접으십시오.


4

TI-BASIC, 19 바이트

형식으로 입력을 가정합니다 {-2,4,3}.

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

3
계수 코드 크기의 재미있는 방법 ...
Ypnypn


내 코드와 median(augment(Ans,0ΔList(Ans8 바이트 만 차원 1 목록에서 실패합니다. If variance(Ans:augment(Ans,0ΔList(Ans:median(Ans너보다 길다. 단지 TI-BASIC은 ... 빈 목록을 지원하는 경우
lirtosiast

네 말이 맞아 내 코드 크기가 12 ~ 15 바이트 인 것 같습니다.
Timtech

내 생각 엔 니가 맞아. 거기에 +4 바이트
Timtech

3

파이썬 2, 82 79 71 69 61 바이트

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

이것은 Mig의 답변 에서 영감을 얻은 pyth 답변을 기반으로합니다 .


이전 답변 :

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

이것은 매우 긴 대답입니다. 나는 2 개의 변수를 갖는 것이 낭비라고 생각합니다 ...? 내가 맞았 어...? 아냐? ;피


3

함수 본문 정의를위한 KDB / Q, 43 자

이전 게시물의 훌륭한 아이디어 덕분에 :

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

enlist를 사용하여 단일 번호를 입력하십시오

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]

나는 어떤 Q 전문가가 더 짧은 것을 얻을 수 있다고 확신합니다.


아마도 같은 {asc[0,x,y]1}/?
algorithmshark

3

피스, 25 22 20 12

uhtS[0GH)QhQ

아마도 소설은 아니지만 독창적입니다 : P


사전 분류 허용

u*?Gx>GH>G0H>*GHZQhQ

피스

온라인으로 사용해보십시오.

사용 reduce및 삼항 문장은 Mig의 대답 에서 뻔뻔하게 도난 당 했지만 삼항 문장을 읽을 수 없으므로 이러한 알고리즘이 다른 경우에도 전혀 모릅니다.

설명:

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

필요 없습니다 tQ. Q작동합니다
Optimizer

맞아! 나는 또한 내가 중 하나를 제거 할 수 있다고 생각 ?합니다 *...
FryAmTheEggman

3

C #, 101 바이트

내 첫 번째 코드 골프와 꽤 골프 적대적인 언어로 시도합니다. AggregateLINQ의 reduce를 기반으로 하며 Mig의 JavaScript 답변 과 매우 유사합니다 . 처럼 실행할 수 있습니다 (new System.Linq.M()).m(new[] {1, 2, 3}). 모든 테스트 사례를 통과하지만 빈 입력 배열은 처리하지 않습니다.

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
그 경우의 함수를 정의조차하지 않았기 때문에 빈 입력을 처리 할 필요가 없습니다.
Martin Ender

3

J, 12 바이트

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

이 함수 /는 다음 표현식을 사용 하여 목록 ( J에서 접기 ( ) 라고 함 )을 줄입니다.

(signum(x) == signum(y)) * [x,y][abs(x)>abs(y)] 어디에

[x,y][abs(x)>abs(y)]y경우 abs(x) > abs(y)다른 x.

예:

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

여기에서 온라인으로 사용해보십시오.


2

게임 메이커 언어, 489 바이트

게임 메이커 언어 정보

배열을 리플 링하고 (0이 추가됨) 중앙값을 반환합니다 (다른 답변과 유사)

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 처음 2.5 줄은 리플을 수행하고 나머지는 중앙값을 찾습니다. 는 32000소프트웨어에 의해 한정되는 바와 같이 배열의 최대 크기이다.
Timtech

@ MartinBüttner 네, 중간 부분에서 전체 목록이 정렬되지 않습니다.
Timtech

@ MartinBüttner 그것은 매 반복마다 정렬됩니다 ... so 3
Timtech

알 겠어요 이 코드는 놀랍게도 그런 언어로 읽기가 어렵습니다. ^^
Martin Ender

MartinBüttner 그것은 꽤 골프에 대한 좋은 (매우 느슨한 구문)하지만 @이 내장 함수 (가 많은 표준이 포함되어 있지 않습니다 되는 게임 디자인을 지향를).
Timtech

2

자바 353 304 124 바이트

세계 최악의 골퍼와 코드 골프의 최악의 언어를 조합하면 다음과 같은 이점을 얻을 수 있습니다.

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

그것을 풀면 얻을 수 있습니다 :

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

이것은 숫자 배열을 수신하고 그 값을 처리하여 minmod 값을 반환하는 함수입니다 (명확하지 않은 경우).

용질에 대한 저의 오래된 장점도 포함되어 있습니다. 이것은 항상 그렇듯이 전체 프로그램입니다.

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

그것을 풀면 얻을 수 있습니다 :

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

무한 숫자를 받고 숫자가 아닌 값을 입력하면 중지되며 Minmon 값을 나타냅니다.


귀하의 코드는 첫 번째 값을 버리는 것처럼 보이므로 예를 들어 잘못된 답변을 제공 1 2 3합니다. 또한 stdin에서 읽는 프로그램이 아니라 인수를 처리하는 함수를 작성할 수 있다고 간과하는 것 같습니다.
피터 테일러

@PeterTaylor 어리석게도, 나의 첫 번째 본능은 그것이 기능이 될 수 있다고 말하더라도 항상 전체 프로그램을 작성하는 것입니다. 그 벌레에 관해서는, 나는 그것을 충분히 테스트하지 않았다. 뿐만 아니라 기능 전용 버전 및 만들 ... - 지금 해결하려고합니다
로돌포 디아스에게

2

R, 20 자

R은 일반적으로 codegolf에는 좋지 않지만 작업에 사용하므로 시도하고 싶습니다. 시도하기 전에 R이 그런 더러운 구문을 기꺼이 받아 들일 것이라는 것을 몰랐습니다! :-) 52 자 :

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

그런 다음 @xnor의 genial median trick을 시도한 다른 답변을 보았습니다.

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

첫 번째 버전은 어떻게 작동합니까? 무엇을 summary합니까? 인가 q[1]q[6]최소 및 최대 각각? 이 경우 기본 제공 최소 / 최대를 사용할 수 없으므로 유효하지 않습니다.
Martin Ender

@ MartinBüttner 기본적으로 Quantile의 벡터와 평균을 제공합니다. 1과 6은 0과 1 Quantile입니다. 규칙에 따라 내장 최소 / 최대 기능을 사용하지 않았습니다.
Tomas

2

파이썬, 52

나는 여전히 두 가지를 갖는 것이 나쁘다는 느낌을 도울 수 없었습니다 lambda. 이 함수는 목록을 가져온 다음 결과가 포함 된 한 요소 목록을 반환합니다.

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

바라건대, 엄청난 양의 범죄가 결과를 한 요소 목록으로 만들지 않기를 바랍니다.


1

MATLAB / 옥타브, 26

이것은 기본적으로 xnor의 Mathematica 답변 의 번역입니다 . 입력 벡터의 길이보다 작은 0을 추가하여 작동합니다. 하나 이상을 추가하면 작동하지 않으므로 결과는 항상 0이됩니다. 이 솔루션의 -4 문자에 대한 MartinBüttner에게 감사드립니다 =)

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

@ MartinBüttner 당신은 절대적으로 맞습니다. 나는 그것을 변경했다 : 프로그램은 입력보다 0을 더 적게 추가 할 것이다. 이런 식으로 우리는 항상 홀수 개의 요소를 가지며 중앙값은 나머지 요소를 처리합니다.
flawr

또는 이전 솔루션에서 마지막 0을 팝하십시오.
Optimizer

@ MartinBüttner 물론 감사합니다. @ Optimizer 어떻게 하시겠습니까?
flawr

나도 몰라 나는 마지막 요소를 간단히 터뜨릴 수있는 방법이 있어야한다고 생각했습니다 @(x)median([0*x,x](2:end)). 그것은 지금과 같은 바이트처럼 보입니다.
Optimizer

@Optimizer 나는 이미 Matlab의 중요한 기능을 놓쳤다 고 생각했습니다. =) 당신이 제안한 표기법이 효과가 없다는 것이 너무 나쁩니다.
flawr

1

파이썬, 72 60 바이트

이것이 내가 생각한 첫 번째 해결책이며 매우 순진합니다. 후반부는 기본적으로 코드의 전반부의 복제본이지만 코드를 슬림화하는 방법을 모르겠습니다. 사용하여 단축 할 수 있는지 궁금합니다 eval...

편집 : 람다를 이해력으로 변경했습니다.

여기에서 사용해보십시오

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

Sp3000의 TIP를 사용하면 4 자 이상이지만 여전히 살펴볼 가치가 있습니다.

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

1

자바 스크립트, 63

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

더 읽기 쉬운 버전 :

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;
            }
        }
    });
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.