ค้นหาจำนวนเต็มต่ำสุดและสูงสุดในอาร์เรย์โดยไม่ต้องใช้บิวอิน


15

ท้าทาย

รับอาร์เรย์ของจำนวนเต็มที่ได้รับจาก stdin ฟังก์ชันอาร์กิวเมนต์อาร์กิวเมนต์โปรแกรมหรือวิธีอื่น:

เอาต์พุตเฉพาะจำนวนต่ำสุดและสูงสุดในอาเรย์ผ่านค่าส่งคืน stdout หรือวิธีการปรับแต่งอื่น ๆ

ตัวอย่างเซสชัน

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

การดำเนินการอ้างอิง

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

กฎระเบียบ

  • คุณไม่สามารถใช้ฟังก์ชันในตัวเพื่อคำนวณค่าได้
  • ช่องโหว่มาตรฐานไม่อนุญาต
  • สนับสนุนการประยุกต์ใช้ความคิดสร้างสรรค์
  • นี่คือคำตอบที่สั้นที่สุดชนะ แต่จะไม่ถูกเลือก

ชี้แจง

  • หากอาร์เรย์มี 1 องค์ประกอบคุณจะต้องออกมันสองครั้ง
  • หากค่าต่ำสุดและค่าสูงสุดเหมือนกันคุณต้องส่งออกทั้งสองค่า

12
นี่คือการทำ X โดยปราศจากความท้าทาย Yซึ่งไม่น่าสนใจโดยเฉพาะ
Mego

5
@DmitryKudriavtsev ลองใช้sandboxครั้งต่อไป
Mego

5
อย่างจริงจังใช้ Sandbox การเปลี่ยนแปลงความท้าทายของคุณทำให้คำตอบทุกคำไม่ถูกต้อง
Mego

1
ฉันสนับสนุนวิธีการสร้างสรรค์ไม่คุณสนับสนุนวิธีแก้ปัญหาสั้น ๆ โดยติดแท็กไว้code golf
Luis Mendo

1
ดังที่ Luis Mendo พูดไว้ใช่ว่าทุกคนเพิ่งโพสต์ข้อความว่า "ฉันเรียงลำดับอาเรย์ของคุณโดยใช้บิวด์อินและที่หนึ่ง" เป็นภาษาที่แตกต่างไม่สร้างสรรค์จริงๆ: x
Walfrat

คำตอบ:


29

เยลลี่ 3 ไบต์

Ṣ.ị

ลองออนไลน์!

เรียงลำดับอาร์เรย์จากนั้นใช้องค์ประกอบที่ 0.5

เจลลี่ใช้การจัดทำดัชนี 1 ครั้งและการจัดทำดัชนีคะแนนลอยตัวหมายถึงการปูพื้นและเพดาน

องค์ประกอบที่ 0.5 จะให้องค์ประกอบที่ 0 และองค์ประกอบที่ 1

องค์ประกอบที่ 0 เป็นองค์ประกอบสุดท้าย


2
Pretty Clever ฉันรอแล้ว .... เจลลี่!
Rohan Jhunjhunwala

โอ้นั่นจะทำให้การค้นหาค่ามัธยฐานเล็กน้อย
อดัม

1
@KonradRudolph นี้
Leun Nun

1
คุณไม่ต้องการองค์ประกอบแรกและสุดท้ายแทนที่จะเป็นสององค์ประกอบแรกใช่หรือไม่ หรือฉันเข้าใจผิดคำอธิบายของคุณ?
Toby Speight

1
@TobySpeight ในการจัดทำดัชนีแบบ 1 องค์ประกอบที่ 0 คือองค์ประกอบสุดท้าย
Leun Nun

12

Python, 61 49 37 36 34 31 ไบต์

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

-12 ไบต์ขอบคุณที่ RootTwo

อีก -12 ไบต์ขอบคุณที่ chepner

-2 ไบต์ขอบคุณ johnLate

-3 ไบต์ขอบคุณ johnLate


1
ฉันเปลี่ยนหัวเรื่องเป็น Python เพราะใช้งานได้ใน Python 3 ด้วย
Leun Nun

1
คุณสามารถตีกอล์ฟเป็นโหลไบท์: ใช้[::(len(s)-1)or 1]สำหรับตัวห้อยตัวแรก และระยะที่สองสามารถย่อให้สั้นลงs[:len(s)<2]ได้
RootTwo

ค่าใช้จ่ายของการเรียงลำดับรายการเป็นครั้งที่สองที่คุณสามารถโกนอีก 12 lambda s:sorted(s)[:1]+sorted(s)[-1:]ไบต์:
chepner

บันทึก 6 ไบต์โดยlambda s:sorted(s)[::len(s)-1]
Aaron

เวอร์ชันปัจจุบัน ( lambda s:sorted(s)[::len(s)-1]) ไม่สามารถใช้งานกับอาร์เรย์ที่มีหนึ่งองค์ประกอบ ( ValueError: slice step cannot be zero) การแก้ไขที่เป็นไปได้จะเป็นlambda s:sorted(s*2)[::len(s*2)-1](34 ไบต์)
johnLate

8

Brain-Flak 220 218 ไบต์

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

ลองออนไลน์!

คำอธิบาย

ก่อนอื่นมันจะเพิ่มค่าสูงสุดเป็นสองเท่า (ในการส่งรายการมีความยาวเพียงหนึ่ง)

(({}))

จากนั้นจะใช้อัลกอริทึมการจัดเรียงฟองของฉัน:

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

จากนั้นจะรับค่าสูงสุดของสแต็ก (เช่นขั้นต่ำ)

({}<...>)

จากนั้นมันจะปรากฏขึ้นจนกว่าความสูงของสแต็กจะเป็นหนึ่ง:

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

8

JavaScript (ES6), 34 ไบต์

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

sortเรียงลำดับแบบ in-place ดังนั้นฉันสามารถอ้างถึงดัชนี [0] สำหรับค่าต่ำสุดและpopค่าสูงสุดจากอาร์เรย์อย่างไรก็ตามมันจะเรียงลำดับสตริงตามค่าเริ่มต้นดังนั้นฉันต้องผ่านตัวเปรียบเทียบ


ฉันไม่คิดว่าคุณต้องการชิ้น(x,y)=>x-yส่วนเว้นแต่จะใช้sort()กับอัลกอริทึมเริ่มต้นนับเป็นบิวด์อิน
สกอตต์

1
@Scott แต่ฉันไม่ต้องการเรียงศัพท์ ...
Neil

ใช่ ... ฉันไม่ได้ทดสอบด้วยตัวเลข> 10 หรือ <0 ฉันไม่รู้ว่าsort()ปฏิบัติกับทุกอย่างภายในสตริง - ขอโทษ!
สกอตต์

5

Mathematica ขนาด 18 ไบต์

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

เรียงลำดับอาร์เรย์และแยกค่าแรกและค่าสุดท้าย



5

รหัสเครื่อง ARM, 26 ไบต์

Hex dump (endian น้อย):

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

นี่คือฟังก์ชั่นที่ไม่มีการเรียกระบบหรือการพึ่งพาไลบรารี การเข้ารหัสคือ Thumb-2 การเข้ารหัสตัวแปร (2 หรือ 4 ไบต์) สำหรับ ARM แบบ 32 บิต อย่างที่ใคร ๆ ก็นึกออกไม่มีวิธีง่ายๆในการเรียงลำดับและเลือกองค์ประกอบแรกและสุดท้ายที่นี่ โดยรวมแล้วไม่มีอะไรที่จะเกิดขึ้นที่นี่จริง ๆ มันเหมือนกันมากกับการใช้งานอ้างอิง

ชุดประกอบ Ungolfed (ไวยากรณ์ของ 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

ทดสอบกับ Raspberry Pi 3; นี่คือสคริปต์ทดสอบ (C99 อินพุตผ่าน 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 ไบต์

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

ใน Haskell minและmaxให้อาร์กิวเมนต์ขั้นต่ำและสูงสุดสองรายการไม่ใช่ของรายการ ฉันไม่สามารถบอกได้ว่านี่เป็นสิ่งต้องห้ามหรือไม่ (ดูเหมือนว่าจะเป็นแบบนั้นเท่านั้นminimumและmaximumจะไม่ได้รับอนุญาต) ดังนั้นโปรดแจ้งให้เราทราบหากพวกเขาเป็นและฉันจะลบคำตอบนี้ทันที


@nimi FGITW ผลน่าเศร้า ...
ThreeFx

3

อ็อกเทฟ 20 ไบต์

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

นี่เป็นการเรียงเวกเตอร์อินพุตและส่งออกค่าแรกและค่าสุดท้าย






3

C, 83 81 79 ไบต์

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
ประกาศสามารถกลายเป็น...f(a,s)int*a{...ต่อนี้
แมว

1
คุณสามารถรวมนิพจน์ประกอบไปด้วยเพื่อลดขนาดอีก 2 ไบต์: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

ในgccคุณสามารถแทนที่*a>M?M=*a:0ด้วย*a<M?:M=*a
ceilingcat


2

V , 12 ไบต์

:sor
ò2Gjkd

ลองออนไลน์!

ขอมอบเครดิตให้แก่ DJMcMayhem สำหรับสิ่งนี้


1
\o/เย่ฉันไม่ได้เป็นคนเดียวที่เคยใช้ภาษานี้อีกต่อไป!
DJMcMayhem

1
หากอินพุตเป็นตัวเลขเดียวตัวเลขนั้นยังคงต้องถูกส่งออกสองครั้ง
Luis Mendo

@ LuisMendo hm จะทำงานในเรื่องนั้น
Rɪᴋᴇʀ

2

CJam, 10 9 ไบต์

q~$_(p;W>

ลองออนไลน์

CJam ฉันไม่เก่งจริงๆ

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

วิธีปกติในการรับองค์ประกอบแรกของรายการคือ0=(แต่น่าเสียดายที่ไม่ได้บันทึกไบต์ใด ๆ ) สองโซลูชั่น 9 ไบต์อื่น ๆหรือบล็อกชื่อ0W]q~$f=p {$2*_,(%}
Martin Ender

8 q~$(p)p;ไบต์: คุณสามารถใช้)เพื่อรับองค์ประกอบสุดท้ายเช่นคุณใช้(เพื่อรับองค์ประกอบแรก
แมวธุรกิจ

@BusinessCat นั่นคือสิ่งที่ฉันเคยมีมา แต่มันล้มเหลวสำหรับการป้อนองค์ประกอบเดียว
PurkkaKoodari

@ Pietu1998: โอ้คุณพูดถูก ฉันไม่ได้สังเกตว่า
แมวธุรกิจ



2

กำลังประมวลผล59 52 ไบต์

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

การประมวลผลไม่ได้ให้ฉันอ่านจาก stdin ที่ฉันสามารถค้นหาได้และฉันไม่รู้ว่า Java compiler ภายในนั้นรองรับ lambdas หรือไม่ จำได้ไหม)


คุณสามารถบันทึกไบต์ด้วยการลบช่องว่างหลังจากint[]
Kritixi Lithos


1

C #, 60 ไบต์

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

วิธีnaïveที่ 93 ไบต์:

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

อ็อกเทฟ 35 ไบต์

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

นี่คือฟังก์ชั่น anoynymous ลองมันที่ ideone

รหัสหลีกเลี่ยงการใช้การเรียงลำดับ กล่าวคือมันทำการเปรียบเทียบ "น้อยกว่าหรือเท่ากับ" ทุกคู่ระหว่างองค์ประกอบของอินพุต ขั้นต่ำคือองค์ประกอบที่การเปรียบเทียบทั้งหมดเป็นจริง ค่าสูงสุดคือค่าที่การเปรียบเทียบเพียงครั้งเดียวเป็นจริง


1

Python ขนาด35 34 ไบต์

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

รุ่นทางเลือก:

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

รุ่นเก่า 35 ไบต์

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

ค่อนข้างง่าย: ใช้รายการอินพุตผนวกองค์ประกอบแรกจัดเรียงจากนั้นใช้องค์ประกอบแรกและ (ยาว) องค์ประกอบของรายการผลลัพธ์ เนื่องจากความยาวของอินพุตหลังจากต่อท้ายองค์ประกอบคือความยาว + 1 นี่เป็นการจบลงด้วยการใช้องค์ประกอบแรกและสุดท้ายของรายการที่กล่าวซึ่งเป็นองค์ประกอบขั้นต่ำและสูงสุด


1
แม้ว่าจะไม่ใช่คำตอบที่สั้นที่สุดใน Python นี่เป็นความคิดสร้างสรรค์มาก! +1
mbomb007

34- ไบต์ไม่ทำงานใน Python 3; ทำงานได้ทั้ง 2 และ 3 นอกจากนี้ยังโพสต์หลังจากนี้
TLW

@ mbomb007 - ดี golfed ตอนนี้เชื่อมโยงกับการใช้งาน Python ที่สั้นที่สุดและเป็นโบนัสที่ใช้ได้ทั้งใน 2 และ 3
TLW

1

zsh, 22 ไบต์

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

กำหนดฟังก์ชั่นแลมบ์ดาที่พิมพ์ครั้งแรกหาเรื่อง ( $1) และอาร์กิวเมนต์สุดท้ายของคำสั่งก่อนหน้า ($_ ) และผ่านมัน$@หลังจากการเรียงลำดับดังนั้นคำสั่งก่อนหน้ากลายเป็นคำภาวนาของแลมบ์ดานั้น


zsh, 21 ไบต์

ใช้งานได้ดีถ้ามีอาร์กิวเมนต์มากกว่า 1 รายการ :(

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

เรียงลำดับ$@ทำให้เป็นสตริงและแทนที่ทุกอย่างจากช่องว่างแรกไปยังช่องว่างสุดท้ายด้วยช่องว่างเดียวจากนั้นส่งผ่านเป็นอินพุตเพื่อ cat ด้วย<<<


การใช้งาน:

$ ./minmax 23 342 21 10
10 342


1

Bash + coreutils 30 ไบต์

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

สคริปต์ sed พิมพ์ออกมาหลังจากเรียงลำดับอินพุตแล้วจำนวนเต็มแรกและสุดท้าย


1

dc, 110 ไบต์

?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

ช่วยฉันด้วยdc! คุณคือความหวังเดียวของฉัน!

ขอบคุณ @seshoumara ที่พบข้อผิดพลาดนั้น!

ฉันจะเพิ่มคำอธิบายในภายหลัง ที่นี่มันแตกออกเล็กน้อย:

?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

ฉันไม่ได้บันทึกวิธีการเรียกสิ่งนี้และตอนนี้ฉันจำไม่ได้ ไม่ว่าฉันจะทำอะไรตอนนี้ฉันทำผิดเพราะมันกลับมา 0 เป็นองค์ประกอบที่เล็กที่สุดเสมอ
โจ

1
Pfew! มันนำแสดงโดยที่มัน แต่พบข้อผิดพลาดในรหัสของคุณ มันเป็นตัวอักษรตัวแรก (0) ที่คุณซ้ำกันและเริ่มต้นลงทะเบียนและM mแต่ถ้าในรายการอินพุตไม่มีจำนวนใดที่น้อยกว่าm=0หรือไม่มีจำนวนมากกว่าM=0นั้นคุณจะได้ผลลัพธ์ที่ไม่ถูกต้องเพราะคุณเพิ่ม 0 ไปยังหมายเลขตัวอย่างปลอม วิธีแก้คือการแทนที่ 0 แรกด้วย?dซึ่งอ่านตัวเลขและเริ่มต้นMและmด้วยหมายเลขสุดท้ายจึงทำให้มันเป็นส่วนหนึ่งของตัวอย่าง จากนั้นเรียกใช้รหัสเช่นนี้: echo "8 _2 5" | dc -e "? ddsMsm .... "
seshoumara

ว้าวขอบคุณ @seshoumara! ฉันไม่เคยจะสังเกตเห็นว่า! (ฉันลืมทุกอย่างเกี่ยวกับคำถามนี้ด้วยเช่นกัน: P)
Joe

1

Java, 115 ไบต์

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
}

รหัสแรกของฉัน "กอล์ฟ" โซลูชัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.