내장을 사용하지 않고 배열에서 최소 및 최대 정수 찾기


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
이것은 Y challenge가없는 do X 이며 특별히 흥미롭지 않습니다.
Mego

5
@DmitryKudriavtsev 다음 에 샌드 박스를 사용해보십시오 .
Mego

5
진심으로, 샌드 박스를 사용합니다 . 챌린지 변경으로 모든 답변이 무효화되었습니다.
Mego

1
창의적인 방법 을 권장했습니다. 아니요. 태그를 지정하여 짧은 솔루션을 권장했습니다.code golf
Luis Mendo

1
Luis Mendo가 말했듯이, 모든 사람들은 "내장 배열을 사용하여 배열을 정렬하고 처음부터 마지막으로 가져옵니다"라고 독창적이지 않은 다른 언어로 게시하고 있습니다 : x
Walfrat

답변:


29

젤리 , 3 바이트

Ṣ.ị

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

배열을 정렬 한 다음 0.5 번째 요소를 가져옵니다.

젤리는 1 인덱싱을 사용하며 부동 소수점 인덱싱은 바닥과 천장을 차지한다는 의미입니다.

따라서 0.5 번째 요소는 0 번째 요소와 첫 번째 요소를 제공합니다.

0 번째 요소는 마지막 요소입니다.


2
꽤 영리한 나는 기다립니다 .... 젤리!
Rohan Jhunjhunwala

아, 그것은 중간 사소한 것을 찾는 것입니다.
Adám

1
@KonradRudolph 이것 .
Leaky Nun

1
당신이 원하지 않는 첫 번째마지막 요소보다는 처음 두 요소를? 아니면 내가 당신의 설명을 잘못 이해 했습니까?
Toby Speight

1
@TobySpeight 1 기반 인덱싱에서 0 번째 요소는 마지막 요소입니다.
Leaky Nun

12

파이썬, 61 49 37 36 34 31 바이트

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

RootTwo 덕분에 -12 바이트

chepner 덕분에 또 다른 -12 바이트

johnLate 덕분에 -2 바이트

johnLate 덕분에 -3 바이트


1
파이썬 3에서도 작동하기 때문에 제목을 파이썬으로 변경했습니다.
Leaky Nun

1
당신은 12 바이트를 골라 낼 수 있습니다 : [::(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

뇌 - 플랙 (220) 218 바이트

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

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

설명

먼저 최상위 값을 두 배로 만듭니다 (캐스트에서 목록은 하나만 길다)

(({}))

그런 다음 거품 정렬 알고리즘을 사용합니다.

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

그런 다음 스택의 최상위 값을 가져옵니다 (즉, 최소값).

({}<...>)

그런 다음 스택 높이가 1이 될 때까지 팝업됩니다.

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

8

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

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

sortpop적절하게 정렬되므로 배열에서 가장 낮은 값과 가장 높은 값에 대한 [0] 색인을 참조 할 수 있지만 기본적으로 문자열 정렬을 수행하므로 비교자를 전달해야합니다.


기본 알고리즘을 기본적으로 (x,y)=>x-y사용하지 않는 한 부분 이 필요하다고 생각하지 않습니다 sort().
Scott

1
@Scott 그러나 나는 어휘 정렬을 원하지 않습니다 ...
Neil

맞습니다 ... 나는 10보다 크거나 0보다 작은 숫자로 테스트하지 않았습니다. sort()내부적으로 모든 것을 문자열로 취급 한다는 것을 몰랐습니다 . 죄송합니다!
Scott

5

매스 매 티카, 18 바이트

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

배열을 정렬하고 첫 번째 값과 마지막 값을 추출합니다.


5

R, 31 바이트

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

아니 원래하지만, 헤이!


5

ARM 기계 코드, 26 바이트

16 진 덤프 (little endian) :

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

이것은 시스템 호출이나 라이브러리 의존성이없는 함수입니다. 인코딩은 32 비트 ARM 용 변수 (2 또는 4 바이트) 인코딩 인 Thumb-2입니다. 상상할 수 있듯이 여기에서 첫 번째 요소와 마지막 요소를 정렬하고 선택하는 쉬운 방법은 없습니다. 전반적으로 여기에는 정말 멋진 것이 없으며 참조 구현과 거의 동일합니다.

언 골프 어셈블리 (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

라즈베리 파이 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

하스켈, 27 바이트

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

하스켈에서, min그리고 max주고 최소 아닌 목록의 두 인수의 최대. 내가 (대신에만 것 같습니다이 허용되는지 여부를 말할 수 minimummaximum그래서 그들은 있다면 알려 주시기 바랍니다 허용 될 것이다) 나는 즉시이 답변 삭제됩니다.


@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
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);}
삼항식

에서 gcc당신은 대체 할 수 *a>M?M=*a:0*a<M?:M=*a
ceilingcat



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

파이썬 2, 34 바이트

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

2

PHP, 44 바이트

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

2

처리 중, 59 52 바이트

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

처리는 실제로 내가 찾을 수 있었던 stdin에서 읽지 못하게하고 내부 Java 컴파일러가 람다를 지원하는지 여부를 알지 못합니다 (그리고 내가 진지한 Java를 작성 했으므로 너무 오래되었습니다. 방법을 기억하지 마십시오).


다음에 공백을 제거하여 바이트를 절약 할 수 있습니다.int[]
Kritixi Lithos

1

펄 6 13 바이트

*.sort[0,*-1]

테스트:

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)

젠장, 날 이겼어!
bb94

1

C #, 60 바이트

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

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)]

이것은 성가신 기능입니다. ideone에서 사용해보십시오 .

코드는 정렬을 사용하지 않습니다. 즉, 입력 요소 사이의 모든 "짝지거나 같지 않은"비교를 수행합니다. 최소값은 모든 비교가 참인 요소입니다 . 최대 값은 하나의 비교 적용되는 것입니다.


1

파이썬, 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
파이썬에서 가장 짧은 답변은 아니지만 매우 독창적입니다! +1
mbomb007

34 바이트는 Python 3에서 작동하지 않습니다. 이것은 2와 3 모두에서 작동합니다. 또한이 게시물 뒤에 게시되었습니다.
TLW

@ mbomb007-골프. 이것은 가장 짧은 Python 구현과 관련이 있으며 보너스로 2와 3 모두에서 작동합니다.
TLW

1

zsh, 22 바이트

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

첫 번째 arg ( $1) 및 이전 인수에 대한 마지막 인수를 인쇄하는 람다 함수를 정의합니다 ($_ )에 , $@정렬 한 후 전달 하여 이전 명령이 해당 람다의 호출이되도록합니다.


zsh, 21 바이트

인수가 둘 이상인 경우에만 잘 작동합니다.

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

정렬 $@ , 문자열로 만들고 첫 번째 공백에서 마지막 공백까지 모든 것을 단일 공백으로 바꾼 다음 cat에 입력으로 전달합니다.<<<


용법:

$ ./minmax 23 342 21 10
10 342

1

스칼라, 55 바이트

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

실행하다:

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


1

배쉬 + 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을 가장 작은 요소로 반환하기 때문에 잘못하고 있습니다.
Joe

1
퓨! 별표가 표시되었지만 코드에서 버그를 발견했습니다. 그것은 첫 번째 문자는 중복 레지스터 초기화 (0)의 Mm. 그러나 입력 목록에서 숫자가보다 작 m=0거나 숫자가보다 크지 M=0않으면 표본 번호에 인위적으로 0을 추가했기 때문에 잘못된 결과를 얻습니다. 해결책은 첫 번째 0을 ?d숫자로 읽고 초기화 M하고 m마지막 숫자 로 바꾸어 샘플의 일부로 만드는 것입니다. 그런 다음 echo "8 _2 5"| dc -e "? ddsMsm ...."과 같은 코드를 실행하십시오.
seshoumara

와, 감사합니다, @seshoumara! 나는 그것을 눈치 채지 못했을 것입니다! (나는이 질문에 대해서도 모두 잊었다. : P)
Joe

1

자바, 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;}

언 골프 드 :

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.