Temukan bilangan bulat minimum dan maksimum dalam array, tanpa menggunakan bawaan


15

Tantangan

Diberikan array bilangan bulat, diterima dari stdin, argumen fungsi, argumen program, atau metode lain:

Keluarkan hanya angka minimum dan maksimum dalam array, melalui nilai balik, stdout, atau metode pemasangan lainnya.

Sesi contoh

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

Implementasi referensi

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

Aturan

  • Anda tidak boleh menggunakan fungsi bawaan untuk menghitung nilai.
  • Celah standar tidak diijinkan.
  • Implementasi kreatif didorong.
  • Ini , jawaban terpendek menang tetapi tidak akan dipilih.

Klarifikasi

  • Jika array berisi 1 elemen, Anda perlu menampilkannya dua kali.
  • Jika nilai minimum dan maksimum adalah sama, Anda harus mengeluarkan keduanya.

12
Ini adalah tantangan X tanpa tantangan Y , yang tidak terlalu menarik.
Mego

5
@DmitryKudriavtsev Cobalah kotak pasir lain kali.
Mego

5
Serius, gunakan Sandbox . Perubahan Anda terhadap tantangan telah membatalkan setiap jawaban.
Mego

1
Saya mendorong metode kreatif Tidak, Anda mendorong solusi pendek, dengan memberi tagcode golf
Luis Mendo

1
Seperti yang dikatakan Luis Mendo Ya, semua orang hanya memposting "saya mengurutkan array Anda menggunakan built-in dan mengambil pertama dan terakhir", dalam bahasa yang berbeda, tidak benar-benar kreatif: x
Walfrat

Jawaban:


29

Jelly , 3 byte

Ṣ.ị

Cobalah online!

Sortir array, lalu ambil elemen ke-0,5.

Jelly menggunakan pengindeksan 1, dan pengindeksan floating point berarti mengambil lantainya dan langit-langitnya.

Jadi elemen ke-0,5 akan memberi Anda elemen ke-0 dan elemen ke-1.

Elemen 0 adalah elemen terakhir.


2
Cukup Pintar Aku menunggu ... Jelly!
Rohan Jhunjhunwala

Oh, jadi itu akan membuat menemukan median sepele.
Adám

1
@KonradRudolph Ini .
Leaky Nun

1
Tidakkah Anda menginginkan elemen pertama dan terakhir , daripada dua elemen pertama ? Atau apakah saya salah memahami penjelasan Anda?
Toby Speight

1
@TobySpeight Dalam pengindeksan berbasis-1, elemen ke-0 adalah elemen terakhir.
Leaky Nun

12

Python, 61 49 37 36 34 31 byte

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

-12 byte terima kasih kepada RootTwo

Lain -12 byte berkat chepner

-2 byte terima kasih kepada johnLate

-3 byte terima kasih kepada johnLate


1
Saya mengubah heading ke Python karena berfungsi juga di Python 3.
Leaky Nun

1
Anda dapat bermain golf selusin byte: gunakan [::(len(s)-1)or 1]untuk subskrip pertama. Dan istilah kedua bisa disingkat menjadi s[:len(s)<2].
RootTwo

Pada biaya menyortir daftar dua kali, Anda dapat mencukur lain 12 bytes: lambda s:sorted(s)[:1]+sorted(s)[-1:].
chepner

hemat 6 byte olehlambda s:sorted(s)[::len(s)-1]
Aaron

Versi saat ini ( lambda s:sorted(s)[::len(s)-1]) tidak berfungsi untuk array dengan satu elemen ( ValueError: slice step cannot be zero). Perbaikan yang mungkin dilakukan adalah lambda s:sorted(s*2)[::len(s*2)-1](34 byte).
johnLate

8

Brain-Flak 220 218 byte

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

Cobalah secara Online!

Penjelasan

Pertama itu menggandakan nilai teratas (dalam daftar pemain hanya satu panjang)

(({}))

Kemudian ia menggunakan algoritma semacam gelembung saya:

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

Kemudian ia mengambil nilai teratas dari tumpukan (yaitu min)

({}<...>)

Kemudian muncul sampai ketinggian tumpukan adalah satu:

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

8

JavaScript (ES6), 34 byte

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

sortmengurutkan di tempat, jadi saya bisa merujuk ke indeks [0] untuk nilai terendah dan popnilai tertinggi dari array, namun ia melakukan pengurutan string secara default sehingga saya harus melewati komparator.


Saya tidak berpikir Anda perlu (x,y)=>x-ybagian, kecuali jika menggunakan sort()dengan algoritma default dianggap sebagai builtin.
Scott

1
@Scott Tapi saya tidak ingin semacam leksikal ...
Neil

Benar ... Saya tidak mengujinya dengan angka> 10 atau <0. Saya tidak tahu secara sort()internal memperlakukan semuanya sebagai string - maaf!
Scott

5

Mathematica, 18 byte

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

Mengurutkan array dan mengekstraksi nilai pertama dan terakhir.


5

R, 31 byte

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

Bukan yang asli, tapi hei!


5

Kode Mesin ARM, 26 byte

Hex dump (endian kecil):

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

Ini adalah fungsi, tanpa ketergantungan sistem atau pustaka. Pengkodean adalah Thumb-2, variabel (2 atau 4 byte) pengkodean untuk ARM 32-bit. Seperti yang mungkin dibayangkan, tidak ada cara mudah untuk hanya mengurutkan dan memilih elemen pertama dan terakhir di sini. Secara keseluruhan tidak ada yang benar-benar suka terjadi di sini, kurang lebih sama dengan implementasi referensi.

Perakitan tidak disatukan (sintaksis 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

Diuji pada Raspberry Pi 3; inilah skrip pengujian (C99, input melalui 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]

Di Haskell, mindan maxberikan minimal dan maksimal dua argumen, bukan daftar. Saya tidak tahu apakah ini tidak diizinkan (tampaknya hanya saja minimumdan maximumtidak akan diizinkan) jadi tolong beri tahu saya jika benar dan saya akan segera menghapus jawaban ini.


@nimi efek FGITW, sayangnya ...
ThreeFx

3

Oktaf, 20 byte

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

Ini mengurutkan vektor input dan menampilkan nilai pertama dan terakhir.




3

MATL , 4 byte

S5L)

Cobalah online!

Penjelasan

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
deklarasi dapat berubah menjadi ...f(a,s)int*a{...per ini
cat

1
Anda dapat menggabungkan ekspresi ternary untuk mendapatkan 2 byte lagi dari: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

Di gccAnda dapat mengganti *a>M?M=*a:0dengan*a<M?:M=*a
ceilingcat



2

CJam, 10 9 byte

q~$_(p;W>

Cobalah online.

Saya benar-benar tidak pandai CJam.

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

Cara biasa untuk mendapatkan elemen pertama dari daftar adalah 0=(tapi sayangnya itu tidak menyimpan byte). Dua solusi 9-byte lainnya: 0W]q~$f=patau blok tanpa nama {$2*_,(%}.
Martin Ender

8 byte: q~$(p)p;. Anda dapat menggunakan )untuk mendapatkan elemen terakhir seperti yang Anda gunakan (untuk mendapatkan elemen pertama.
Business Cat

@BusinessCat Itulah yang awalnya saya miliki, tetapi gagal untuk input elemen tunggal.
PurkkaKoodari

@ Pietu1998: Oh, kamu benar. Saya tidak memperhatikan itu.
Business Cat

2

Python 2, 34 byte

x=sorted(input());print x[0],x[-1]

2

PHP, 44 byte

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

2

Processing, 59 52 bytes

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

Processing doesn't actually let me read from stdin that I've been able to find, and I don't know if its internal Java compiler supports lambdas (and its been so long since I've had to write serious Java that I don't remember how).


You can save bytes by removing spaces after int[]
Kritixi Lithos

1

Perl 6 13 bytes

*.sort[0,*-1]

Test:

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)

Darn, you beat me there!
bb94

1

C#, 60 bytes

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

A naïve method at 93 bytes:

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


1

Octave, 35 bytes

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

This is an anoynymous function. Try it at ideone.

The code avoids using sorting. Namely, it does all pairwise "less than or equal" comparisons between elements of the input. The minimum is the element for which all comparisons are true. The maximum is that for which only one comparison is true.


1

Python, 35 34 bytes

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

Alternative version:

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

Old version, 35 bytes.

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

Fairly simple: take the input list, append the first element, sort it, then take the first and (length)th element of the resulting list. As the length of the input after appending an element is length + 1, this ends up taking the first and last element of said list, which are the minimum and maximum elements.


1
Though not the shortest answer in Python, this is very creative! +1
mbomb007

The 34-byte one doesn't work in Python 3; this works in both 2 and 3. Also, it was posted after this one.
TLW

@mbomb007 - fine, golfed. This is now tied for the shortest Python implementation, and as a bonus it works in both 2 and 3.
TLW

1

zsh, 22 bytes

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

defines a lambda function that prints its first arg ($1) and the last argument to the previous command ($_), and passes it $@ after sorting it so the previous command becomes the invocation of that lambda


zsh, 21 bytes

this only works fine if there's more than 1 argument :(

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

sorts $@, makes it a string and replaces everything from the first space to the last one with a single space, then passes it as input to cat with <<<


usage:

$ ./minmax 23 342 21 10
10 342

1

Scala, 55 bytes

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

To execute:

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


1

Bash + coreutils, 30 bytes

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

The sed script prints, after the input is sorted, the first and last integers.


1

dc, 110 bytes

?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

Help me, dcers! You are my only hope!

Thanks to @seshoumara for finding that bug!

I'll add an explanation later. Here it is broken up a bit:

?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

I didn't record how to invoke this, and now I can't remember. Whatever I'm doing now, I'm doing it wrong, because this is always returning 0 as the smallest element.
Joe

1
Pfew! It took some starring at it, but found the bug in your code. It's the first character (0) which you duplicate and initialize registers M and m. But if in the input list no number is smaller than m=0, or no number is greater than M=0, then you get an incorrect result, because you artificially added 0 to the sample numbers. The solution is to replace that first 0 with ?d, which reads the numbers and initializes M and m with the last number, thus making it a part of the sample. Then run the code like this: echo "8 _2 5"|dc -e "?ddsMsm....".
seshoumara

Wow, thanks, @seshoumara! I never would have noticed that! (I'd forgotten all about this question, too :P)
Joe

1

Java, 115 bytes

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

Ungolfed:

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
}

My first ever code "golf" solution.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.