Builtins kullanmadan bir dizideki minimum ve maksimum tam sayıları bulma


15

Meydan okuma

Stdin, fonksiyon argümanları, program argümanları veya başka bir yöntemden alınan bir tamsayı dizisi verildiğinde:

Çıkış sadece bir dönüş değeri, standart giriş aygıtına ya da diğer uygun yöntemlerle dizideki en az ve en numaraları.

Örnek oturum

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

Referans uygulaması

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

kurallar

  • Değerleri hesaplamak için yerleşik bir işlev kullanamazsınız.
  • Standart boşluklara izin verilmedi.
  • Yaratıcı uygulamalar teşvik edildi.
  • Bu , en kısa cevap kazanır, ancak seçilmez.

Açıklamalar

  • Dizi 1 öğe içeriyorsa, bunu iki kez vermeniz gerekir.
  • Minimum ve maksimum değerler aynı ise, her ikisini de vermeniz gerekir.

12
Bu, Y zorluğu olmayan bir do X , özellikle ilginç değil.
Mego

5
@DmitryKudriavtsev Bir sonraki sefer korumalı alanı deneyin .
Mego

5
Cidden, Sandbox'ı kullanın . Meydan okumadaki değişiklikleriniz her cevabı geçersiz kıldı.
Mego

1
Yaratıcı yöntemleri teşvik ettim Hayır, etiketleyerek kısa çözümleri teşvik ettinizcode golf
Luis Mendo

1
Dediğim gibi Luis Mendo Evet, herkes sadece farklı bir dilde, gerçekten yaratıcı değil, farklı bir dilde "yerleşik bir kullanarak sırala ve ilk ve son alır"
dizisini gönderiyor

Yanıtlar:


29

Jöle , 3 bayt

Ṣ.ị

Çevrimiçi deneyin!

Diziyi sıralar ve ardından 0.5'inci öğeyi alır.

Jelly 1-indeksleme kullanır ve kayan nokta indeksleme araçları zemini ve tavanını alır.

Böylece 0.5'inci element size 0. elementi ve 1. elementi verecektir.

0. eleman son öğedir.


2
Oldukça Akıllı Bunu bekliyorum .... Jelly!
Rohan Jhunjhunwala

Ah, bu medyanı önemsiz hale getirir.
Adam

1
@KonradRudolph Bu .
Leaky Nun

1
İlk iki elementten ziyade ilk ve son elementleri istemiyor musunuz ? Yoksa açıklamanızı yanlış anladım mı?
Toby Speight

1
@TobySpeight 1 tabanlı indekslemede 0ncı öğe son öğedir.
Leaky Nun

12

Python, 61 49 37 36 34 31 bayt

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

RootTwo sayesinde -12 bayt

Chepner sayesinde -12 bayt daha

JohnLate sayesinde -2 bayt

JohnLate sayesinde -3 bayt


1
Python 3'te de çalıştığı için başlığı Python olarak değiştirdim.
Leaky Nun

1
Bir düzine baytta golf oynayabilirsiniz: [::(len(s)-1)or 1]ilk abonelik için kullanın . Ve ikinci terim kısaltılabilir s[:len(s)<2].
RootTwo

İki kez listesini sıralama pahasına, başka bir 12 bayt kapalı tıraş edebilirsiniz: lambda s:sorted(s)[:1]+sorted(s)[-1:].
chepner

6 bayt tasarruflambda s:sorted(s)[::len(s)-1]
Aaron

Geçerli sürüm ( lambda s:sorted(s)[::len(s)-1]), bir öğeye ( ValueError: slice step cannot be zero) sahip diziler için çalışmaz . Olası bir düzeltme lambda s:sorted(s*2)[::len(s*2)-1](34 bayt) olacaktır.
johnLate

8

Beyin Flak 220 218 bayt

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

Çevrimiçi Deneyin!

açıklama

İlk olarak en yüksek değeri iki katına çıkarır (listede döküm sadece bir uzun)

(({}))

Sonra benim kabarcık sıralama algoritması kullanır:

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

Sonra yığının en yüksek değerini alır (yani min)

({}<...>)

Sonra yığının yüksekliği bir olana kadar açılır:

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

8

JavaScript (ES6), 34 bayt

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

sortyerinde sıralar, bu yüzden ben sadece popbir karşılaştırıcı geçmek zorunda varsayılan olarak bir dize sıralama yapar, ancak diziden en düşük değer ve en yüksek değer için [0] dizinine başvurabilirsiniz .


Varsayılan algoritma ile birlikte yerleşik olarak sayılmadığı (x,y)=>x-ysürece , parçaya ihtiyacınız olduğunu düşünmüyorum sort().
Scott

1
@Scott Ama sözcüksel bir sıralama istemiyorum ...
Neil

Doğru ... 10 veya <0 rakamları ile test etmedim. sort()Her şeyi dize olarak ele aldığını bilmiyordum - üzgünüm!
Scott

5

Mathematica, 18 bayt

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

Diziyi sıralar ve ilk ve son değerleri ayıklar.


5

R, 31 bayt

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

Değil o orijinal, ama hey!


5

ARM Makine Kodu, 26 bayt

Hex dökümü (küçük endian):

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

Bu, sistem çağrısı veya kütüphane bağımlılığı olmayan bir işlevdir. Kodlama, 32-bit ARM için bir değişken (2 veya 4 bayt) kodlayan Thumb-2'dir. Tahmin edebileceğiniz gibi, buradaki ilk ve son öğeleri sıralamanın ve seçmenin kolay bir yolu yoktur. Genel olarak burada fantezi olan hiçbir şey yok, aşağı yukarı referans uygulamasıyla aynı.

Kurtulmamış montaj (GNU sözdizimi):

.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 üzerinde test edilmiştir; İşte test komut dosyası (C99, argv üzerinden giriş):

#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 bayt

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

Haskell, içinde minve maxvermek minimum ve bir listenin iki argüman, maksimum. Bunun izin verilmediğini söyleyemedim (bunun yerine sadece minimumve izin verilmiyor gibi görünüyor maximum) bu yüzden lütfen bana bildirin ve hemen bu cevabı sileceğim.


@nimi FGITW etkisi, ne yazık ki ...
ThreeFx

3

Oktav, 20 bayt

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

Bu, giriş vektörünü sıralar ve ilk ve son değeri çıktılar.




3

MATL , 4 bayt

S5L)

Çevrimiçi deneyin!

açıklama

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 bayt

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
deklarasyon dönüşebilir ...f(a,s)int*a{...başına bu
kedi

1
Üçlü ifadeleri birleştirerek 2 bayt daha alabilirsiniz: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

Gelen gccsen yerine *a>M?M=*a:0sahip*a<M?:M=*a
ceilingcat



2

CJam, 10 9 bayt

q~$_(p;W>

Çevrimiçi deneyin.

CJam'de gerçekten iyi değilim.

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

Bir listenin ilk öğesini almanın olağan yolu 0=(ama maalesef bu bayt kaydetmez). Diğer iki 9 baytlık çözüm: 0W]q~$f=pveya adsız blok {$2*_,(%}.
Martin Ender

8 bayt: q~$(p)p;. Sen kullanabilirsiniz )kullanmak gibi son öğe almak için (ilk olsun.
Business Cat

@BusinessCat Başlangıçta sahip olduğum şey bu, ama tek elemanlı giriş için başarısız.
PurkkaKoodari

@ Pietu1998: Oh, haklısın. Fark etmedim.
Business Cat

2

Python 2, 34 bayt

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

2

PHP, 44 bayt

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

2

İşleme, 59 52 bayt

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

İşleme aslında bulabildiğim stdin'den okumama izin vermiyor ve dahili Java derleyicisinin lambda'ları destekleyip desteklemediğini bilmiyorum (ve ciddi Java yazmak zorunda olduğumdan beri uzun zamandır nasıl olduğunu hatırlamıyorum).


int[]
Ardından


1

C #, 60 bayt

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

93 baytta naif bir yöntem:

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

Oktav , 35 bayt

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

Bu anormal bir işlevdir. Bunu ideone'de deneyin .

Kod sıralama kullanmaktan kaçınır. Yani, girdinin elemanları arasında çift olarak "küçük veya eşit" karşılaştırmalar yapar. Minimum değer, tüm karşılaştırmaların doğru olduğu öğedir . Maksimum değer, yalnızca bir karşılaştırmanın doğru olduğu durumdur.


1

Python, 35 34 bayt

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

Alternatif versiyon:

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

Eski sürüm, 35 bayt.

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

Oldukça basit: giriş listesini alın, ilk öğeyi ekleyin, sıralayın, ardından ortaya çıkan listenin ilk ve (uzunluk) öğelerini alın. Bir öğeyi ekledikten sonra girişin uzunluğu uzunluk + 1 olduğundan, bu, söz konusu listenin minimum ve maksimum öğeler olan ilk ve son öğesini alır.


1
Python'daki en kısa cevap olmasa da, bu çok yaratıcı! +1
mbomb007

34 baytlık Python 3'te çalışmaz; Bu hem 2 hem de 3'te çalışır. Ayrıca, bundan sonra yayınlanmıştır.
TLW

@ mbomb007 - güzel, golf. Bu şimdi en kısa Python uygulaması için bağlandı ve bonus olarak hem 2 hem de 3'te çalışıyor.
TLW 1

1

zsh, 22 bayt

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

ilk $1bağımsız değişkenini ( ) ve son bağımsız değişkenini önceki komuta ( $_) basan bir lambda işlevi tanımlar ve sıraladıktan $@sonra iletir, böylece önceki komut bu lambda'nın çağrılması haline gelir


zsh, 21 bayt

bu yalnızca 1'den fazla argüman varsa işe yarar :(

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

sıralar $@ , bir dize yapar ve ilk boşluktan sonuncuya kadar olan her şeyi tek bir boşlukla değiştirir, sonra onu kediye girdi<<<


kullanımı:

$ ./minmax 23 342 21 10
10 342

1

Scala, 55 bayt

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

Yürütmek için:

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


1

Bash + coreutils, 30 bayt

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

Sed komut dosyası, girdi sıralandıktan sonra ilk ve son tamsayıları yazdırır.


1

dc, 110 bayt

?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

Bana yardım et dc! Sen benim tek umudumsun!

Bu hatayı bulduğu için @seshoumara'ya teşekkürler!

Daha sonra bir açıklama ekleyeceğim. İşte biraz parçalanmış:

?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

Bunu nasıl çağıracağımı kaydetmedim ve şimdi hatırlayamıyorum. Şimdi ne yapıyorsam, yanlış yapıyorum, çünkü bu her zaman en küçük eleman olarak 0 döndürür.
Joe

1
Pfew! Biraz oynadı, ancak kodunuzdaki hatayı buldu. Kayıtları çoğaltıp başlatırken ilk karakterdir (0) Mve m. Ancak giriş listesinde hiçbir sayı daha küçük m=0veya hiçbir sayı büyük değilse, M=0yanlış bir sonuç elde edersiniz, çünkü örnek numaralarına yapay olarak 0 eklediniz. Çözüm, ilk 0'ı ?d, sayıları okuyan ve başlatan Mve mson sayı ile değiştirerek, örneğin bir parçası haline getirmektir. Sonra kodu şu şekilde çalıştırın: 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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.