Méthodes «créatives» pour déterminer si un tableau est trié


51

Étant donné un tableau entier, écrivez un programme qui détermine s'il est trié par ordre croissant.

Rappelez-vous qu'il s'agit d'une question à la traîne de code.

Je cherche les moyens les plus intéressants que les gens trouvent.

La réponse avec le plus de votes positifs l'emporte.

Cette question s'inspire d'une solution "créative" qu'un candidat m'a donnée lors d'un entretien :)


La solution "créative" ressemblait à ceci:

  • Parce que pour un tableau trié

    • tous les éléments du côté gauche d'un élément doivent être plus petits
    • tous les éléments du côté droit d'un élément doivent être plus grands

Par conséquent, exécutez une boucle principale pour tous les éléments et vérifiez les deux conditions ci-dessus en exécutant deux boucles imbriquées dans la boucle principale (une pour le côté gauche et une pour le côté droit).

J'étais choqué!!.


58
Ce n'est pas un doublon. Certains modérateurs estiment qu'il est nécessaire de marquer chaque question comme une duplication pour les autres sans la lire. Ce n'est pas une question de tri du tout. Lis le.
Microbian

3
À la fin du concours, j'aimerais aussi connaître la solution "créative"! :)
Vereos

16
Les modérateurs de @micro Diamond sont élus par la communauté. Vous confondez les modérateurs avec le système de privilège.
Poignée de porte

3
@ microbian Alors, avez-vous engagé ce gars?
VisioN

3
Si seule l'API StackExchange permettait l'accès en écriture, je poserais la question "Ce tableau est-il trié?" et compter les votes positifs sur les réponses positives / négatives ..
Michael Foukarakis

Réponses:


77

Rubis

Tout le monde le sait: le tri est très lent et prend plusieurs cycles (le mieux que vous puissiez faire est quelque chose avec n log(n)). Ainsi, il est assez facile de vérifier si le tableau est trié. Il vous suffit de comparer le temps d'exécution entre le tri du tableau et celui du tri.

array = [1, 5, 4, 2, 3]

## measure the time needed to sort the array 1m times
tstart = Time.now
1000000.times {
  array.sort
}
trun = Time.now - tstart

## now do a reference measurement on a sorted array
array.sort!
tstart = Time.now
1000000.times {
  array.sort
}
treference = Time.now - tstart

## compare run times
if trun > treference
  print "array was not sorted"
else
  print "array was sorted"
end

19
Cela dépend de l’algorithme de tri. Le tri par fusion ou par tas ne montre aucune différence, que le tableau soit déjà trié ou non.
Niklas B.

4
@ NiklasB. Ruby utilise quicksort . Cela dit, cette méthode pourrait devenir délicate et donner des faux positifs lorsque le tableau en entrée est presque trié, ou plus vraisemblablement des faux négatifs lorsque le tableau est trié (ce serait très improbable treference <= trunpour tous les cas triés, uniquement en raison de choses non déterministes). . En théorie, il semblerait que vous obtiendrez environ 50% de faux négatifs pour le cas trié?
Jason C

6
Pensée intéressante mais non déterministe. C'est à peu près aussi bon que l'on pourrait faire dix pompes puis dix pompes supplémentaires et ensuite décider si le premier tableau était trié ou non, car on transpirait de plus lors de la deuxième série de pompes. Avons-nous oublié, nous exécutons du code sur des machines multitâches? Également sur de très petits tableaux, la tranche de temps n’est tout simplement pas assez précise. +1 pour une tentative sauvage cependant!
LMSingh

1
@ NiklasB. Timsort (une variante de mergesort) s'exécute en temps linéaire sur des tableaux triés (et également partiellement triés).
Bakuriu

3
@JasonC - il convient de noter que cela rend encore plus douteuse l'implémentation ci-dessus: elle repose non seulement sur le fait que l'algorithme de tri interne de Ruby est quicksort (ce qui est en soi non documenté et donc douteux), mais que l'implémentation spécifique est optimisé pour le cas de données déjà triées (ce que quicksort ne fait pas par défaut: quicksort n’est que O (n log n) en moyenne, sa performance dans le pire des cas est O (n ^ 2) et dans une implémentation naïve qui le pire des cas est en fait appelé sur des données déjà triées).
Jules

52

Javascript

array = prompt("Give the array");
while (true) {
    sorted = prompt("Is it sorted?");
    if (/yes|Yes/.test(sorted)) {
        alert("The array is sorted.");
        break;
    } else if (/no|No/.test(sorted)) {
        alert("The array is not sorted.");
        break;
    } else {
        alert("Dear user:\n\nPlease refer to the manual (RTFM) to observe how to use the system accordingly to the defined business rules.\nNow, try again.");
    }
}

55
-1 pas assez de JQuery.
Pierre Arlaud le

3
J'ai eu une idée similaire qui demanderait le tableau, puis une invite "Est-ce que c'est plus grand que ça?" Et si tout est vrai, alors le tableau est trié
Zach Thacker le

41

Java - Sous-ensembles récursifs

Bienvenue dans Stack Overflow! C'est une excellente première question, car même certains codeurs chevronnés sont perplexes. Laissez-moi vous donner quelques informations de base avant de vous distribuer le code:

Déterminer le tri peut être une tâche difficile à première vue. Pour tout ensemble de longueur n, il y a n! façons possibles de le commander. Ce sont les permutations . Si votre tableau a des éléments distincts, une seule de ces possibilités est triée! Pour trouver celui qui est trié, vous devez les passer au crible jusqu'à trouver celui qui vous convient (éventuellement le seul), en éliminant tous les autres.

Quelle? Ce n'est sûrement pas si difficile ...

Algorithmes avec n! La complexité prend beaucoup de temps pour des entrées plus importantes, mais avec un peu de travail, nous pouvons contourner ce problème et réduire tout un ordre de complexité. C'est toujours un temps exponentiel, mais c'est beaucoup mieux que factoriel.

Pour ce faire, il suffit de considérer le fait mathématique suivant: Si un tableau est trié, chacun de ses sous - ensembles (relativement ordonnés) est également trié. Vous pouvez demander aux experts en mathématiques une preuve formelle, mais c'est intuitivement vrai. Par exemple, pour l'ensemble 123, les sous-ensembles appropriés sont 1 2 3 12 13 23. Vous pouvez voir qu'ils sont tous commandés. Maintenant, si l'original était 213, vous l'auriez 2 1 3 21 23 13, et tout de suite, vous pouvez voir que 21c'est irrecevable.

C'est important parce qu'il y en a beaucoup moins que n! sous-ensembles. En fait, il ne faut regarder que 2 n -2 sous-ensembles. Nous pouvons exclure le jeu contenant le tableau complet des nombres originaux, ainsi que le jeu vide.

Pourtant, 2 n -2 peut représenter beaucoup de travail. Comme pour la plupart des choses qui dépassent le temps polynomial, une approche diviser pour régner fonctionne bien ici. L'approche la plus simple? Récursion !

Les étapes de base sont simples. Pour chaque sous-ensemble de votre entrée, vous générez des sous-ensembles plus petits . Ensuite, pour chacun de ceux-ci, vous faites la même chose. Une fois que vos sous-ensembles sont ramenés à la taille 2, il vous suffit de vérifier lequel est le plus gros. Etant donné que vous réduisez la taille des sous-ensembles à chaque fois, cela va en fait plus vite que prévu.

Le fait clé ici est que vous pouvez quitter tôt , dès que vous trouvez un seul sous-ensemble en panne. Vous ne devez à la recherche par tous. Si l'un est mauvais, tout le groupe est mauvais. Ceci est une considération de vitesse que vous ne voyez pas dans beaucoup de ces autres réponses.

Assez parlé, ayons le code!

Je l'ai fait en Java car c'est un langage populaire et facile à lire. L'élégance de la récursivité devrait être évidente:

import java.util.ArrayList;

public class SortChecker {

    static final Integer[] input = {1, 2, 3, 4, 5};

    public static void main(String[] args) {
        if(isSorted(input))
            System.out.println("The array is sorted properly.");
        else
            System.out.println("The array was not sorted properly.");
    }

    public static boolean isSorted(Integer[] in){
        if(in.length == 1)
            return true;
        if(in.length == 2)
            return (in[0] <= in[1]);
        ArrayList<Integer[]> subsets = getSubsets(in);
        for(Integer[] next : subsets){
            if(!isSorted(next))
                return false;
        }
        return true;
    }

    public static ArrayList<Integer[]> getSubsets(Integer[] in){
        ArrayList<Integer[]> subsets = new ArrayList<Integer[]>();
        int bitmasks = (1 << in.length) - 1;
        for (int i = 1; i < bitmasks; i++){
            ArrayList<Integer> subset = new ArrayList<Integer>(); 
            for (int j = 0; j < in.length; j++)
                if ((i & (1 << j)) > 0) 
                    subset.add(in[j]);          
            subsets.add(subset.toArray(new Integer[1]));
        }
        return subsets;
    }
}

Pour mémoire, je me suis ennuyé et je l'ai tué après 15 minutes d'attente pour un tableau trié de 12 éléments. Cela fera 11 éléments en environ 45 secondes. Bien sûr, il a vraiment fait sortir plus tôt pour les non-classés, de sorte que de, euh, bon.

Mise à jour: lors d'un nouveau redémarrage, il effectue 12 éléments en 13 minutes. 13 prend presque 3 heures, et 14 est à 20 heures et compte.


8
+1 c'est probablement l'algorithme le moins efficace que j'ai jamais vu. Devrait être autour de O (n! * 2 ^ (n!)) - Complexité (probablement pire).
Ral Zarek

6
Je suis sûr que je l' ai vu pire, mais il est assez mauvais. J'essayai sans conviction de déterminer la complexité, mais j'abandonnai et l'appelai O(big).
Geobits

1
Fournir une solution moins efficace que la tentative naïve du problème du vendeur voyageur est impressionnant!
recursion.ninja

3
Étant donné que la probabilité qu'un tableau de 12 éléments soit trié est de seulement 1 sur 479 millions, peu importe qu'il faille un certain temps pour être absolument certain de l'être, sûrement? En fait, vous ne verrez jamais personne dans le monde réel ...
Jules

2
@ Geobits Pas de problème. Exécutez l'algorithme de Victor et répondez "oui" à la première invite.
Jason C

29

C ++ - une méthode de force brute

Tout le monde sait que les méthodes de force brute sont toujours les plus rapides.

bool issorted(std::vector<int>& list)
{
  switch (list.size()) {
    case 0: case 1: return true;
    case 2: return list[0]<=list[1];
    case 3: return list[0]<=list[1] && list[1]<=list[2];
    case 4: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3];
    case 5: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4];
    case 6: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5];
    case 7: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6];
    case 8: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7];
    case 9: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8];
    case 10: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9];
    case 11: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10];
    case 12: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11];
    case 13: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12];
    case 14: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13];
    case 15: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14];
    case 16: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15];
    case 17: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16];
    case 18: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17];
    case 19: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18];
    case 20: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19];
    case 21: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20];
    case 22: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21];
    case 23: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22];
    case 24: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23];
    case 25: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24];
    case 26: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25];
    case 27: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25] && list[25]<=list[26];
    case 28: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25] && list[25]<=list[26] && list[26]<=list[27];
    case 29: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25] && list[25]<=list[26] && list[26]<=list[27] && list[27]<=list[28];
    case 30: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25] && list[25]<=list[26] && list[26]<=list[27] && list[27]<=list[28] && list[28]<=list[29];
    case 31: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25] && list[25]<=list[26] && list[26]<=list[27] && list[27]<=list[28] && list[28]<=list[29] && list[29]<=list[30];
    case 32: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25] && list[25]<=list[26] && list[26]<=list[27] && list[27]<=list[28] && list[28]<=list[29] && list[29]<=list[30] && list[30]<=list[31];
    case 33: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25] && list[25]<=list[26] && list[26]<=list[27] && list[27]<=list[28] && list[28]<=list[29] && list[29]<=list[30] && list[30]<=list[31] && list[31]<=list[32];
    case 34: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25] && list[25]<=list[26] && list[26]<=list[27] && list[27]<=list[28] && list[28]<=list[29] && list[29]<=list[30] && list[30]<=list[31] && list[31]<=list[32] && list[32]<=list[33];
    case 35: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25] && list[25]<=list[26] && list[26]<=list[27] && list[27]<=list[28] && list[28]<=list[29] && list[29]<=list[30] && list[30]<=list[31] && list[31]<=list[32] && list[32]<=list[33] && list[33]<=list[34];
    case 36: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25] && list[25]<=list[26] && list[26]<=list[27] && list[27]<=list[28] && list[28]<=list[29] && list[29]<=list[30] && list[30]<=list[31] && list[31]<=list[32] && list[32]<=list[33] && list[33]<=list[34] && list[34]<=list[35];
    case 37: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25] && list[25]<=list[26] && list[26]<=list[27] && list[27]<=list[28] && list[28]<=list[29] && list[29]<=list[30] && list[30]<=list[31] && list[31]<=list[32] && list[32]<=list[33] && list[33]<=list[34] && list[34]<=list[35] && list[35]<=list[36];
    case 38: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25] && list[25]<=list[26] && list[26]<=list[27] && list[27]<=list[28] && list[28]<=list[29] && list[29]<=list[30] && list[30]<=list[31] && list[31]<=list[32] && list[32]<=list[33] && list[33]<=list[34] && list[34]<=list[35] && list[35]<=list[36] && list[36]<=list[37];
    case 39: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25] && list[25]<=list[26] && list[26]<=list[27] && list[27]<=list[28] && list[28]<=list[29] && list[29]<=list[30] && list[30]<=list[31] && list[31]<=list[32] && list[32]<=list[33] && list[33]<=list[34] && list[34]<=list[35] && list[35]<=list[36] && list[36]<=list[37] && list[37]<=list[38];
    case 40: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25] && list[25]<=list[26] && list[26]<=list[27] && list[27]<=list[28] && list[28]<=list[29] && list[29]<=list[30] && list[30]<=list[31] && list[31]<=list[32] && list[32]<=list[33] && list[33]<=list[34] && list[34]<=list[35] && list[35]<=list[36] && list[36]<=list[37] && list[37]<=list[38] && list[38]<=list[39];
    case 41: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25] && list[25]<=list[26] && list[26]<=list[27] && list[27]<=list[28] && list[28]<=list[29] && list[29]<=list[30] && list[30]<=list[31] && list[31]<=list[32] && list[32]<=list[33] && list[33]<=list[34] && list[34]<=list[35] && list[35]<=list[36] && list[36]<=list[37] && list[37]<=list[38] && list[38]<=list[39] && list[39]<=list[40];
    case 42: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25] && list[25]<=list[26] && list[26]<=list[27] && list[27]<=list[28] && list[28]<=list[29] && list[29]<=list[30] && list[30]<=list[31] && list[31]<=list[32] && list[32]<=list[33] && list[33]<=list[34] && list[34]<=list[35] && list[35]<=list[36] && list[36]<=list[37] && list[37]<=list[38] && list[38]<=list[39] && list[39]<=list[40] && list[40]<=list[41];
    case 43: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25] && list[25]<=list[26] && list[26]<=list[27] && list[27]<=list[28] && list[28]<=list[29] && list[29]<=list[30] && list[30]<=list[31] && list[31]<=list[32] && list[32]<=list[33] && list[33]<=list[34] && list[34]<=list[35] && list[35]<=list[36] && list[36]<=list[37] && list[37]<=list[38] && list[38]<=list[39] && list[39]<=list[40] && list[40]<=list[41] && list[41]<=list[42];
    case 44: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25] && list[25]<=list[26] && list[26]<=list[27] && list[27]<=list[28] && list[28]<=list[29] && list[29]<=list[30] && list[30]<=list[31] && list[31]<=list[32] && list[32]<=list[33] && list[33]<=list[34] && list[34]<=list[35] && list[35]<=list[36] && list[36]<=list[37] && list[37]<=list[38] && list[38]<=list[39] && list[39]<=list[40] && list[40]<=list[41] && list[41]<=list[42] && list[42]<=list[43];
    case 45: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25] && list[25]<=list[26] && list[26]<=list[27] && list[27]<=list[28] && list[28]<=list[29] && list[29]<=list[30] && list[30]<=list[31] && list[31]<=list[32] && list[32]<=list[33] && list[33]<=list[34] && list[34]<=list[35] && list[35]<=list[36] && list[36]<=list[37] && list[37]<=list[38] && list[38]<=list[39] && list[39]<=list[40] && list[40]<=list[41] && list[41]<=list[42] && list[42]<=list[43] && list[43]<=list[44];
    case 46: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25] && list[25]<=list[26] && list[26]<=list[27] && list[27]<=list[28] && list[28]<=list[29] && list[29]<=list[30] && list[30]<=list[31] && list[31]<=list[32] && list[32]<=list[33] && list[33]<=list[34] && list[34]<=list[35] && list[35]<=list[36] && list[36]<=list[37] && list[37]<=list[38] && list[38]<=list[39] && list[39]<=list[40] && list[40]<=list[41] && list[41]<=list[42] && list[42]<=list[43] && list[43]<=list[44] && list[44]<=list[45];
    case 47: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25] && list[25]<=list[26] && list[26]<=list[27] && list[27]<=list[28] && list[28]<=list[29] && list[29]<=list[30] && list[30]<=list[31] && list[31]<=list[32] && list[32]<=list[33] && list[33]<=list[34] && list[34]<=list[35] && list[35]<=list[36] && list[36]<=list[37] && list[37]<=list[38] && list[38]<=list[39] && list[39]<=list[40] && list[40]<=list[41] && list[41]<=list[42] && list[42]<=list[43] && list[43]<=list[44] && list[44]<=list[45] && list[45]<=list[46];
    case 48: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25] && list[25]<=list[26] && list[26]<=list[27] && list[27]<=list[28] && list[28]<=list[29] && list[29]<=list[30] && list[30]<=list[31] && list[31]<=list[32] && list[32]<=list[33] && list[33]<=list[34] && list[34]<=list[35] && list[35]<=list[36] && list[36]<=list[37] && list[37]<=list[38] && list[38]<=list[39] && list[39]<=list[40] && list[40]<=list[41] && list[41]<=list[42] && list[42]<=list[43] && list[43]<=list[44] && list[44]<=list[45] && list[45]<=list[46] && list[46]<=list[47];
    case 49: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25] && list[25]<=list[26] && list[26]<=list[27] && list[27]<=list[28] && list[28]<=list[29] && list[29]<=list[30] && list[30]<=list[31] && list[31]<=list[32] && list[32]<=list[33] && list[33]<=list[34] && list[34]<=list[35] && list[35]<=list[36] && list[36]<=list[37] && list[37]<=list[38] && list[38]<=list[39] && list[39]<=list[40] && list[40]<=list[41] && list[41]<=list[42] && list[42]<=list[43] && list[43]<=list[44] && list[44]<=list[45] && list[45]<=list[46] && list[46]<=list[47] && list[47]<=list[48];
    case 50: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25] && list[25]<=list[26] && list[26]<=list[27] && list[27]<=list[28] && list[28]<=list[29] && list[29]<=list[30] && list[30]<=list[31] && list[31]<=list[32] && list[32]<=list[33] && list[33]<=list[34] && list[34]<=list[35] && list[35]<=list[36] && list[36]<=list[37] && list[37]<=list[38] && list[38]<=list[39] && list[39]<=list[40] && list[40]<=list[41] && list[41]<=list[42] && list[42]<=list[43] && list[43]<=list[44] && list[44]<=list[45] && list[45]<=list[46] && list[46]<=list[47] && list[47]<=list[48] && list[48]<=list[49];
    case 51: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25] && list[25]<=list[26] && list[26]<=list[27] && list[27]<=list[28] && list[28]<=list[29] && list[29]<=list[30] && list[30]<=list[31] && list[31]<=list[32] && list[32]<=list[33] && list[33]<=list[34] && list[34]<=list[35] && list[35]<=list[36] && list[36]<=list[37] && list[37]<=list[38] && list[38]<=list[39] && list[39]<=list[40] && list[40]<=list[41] && list[41]<=list[42] && list[42]<=list[43] && list[43]<=list[44] && list[44]<=list[45] && list[45]<=list[46] && list[46]<=list[47] && list[47]<=list[48] && list[48]<=list[49] && list[49]<=list[50];
    case 52: return list[0]<=list[1] && list[1]<=list[2] && list[2]<=list[3] && list[3]<=list[4] && list[4]<=list[5] && list[5]<=list[6] && list[6]<=list[7] && list[7]<=list[8] && list[8]<=list[9] && list[9]<=list[10] && list[10]<=list[11] && list[11]<=list[12] && list[12]<=list[13] && list[13]<=list[14] && list[14]<=list[15] && list[15]<=list[16] && list[16]<=list[17] && list[17]<=list[18] && list[18]<=list[19] && list[19]<=list[20] && list[20]<=list[21] && list[21]<=list[22] && list[22]<=list[23] && list[23]<=list[24] && list[24]<=list[25] && list[25]<=list[26] && list[26]<=list[27] && list[27]<=list[28] && list[28]<=list[29] && list[29]<=list[30] && list[30]<=list[31] && list[31]<=list[32] && list[32]<=list[33] && list[33]<=list[34] && list[34]<=list[35] && list[35]<=list[36] && list[36]<=list[37] && list[37]<=list[38] && list[38]<=list[39] && list[39]<=list[40] && list[40]<=list[41] && list[41]<=list[42] && list[42]<=list[43] && list[43]<=list[44] && list[44]<=list[45] && list[45]<=list[46] && list[46]<=list[47] && list[47]<=list[48] && list[48]<=list[49] && list[49]<=list[50] && list[50]<=list[51];
  }
}

La routine réelle est plus longue (elle va à std :: npos), mais je suis limité à 30000 caractères en postant ici.


J'aime vraiment ça.
Jakob

3
Cela ressemble à l'approche "utiliser chaque partie du buffle" pour les déclarations de cas.
Jonathan Van Matre

C'est génial. Déroulez toutes les boucles!
McKay

bonne pensée !!!
bikram990

26

Informer

Inform est un langage d'écriture de jeux de fiction interactifs pour l'interprète classique Infocom Z-machine. Pour éviter les problèmes, je vais d'abord donner les résultats de mon programme, puis le code source.

Edit: J'ai fait une petite révision pour permettre l'ajout de nombres au tableau, et inclus une description de pièce charmante.

Sorted
An Interactive Fiction by Jonathan Van Matre
Release 1 / Serial number 140301 / Inform 7 build 6G60 (I6/v6.32 lib 6/12N) SD

Sorting Room
You are in the Sorting Room, a sterile expanse of pure white. Translucent
lucite walls leak a lambent clinical light into the spotless room.

You can see a safe (closed), a flask of poison, a radioactive isotope 
attached to a radiation detector that triggers a hammer, an array (empty) 
and Erwin Schrodinger here.

>open safe
You open the safe.

>put flask in safe
(first taking the flask of poison)

You put the flask of poison into the safe.

>put isotope in safe
(first taking the radioactive isotope attached to a radiation detector 
 that triggers a hammer)

You put the isotope detector assembly into the safe, carefully placing 
the hammer next to the fragile glass of the flask of poison.

>get array
Taken.

>put numeral 1 in array
(first taking the numeral 1)

You put the numeral 1 into the array.

>put 2 in array
(first taking the numeral 2)

You put the numeral 2 into the array.

>put 3 in array
(first taking the numeral 3)

You put the numeral 3 into the array.

>examine array
In the array are a numeral 3, a numeral 2 and a numeral 1.

>put array in safe
You put the array into the safe.

>ask Erwin about whether the array is sorted
Erwin grumbles and complains, "You haven't finished the experiment" 

>close safe
You close the safe.

>ask Erwin about whether the array is sorted
Erwin beams and proudly announces, "Indeterminate!" 

Et ci-joint le code source:

"Sorted" by Jonathan Van Matre

The Sorting Room is a room. "You are in the Sorting Room, a sterile expanse of pure white. Translucent lucite walls leak a lambent clinical light into the spotless room."
The safe is a container. The safe is in the Sorting Room. The safe is openable. The safe is closed.
There is a flask of poison in the Sorting Room.
There is a radioactive isotope attached to a radiation detector that triggers a hammer in the Sorting Room.
There is an array in the Sorting Room. The array is a container.
There is a numeral 1 in the Sorting Room. The numeral 1 is undescribed.
There is a numeral 2 in the Sorting Room. The numeral 2 is undescribed.
There is a numeral 3 in the Sorting Room. The numeral 3 is undescribed.
There is a numeral 4 in the Sorting Room. The numeral 4 is undescribed.
There is a numeral 5 in the Sorting Room. The numeral 5 is undescribed.
There is a numeral 6 in the Sorting Room. The numeral 6 is undescribed.
There is a numeral 7 in the Sorting Room. The numeral 7 is undescribed.
There is a numeral 8 in the Sorting Room. The numeral 8 is undescribed.
There is a numeral 9 in the Sorting Room. The numeral 9 is undescribed.
In the Sorting Room is a man called Erwin Schrodinger.
Understand the command "ask" as something new.
Understand "ask [someone] about [text]" as asking it about.
After inserting the isotope into the safe:
    If the safe encloses the flask, say "You put the isotope detector assembly into the safe, carefully placing the hammer next to the fragile glass of the flask of poison.";
Instead of asking Erwin about something:
    If the safe is closed and the safe encloses the flask and the safe encloses the array and the safe encloses the isotope, say "Erwin beams and proudly announces, 'Indeterminate!' ";
    Otherwise say "Erwin grumbles and complains, 'You haven't finished the experiment' ";

21

Doge Ruby

D'abord, vous devez exécuter ce code d'installation

class Array;alias ruby sort;end
def self.method_missing x,*a;x;end
def very x;$a=x;end
def many x;$b=$a.send x;end
def wow;puts $a==$b;end

Ensuite, stockez simplement le tableau dans une variable appelée codinget exécutez:

  very coding

                 many ruby
so algorithm


      wow

Et votre réponse sera imprimée (vrai ou faux).

S'il vous plaît également ajouter le code doge pour une performance optimale:

#~! SET DOGE=1 PERFORMANCE=OPTIMAL ONERROR=nil PIC=
#                    ***=*                                                       
#                    **===*                                                      
#                    ***=-=&                                   &&**&             
#                    **==--=                                  ***===*            
#                   &***=---*                               $*=------*&          
#                   &***=---=*                             $**=----;;=&          
#                   &**==----=&                           &*===---;;;-*          
#                   &**==----=*                          &**=-==--;;;;=          
#                   ****=-----=*                       &&*==--=---;;;;-          
#                   **===------=&                     $&*==-------;;;;-          
#                   **===-------=*&$$                &*==------;;;;;;;-          
#                   **==----==-====***&&&&&&&&$$    &*==-;;---;;;;;;;;-&         
#                  &*=---=====================*******=---;---;;;;;;;-;;=         
#                  *=======*=========================---;;--;;;;;;;;;;;*         
#                  *===***=======================------;;--;;""""";;;;;=         
#                  *=*****========================;--;;;;--;;""""";;;;;*         
#                &*********====-----===============;;;;;----;"","";-;;-&         
#               ***********====----================-;;;;----;",,";;----          
#             &************===---====================-;;;;;;",,"";----=          
#            &*************===---=====================-;;;;",,,";-----*          
#            ******=*******===--=======================--;",,,"";-----&          
#           &**************==--=========================-;"","";----;-           
#          ****************==---====****=====-===========--;";;-;;;";=           
#         ****************==----==*******===--=============--;----;--=           
#        &*****=;"";==***===----==*******===----=============------;-=$          
#        &&&***;"",,"-**====---==********=====-===============----;;;-&          
#       &&&&&*=-;;";";*==========****=***======--=========***==---;;;-&          
#      $&&&&&&=="",,,-===**=======***==-;-=================**===--;;;;*          
#      &&&&&&&-="",,"==***==***======-",,,";=-===================--";;=          
#      &&&&&**=-""";==****=***===---;"-=-,,,"--===================-;;;=&         
#     &&&&&&***--;=***********=---;,,-*",,,,,"--==================--;--*         
#     &&&&&***=*=*************=-;;","=-,,,,,,"-====================----=$        
#    &&&&&&*******************==--","-;,,,,,"-====*****=============-===&        
#   $&&&&&&******************===---",";"""";=******************=====-===*        
#   &&&&&&&&&*****************======--;;--==********************=========&       
#  &&&&&&&&&&&******=**********===========*==*****&&************=========*       
#  &&&&&&&&*=---;--==**********==============*********************=======*&      
#  &&&&&&&-""""";;"";=**********==**=========*****&&&**************=======*      
# &&&&&&&*,,,,,,,,,,,"-****&************=*******&&&&&&&************========&     
# &&**&&&=,,,,,,,,,,,,;*&&&&***********************&&&&&&***********=======*     
# &&&*&&&*",,,,,,,,,,,;*&&&*************&&**********&**************========*&    
#&&&&&&&&-"",,,,,,,,,,-*&&&**********&**&&&&&&&******************==========**    
#&&&&&&&*=,,,,,,,,,,,"-***************&&&&&&&&&*****************====--======*&   
#&&***&&*=;,,,,,,,,,";=*==*****************&&&***************=======--=======&   
#*&&&&**=-;",,,,,,"";-=*********=**&*********&&**************=======--======**   
#&&&&&**=-""",,,,,"";==**==***===**********************======***===---=======*&  
#&&&&&**=-;"""""","";;=-===*======*********************==******====----======*&  
#*&&&&**=-;""""""""";=-============*****************==*********====---==--===**  
#&&&&&***=",,,,,,"""";--=============*******==****************====----=--====**& 
#&&&&&****"",,,,,,,,,;-=========--===****====******************====--==-======*& 
#&&&&&&&&*-"",,,,,,,,,"--==--;"""";====**===********************======--======** 
#&&&&&&***=-;",,,,,,,,,,,;",,,""";-=======********************===-------=======* 
#&&&&&&&****=;""""""""",,,"""";;--==**====*******************=====--------=====* 
# &&&&&&&***=-;;;;;;;;;"";;;;;---==***====*****************=====--=--------====*$
# &&&&&&*****=-;-----=--------=====*=======****************====-==---------=====&
#  &&&&&******==-==-=============***========*************======----=--------====&
#  &&&&************==========================***********=====----------------===*
#  $&&&&***************====================***********=*======-------------=--==*
#   &&*&************=====================**************======--------------=====*
#   &******************=================**************=========-----------======*
#    &***********=*****================************==========------;-------=====*
#    &*****************================***********=============---------========*
#     &*************===================**********==***========--------========***
#      **************==================********====**===*=====--------=======****
#      &************=============================*****=*=====--------=======*****
#       &****=*******=============================**============--=======*=******
#       $*****=====**===========================***===================**********&
#        &*****=====================-====-====*=*=====*=======--==***************
#         &*****===========---==--===============**=**=*========*****************
#          &*****====---=---------========********======***===*******************
#           *****=======-=-------======*******=**==****==*==*********************
#           $***======================******===**********************************
#            &***===================*******==***=******************************=&
#             &***=========-=========*************==***************************=&
#              ******===*=======*=*****************==*************************==&
#~! END

C'est le moyen le plus simple.


(L'art ASCII a été généré par un script que j'ai rédigé, dérivé de cette image .)


7
Vous avez oublié "so algorithme". Un vrai échantillon de doge a 3 phrases avant "wow". Et oui, je suis très amusant lors des fêtes.
Pierre Arlaud le

@ArlaudPierre Heh, d'accord, corrigé: P
Bouton de porte

11
Alors commentez, très amélioration, beaucoup utile. Sensationnel.
Pierre Arlaud le

Vous auriez dû écrire un programme BF en ascii en forme de doge ... nouvelle idée de question !!
TheDoctor

19

PHP

Vous aimeriez la facilité et la simplicité de la solution suivante. Le concept global et les fonctions de pointe utilisées dans ce chef-d'œuvre de codage vous mèneront immédiatement à la liste des meilleurs développeurs du monde.

function is_sorted($input) {
    mysql_connect('localhost', 'name', 'password');
    mysql_select_db('database');

    mysql_query('
        CREATE TEMPORARY TABLE sorting_table (
          `value` int NOT NULL
        )');

    foreach ($input as $value) {
        mysql_query('INSERT INTO sorting_table VALUES (' . $value . ')');
    }

    $i = 0;
    $result = 'SORTED';
    $query = mysql_query('SELECT * FROM sorting_table ORDER BY value ASC');
    while ($value = reset(mysql_fetch_row($query))) {
        if ($input[$i++] != $value) {
            $result = 'NOT SORTED';
            break;
        }
    }

    mysql_query('DROP TABLE sorting_table');

    return $result;
}

print is_sorted(array(10, 20, 30, 40, 50));

+1 Parce que vous utilisez le même concept de ma réponse à la question de tri
Victor Stafusa

4
Cela fonctionnerait-il si Mme Roberts entrait dans les valeurs?
user80551

3
@ user80551 oui car il n'y a pas de table appelée students
fratchet freak

3
@JonathanVanMatre La sécurité est certainement l'un des aspects les plus puissants de ce code.
VisioN

1
Ceci est ma nouvelle réponse préférée sur ce site; mais pour des raisons supplémentaires j'aimerais beaucoup que vous utilisiez un AOP pour des
raisons

17

C # - Le pouvoir des statistiques

Ce que vous devez vraiment faire pour résoudre ce problème est de reformuler la question de manière à rendre la solution évidente. Comme il s’agit essentiellement d’une question de type "vrai-faux", vous demandez essentiellement: "Comment puis-je être sûr à 100% que le tableau est trié?" Si un mot ressort de cette question, c'est le mot "certain". Quel est le meilleur moyen de mesurer la certitude? Vous l'avez: statistiques.

Les autres réponses ici ne font que vérifier si le tableau est trié dans une direction . Cette solution teste les ordres croissant et décroissant en même temps. L'astuce consiste à prendre un tableau de la même taille que vous savez déjà trié (facile d'en créer un vous-même), puis à déterminer dans quelle mesure l'ordre de chaque tableau est en corrélation avec l'autre. Le plus simple consiste à calculer le coefficient de corrélation de rang de Kendall tau:

using System;

namespace Homework
{
    class Example
    {
        static void Main(string[] args)
        {
            int[] n1 = { 23, 50, 16, 57, 19, 60, 40, 7, 30, 54 };
            int[] n2 = { 7, 16, 19, 23, 30, 40, 50, 54, 57, 60 };
            int[] n3 = { 60, 57, 54, 50, 40, 30, 23, 19, 16, 7 };

            Console.WriteLine(isSorted(n1));
            Console.WriteLine(isSorted(n2));
            Console.WriteLine(isSorted(n3));
        }

        static string isSorted(int[] a)
        {
            double t = 0;
            int n = a.Length;

            //Build a 'known' sorted array.
            int[] k = new int[n];
            for (int i = 1; i < n; i++)
            {
                k[i] = i;
            }

            //Find the Kendall's tau coefficient.
            //First the numerator...
            for (int i = 1; i < n; i++)
            {
                for (int j = 0; j < i; j++)
                {
                    t += Math.Sign(a[i] - a[j]) * Math.Sign(k[i] - k[j]);
                }
            }
            //...then the denominator.
            int d = n * (n-1) / 2;
            //This gives the correlation coefficient.
            double sortedness = t / d;
            //1 is perfect correlation (ascending), -1 is perfectly non-correlated (descending).
            if (Math.Abs(sortedness) == 1)
            {
                return "Sorted";
            }
            else
            {
                return "Unsorted";
            }
        }
    }
}

Sortie:

Unsorted
Sorted
Sorted

Il est également très facile d’étendre la fonctionnalité de cette fonction, car il serait trivial d’ajouter des fonctionnalités telles que «Principalement trié» ou «Plus trié que non» ou «Complètement aléatoire».

Modifier

J'ai presque oublié de passer en revue l'efficacité de l'algorithme. C'est actuellement O (7). Il y en a un dans le nom de la méthode, un dans chacun des mots clés "pour", un dans la déclaration "double" et deux dans les utilisations de la variable "sortness". Vous pouvez améliorer cela jusqu’à O (0) (aussi bas que vous le pouvez) en renommant la fonction, en changeant le double en décimal, en supprimant le "tri" en "srtdnss" et en convertissant les boucles for en tandis que des boucles.


2
J'ai minutieusement recalculé la complexité et déterminé qu'elle était O (8). Vous éviterez la sortie, ce qui, à mon avis, devrait en tenir compte. Pour obtenir une complexité vraiment O (7), vous pouvez envisager de renvoyer "ascendant" / "au hasard" au lieu de "trié" / "non trié".
Geobits

@ Geobits - Je l'ai regardé à nouveau, et bien sûr vous avez raison. Je suppose que cela montre qu'il existe une complexité minimale de O (1) lors du renvoi des chaînes. C'est un petit prix à payer cependant, car retourner un booléen est deux fois plus mauvais.
Komintern

1
+1 pour le calcul de O (). -1 pour ne pas également calculer un rho de Spearman, car deux corrélations ne sont-elles pas meilleures qu'une? Et +1 pour les statistiques en C #, le favori des statisticiens.
Jonathan Van Matre

S'il vous plaît dites-moi que la O(7)chose est une blague
mbatchkarov

@mbatchkarov - C'est une petite notation en O :-)
Comintern

16

Rubis

La stratégie suivante révélera éventuellement si un tableau est trié:

  1. A soit un tableau (soit trié, soit non trié, par exemple [1,2,3] ou [1,3,2])
  2. P est un tableau contenant toutes les permutations de A
  3. Si A est trié, il s’agit du maximum ou du minimum de P (qui sont essentiellement les versions triées de A en Ruby)

Version en ligne pour les tests.

class Array
   def is_sorted?
      permutations = permutation.to_a
      self == permutations.max || self == permutations.min
   end
end

1
Je ne pense pas avoir compris l'explication. Si le tableau est, par exemple, [1, 9, 100], alors min est 10019 et le maximum est 91100, mais le nombre trié est 19100. Pour jouer avec la version en ligne, max est [100,9,1] et min. est [1,9,100]. Je ne vois pas où quelque chose est "représenté par un nombre"; il semble que les tableaux soient en train d'être ordonnés lexicographiquement. Ce serait la même chose, je suppose, si tous les chiffres ne sont qu’un chiffre.
Joshua Taylor

"... soit le maximum ou le minimum ..." a adoré.
Microbian

@JoshuaTaylor: Merci pour le heads-up! Je voulais l'expliquer d'une manière facilement compréhensible - ce qui a fini par être tout à fait faux;) J'ai corrigé ma description ...
David Herrmann

2
@JoshuaTaylor les méthodes ruby ​​Array # max et #min sélectionnent l'élément le plus grand et le plus petit parmi les opérateurs <et>. Sur les tableaux, <et> implémentent le tri lexicographique. [1,9,100] est le minimum de toutes les permutations ordonnées de 1, 9 et 100 dans l'ordre lexicographique.
Karl Damgaard Asmussen

C'est presque la qualité de la production.
Primo

12

C # - solution non déterministe

Ce code fonctionne probablement.

static bool isSorted(int[] s)
{
    var rnd = new Random();
    for (var i = 0; i < s.Length * s.Length * s.Length; i++)
    {
        var i1 = rnd.Next(0, s.Length);
        var i2 = rnd.Next(0, s.Length);
        if (i1 < i2 && s[i1] > s[i2] || i1 > i2 && s[i1] < s[i2])
            return false; // definitely not sorted
    }
    return true; // probably sorted
}

8
Si vous définissez le nombre d'itérations sur -n ^ 2 * ln (1-p), vous pouvez vous assurer avec une probabilité de p que toutes les combinaisons seront vérifiées!
Hannesh

Et quelles valeurs de p sont valables pour que cette solution soit acceptée comme "code de travail mais en traîne"? :)
fejesjoco

2
D'après stackoverflow.com/questions/2580933 , le risque d'erreur dans le calcul d'une comparaison due aux rayons cosmiques serait de 0,0000018 (1.8e-6) toutes les secondes. Donc, si: 1) vous pouvez déterminer le temps que prend une itération, 2) nous pouvons utiliser la formule de @Hannesh pour calculer la probabilité, puis résoudre le système d’équations pour trouver le nombre d’itérations qui rendent votre solution impossible à distinguer méthode standard isSorted.
Xantix

11

Python

Si la liste est triée, chaque nombre est inférieur ou égal au nombre suivant. Par conséquent, supprimer le nombre le plus à gauche augmentera la valeur moyenne, sinon la liste n'est pas triée. Nous allons mettre cela en boucle pour vérifier chaque numéro

def is_sorted(lst):
    def _avg(lst):
        return sum(lst)/(1.0*len(lst))
    for i in range(len(lst)-1):
        if _avg(lst[i:]) > _avg(lst[i+1:]):
            return False
    return True

is_sorted ([1,2,3]) #True
is_sorted ([3,2,1]) #False
is_sorted ([1,4,3,2,0,3,4,5]) #False


Le lecteur attentif remarquera que cela ne fonctionne pas exactement comme ça.
is_sorted ([1,4,3,2,0,3,4,11]) #False
is_sorted ([1,4,3,2,0,3,4,12]) #True
is_sorted ([1,2 , 1,2,1,2,1,2,99]) #Vrai


9

Frapper

mkdir -p nums
mynums=(1 2 3 4)
for i in "${mynums[@]}"
do
     touch "nums/$i"
done

result=`ls -v nums`
resultarray=(${result})
for i in "${!resultarray[@]}"
do
    if [ ${resultarray[$i]} != ${mynums[$i]} ]; then
        echo "not sorted!"
        rm -rf nums/*
        exit 1
    fi
done
echo "sorted!"
rm -rf nums/*

touchez un fichier pour chaque élément du tableau, ls le répertoire et comparez le résultat de ls au tableau d'origine.

Je ne suis pas très bon avec bash, je voulais juste l'essayer :)


Bien gentil, cela suppose que le répertoire "./nums" existe déjà. Peut-être un "mkdir -p nums" quelque part?
camelthemammel

Ah oui, ça a du sens: P
Zach Thacker Le

8

C #

Les notions de "plus petit" ou "plus grand" sont tellement 2013 . Les vrais programmeurs n'utilisent que l' moduloopérateur!

private static void Main()
{
    List<int> list = new List<int> { 1, 5, 7, 15, 22};
    List<int> list2 = new List<int> { 1, 5, 15, 7, 22 };

    bool a = IsSorted(list); // true
    bool b = IsSorted(list2); // false
}

private static bool IsSorted(List<int> list)
{
    for(int i = 0; i % list.Count != list.Count() - 1; i++)
    {
        if (list[i] % list[i + 1] != list[i] &&
            list[i] != list[i + 1])
        {
            return false;
        }
    }
    return true;
}

Et si le même numéro apparaît deux fois? Puis listez [i]% list [i + 1] == 0.
Simon le

@Simon Oh ho! En effet, je suppose que deux nombres identiques sont triés. Ajout d'une comparaison pour ce cas de bord. Belle trouvaille.
Pierre-Luc Pineault

5
Content de savoir que {0, -1, 2} est une liste triée.
Pierre Arlaud

9
@ArlaudPierre Si vous voulez être un vrai programmeur 2014, vous devez mettre de côté tout ce qui est négatif. Le monde est positif, le monde est absolu, le monde est modulo!
Pierre-Luc Pineault le

1
Puisque vous n'aimez pas la notion de "plus grand" et de "plus petit", il est dommage que vous ayez dû inclure ces signes "moins que et plus" que. Vous auriez dû utiliser des tableaux plutôt que des listes.
M. Lister

8

Scala

Vérifier si un tableau est trié est facile! Il suffit de vérifier si le premier élément est inférieur au second. Ensuite, triez le reste et voyez s'il est égal.

Malheureusement, le tri est un problème difficile. Il n'y a pas beaucoup d'algorithmes connus ou efficaces pour trier un tableau; en fait, c'est un énorme angle mort dans l'état actuel des connaissances en informatique. Je propose donc un algorithme simple: mélangez le tableau, puis vérifiez s'il est trié, ce qui, comme déjà indiqué, est facile! Continuez à mélanger jusqu'à ce que tout soit trié.

object Random {
  def isSorted(list: List[Int]): Boolean = {
    if (list.size <= 1) {
      true
    } else {
      sort(list.tail) == list.tail && list.head <= list.tail.head
    }
  }

  def sort(list: List[Int]): List[Int] = {
    val rand = new scala.util.Random()
    var attempt = list
    do {
      attempt = rand.shuffle(attempt)
    } while (!isSorted(attempt))
    attempt
  }

  def main(args: Array[String]): Unit = {
    println(isSorted(List(1, 2, 3)))
    println(isSorted(List(1, 3, 2)))
    println(isSorted(List(1, 2, 3, 4, 5, 6, 7, 8)))
  }
}

Je suppose que cela produit "true, false, true". Ça fait un moment que ça fonctionne ...


8

Un tableau d'entiers trié a la propriété que chaque sous-tableau (par exemple, les éléments n à m du tableau) est également un tableau trié d'entiers. Cela implique évidemment que la meilleure méthode est une fonction RECURSIVE:

bool isSorted_inner(const std::vector<int> &array, int start, int length){
    if (length == 2){
        if (array[start] < array[start+1]){
            return true;
        }else{
            return false;
        }
    }else{
        return isSorted_inner(array, start, length-1) && isSorted_inner(array, start+1, length-1);
    }
}

bool isSorted(const std::vector<int> &array){
    return isSorted_inner(array, 0, array.size());
}

Ce n’est peut-être pas la méthode la plus rapide, mais c’est quand même un test TRÈS PRÉCIS pour déterminer si une liste est ordonnée ou non. Il est également incroyablement facile à lire et à comprendre ce code car il utilise un paradigme FONCTIONNEL, et est donc exempt des horreurs des boucles de changement d'état et des boucles itératives.

J'espère que ce sera une information utile pour vous.


6

C # - sous-séquence croissante la plus longue

Pour un tableau trié, la longueur de la sous-séquence croissante la plus longue est égale à la longueur du tableau. J'ai copié l'algorithme à partir d' ici , mais je l'ai seulement modifié pour qu'il soit non décroissant au lieu d'augmenter.

static bool isSorted(int[] s)
{
    return s.Length == LongestIncreasingSeq(s);
}

static public int LongestIncreasingSeq(int[] s)
{
    int[] l = new int[s.Length];  // DP table for max length[i]
    int[] p = new int[s.Length];  // DP table for predeccesor[i]
    int max = int.MinValue;

    l[0] = 1;

    for (int i = 0; i < s.Length; i++)
        p[i] = -1;

    for (int i = 1; i < s.Length; i++)
    {
        l[i] = 1;
        for (int j = 0; j < i; j++)
        {
            if (s[j] <= s[i] && l[j] + 1 > l[i])
            {
                l[i] = l[j] + 1;
                p[i] = j;
                if (l[i] > max)
                    max = l[i];
            }
        }
    }
    return max;
}

6

Stonescript (c) LMSingh - 0 moins (4102 palindromé).

Ce qui suit est écrit en Stonescript (c), une langue protégée par le droit d’auteur et utilisée par moi il ya plusieurs siècles, c’est-à-dire autrefois avant les midframes. NOTE: C'est un précurseur du sanscrit.

1. Find a very straight stick in the jungle.  
2. Sum up all the values of the array elements and find that many equal sized stones.  
3. Line up all the values of the array along the side of straight stick from step 1. Each value is to be represented by number of stones for each array element like so...  

Exemple de tableau avec 8 éléments. Tri par ordre décroissant :-)

o
oo
oo
oooo
ooooo
ooooo
ooooo
oooooo
ooooooo
oooooooo
========
12345678

- Code continué.

4. E-ball-uate. (In Shakespearean English that means Eye ball it.)  
  4.1 Run your eye from array position 1 top towards array position 8 top.  
  4.2 If it looks sorted, then it is.  
  4.2.1 Start jumping up and down and thumping chest.  
  4.2.2 Go to happy end.  
  4.3 If something isn't quite right, like in case of example below then it isn't.  
  4.3.1 Kick the stones in frustration and anger! Cuz it really is not sorted!  
  4.3.2 Go to sad end.  

Exemple de tableau avec 8 éléments. Non trié :-(

o
oo
oo
oo o
ooooo
ooooo
ooooo
oooooo
ooooooo
oooooooo
========
12345678

- Code continué.

5. Sad end.  
  5.1 Eat an apple.  
  5.2 Fall from grace to next line.  
6. Happy end.  

= - = - - - - - - - - =
Lors d'une optimisation ultérieure, l'étape 4 des feuilles perforées peut être remplacée par les feuilles perforées suivantes.
= - = - = - = - = - =

4. Roll a stone from top of position 1 towards top of position 8, pushing the rolling stone towards the top stone for each position while moving to the right.  
  4.1 If rolling stone reaches the position 8 then it's sorted.  
  4.1.1 Start jumping up and down and thumping chest.  
  4.1.2 Go to happy end.  
  4.2 If the rolling stone gets stuck in a trough, then it isn't.  
  4.3.1 Kick the stones in frustration and anger!  
  4.3.2 Go to sad end.  

= - = - = - = - = - =
Pour vous tous, les détecteurs de code et les débogueurs de puissance, j'ai intentionnellement ajouté un bogue dans la deuxième variante ci-dessus de l'étape 4. Pouvez-vous le trouver?


3
J'ai trouvé le bogue - tout 4.3.*devrait être4.2.*
Timtech

4

Javascript

C'est ce qui vous a choqué à propos de la "créativité":

  • Parce que pour un tableau trié

    * all the elements on the left side of any element must be smaller 
    * all the elements on the right side of any element must be bigger
    
  • Par conséquent, exécutez une boucle principale pour tous les éléments et vérifiez les deux conditions ci-dessus en exécutant deux boucles imbriquées dans la boucle principale (une pour le côté gauche et une pour le côté droit).

Donc, je donne une implémentation javascript de l'algorithme décrit:

function checkArraySorted(array) {
  for (a = 0; a < array.length; a++) {
    for (b = 0; b < a; b++) {
       if (array[b] > array[a]) return false;
    }
    for (b = a + 1; b < array.length; b++) {
       if (array[b] < array[a]) return false;
    }
  }
  return true;
}

Permet de le tester:

checkArraySorted([]);
> true

checkArraySorted([1]);
> true

checkArraySorted([1, 2]);
> true

checkArraySorted([2, 1]);
> false

checkArraySorted([1, 2, 3]);
> true

checkArraySorted([1, 2, 3, 4]);
> true

Semble fonctionner parfaitement! Il a une complexité de O(n²), idéal pour un algorithme qui devrait l'être O(n), mais en le faisant, O(n²)il devient plus efficace, puisqu'il s'agit d'une mesure de l'efficacité, il O(n²)est donc plus efficace que O(n).


Je ne voulais pas utiliser un «moyen». La première boucle imbriquée allait de 0 à a et la seconde était supposée être de + 1 à longueur. BTW, 1,2,3 devrait être trié, n'est-ce pas?
Microbian

@ Microbien Ok, édité.
Victor Stafusa

4

C

Ci-après, "triés" signifie "triés par ordre croissant".

Un tableau n'est pas trié si et seulement si a[i]>a[i+1]

Donc, si nous laissons x=a[i]-a[i+1], xsera positif si le tableau n'est pas trié.

Pour xêtre positif, nous pouvons le décomposer en deux parties: xn’est pas négatif et xn’est pas nul

Un simple test pour savoir si xest négatif est que nous testons si x*xest égal à x*abs(x). Cette condition devrait être fausse si xest négative, depuis (-1)*(-1)==1.

Pour tester zéro, nous pouvons utiliser un autre test simple: 0./(float)xis Not a Number ssi xest zéro.

Alors voici le code complet: (en supposant que le tableau a 5 éléments)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main() {
    int i, a[5];
    for(i=0;i<5;i++) scanf("%d",&a[i]);
    int sorted=1;
    for(i=0;i<4;i++) {
        int x=a[i]-a[i+1];
        if(x*x==x*abs(x)&&!isnan(0./(float)x)) {
            sorted=0;
            break;
        }
    }
    puts(sorted?"sorted":"not sorted");
    return 0;
}

En fait, tester a[i]-a[i+1] > 0est déjà problématique. Pas besoin de faire tout ce genre de choses.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Faire des choses inutiles est le but de la surveillance du code, n'est-ce pas? (Et qu'entendez-vous par problématique?)
ace_HongKongIndependence

1
Le dépassement d'entier signé est UB. Même si nous définissons le comportement de bouclage, si nous faisons INT_MAX - INT_MIN, le résultat sera un nombre négatif (remplacez un [i] par INT_MAX et un [i + 1] par INT_MIN).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Puisqu'il ne s'agit que d'un problème de devoirs, supposons que l'enseignant ne donne pas autant de chiffres extrêmes.
ace_HongKongIndependence

D'ACCORD. Juste que je préfère troll + être méchant.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

4

Tout dépend de la certitude que vous souhaitez être. Comme aucune certitude n’a été donnée, ce qui suit est en fait assez bon en termes de performances. Le code ci-dessous laisse deviner, mais si vous êtes sûr, vous devriez répéter la fonction plusieurs fois. Si vous souhaitez être vraiment sûr, vous devriez le lancer en boucle et le faire une douzaine de fois. Evolutivité parfaite!

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

static const int size = 100;

int issorted(int *array, int size)
{
    int idx = random() % size;
    return (array[idx] >= array[0]);
}

void check_array(int *array, int size)
{
    if (issorted(array, size)) {
        puts("The array is sorted but I am not 100% sure.");
    } else {
        puts("The array is definitely not sorted in ascending order.");
    }
}

int main(void)
{
    int *array = malloc(sizeof(int) * size);
    int i = 0;

    srand(time(NULL));

    for (i = 0; i < size; i++) {
        array[i] = random();
    }

    check_array(array, size);

    for (i = 0; i < size; i++) {
        array[i] = i + 1;
    }

    check_array(array, size);
    free(array);

    return 0;
}

N'est-ce pas un régal?


4

C

int is_sorted(int *T, int n)
{
return false;
}

Fonctionne avec une probabilité 1- (1 / n!) Et une complexité O (1). De toute évidence, la meilleure méthode pour les très grands tableaux aléatoires.

Comme la complexité n'est que de O (1), exécutez deux fois pour une meilleure estimation.


3

C

Cette fonction fait plus que simplement vous dire si le tableau est trié. Il vous dit combien d'éléments sont au bon endroit. Il peut être utilisé pour tout type de données.

Notez l’importance d’utiliser des noms de variables descriptifs pour rendre votre code facile à suivre. D'autre part, il n'est pas nécessaire de déclarer la variable i, car elle doit être déclarée ailleurs dans le programme.

int sortcheck(array_to_be_checked[10])
{
  int number_of_elements_in_right_place=0;

  for (i = 1; i = 10; i++)
    number_of_elements_in_right_place += i == array_to_be_checked[i];

  return number_of_elements_in_right_place;
}

Edit: C’est un meilleur moyen pour les tableaux de grande taille. L'avantage de ceci est que cela ressemble à la façon dont un humain vérifierait.

int sortcheck(array_to_be_checked[32767])
{
  i=rand(); j=rand();
  while( (array_to_be_checked[i] > array_to_be_checked[j]) = (i > j) ) 
  {
    printf("I think it's sorted");
    i=rand(); j=rand();
  };
  printf("It wasn't sorted");
}

1
"Nous n'avons pas besoin de déclarer la variable i, car elle doit être déclarée ailleurs dans le programme." valait la peine de rire.
Jonathan Van Matre

@ JonathanVanMatre Merci, mais ce n'est en aucun cas la seule chose qui ne va pas avec ce code.
Level River St

3

JavaScript + plus de statistiques

J'ai beaucoup aimé la solution proposée par @Cominterm. Mais en comparant à une liste déjà triée? C'est de la triche!

Au lieu de cela, je calcule l'autocorrélation du tableau (la corrélation entre le tableau et le tableau a changé d'une position). Ensuite, je mélange le tableau de nombreuses fois et compare chaque fois sa nouvelle autocorrélation à l'autocorrélation d'origine. Si le tableau était trié, l'autocorrélation d'origine serait la plupart du temps la plus élevée!

http://jsfiddle.net/dB8HB/

Bonus: Si votre valeur p <0,05, la sortie automatisera la tâche consistant à déclarer que le tableau est trié pour vous. Que pourriez-vous demander de plus?

Bonus2: Bien que cette implémentation utilise les fonctions de tableau O (n) de JavaScript pour plus de commodité, l'approche pourrait utiliser l'échantillonnage pour s'exécuter en temps constant!

<form name="out"><textarea name="put" cols="80" rows="3">Press the button</textarea></form> 
<button onclick="startstop();">The button</button>
<script>
var iid=input=0, my=document.forms, isit={'true':0.5,'false':0.5}, ownAutocorr;
function startstop(){
     if(iid){
        clearInterval(iid);
        if(1 - isit.true / (isit.true+isit.false)<0.05){my.out.put.value+="\nYour array is sorted! (p<0.05)";}
        iid=input=0;isit={'true':0.5,'false':0.5}
     }
     else   {
        input=JSON.parse("["+prompt("Comma separated integers")+"]");
        ownAutocorr=pearsonCorrelation(input,cloneShiftArray(input));
        iid=setInterval(trial,50);
    }
}

function trial(){

 var newArr=shuffle(input.slice(0));
 var newAutocorr=pearsonCorrelation(newArr,cloneShiftArray(newArr));
 isit[newAutocorr<ownAutocorr]++;
 my.out.put.value="Your array is sorted with probability " + (isit.true / (isit.true+isit.false)).toFixed(2);
}

function cloneShiftArray(oldArr){
    var newArr=oldArr.slice(0); //clone the array
    var len=oldArr.length;
    //shift the array one
    for(var l=0;l<len-1;l++){
     //performance is important so we'll use bitwise operators
     newArr[l]^=newArr[l+1];
     newArr[l+1]^=newArr[l];
     newArr[l]^=newArr[l+1];
    }
    newArr[l]+=newArr[l-1   ];
    return newArr;
}
function pearsonCorrelation(p1, p2) { //Borrowed from teh interwebs
  var len = p1.length;
  var sum1=sum2=sum1Sq=sum2Sq=pSum = 0;
  for (var l = 0; l < len; l++) sum1 += p1[l];
  for (var l = 0; l < len; l++) sum2 += p2[l];
  for (var l = 0; l < len; l++) sum1Sq += Math.pow(p1[l], 2);
  for (var l = 0; l < len; l++) sum2Sq += Math.pow(p2[l], 2);
  for (var l = 0; l < len; l++) pSum += p1[l] * p2[l];
  var num = pSum - (sum1 * sum2 / len);
  var den = Math.sqrt((sum1Sq - Math.pow(sum1, 2) / len) *
      (sum2Sq - Math.pow(sum2, 2) / len));
  if (den == 0) return 0;
  return num / den;
}
function shuffle(array) {//also borrowed
  var currentIndex = array.length, temporaryValue, randomIndex;
  while (0 !== currentIndex) {
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex -= 1;
    temporaryValue = array[currentIndex];
    array[currentIndex] = array[randomIndex];
    array[randomIndex] = temporaryValue;
  }
  return array;
}
</script>

3

JavaScript / SVG - sunDialsort

Cette solution n'utilise pas les comparateurs <, <=,> ou> =. J'ai essayé de le faire lire le moins possible.

Méthode

  • Tracer les valeurs sous forme de points le long d'un arc.
  • Pour un tableau ascendant, chaque valeur élargit la largeur totale du dessin sans diminuer le X de départ (exception: deux valeurs identiques).
  • Comme la largeur ne peut pas diminuer, un! = Suffira,
  • Comme X ne peut pas augmenter, un == suffira.
  • pour fixer deux valeurs identiques, chaque point est en fait une ligne de longueur croissante. Où la longueur de l'unité est inférieure à 1 / nombre de valeurs.

À la traîne

J'ai ajouté les éléments suivants au cours de la lecture de ce très mauvais code.

  • La fonction peut ressembler à sa façon de trier le tableau, elle a été nommée sunDialsort
  • référence lit-geek utilisée pour tous les noms de variables
  • a utilisé le marteau à expression régulière pour compter le nombre d'éléments dans le tableau
  • utilisé une boîte d'alerte
  • la solution pour le cas de bord où 2 variables consécutives sont identiques a doublé la quantité de code (une ligne aurait pu la trier), mettez beaucoup de ce code en avance pour confondre le but de la fonction.
  • au lieu de trouver les valeurs min et max, trouver le nombre le plus long et arrondir à la puissance suivante de dix, nous espérons que cela dissuadera les gens.

xml

<body>
<svg id="dial" height="400" width="400" transform=""></svg>
</body>

une fonction

sunDialsort = function (values)
{
    var twas = values.toString();  
    var brillig = twas.match(/,/g).length + 1; //<1>
    //find the sig figs we are working with (longest number)
    var and = [], the = 0;
    for (var jabberwock = 0; jabberwock < twas.length; jabberwock++)
    {
        switch (twas.charAt(jabberwock))
        {
        case ("."):
            break; //dont count
        case (","):
            and.push(the);
            the = 0;
            break;
        default:
            the++;
        }
    }
    and.push(the);
    var slithy = Math.max.apply(Math, and);
    //assume did/toves based on number of characters
    var toves = Math.pow(10, slithy);
    var did = toves * -1;
    console.log(did + "," + toves + "," + brillig);
    //for each number make a horizontal svg line of length (jabberwock*acuuracy)     
    var gyre = 1 / brillig;
    var gimble, wabe, all, mimsy, were, borogoves, mome, raths;
    var outgrabe = true;
    for (jabberwock = 0; jabberwock < brillig; jabberwock++)
    {
        gimble = document.createElementNS('http://www.w3.org/2000/svg', 'path');
        gimble.setAttribute("stroke", "blue"); //green is not a creative colour
        gimble.setAttribute("d", "M0 20 h " + (jabberwock * gyre));
        wabe = (values[jabberwock] - did) / (toves - did);
        mimsy = 90 - (wabe * 180);
        gimble.setAttribute("transform", "rotate(" + mimsy + ")");
        document.getElementById("dial").appendChild(gimble);
        borogoves = document.getElementById("dial").getBBox();
        if (mome)
        {
            raths = (borogoves.width != all && were == borogoves.x);
            console.log("test " + raths);
            all = borogoves.width;
            if (!raths)
            {
                outgrabe = false
            }
        }
        else
        {
            were = borogoves.x;
            all = borogoves.width;
            mome = true;
        }
    }
    return outgrabe
};
alert(sunDialsort([1, 2, 3, 3, 4341, 556]));

Si quelqu'un veut tester, il existe une version avec des noms de variables lisibles. http://jsfiddle.net/outRideACrisis/r8Awy/


3

C

Comme une recherche binaire ne fonctionne que sur des tableaux triés, pour vérifier si un tableau est trié, il suffit de vérifier qu’une recherche binaire fonctionne pour tous les éléments du tableau. Si aucun élément n'est trouvé, nous savons que le tableau n'est pas trié.

Les arguments de ligne de commande passés doivent tous être des entiers décimaux sans zéros non significatifs.

#include <stdlib.h>
#include <string.h>

int compar(const void *a, const void *b) {
  char *const *sa = a, *const *sb = b;
  int cmp = strlen(*sa) - strlen(*sb);
  if (cmp == 0) cmp = strcmp(*sa, *sb);
  if (cmp == 0) cmp = sa - sb;
  return cmp;
}

int main(int argc, char *argv[]) {
  if (argc-- && argv++) {
    for (int i = 0; i != argc; i++) {
      if (bsearch(argv+i, argv, argc, sizeof *argv, compar) != argv+i) {
        return 1;
      }
    }
  }
  return 0;
}

3

Javascript

a = prompt("Please enter the data");
r = prompt("Does your array arouse moral distaste and contempt?");
if ((/yes/i).test(r))
  alert("The array is sordid.");

1
{ 69 , 313 , 187 , 31338 }
Geobits

2

C

  • Faire une copie du tableau
  • trier la copie par ordre décroissant
  • vérifie si ce tableau est l'inverse du tableau donné
    #include<stdio.h>
    #include<stdlib.h>
    #include <stddef.h>
    #include<string.h>
    int main(){
     int arr[100],i,j,temp;
     int a[] = {1,2,3,4,5,6,7,8,9,10};
     char b[256];

     printf("Loading the program please wait...");
      int s = sizeof(a)/sizeof(a[0]);
     for(i=0; i<999999999; i++);//best way to make the program more realistic
     system("cls");

     for(i=0;i<s; i++ )
     arr[i] = a[i];

     for(i=0;i<s;i++){
          for(j=i;j<s;j++){
               if(arr[i] < arr[j]){
               temp=arr[i];
               arr[i]=arr[j];
               arr[j]=temp;
               }
           }
     } //sorting array in descending order

     int p = 0;
     for(i=0; i<s; i++)
     {
         if (a[s-i-1] != arr[i])
         p++;
     }

     if(p>0)
     printf("No");
     else
     printf("yes");
     getch();


     }

2

Mathematica

Cet algorithme semble fonctionner, mais il est un peu lent. Il existe peut-être des moyens plus rapides de trier mais je ne les ai pas trouvés.

  1. Prenez un ordre aléatoire de la liste et vérifiez si elle est en ordre (avec OrderedQ).
  2. Si c'est le cas, arrêtez. Sinon, répétez l'étape 1.

Le code suivant a trié la liste en un peu plus de 18 secondes.

a = {23, 50, 16, 57, 19, 60, 40, 7, 30, 54};
n = 1;
Timing[While[! OrderedQ[a], a = RandomSample[a]; n++]]
n
a

{18.581763, null}
8980699
{7, 16, 19, 23, 30, 40, 50, 54, 57, 60}


La tâche consistait à vérifier si l'entrée était déjà triée.
Ilmari Karonen

C’est l’idée essentielle de ma solution (bien que j’utilise un temps quadratique OrderedQjuste pour les funsies) avec le contrôle ajouté à la fin "maintenant que nous en avons un trié, est-ce que nous avons commencé?"
Boothby

2

JavaScript

function isSorted(arr) {
    if (arr.length === 1 && typeof arr[0] !== 'number' || arr[0].toString().indexOf('.') !== -1 || arr[0] > (-1 >>> 0) || arr[0] !== arr[0] || arr[0] === Infinity) {
        // Return false in the case of one non-number element.
        // isSorted returns false for arrays containing non-numbers for consistency
        // with PHP, but that doesn’t work for one element, so that’s the purpose
        // of this check.
        return false;
    }

    var obj = {};
    var i;

    for (i = arr.length; i--;)
        obj[arr[i]] = true;

    for (var x in obj)
        if (arr[++i] != x) return false;

    return true;
}

Cette fonction peut ne pas être renvoyée falsecorrectement, mais pas sur les navigateurs modernes. vous pouvez vérifier cela et prévoir un repli plus lent (comme décrit dans la question) si nécessaire:

var isModern = /chrome/i.test(typeof navigator === 'object' && navigator.userAgent);

if (!isModern) {
    isSorted = function() {
        // I develop on good browsers, so the implementation is left as an exercise
        // to the reader if he or she wants to support outdated browsers.
    };
}

Ils disent que cela donne des résultats imprévisibles sur les nombres négatifs, mais que tout dépend vraiment de votre capacité à prédire les choses.


2
J'aimerais que Chrome mélange les propriétés des objets afin d'empêcher les gens de faire de telles choses…
Bergi

2

Java (distance de Levenshtein)

Dans cette implémentation, je clone le tableau d'origine et trie l'instance clonée. Ensuite, la distance de Levenshtein est calculée. S'il est égal à zéro, le tableau d'origine a été trié.

Remarque: L'implémentation getLevenshteinDistance () est extraite de Jakarta Commons Lang et modifiée pour fonctionner avec int [] à la place de CharSequence.

import java.util.Arrays;

public class CheckSorting {

    public boolean isSorted(int[] array) {
        int[] sortedArray = Arrays.copyOf(array, array.length);
        Arrays.sort(sortedArray);

        return CheckSorting.getLevenshteinDistance(array, sortedArray) == 0;
    }

    public static int getLevenshteinDistance(int[] s, int[] t) {
        int n = s.length;
        int m = t.length;

        if (n == 0) {
            return m;
        } else if (m == 0) {
            return n;
        }

        if (n > m) {
            int[] tmp = s;
            s = t;
            t = tmp;
            n = m;
            m = t.length;
        }

        int p[] = new int[n + 1];
        int d[] = new int[n + 1];
        int _d[];

        int i;
        int j;

        int t_j;

        int cost;

        for (i = 0; i <= n; i++) {
            p[i] = i;
        }

        for (j = 1; j <= m; j++) {
            t_j = t[j - 1];
            d[0] = j;

            for (i = 1; i <= n; i++) {
                cost = s[i - 1] == t_j ? 0 : 1;
                d[i] = Math.min(Math.min(d[i - 1] + 1, p[i] + 1), p[i - 1] + cost);
            }

            _d = p;
            p = d;
            d = _d;
        }
        return p[n];
    }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.