Trouver les entiers minimum et maximum dans un tableau, sans utiliser de builtins

15

Défi

Étant donné un tableau d'entiers, reçus de stdin, des arguments de fonction, des arguments de programme ou une autre méthode:

Afficher uniquement les nombres minimum et maximum dans le tableau, via une valeur de retour, stdout ou d'autres méthodes d'ajustement.

Exemple de session

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

Implémentation de référence

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

Règles

  • Vous ne pouvez pas utiliser une fonction intégrée pour calculer les valeurs.
  • Failles standard interdites.
  • Implémentations créatives encouragées.
  • Il s'agit du , la réponse la plus courte gagne mais ne sera pas sélectionnée.

Clarifications

  • Si le tableau contient 1 élément, vous devez le sortir deux fois.
  • Si les valeurs minimale et maximale sont identiques, vous devez les sortir toutes les deux.
dkudriavtsev
la source
12
C'est un défi do X sans Y , qui n'est pas particulièrement intéressant.
Mego
5
@DmitryKudriavtsev Essayez le bac à sable la prochaine fois.
Mego
5
Sérieusement, utilisez le bac à sable . Vos modifications apportées au défi ont invalidé chaque réponse.
Mego
1
J'ai encouragé les méthodes créatives Non, vous avez encouragé les solutions courtes, en les marquantcode golf
Luis Mendo
1
Comme l'a dit Luis Mendo Oui, tout le monde publie simplement "je trie votre tableau à l'aide d'un intégré et prend le premier et le dernier", dans différentes langues, pas vraiment créatif: x
Walfrat

Réponses:

29

Gelée , 3 octets

Ṣ.ị

Essayez-le en ligne!

Triez le tableau, puis prenez l'élément 0,5-ème.

Jelly utilise l'indexation 1, et l'indexation en virgule flottante signifie prendre son plancher et son plafond.

Ainsi, le 0,5-ème élément vous donnerait le 0ème élément et le 1er élément.

Le 0ème élément est le dernier élément.

Leaky Nun
la source
2
Assez intelligent Je l'attends .... Gelée!
Rohan Jhunjhunwala
Oh, donc cela rendrait la médiane triviale.
Adám
1
@KonradRudolph This .
Leaky Nun
1
Ne voulez-vous pas le premier et le dernier éléments, plutôt que les deux premiers éléments? Ou ai-je mal compris votre explication?
Toby Speight
1
@TobySpeight Dans l'indexation basée sur 1, le 0ème élément est le dernier élément.
Leaky Nun
12

Python, 61 49 37 36 34 31 octets

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

-12 octets grâce à RootTwo

Encore -12 octets grâce à chepner

-2 octets grâce à johnLate

-3 octets grâce à johnLate

acrolithe
la source
1
J'ai changé le titre en Python car il fonctionne également en Python 3.
Leaky Nun
1
Vous pouvez jouer au golf sur une douzaine d'octets: utilisez [::(len(s)-1)or 1]pour le premier indice. Et le deuxième mandat peut être raccourci s[:len(s)<2].
RootTwo
Au prix de tri de la liste deux fois, vous pouvez raser un autre 12 octets: lambda s:sorted(s)[:1]+sorted(s)[-1:].
chepner
enregistrer 6 octets parlambda s:sorted(s)[::len(s)-1]
Aaron
La version actuelle ( lambda s:sorted(s)[::len(s)-1]) ne fonctionne pas pour les tableaux avec un élément ( ValueError: slice step cannot be zero). Un correctif possible serait lambda s:sorted(s*2)[::len(s*2)-1](34 octets).
johnLate
8

Brain-Flak 220 218 octets

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

Essayez-le en ligne!

Explication

D'abord, il double la valeur maximale (dans le casting, la liste n'est qu'une seule longue)

(({}))

Ensuite, il utilise mon algorithme de tri à bulles:

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

Ensuite, il récupère la valeur maximale de la pile (c'est-à-dire le min)

({}<...>)

Ensuite, il apparaît jusqu'à ce que la hauteur de la pile soit de un:

((())){{}{}([][()])}{}
Post Rock Garf Hunter
la source
8

JavaScript (ES6), 34 octets

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

sorttrie sur place, donc je peux simplement me référer à l'index [0] pour la valeur la plus basse et popla valeur la plus élevée du tableau, mais il fait un tri de chaîne par défaut, donc je dois passer un comparateur.

Neil
la source
Je ne pense pas que vous ayez besoin de la (x,y)=>x-ypièce, à moins que l'utilisation sort()avec l'algorithme par défaut ne compte comme une fonction intégrée.
Scott
1
@Scott Mais je ne veux pas d'une sorte lexicale ...
Neil
Bon ... Je ne l'ai pas testé avec des nombres> 10 ou <0. Je ne savais pas que sort()tout était traité en interne comme des chaînes - désolé!
Scott
5

Mathematica, 18 octets

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

Trie le tableau et extrait les première et dernière valeurs.

Martin Ender
la source
5

R, 31 octets

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

Pas si original, mais bon!

Frédéric
la source
5

Code machine ARM, 26 octets

Vidage hexadécimal (petit endian):

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

Il s'agit d'une fonction, sans appel système ni dépendance de bibliothèque. Le codage est Thumb-2, un codage variable (2 ou 4 octets) pour ARM 32 bits. Comme on pourrait l'imaginer, il n'y a pas de moyen facile de simplement trier et sélectionner les premier et dernier éléments ici. Dans l'ensemble, il n'y a rien de vraiment fantastique ici, c'est plus ou moins la même chose que l'implémentation de référence.

Assemblage non golfé (syntaxe 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

Testé sur le Raspberry Pi 3; voici le script de test (C99, entrée via 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));
}
Ian Chew
la source
4

Haskell, 27 octets

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

Dans Haskell, minet maxdonnez au minimum et au maximum deux arguments, pas d'une liste. Je ne pourrais pas dire si cela est interdit (il semble qu'au lieu de cela seulement minimumet maximumserait refusé), veuillez donc me le faire savoir et je supprimerai rapidement cette réponse.

Michael Klein
la source
@nimi FGITW effet, malheureusement ...
ThreeFx
3

Octave, 20 octets

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

Cela trie le vecteur d'entrée et sort la première et la dernière valeur.

flawr
la source
3

En fait, 5 octets

S;F@N

Essayez-le en ligne!

Explication:

S;F@N
S      sort
 ;     dupe
  F    first element
   @N  and last element
Mego
la source
3

MATL , 4 octets

S5L)

Essayez-le en ligne!

Explication

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
Luis Mendo
la source
3

Python, 29 octets

lambda s:s[s.sort():1]+s[-1:]

Testez-le sur Ideone .

Dennis
la source
3

C, 83 81 79 octets

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);}
NoSeatbelts
la source
1
la déclaration peut se transformer en ...f(a,s)int*a{...par ce
chat
1
Vous pouvez combiner les expressions ternaires pour obtenir 2 octets 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);}
supplémentaires
Dans, gccvous pouvez remplacer *a>M?M=*a:0par*a<M?:M=*a
plafond du
2

V , 12 octets

:sor
ò2Gjkd

Essayez-le en ligne!

Nous remercions DJMcMayhem pour cela.

Rɪᴋᴇʀ
la source
1
\o/Ouais, je ne suis plus la seule personne à avoir utilisé cette langue!
DJMcMayhem
1
Si l'entrée est un seul numéro, ce numéro doit encore être sorti deux fois
Luis Mendo
@LuisMendo hm, y travaillera.
Rɪᴋᴇʀ
2

CJam, 10 9 octets

q~$_(p;W>

Essayez-le en ligne.

Je ne suis vraiment pas bon à CJam.

q~          e# eval input
  $         e# sort
   _        e# duplicate
    (       e# pop first
     p      e# print
      ;     e# remove array
       W>   e# get last element
PurkkaKoodari
la source
La façon habituelle d'obtenir le premier élément d'une liste est 0=(mais cela ne permet malheureusement pas d'économiser d'octets). Deux autres solutions à 9 octets: 0W]q~$f=pou le bloc sans nom {$2*_,(%}.
Martin Ender
8 octets: q~$(p)p;. Vous pouvez utiliser )pour obtenir le dernier élément comme vous utilisez (pour obtenir le premier.
Business Cat du
@BusinessCat C'est ce que j'avais à l'origine, mais il échoue pour l'entrée à un seul élément.
PurkkaKoodari
@ Pietu1998: Oh, tu as raison. Je ne l'ai pas remarqué.
Business Cat
2

Python 2, 34 octets

x=sorted(input());print x[0],x[-1]
Bleu
la source
2

PHP, 44 octets

function a($a){sort($a);echo $a[0].end($a);}
Dexa
la source
2

Traitement, 59 52 octets

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

Le traitement ne me permet pas réellement de lire depuis stdin que j'ai pu trouver, et je ne sais pas si son compilateur Java interne prend en charge les lambdas (et cela fait si longtemps que je n'ai pas dû écrire de Java sérieux ne me souviens pas comment).

Cody
la source
Vous pouvez économiser des octets en supprimant les espaces aprèsint[]
Kritixi Lithos
1

Perl 6 13 octets

*.sort[0,*-1]

Tester:

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)
Brad Gilbert b2gills
la source
Bon sang, tu m'as battu là!
bb94
1

C #, 60 octets

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

Une méthode naïve à 93 octets:

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;};
TheLethalCoder
la source
1

POSIX Awk, 44 octets

awk '{for(;NF-1;NF--)if($1>$NF)$1=$NF}1' RS=
Steven Penny
la source
1

Octave , 35 octets

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

Il s'agit d'une fonction anoynymous. Essayez-le chez ideone .

Le code évite d'utiliser le tri. A savoir, il effectue toutes les comparaisons par paires "inférieures ou égales" entre les éléments de l'entrée. Le minimum est l'élément pour lequel toutes les comparaisons sont vraies. Le maximum est celui pour lequel une seule comparaison est vraie.

Luis Mendo
la source
1

Python, 35 34 octets

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

Version alternative:

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

Ancienne version, 35 octets.

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

Assez simple: prenez la liste d'entrée, ajoutez le premier élément, triez-le, puis prenez le premier et (longueur) e élément de la liste résultante. La longueur de l'entrée après ajout d'un élément étant de longueur + 1, cela finit par prendre le premier et le dernier élément de ladite liste, qui sont les éléments minimum et maximum.

TLW
la source
1
Bien que ce ne soit pas la réponse la plus courte en Python, c'est très créatif! +1
mbomb007
Celui de 34 octets ne fonctionne pas en Python 3; cela fonctionne à la fois en 2 et 3. En outre, il a été publié après celui-ci.
TLW
@ mbomb007 - bien, joué au golf. Ceci est maintenant lié à l'implémentation Python la plus courte, et en bonus, il fonctionne à la fois en 2 et 3.
TLW
1

zsh, 22 octets

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

définit une fonction lambda qui imprime son premier arg ( $1) et le dernier argument à la commande précédente ( $_), et la passe $@après l'avoir triée pour que la commande précédente devienne l'invocation de ce lambda


zsh, 21 octets

cela ne fonctionne que s'il y a plus d'un argument :(

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

trie $@, en fait une chaîne et remplace tout du premier espace au dernier par un seul espace, puis le passe en entrée à cat avec<<<


usage:

$ ./minmax 23 342 21 10
10 342
izabera
la source
1

Scala, 55 octets

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

Éxécuter:

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

AmazingDreams
la source
1

Bash + coreutils, 30 octets

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

Le script sed affiche, une fois l'entrée triée, le premier et le dernier entier.

seshoumara
la source
1

cc, 110 octets

?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

Aidez-moi, dcers! Vous êtes mon seul espoir!

Merci à @seshoumara d'avoir trouvé ce bug!

J'ajouterai une explication plus tard. Ici, c'est un peu brisé:

?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
Joe
la source
Je n'ai pas enregistré comment invoquer cela, et maintenant je ne me souviens plus. Quoi que je fasse maintenant, je le fais mal, car cela renvoie toujours 0 comme le plus petit élément.
Joe
1
Pfew! Il a fallu un certain temps pour y jouer, mais a trouvé le bogue dans votre code. C'est le premier caractère (0) que vous dupliquez et initialisez les registres Met m. Mais si dans la liste d'entrée aucun nombre n'est inférieur à m=0, ou aucun nombre n'est supérieur à M=0, alors vous obtenez un résultat incorrect, car vous avez artificiellement ajouté 0 aux numéros d'échantillon. La solution consiste à remplacer le premier 0 par ?d, qui lit les nombres et initialise Met mpar le dernier nombre, ce qui en fait une partie de l'échantillon. Exécutez ensuite le code comme ceci: echo "8 _2 5" | dc -e "? DdsMsm ....".
seshoumara
Wow, merci, @seshoumara! Je n'aurais jamais remarqué ça! (J'avais tout oublié de cette question aussi: P)
Joe
1

Java, 115 octets

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

Non golfé:

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
}

Ma toute première solution de code "golf".

AMACB
la source