Tìm số nguyên tối thiểu và tối đa trong một mảng mà không cần sử dụng nội dung


15

Thử thách

Cho một mảng các số nguyên, nhận được từ stdin, đối số hàm, đối số chương trình hoặc một số phương thức khác:

Chỉ xuất ra các số tối thiểu và tối đa trong mảng, thông qua giá trị trả về, thiết bị xuất chuẩn hoặc các phương thức khớp khác.

Ví dụ phiên

> minmax( {0, 15, 2, 3, 7, 18, -2, 9, 6, -5, 3, 8, 9, -14} )
-14 18

Thực hiện tham khảo

// C++14

void minmax(std::vector<int> v) {
    int min = v[0]; int max = v[0];
    for(auto it : v) {
        if (*it < min)
            min = *it;
        if (*it > max)
            max = *it;
    }
    std::cout << min << ' ' << max << std::endl;
}

Quy tắc

  • Bạn không thể sử dụng hàm dựng sẵn để tính toán các giá trị.
  • Sơ hở tiêu chuẩn không được phép.
  • Khuyến khích thực hiện sáng tạo.
  • Đây là , câu trả lời ngắn nhất sẽ thắng nhưng sẽ không được chọn.

Làm rõ

  • Nếu mảng chứa 1 phần tử bạn cần xuất nó hai lần.
  • Nếu giá trị tối thiểu và tối đa là như nhau, bạn cần xuất cả hai.

12
Đây là một thử thách X không có Y , không đặc biệt thú vị.
Mego

5
@DmitryKudriavtsev Hãy thử hộp cát lần sau.
Mego

5
Nghiêm túc, sử dụng Sandbox . Những thay đổi của bạn đối với thử thách đã vô hiệu hóa từng câu trả lời.
Mego

1
Tôi khuyến khích các phương pháp sáng tạo Không, bạn khuyến khích các giải pháp ngắn, bằng cách gắn thẻcode golf
Luis Mendo

1
Như Luis Mendo đã nói Có, mọi người chỉ đăng bài "tôi sắp xếp mảng của bạn bằng cách sử dụng tích hợp và lấy trước và cuối cùng", bằng các ngôn ngữ khác nhau, không thực sự sáng tạo: x
Walfrat 24/8/2016

Câu trả lời:


29

Thạch , 3 byte

Ṣ.ị

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

Sắp xếp mảng và sau đó lấy phần tử 0,5-th.

Jelly sử dụng lập chỉ mục 1 và lập chỉ mục các dấu phẩy động có nghĩa là lấy sàn và trần của nó.

Vì vậy, phần tử thứ 0,5 sẽ cung cấp cho bạn phần tử thứ 0 và phần tử thứ 1.

Phần tử thứ 0 là phần tử cuối cùng.


2
Khá thông minh Tôi đang chờ nó .... Jelly!
Rohan Jhunjhunwala

Oh, vì vậy mà sẽ làm cho việc tìm kiếm trung bình tầm thường.
Adám

1
@KonradRudolph Cái này .
Nữ tu bị rò rỉ

1
Bạn không muốn các yếu tố đầu tiêncuối cùng , thay vì hai yếu tố đầu tiên ? Hay tôi đã hiểu nhầm lời giải thích của bạn?
Toby Speight

1
@TobySpeight Trong lập chỉ mục dựa trên 1, phần tử 0 là phần tử cuối cùng.
Nữ tu bị rò rỉ

12

Python, 61 49 37 36 34 31 byte

lambda s:s.sort()or[s[0],s[-1]]

-12 byte nhờ RootTwo

Một -12 byte khác nhờ chepner

-2 byte nhờ johnLate

-3 byte nhờ johnLate


1
Tôi đã thay đổi tiêu đề thành Python vì nó cũng hoạt động trong Python 3.
Leaky Nun

1
Bạn có thể chơi golf tắt một chục byte: sử dụng [::(len(s)-1)or 1]cho subscript đầu tiên. Và thuật ngữ thứ hai có thể được rút ngắn s[:len(s)<2].
RootTwo

Với chi phí sắp xếp danh sách hai lần, bạn có thể loại bỏ 12 byte khác : lambda s:sorted(s)[:1]+sorted(s)[-1:].
chepner

lưu 6 byte bằng cáchlambda s:sorted(s)[::len(s)-1]
Aaron

Phiên bản hiện tại ( lambda s:sorted(s)[::len(s)-1]) không hoạt động cho các mảng có một phần tử ( ValueError: slice step cannot be zero). Một sửa chữa có thể sẽ là lambda s:sorted(s*2)[::len(s*2)-1](34 byte).
John

8

Brain-Flak 220 218 byte

(({}))([]){({}[()]<(([])<{({}[()]<([([({}<(({})<>)<>>)<><({}<>)>]{}<(())>)](<>)){({}())<>}{}({}<><{}{}>){{}<>(<({}<({}<>)<>>)<>({}<>)>)}{}({}<>)<>>)}{}<>{}>[()]){({}[()]<({}<>)<>>)}{}<>>)}{}({}<((())){{}{}([][()])}{}>)

Dùng thử trực tuyến!

Giải trình

Đầu tiên, nó nhân đôi giá trị hàng đầu (trong danh sách chỉ có một danh sách dài)

(({}))

Sau đó, nó sử dụng thuật toán sắp xếp bong bóng của tôi:

([]){({}[()]<(([])<{({}[()]<([([({}<(({})<>)<>>)<><({}<>)>]{}<(())>)](<>)){({}())<>}{}({}<><{}{}>){{}<>(<({}<({}<>)<>>)<>({}<>)>)}{}({}<>)<>>)}{}<>{}>[()]){({}[()]<({}<>)<>>)}{}<>>)}{}

Sau đó, nó chọn giá trị trên cùng của ngăn xếp (tức là min)

({}<...>)

Sau đó, nó bật cho đến khi chiều cao của ngăn xếp là một:

((())){{}{}([][()])}{}

8

JavaScript (ES6), 34 byte

a=>[a.sort((x,y)=>x-y)[0],a.pop()]

sortsắp xếp tại chỗ, vì vậy tôi chỉ có thể tham khảo chỉ số [0] cho giá trị thấp nhất và popgiá trị cao nhất từ ​​mảng, tuy nhiên nó thực hiện sắp xếp chuỗi theo mặc định nên tôi phải vượt qua bộ so sánh.


Tôi không nghĩ rằng bạn cần (x,y)=>x-ymột phần, trừ khi sử dụng sort()với thuật toán mặc định được tính là tích hợp.
Scott

1
@ Hủy bỏ Nhưng tôi không muốn một loại từ vựng ...
Neil

Phải ... Tôi đã không kiểm tra nó với các số> 10 hoặc <0. Tôi không biết sort()nội bộ coi mọi thứ là chuỗi - xin lỗi!
Scott

5

Toán học, 18 byte

Sort[#][[{1,-1}]]&

Sắp xếp mảng và trích xuất các giá trị đầu tiên và cuối cùng.


5

R, 31 byte

l=sort(scan());l[c(1,sum(l|1))]

Không phải bản gốc, nhưng hey!


5

Mã máy ARM, 26 byte

Hex dump (ít endian):

6810 4601 f852 cb04 4560 bfc8 4660 4561 bfb8 4661 3b01 d8f5 4770

Đây là một chức năng, không có sự phụ thuộc của hệ thống hoặc thư viện. Mã hóa là Thumb-2, mã hóa biến (2 hoặc 4 byte) cho ARM 32 bit. Như người ta có thể tưởng tượng, không có cách nào dễ dàng để sắp xếp và chọn các yếu tố đầu tiên và cuối cùng ở đây. Nhìn chung, không có gì thực sự thú vị đang diễn ra ở đây, nó ít nhiều giống như việc thực hiện tham chiếu.

Lắp ráp Ungolfed (cú pháp GNU):

.syntax unified
.text
.global minmax
.thumb_func
minmax:
    @Input: @r0 and r1 are dummy parameters (they don't do anything)
    @r2 - Pointer to list of integers (int*)
    @r3 - Number of integers to sort (size_t)
    @Output:
    @Minimum of the list in r0 (int)
    @Maximum in r1 (int)
    ldr r0,[r2] @min=r2[0]
    mov r1,r0 @max=min
    loop:
        @ip is intra-procedure call register, a.k.a. r12
        ldr ip,[r2],#4 @ip=*r2++
        cmp r0,ip
        it gt @if (r0>ip)
        movgt r0,ip @r0=ip
        cmp r1,ip
        it lt @if (r1<ip)
        movlt r1,ip @r1=ip
        subs r3,r3,#1
        bhi loop @while (--r3>0)
    bx lr @Return

Đã thử nghiệm trên Raspberry Pi 3; đây là kịch bản thử nghiệm (C99, đầu vào thông qua argv):

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
//First 2 arguments are dummies.
uint64_t minmax(int,int,int* array,size_t size);

int main(int argc,char** argv) {
    int i;
    int array[argc-1];
    for (i=1;i<argc;i++) {
        array[i-1]=atoi(argv[i]);
    }
    uint64_t result = minmax(0,0,array,argc-1);
    printf("Minimum is %d, maximum is %d.\n",(unsigned)result,(unsigned)(result>>32));
}

4

Haskell, 27 byte

f x=(`foldl1`x)<$>[min,max]

Trong Haskell, minmaxđưa ra tối thiểu và tối đa hai đối số, không phải trong danh sách. Tôi không thể biết liệu điều này có được phép hay không (dường như chỉ thay vào đó minimummaximumsẽ không được phép) vì vậy vui lòng cho tôi biết nếu có và tôi sẽ nhanh chóng xóa câu trả lời này.


@nimi Hiệu ứng FGITW, thật đáng buồn ...
ThreeFx

3

Octave, 20 byte

@(n)sort(n)([1,end])

Điều này sắp xếp các vectơ đầu vào và xuất giá trị đầu tiên và cuối cùng.




3

MATL , 4 byte

S5L)

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

Giải trình

S    % Implicitly input the array. Sort
5L   % Push [1 0]. When used as a (modular, 1-based) index, this means "first and last"
)    % Apply as an indexing vector into the sorted array. Implicitly display


3

C, 83 81 79 byte

m,M;f(a,s)int*a;{for(m=M=*a;s--;++a)*a<m?m=*a:*a>M?M=*a:0;pr‌​intf("%i %i",m,M);}

1
việc kê khai có thể biến thành ...f(a,s)int*a{...mỗi này
con mèo

1
Bạn có thể kết hợp các biểu thức ternary để nhận thêm 2 byte:m,M;f(a,s)int*a;{for(m=M=*a;s--;++a)*a<m?m=*a:*a>M?M=*a:0;printf("%i %i",m,M);}
gastropner 18/12/17

Trong gccbạn có thể thay thế *a>M?M=*a:0bằng*a<M?:M=*a
trần mèo


2

V , 12 byte

:sor
ò2Gjkd

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

Tín dụng cho DJMcMayhem cho việc này.


1
\o/Yay, tôi không còn là người duy nhất từng sử dụng ngôn ngữ này!
DJMcMayhem

1
Nếu đầu vào là một số duy nhất, số đó vẫn phải được xuất hai lần
Luis Mendo

@LuisMendo hm, sẽ làm việc đó.
Rɪᴋᴇʀ

2

CJam, 10 9 byte

q~$_(p;W>

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

Tôi thực sự không giỏi ở CJam.

q~          e# eval input
  $         e# sort
   _        e# duplicate
    (       e# pop first
     p      e# print
      ;     e# remove array
       W>   e# get last element

Cách thông thường để có được phần tử đầu tiên của danh sách là 0=(nhưng thật không may là nó không lưu bất kỳ byte nào). Hai giải pháp 9 byte khác: 0W]q~$f=phoặc khối không tên {$2*_,(%}.
Martin Ender

8 byte : q~$(p)p;. Bạn có thể sử dụng )để có được phần tử cuối cùng giống như bạn sử dụng (để có được phần tử đầu tiên.
Mèo kinh doanh

@BusinessCat Đó là những gì tôi đã có ban đầu, nhưng nó không thành công cho đầu vào một phần tử.
PurkkaKoodari

@ Pietu1998: Ồ, bạn nói đúng. Tôi đã không nhận thấy điều đó.
Mèo kinh doanh


2

C #, 60 byte

n=>{System.Array.Sort(n);return new[]{n[0],n[n.Length-1]};};

Một phương thức ngây thơ ở 93 byte:

n=>{var r=new[]{n[0],n[0]};foreach(int i in n){if(i<r[0])r[0]=i;if(i>r[1])r[1]=i;}return r;};

2

PHP, 44 byte

function a($a){sort($a);echo $a[0].end($a);}

2

Đang xử lý, 59 52 byte

void m(int[]x){x=sort(x);print(x[0],x[x.length-1]);}

Việc xử lý không thực sự cho tôi đọc từ stdin mà tôi có thể tìm thấy và tôi không biết trình biên dịch Java bên trong của nó có hỗ trợ lambdas hay không (và đã rất lâu kể từ khi tôi phải viết Java nghiêm túc mà tôi không Tôi không nhớ như thế nào).


Bạn có thể lưu byte bằng cách xóa khoảng trắng sauint[]
Kritixi Lithos

1

Perl 6 13 byte

*.sort[0,*-1]

Kiểm tra:

my &min-max = *.sort[0,*-1];

say min-max 1;
# (1 1)
say min-max (0, 15, 2, 3, 7, 18, -2, 9, 6, -5, 3, 8, 9, -14)
# (-14 18)

Chết tiệt, bạn đánh tôi ở đó!
bb94


1

Octave , 35 byte

@(x)[x(all(t=x<=x')) x(sum(t)==1)]

Đây là một chức năng anoynymous. Hãy thử nó tại ideone .

Mã tránh sử dụng phân loại. Cụ thể, nó thực hiện tất cả các so sánh "nhỏ hơn hoặc bằng" giữa các yếu tố của đầu vào. Tối thiểu là yếu tố mà tất cả các so sánh là đúng. Tối đa là chỉ có một so sánh là đúng.


1

Python, 35 34 byte

lambda s:sorted(s+s[:1])[::len(s)]

Phiên bản thay thế:

lambda s:sorted(s+s)[::len(s)*2-1]

Phiên bản cũ, 35 byte.

lambda s:sorted(s+[s[0]])[::len(s)]

Khá đơn giản: lấy danh sách đầu vào, nối phần tử đầu tiên, sắp xếp nó, sau đó lấy phần tử đầu tiên và (độ dài) của danh sách kết quả. Vì độ dài của đầu vào sau khi nối thêm một phần tử là độ dài + 1, nên cuối cùng lấy phần tử đầu tiên và cuối cùng của danh sách đã nói, là các phần tử tối thiểu và tối đa.


1
Mặc dù không phải là câu trả lời ngắn nhất trong Python, nhưng điều này rất sáng tạo! +1
mbomb007

Mã 34 byte không hoạt động trong Python 3; cái này hoạt động trong cả 2 và 3. Ngoài ra, nó đã được đăng sau cái này.
TLW

@ mbomb007 - tốt, chơi gôn. Điều này hiện được gắn với việc triển khai Python ngắn nhất và như một phần thưởng, nó hoạt động trong cả 2 và 3.
TLW

1

zsh, 22 byte

(){echo $1 $_} ${(n)@}

định nghĩa hàm lambda in arg đầu tiên của nó ($1 ) và đối số cuối cùng cho lệnh trước đó ( $_) và chuyển nó $@sau khi sắp xếp nó để lệnh trước đó trở thành lệnh gọi của lambda đó


zsh, 21 byte

điều này chỉ hoạt động tốt nếu có nhiều hơn 1 đối số :(

<<<"${${(n)@}/ * / }"

các loại $@ , biến nó thành một chuỗi và thay thế mọi thứ từ không gian đầu tiên đến không gian cuối cùng bằng một không gian duy nhất, sau đó chuyển nó thành đầu vào cho mèo với<<<


sử dụng:

$ ./minmax 23 342 21 10
10 342

1

Scala, 55 byte

val s=args.map(_.toInt).sorted
print(s.head+" "+s.last)

Để thực hiện:

$ scala minmax.scala 1 2 3 4 5 6 7 8 9


1

Bash + coreutils, 30 byte

tr \  \\n|sort -n|sed '$p;1!d'

Tập lệnh sed in, sau khi đầu vào được sắp xếp, số nguyên đầu tiên và cuối cùng.


1

dc, 110 byte

?ddsMsmzdsAsa[z1-:az0<S]dsSx[>R]s?[la;asM]sR[lM]sQ[lQxla1-dsa;al?xla0<N]dsNxlAsa[<R]s?[la;asm]sR[lm]sQlNxlmlMf

Giúp tôi, dc ers! Bạn là hy vọng duy nhất của tôi!

Cảm ơn @seshoumara vì đã tìm ra lỗi đó!

Tôi sẽ thêm một lời giải thích sau. Ở đây nó được chia ra một chút:

?dd sM sm
zd sA sa
[z 1- :a z0<S]dsSx
 [>R]s?
 [la;asM]sR
 [lM]sQ
[lQx la 1- dsa ;a l?x la0<N]dsNx
lA sa
 [<R]s?
 [la;a sm]sR
 [lm]sQ
lNx
lm lM f

Tôi đã không ghi lại làm thế nào để gọi điều này, và bây giờ tôi không thể nhớ. Bất cứ điều gì tôi đang làm bây giờ, tôi đang làm sai, bởi vì điều này luôn trả về 0 là phần tử nhỏ nhất.
Joe

1
Pfew! Phải mất một số ngôi sao với nó, nhưng tìm thấy lỗi trong mã của bạn. Đó là ký tự đầu tiên (0) mà bạn nhân đôi và khởi tạo các thanh ghi Mm. Nhưng nếu trong danh sách đầu vào không có số nào nhỏ hơn m=0hoặc không có số nào lớn hơn M=0, thì bạn nhận được kết quả không chính xác, vì bạn đã thêm 0 vào số mẫu một cách giả tạo. Giải pháp là thay thế số 0 đầu tiên bằng ?d, đọc các số và khởi tạo Mmbằng số cuối cùng, do đó làm cho nó trở thành một phần của mẫu. Sau đó chạy mã như thế này: echo "8 _2 5" | dc -e "? DdsMsm ....".
seshoumara

Ồ, cảm ơn, @seshoumara! Tôi sẽ không bao giờ nhận thấy điều đó! (Tôi cũng đã quên tất cả về câu hỏi này: P)
Joe

1

Java, 115 byte

String f(int[]i){int t=i[0],a=t,b=t;for(int c=0;c<i.length;c++){a=i[c]<a?i[c]:a;b=i[c]>b?i[c]:b;}return""+a+" "+b;}

Ung dung:

String f(int[] i) {
    int t=i[0], a=t, b=t; // assigns a and b to i[0]
    for (int c=0; c < i.length; c++) { // loop through the array
        a=(i[c]<a) ? i[c] : a;
        b=(i[c]>b) ? i[c] : b; // assignment with ternary operator
    }
    return ""+a+" "+b; // returns a string
}

Giải pháp "golf" đầu tiên của tôi.

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.