Chức năng Minmod ngắn nhất


24

Hàm minmod là một biến thể của min quen thuộc , xuất hiện trong các sơ đồ độ phân giải cao giới hạn độ dốc cho các phương trình vi phân từng phần. Đưa ra một số độ dốc, nó chọn ra độ dốc phẳng nhất, trong khi chăm sóc các dấu hiệu tương đối giữa các sườn dốc.

Hàm lấy một số lượng tham số tùy ý. Sau đó minmod (x 1 , x 2 , ..., x n ) được định nghĩa là:

  • min (x 1 , x 2 , ..., x n ) , nếu tất cả x i đều dương
  • max (x 1 , x 2 , ..., x n ) , nếu tất cả x i đều âm
  • 0 , nếu không.

Chúng tôi sẽ chỉ xem xét các đầu vào số nguyên, vì điều đó không thực sự ảnh hưởng đến việc triển khai và nên bao quát hơn đối với một số ngôn ngữ (bí truyền).

Viết chương trình hoặc hàm, lấy n số nguyên đã ký (cho n> 0 ) thông qua STDIN, ARGV hoặc đối số hàm (bạn có thể sử dụng một mảng nếu thuận tiện hơn hàm matrixdic) và trả về hoặc in (cho STDOUT) của minmod (a, b) .

Bạn không được sử dụng các hàm min hoặc max tích hợp (và rõ ràng, không có minmod tích hợp nào, nếu bạn thực sự có thể tìm thấy điều đó). Ngoài ra, bạn không được sử dụng bất kỳ chức năng sắp xếp tích hợp nào, ngoại trừ để sắp xếp một số lượng nhỏ các mục cố định (dưới 5).

Nếu ngôn ngữ của bạn không có loại đã ký, bạn có thể sử dụng loại không dấu và giải thích nó là hai loại bổ sung. Ví dụ: nếu ngôn ngữ của bạn chỉ sử dụng các byte không dấu, bạn có thể sử dụng 255để thay thế -1128thay thế -128, v.v.

Đây là mã golf, vì vậy câu trả lời ngắn nhất (tính bằng byte) sẽ thắng.

Các trường hợp thử nghiệm

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

Bảng xếp hạng

Đoạn trích sau đây tạo ra cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ. Vì vậy, ngay cả khi ngôn ngữ bạn chọn không cho phép bạn chiến thắng toàn bộ thử thách, tại sao bạn không thử giành một vị trí trong danh sách thứ hai?

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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


1
Có thể thêm một cột để biết có bao nhiêu câu trả lời trong mỗi ngôn ngữ
tự hào

1
@proudhaskeller Hmm, tôi thích rằng hai bảng hiện đang nằm cạnh nhau mà không cần phải mở toàn màn hình đoạn trích - Tôi nghĩ rằng nó sẽ hơi bị nhồi nhét nếu tôi thêm một cột khác. Nếu bình luận của bạn nhận được nhiều lượt ủng hộ hơn tôi, tôi sẽ thấy những gì tôi có thể làm. ;)
Martin Ender

1
@Optimizer Tôi đã quyết định rằng phiên bản trước của các quy tắc đã gây hại nhiều hơn cho sự sáng tạo trong câu trả lời của mọi người hơn tôi dự định. Ngoài ra, tôi sẽ trao một phần thưởng cho câu trả lời dẫn đầu trước khi thay đổi quy tắc, vì vậy tôi không nghĩ rằng bất kỳ tác hại nào về mặt đại diện cũng được thực hiện. (Vâng, tôi đồng ý rằng thay đổi quy tắc không phải là một ý tưởng hay, nhưng tôi đoán rằng nó sẽ có giá trị trong trường hợp này.)
Martin Ender

1
@ MartinBüttner - Tôi không thấy bất kỳ sáng tạo nào trong các câu trả lời mới hơn bây giờ. Nó có tất cả đi xuống để giảm xuống một minmod cặp. Sự sáng tạo nằm trong câu trả lời của xnor hoặc cách tiếp cận của Mig mà nhiều câu trả lời khác bị ảnh hưởng.
Tối ưu hóa

2
@Optimizer, không phải lúc nào cũng có thể biết liệu một câu trả lời mới có chính xác như sáng tạo như một câu trả lời cũ hơn hay không, hay đó là một cổng không tưởng tượng.
Peter Taylor

Câu trả lời:


13

GolfScript, 10 9 byte

~{0]$1=}*

Giả sử đầu vào từ stdin ở định dạng [-4 -2 -3 -2]

Cái này sử dụng hàm sắp xếp tích hợp $, nhưng mỗi lần nó gọi nó trên một mảng gồm 3 phần tử, được phép.

Bản demo trực tuyến


Thật tuyệt, câu trả lời của chúng tôi cách nhau chưa đến 1 giây, điều đó có nghĩa là câu trả lời của tôi thường ngắn nhất. ;)
Timtech

1
+1, đây là cách ngắn hơn và thông minh hơn giải pháp của tôi. (Ps. Trong trường hợp bất kỳ ai nghi ngờ về nó, vâng, giải pháp này là chính xác và khá dễ dàng để chứng minh bằng cảm ứng. Mã của Peter là gì khi tính toán trung bình của giá trị minmod trước đó, giá trị đầu vào tiếp theo và bằng 0; các trường hợp có thể cho thấy điều này thực sự mang lại giá trị minmod mới.)
Ilmari Karonen

Thật là ...
à

24

Toán học, 19 byte

Median[#~Riffle~0]&

Mã và chơi golf nhờ Martin Büttner.

Đây là một hàm thuần không tên được lấy trong danh sách các số nguyên làm đầu vào. Gọi nó như thế nào

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

hoặc tương tự lưu vào biến.

Mã đầu tiên kiểm tra số 0 ở giữa mỗi hai phần tử của danh sách đầu vào, trong đó chèn các n-1số 0 giữa ncác phần tử. Sau đó, phải mất trung bình để đưa ra câu trả lời.

Điều này mang lại cho min-mod vì nó xử lý từng trường hợp:

  1. Tất cả các số đều dương, trong trường hợp các số 0 nằm dưới chúng và trung vị là số dương thấp nhất.

  2. Tất cả các số đều âm, trong trường hợp các số 0 nằm trên chúng và trung vị là số âm ít nhất.

  3. Có cả số dương và số âm, và vì vậy phần tử ở giữa là một số không.

Nếu Mathicala thực hiện trung vị của nó bằng thuật toán chọn thời gian tuyến tính , thì đây cũng là O (n).


11

Haskell, 62 61 39 38 37 byte

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

sử dụng một số phép thuật so sánh mượn từ câu trả lời của @ Zgarb *, cụ thể là x*x<=x*y.

x*x<=x*ychỉ đúng khi xycó cùng dấu và ygiá trị tuyệt đối của nó lớn hơn. lưu ý rằng khi x0nó luôn luôn là sự thật.

chúng tôi xác định đó xlà kết quả nếu nó được chứa trong sđó và cho tất cả ytrong đó s xcó cùng dấu yvà nhỏ hơn về giá trị tuyệt đối. nếu không có giá trị sthỏa mãn định nghĩa này, thì đó 0là kết quả.

fsau đó hoạt động bằng cách tìm kiếm smột phần tử để đáp ứng điều này và sử dụng 0làm mặc định.

* mặc dù anh ấy đã không sử dụng nó vì những lý do tôi đang sử dụng nó và đến giờ anh ấy đã thực sự loại bỏ nó


Hiếm khi Haskell trở thành tay golf này (và, trớ trêu thay, vẫn có thể đọc được). Yêu nó.
Isiah Meadows

10

JavaScript (ES6), 39 byte

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

1
Thích cái này. Sử dụng tốt ES6.
Qix

6

Con trăn 2, 53

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

Ý tưởng là sử dụng reduceđể biến công cụ tìm min-mod hai đầu vào thành một n-input. Tôi đã đưa ra nó một cách độc lập với các câu trả lời khác sử dụng nó. Chỉ hỗ trợ Python 2 reduce.

Giải pháp hai đầu vào chỉ đơn giản là tìm trung vị của hai số và số không. Xem câu trả lời Mathicala của tôi để biết cách trực tiếp hơn để sử dụng trung bình.

Ít chơi gôn hơn:

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

Một hỗn hợp giả thuyết của Python 2 và Python 3 sẽ là một ký tự ngắn hơn, với sự phân công được gắn dấu sao từ Python 3 input()printtừ Python 2.

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

Mã cũ, không cần sắp xếp:

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

Hừm, vâng, tôi nhận thấy tác dụng phụ trong lúc này, nhưng tôi cảm thấy như đã quá muộn để khắc phục nó. Mathematica có tích hợp Medianmặc dù.
Martin Ender

Cách tiếp cận sau của bạn bây giờ cũng hợp lệ.
Martin Ender

6

Tuyệt vời, 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
\/

Có ba bảng được sử dụng ở đây.

Bảng |( Abtrong phiên bản có thể đọc được) lấy giá trị tuyệt đối của một viên bi (bằng cách trả lại viên bi đã qua hoặc bằng 0 trừ số cẩm thạch đã qua, vì tất cả số học trong Marbelous không được ký).

Bảng M( Minabstrong phiên bản có thể đọc được) tìm và xuất ra bên trái hoặc viên bi thứ nhất hoặc thứ hai được thông qua (cái nào có giá trị tuyệt đối nhỏ hơn) và thoát ra nếu một viên bi khác được ký.

Các Mhội đồng quản trị cũng nhả đá cẩm thạch nó giữ xuống thay vì về phía trái một lần ký tự cuối cùng từ STDIN được nạp.

Bảng Mđược sử dụng trong bảng chính để lưu trữ minmod của tất cả các giá trị được kiểm tra tại bất kỳ thời điểm nào, vì nó giải phóng giá trị được lưu bên trái, sau đó bị lệch trở lại.

Thùng rác ( \/) chỉ được đặt dưới bộ đồng bộ hóa mà sẽ in ra STDIN.

Đầu vào / đầu ra sử dụng STDIN / STDOUT. Cả hai đều xử lý các giá trị 8 bit (nếu bạn muốn vượt qua + 0x30 và + 0x38, đặt 08vào STDIN).

Thư viện và bảng hình trụ đều được yêu cầu. Nên xem đầu ra dưới dạng số thập phân (lưu ý rằng điều này sẽ hiển thị giá trị không dấu của kết quả minmod).

Kiểm tra nó ở đây.

Lưu ý: Để đầu vào / đầu ra thân thiện với con người hơn, hãy thêm Dpvào dòng cuối cùng của bảng chính (trước :M), thay thế ]]bằng Rdvà thêm dòng sau ở phía dưới:

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

Điều này chỉ đơn giản là thay đổi đầu ra thành 3 chữ số thập phân. Tương tự, đầu vào với những thay đổi này yêu cầu một danh sách được phân tách bằng dấu cách gồm 3 chữ số thập phân trên mỗi số.

Phiên bản dễ đọc:

Ban hình ảnh


5

Haskell, 83 40 39 byte

Đây có lẽ không phải là giải pháp Haskell ngắn nhất có thể (và chắc chắn sẽ không đánh bại những người khác ở đây), nhưng đó là một sự khởi đầu. EDIT: Bây giờ ngắn hơn 50%! EDIT2: Ít hơn một byte ...

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

Đây chỉ là một nếp gấp đơn giản (hoặc rút gọn, như một số ngôn ngữ gọi nó) bởi toán tử nhị phân #, tính toán trung vị của a, b0. Mặc dù các quy tắc bây giờ sẽ cho phép tôi sắp xếp các danh sách nhỏ, nhưng điều này yêu cầu nhập vào Haskell và dẫn đến số byte cao hơn ( 49 byte, nhưng 31 mà không cần nhập):

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

\a-> (signum a,a)là giống như signum>>=(,)sử dụng thể hiện đơn nguyên chức năng. (xem bài đăng của tôi trong "mẹo chơi gôn ở haskell")
tự hào

Cảm ơn vì tiền boa, nhưng giờ đã xong. :)
Zgarb

@Zgarb À được rồi.
Trình tối ưu hóa

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

Dự kiến ​​trình tự sẽ được chấm dứt bởi -999. TIS-100 mới hơn câu hỏi này, nhưng dù sao nó cũng không phải là vấn đề quan trọng.

Nút 9 theo dõi xem tất cả chúng ta đều tích cực, tất cả tiêu cực hay hỗn hợp. Các nút 5 và 6 hoạt động để tìm giá trị tối thiểu của tất cả các số đầu vào. Nút 10 sau đó chọn mức tối thiểu, mức tối thiểu bị phủ định hoặc 0 tùy thuộc vào trạng thái của nút 9.

nhập mô tả hình ảnh ở đây


Tôi đã triển khai trình giả lập TIS cho TIO, vì vậy bây giờ bạn có thể dùng thử trực tuyến!
Phlarx

4

CJam, 20 byte (hoặc 10 byte)

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

Sử dụng phương pháp của @ xnor, giảm tính toán minmod của 2 số tại một thời điểm từ mảng.

Điều này sẽ là 19 byte nếu :zlàm việc


Sử dụng quy tắc mới về sử dụng sắp xếp trên các mảng ngắn:

q~{0]$1=}*

tương đương với câu trả lời của @ Peter


Mã vạch 26 byte trước đó:

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

Điều này có thể được đánh gôn hơn nữa ...

Đầu vào (thông qua STDIN) là mảng số nguyên như:

[-4 -2 -3 -2]

và đầu ra là minmod của mảng đầu vào

Hãy thử nó ở đây

Nếu chỉ :g:zhoạt động, nó sẽ ngắn hơn 4 byte.


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

Thất bại cho mảng int đơn. Tôi cũng đã thử nó :)
Trình tối ưu hóa

Mặc dù có một giải pháp 26 byte trong đó. Cảm ơn vì điều đó :)
Trình tối ưu hóa

4

Java, 84 byte

Đây là Java trong tất cả vinh quang của nó. Đánh bại GolfScript theo hệ số hơi hơn 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;}

Bao bọc trong lớp:

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

}

Mở rộng với các bình luận:

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

}

Lưu ý: Điều này có thể được cải thiện bằng Java 8.

Lưu ý: Nỗ lực cải thiện trong Java 8 đã thất bại.


Tôi còn nhiều điều phải học. +1.
Rodolfo Dias

4

J, 20 12 byte

Hàm lấy danh sách làm đối số. Lấy cắp từ Golfscript / CJam / bất cứ điều gì.

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

Các minmod của xylà trung vị (sắp xếp /:~và lấy giữa 1{) của danh sách ba mục 0,x,y. Giảm danh sách ( gấp theo cách nói J) bằng cách lấy minmod này giữa các phần tử liền kề.

Đang sử dụng tại REPL. (J đánh vần dấu âm của nó _.)

   (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

Rác cũ, trước khi tôi nhận thấy các loại ngắn được cho phép: 0:`<.`>.@.(*@]*0<*))/minmod của xylà 0 ( 0:) nếu 0 lớn hơn hoặc bằng sản phẩm của xy, nếu không, đó là min ( <.) hoặc max ( >.) giữa xytùy thuộc vào dấu hiệu . Gấp cái này lên toàn bộ danh sách.


4

TI-BASIC, 19 byte

Giả sử đầu vào ở định dạng {-2,4,3}.

Hoạt động tương tự như câu trả lời của 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
Cách thú vị để đếm kích thước mã ...
Ypnypn


Mã của tôi, cũng như median(augment(Ans,0ΔList(Anschỉ có tám byte, không thành công trong danh sách thứ nguyên một. If variance(Ans:augment(Ans,0ΔList(Ans:median(Ansdài hơn của bạn Nếu chỉ TI-BASIC hỗ trợ danh sách trống ...
lirtosiast

Bạn đúng rồi. Có vẻ như điều đó làm giảm kích thước mã của tôi từ 12 đến 15 byte.
TimTech

Tôi đoan la bạn đung. +4 byte ở đó.
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])

Điều này dựa trên câu trả lời thứ ba của tôi, được lấy cảm hứng từ câu trả lời của Mig .


Câu trả lời cũ:

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

Đây là một câu trả lời rất dài. Tôi cảm thấy có 2 biến là một sự lãng phí ...? Tôi đã đúng...? được không ; p


3

KDB / Q, 43 ký tự cho định nghĩa thân hàm

Nhờ những ý tưởng tuyệt vời từ các bài viết trước:

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

Nhập số duy nhất bằng cách sử dụng

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]

Tôi chắc rằng một số guru Q có thể đưa ra những cái ngắn hơn.


Có lẽ một cái gì đó như thế {asc[0,x,y]1}/nào?
thuật toán

3

Bình thường, 25 22 20 12

uhtS[0GH)QhQ

Có lẽ không phải tiểu thuyết, mà là bản gốc: P


Sắp xếp trước cho phép

u*?Gx>GH>G0H>*GHZQhQ

Bình

Hãy thử trực tuyến.

Ý tưởng sử dụng reducevà các câu lệnh tạm thời đã bị đánh cắp một cách đáng xấu hổ từ câu trả lời của Mig , nhưng tôi không biết liệu các thuật toán này có giống nhau hay không, vì tôi không thể đọc các câu lệnh tạm thời.

Giải trình:

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

Không cần tQ. Qcũng sẽ hoạt động
Trình tối ưu hóa

Khá đúng! Tôi cũng nghĩ rằng tôi có thể xóa một trong số ?cho *...
FryAmTheEggman

3

C #, 101 byte

Lần thử đầu tiên của tôi ở môn đánh gôn và bằng một ngôn ngữ thù địch khá hay. Dựa trên giảm ( Aggregatetrong LINQ) và rất giống với câu trả lời JavaScript của Mig . Có thể chạy như thế nào (new System.Linq.M()).m(new[] {1, 2, 3}). Vượt qua tất cả các trường hợp thử nghiệm, nhưng không xử lý các mảng đầu vào trống.

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
Không cần xử lý đầu vào trống, vì tôi thậm chí không xác định chức năng cho trường hợp đó.
Martin Ender

3

J, 12 byte

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

Hàm này làm giảm danh sách (được gọi là Folding ( /) trong J) với biểu thức:

(signum(x) == signum(y)) * [x,y][abs(x)>abs(y)] Ở đâu

[x,y][abs(x)>abs(y)]ynếu abs(x) > abs(y)khác x.

Thí dụ:

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

Hãy thử trực tuyến tại đây.


2

Ngôn ngữ nhà sản xuất trò chơi, 489 byte

Giới thiệu về Ngôn ngữ của Game Maker

Riffles mảng (số không được nối thêm) và trả về trung vị (tương tự như câu trả lời khác của tôi)

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 dòng đầu tiên thực hiện đoạn riff và phần còn lại tìm trung vị. Đây 32000là kích thước tối đa của mảng được giới hạn bởi phần mềm.
Timtech

@ MartinBüttner Có, trong phần trung vị, toàn bộ danh sách không được sắp xếp.
Timtech

@ MartinBüttner nó được sắp xếp mỗi lần lặp ... vì vậy 3
Timtech

Ồ, tôi nhìn thấy. Mã đó là đáng ngạc nhiên khó đọc cho một ngôn ngữ dài như vậy. ^^
Martin Ender

@ MartinBüttner Nó khá tốt để chơi gôn (cú pháp rất lỏng lẻo) nhưng nó không chứa nhiều chức năng tích hợp tiêu chuẩn (nó được định hướng theo thiết kế trò chơi).
Timtech

2

Java, 353 304 124 byte

Kết hợp ngôn ngữ tồi tệ nhất để chơi golf mã với người chơi golf tệ nhất thế giới và bạn sẽ ...

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 nó và bạn nhận được:

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

Đây là một hàm (nếu nó không rõ ràng lắm) nhận được một mảng các số và xử lý các giá trị của nó, trả về giá trị minmod.

Bao gồm cả benemoth cũ của tôi về một câu hỏi hay, đó là cả một chương trình - như mọi khi.

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 nó và bạn nhận được:

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

Nhận số vô hạn, dừng khi nhập giá trị không phải số, hiển thị giá trị Minmon.


Mã của bạn dường như loại bỏ giá trị đầu tiên, vì vậy nó sẽ đưa ra câu trả lời không chính xác, ví dụ 1 2 3. Bạn dường như cũng đang nhìn ra rằng bạn có thể viết một hàm xử lý các đối số của nó chứ không phải là một chương trình đọc từ stdin.
Peter Taylor

@PeterTaylor Foolishly, bản năng đầu tiên của tôi là luôn viết một chương trình đầy đủ ngay cả khi nó tuyên bố rằng nó có thể là một chức năng. Về lỗi đó, rõ ràng tôi đã không kiểm tra đủ, chuột. Sẽ cố gắng sửa nó ngay bây giờ - và tạo một phiên bản chỉ có chức năng ...
Rodolfo Dias

2

R, 20 ký tự

R thường không tốt cho codegolf, nhưng tôi sử dụng nó cho công việc của mình nên tôi muốn thử. Trước khi thử, tôi không biết rằng R sẵn sàng chấp nhận một cú pháp bẩn thỉu như vậy! :-) 52 ký tự :

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

Sau đó, tôi đã xem các câu trả lời khác mà tôi đã thử mẹo lừa đảo trung gian của @ xnor, thật tuyệt!

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

Phiên bản đầu tiên của bạn hoạt động như thế nào? Không gì summarylàm gì? Được q[1]q[6]tối thiểu và tối đa, tương ứng? Trong trường hợp đó, điều đó không hợp lệ, vì bạn không thể sử dụng tối thiểu / tối đa tích hợp.
Martin Ender

@ MartinBüttner về cơ bản nó cung cấp một vectơ lượng tử và trung bình. 1 và 6 là 0 và 1 lượng tử. Tôi chưa sử dụng hàm min / max tích hợp, theo quy tắc của bạn.
Tomas

2

Con trăn, 52

Tôi vẫn không thể cảm thấy rằng thật tệ khi có hai lambdas. Hàm này nhận trong một danh sách và sau đó trả về danh sách một thành phần có chứa kết quả.

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

Hy vọng, nó sẽ không gây ra một số lượng lớn hành vi phạm tội để có kết quả trong danh sách một yếu tố.


1

Matlab / Octave, 26

Đây về cơ bản chỉ là một bản dịch của câu trả lời Mathicala của xnor. Nó hoạt động bằng cách nối thêm một số không nhỏ hơn độ dài của vectơ đầu vào. Lưu ý rằng việc thêm một lần nữa sẽ không hoạt động, kể từ đó kết quả sẽ là 0 mọi lúc. Cảm ơn MartinBüttner cho -4 ký tự của giải pháp này =)

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

@ MartinBüttner Bạn hoàn toàn đúng. Bây giờ tôi đã thay đổi nó: Chương trình sẽ chỉ nối thêm một số ít hơn đầu vào. Bằng cách này, đảm bảo rằng chúng ta luôn có một số lượng phần tử lẻ và trung vị sẽ chăm sóc cho phần còn lại.
flawr

hoặc bật 0 cuối cùng từ giải pháp trước đó của bạn.
Tối ưu hóa

@ MartinBüttner Cảm ơn, tất nhiên đó là cách tốt hơn. @ Trình tối ưu hóa Bạn sẽ làm điều đó như thế nào?
flawr

Tôi không có ý kiến. Tôi nghĩ rằng phải có một cách đơn giản để bật ra yếu tố cuối cùng, đại loại như thế @(x)median([0*x,x](2:end)). Mặc dù có vẻ như đó là các byte giống như bây giờ.
Tối ưu hóa

@Optimizer Tôi đã nghĩ rằng tôi đã bỏ lỡ một tính năng quan trọng của Matlab =) Thật tệ khi ký hiệu mà bạn đề xuất không hoạt động, đôi khi nó sẽ thực sự tiện dụng!
flawr

1

Python, 72 60 byte

Đây là giải pháp đầu tiên tôi nghĩ đến và nó khá ngây thơ. Nửa thứ hai về cơ bản là một bản sao của nửa đầu của mã, nhưng tôi không chắc làm thế nào để làm mỏng nó. Tôi tự hỏi nếu nó có thể được rút ngắn bằng cách sử dụng eval...

Chỉnh sửa: Thay đổi lambdas để hiểu.

Hãy thử chúng ở đây

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

Đây chỉ dài hơn 4 ký tự, nhưng vẫn đáng xem, sử dụng TIP của Sp3000 .

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)

Một phiên bản dễ đọc hơn:

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;
            }
        }
    });
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.