Je veux tester si une liste contient des entiers consécutifs.
consQ[a_] := Module[ {ret = True}, Do[If[i > 1 && a[[i]] != a[[i - 1]] + 1, ret = False; Break[]], {i, 1, Length[a]}]; ret]
7 Réponses :
Vous pouvez utiliser
consQ[a : {Integer___}] := MatchQ[Union@Differences[a], {1} | {-1} | {}] consQ[_] = False
Puisque vous testez que l'ensemble de la différence est exactement i> {1} code>, il suffit de vérifier que la liste contient un entier, au lieu de les vérifier.
Ou sans les contraintes d'intégrité: CONQ [A_]: = Union @ Différences [A] === {1}. Frais. Il est difficile de choisir entre votre solution et celle par champion. - (Je n'étais pas au courant de Mathematica avait la fonction des différences.)
S'il vous plaît jeter un oeil à la modification: et plus loin en question. Comment modifieriez-vous votre consQ?
Merci pour la modification. @Szabolcs - J'aime votre réponse pour sa lisibilité, sa compacité et son style fonctionnel, même si techniquement, cela pourrait ne pas être le plus rapide. - La variété des solutions montrent le pouvoir de Mathematica.
La solution de SzableLics est probablement ce que je ferais, mais voici une alternative: Notez que ces approches diffèrent dans la manière dont ils gèrent la liste vide. P> P> P> P> P> P> >
Et aussi la liste de taille 1. J'aime mieux le vôtre.
Rapide, fonctionnel et compact. :-) Mais cryptique (pour moi), où l'Union @ Différences est proche de l'auto-documentant. - Il est difficile de décider lequel est le meilleur! - Les deux laissent ma "solution" loin derrière la performance-sage.
Mais facilement décomposé. Définir a = {1,2,3,4,5} code> et aller de là.
S'il vous plaît jeter un oeil à la modification: et plus loin en question. Comment modifieriez-vous votre consQ?
@nilo, vous pouvez suivre le plomb de Belisarius 'LEPLOW et UTILISER SIGN CODE>:
MOST [A] + SIGN [A [[2]] - A [[1]]] === Reste [A ] code>
@Monsieur. Voulez-vous dire que vous voulez dire signe [- # [[1]] + # [[2]]]] & @ {A [[[1]], A [[- 1]]} code>?
@belisarius signe [{- 1,1} .a [[{1, -1}]]]] code>
J'aime les solutions par les deux autres, mais je serais préoccupé par de très longues listes. Considérez les données
{0.000076, False}
Je ne suis pas un expert chronométrant mais ne tient pas la fonction de choisir lors de la comparaison des vitesses d'algorithme SEC? - Je demande parce que je reçois des résultats différents lors de l'utilisation de timing au lieu d'absolutimer. - Je suis intéressé quelle solution utilise l'algorithme le plus rapide.
@niloderoock, j'ai ajouté des données de synchronisation, en utilisant timing code> à ma réponse.
@belisarius, absolument. Donne-moi quelques heures.
@belisarius, alors je, je vois mon
correspondance de modèle peut être utilisé pour fournir une expression très claire de l'intention à Le coût des performances sensiblement plus lentes: p> la seconde, comme suggéré par @ M.Wizard, est de remplacer pli code> peut être utilisé dans une expression assez concise qui fonctionne très rapidement:
consisque code>, comme écrit, fonctionne en mathématica v8.0.4 mais pas dans les versions antérieures de V8 ou V7. Pour corriger ce problème, il y a quelques alternatives. Le premier consiste à nommer explicitement le point de retour code> code>: p>
retour code> avec
lancer code> /
attrape code>: p>
C'est ce que j'ai pensé quand j'ai lu la question, mais vous ne voulez pas utiliser lancer code> plutôt que
retour code>?
@ M.Wizard lancer code> fonctionnerait également, mais il nécessiterait une prise
correspondante code>.
retour code> est donc plus concis car il quitte la construction de la société la plus proche (dans ce cas, la définition de
consisque code>).
@ M.Wizard AHA! Je vois le problème maintenant. retour code> semble être cassé dans la version 7 et 8.0.1. Il est à nouveau fixé dans la version 8.0.4 (ou cassé, en fonction de votre point de vue :).
Combien de constructions retourne-t-il code> avec 8.0.4? Oh, et bien sûr, +1.
@ M.Wizard Il semble y avoir beaucoup de traditions d'entourer retour code> - et peu de faits. La documentation officielle est clairsemée. Par exemple, le formulaire à deux arguments est presque non documenté . J'ai été surpris plus d'une fois par le comportement documenté: si [le deuxième argument] est omis, la fonction ou la boucle concernée est déterminée à l'aide de l'heuristique intégrée i>. Je suppose que j'aurais dû savoir mieux que de m'avoir informé et j'avais la fortune (MIS) d'essayer mon code dans le nouveau 8.0.4 brillant.
Je pense que ce qui suit est également rapide, et la comparaison des listes inversées ne prend pas plus de plus:
a = Range[2 10^7]; Timing@consQSzab@a Timing@consQBret@a Timing@consQBeli@a (* {6.5,True} {0.703,True} {0.203,True} *)
Notre- hangar.co.uk/blog/wp-content/uploads/2010/01/...
@Monsieur. Regardez vos manières! Retour Kicking, pondre des œufs géants et manger des feuilles d'eucalyptus n'est autorisée que sur www.stackoverflow.co.au
Je suis maintenant convaincu que Belisarius essaie d'obtenir ma chèvre en écrivant du code intentionnellement compliqué. :-p
J'écrirais: En outre, je crois que Wrach avait probablement l'intention d'écrire quelque chose comme: p> f = la plage [##, signe [# 2 - #]] & @@ # [[{1, -1}]] == # & code> P>
-14 pour ingénierie inverse mon code protégé par le droit d'auteur et obscurcie
Il y a un vin pour votre Problème de chèvre .
Puisque le timing semble être plutôt important. J'ai déplacé les comparaisons entre les différentes méthodes à ce sujet, la réponse de la communauté, la réponse.
Les données utilisées sont simplement des listes de nombres entiers consécutifs, avec un seul point non consécutif, et ils sont générés via P> < Pré> xxx pré>
où la première forme de Il génère 100 entiers aléatoires entre 1 et chacun des p> J'ai chronométré les fonctions suivantes en ordre croissant de la gauche la plupart du temps: p> p> dat [n] code> est équivalente à
dat [n, 1] code>. Le code de timing est simple: p>
{10, 25, 50, 100, 250, 500, 1000} < / Code> et
DAT CODE> utilise ensuite chacun de ces nombres aléatoires comme point non consécutif dans une liste de 10 000 éléments longs. Chaque implémentation
consQ code> est ensuite appliquée à chaque liste produite par
dat code> et les résultats sont moyennés. La fonction de traçage est simplement p>
consqszabolcs1 code>
, consqszabolcs2 code>
, consQBett code>
, CONSQRCOLLYER CODE>
, , consqwrffolf code>
, consqwrfol2 code>
, consqwrfol3 code>
, consQwrmatch code>
et Version de MRWizard de consQBelisarius code>. < / p>
consQBelisarius code>,
consQWizard code>,
CONSKBRETT CODE>,
CONSQSZABOLCS1 CODE>,
CONSQWRMATCH CODE>,
CONSQSZABOLCS2 CODE>, CODE> CONSQWLIOLD2 Code>,
consqwrfol3 code> et
consQwrffold code>. p>
TimeaVG code>
(le second) au lieu de < Code> Timing Code> dans consQTIMing code>. J'ai toujours fait plus de 100 points, cependant. Pour la plupart, il y avait une modification, à l'exception des deux les plus bas où il y a une variation de la course à courir. Donc, prenez ces deux lignes avec un grain de sel car ils sont pratiquement identiques. P>
@belisarius, l'a poussé à autoriser des points non consécutifs aléatoires à 5000 et 10000 et à une image mise à jour.
@Belisarius, celui juste au-dessus de la vôtre, qui plonge au-dessous de la vôtre entre 50 et 1000.
Oui, mais quelle fonction i> est-ce? Il y a deux fonctions dans la réponse de M.
@Belisarius, je pensais que je l'ai fait clairement dans le texte, apparemment pas. C'est sa version de votre fonction, f code>. Je n'ai pas pris la peine avec l'autre, car Wrond a appliqué ce correctif à
consQwrfol3 code>. Donc, j'étais assez surpris que la synchronisation ait une différence dans le timing.
Désolé je n'ai pas compris. Merci beaucoup!
@RCollyer Souhaitez-vous tester Belisarius 'et mes fonctions à nouveau, en utilisant Timeeavg Code> ou similaire? Je suis curieux de savoir si, sur votre système, le vacillement vu sur le mien est réel ou un artefact.
@ M.Wizard, Reran toutes les fonctions avec Timeavg CODE>, et il existe une variation pour le vôtre et le Belisarius 'de fonctionner à exécuter.
Merci. Il semble être une simple variation, plutôt que d'être plus rapide que l'autre, ce que j'attendais.