Etant donné un tableau a ne contenant que des nombres compris entre 1 et a.length, trouvez le premier numéro en double pour lequel la deuxième occurrence a l'index minimal. En d'autres termes, s'il y a plus d'un nombre dupliqué, renvoyez le numéro pour lequel la seconde occurrence a un index plus petit que la seconde occurrence de l'autre numéro. Si de tels éléments n'existent pas, votre programme / fonction peut entraîner un comportement non défini.
Exemple:
Pour a = [2, 3, 3, 1, 5, 2]
, la sortie devrait être
firstDuplicate(a) = 3
.
Il y a 2 doublons: les nombres 2 et 3. La deuxième occurrence de 3 a un indice plus petit que la deuxième occurrence de 2 le fait, donc la réponse est 3.
Pour a = [2, 4, 3, 5, 1]
, la sortie devrait être
firstDuplicate(a) = -1
.
C'est du code-golf , donc la réponse la plus courte en octets est gagnante.
BONUS: Pouvez-vous le résoudre en complexité temporelle O (n) et en complexité spatiale O (1)?
la source
Réponses:
Python 2 , 34 octets
O (n 2 ) heure, O (n) espace
Sauvegardé 3 octets grâce à @vaultah et 3 autres de @xnor!
Essayez-le en ligne!
la source
lambda l:l[map(l.remove,set(l))<0]
œuvres, même si l'ordre d'évaluation est bizarre.-1
lorsqu'aucune copie n'est trouvée sans le "code de pied de page". Ce code ne compte-t-il pas dans les octets? Je suis nouveau sur le code de golf, désolé si c'est une question de base!JavaScript (ES6),
47363125 octetsSauvegardé 6 octets grâce à ThePirateBay
Renvoie
undefined
si aucune solution n'existe.Complexité temporelle: O (n) :-)
Complexité spatiale: O (n) :-(
Comment?
Nous gardons une trace des valeurs déjà rencontrées en les enregistrant comme de nouvelles propriétés du tableau d' origine un en utilisant les numéros négatifs. De cette façon, ils ne peuvent pas interférer avec les entrées originales.
Démo
Afficher l'extrait de code
la source
a=>a.find(c=>!(a[-c]^=1))
Mathematica, 24 octets
La capacité de correspondance de motifs de Mathematica est tellement cool!
Renvoie l'original
List
pour une entrée non valide.Explication
Dans l'entrée, remplacez ...
A
List
avec un élément en double, avec 0 ou plusieurs éléments avant, entre et après les doublons ...Avec l'élément dupliqué.
la source
Gelée , 5 octets
Essayez-le en ligne!
Comment ça marche
la source
œ-
supprime les occurrences les plus à droite? TIL-1
sans doublons. Lancer une exception est acceptable selon l'OP mais je ne suis pas sûr si0
c'est même si ce n'est pas dans la plage.Haskell , 35 octets
Essayez-le en ligne! Se bloque si aucun doublon n'est trouvé.
la source
Gelée , 6 octets
Essayez-le en ligne!
Retourne le premier doublon ou 0 s'il n'y a pas de doublon.
Explication
la source
ŒQi0ị
.i0
renverrait 0, où indexeraitị
et renverrait la dernière valeur de l'entrée au lieu de 0.Japt , 7 octets
Testez-le en ligne!
Explication
Alternativement:
Testez-le en ligne!
Explication
la source
Pyth, 5 octets
Suite de tests
Supprime de Q la première apparition de chaque élément de Q, puis retourne le premier élément.
la source
Dyalog APL,
27242019131211 octetsMaintenant modifié pour ne pas dépendre de v16! Essayez-le en ligne!
Comment? (Avec entrée N )
⊢⊃⍨...
- N à cet index:⍴↑∪
- N avec les doublons enlevés, rembourré à droite0
pour s'adapter à N⊢=
- égalité élémentaire avec N0⍳⍨
- Index du premier0
. `la source
⎕AV
, hein?⎕U2378
chargement. Essayez-le en ligne!Python 3 ,
9492 octetsO (n) temps et O (1) mémoire supplémentaire.
Essayez-le en ligne!
Source de l'algorithme .
Explication
L'idée de base de l'algorithme est de parcourir chaque élément de gauche à droite, de garder une trace des nombres apparus et de renvoyer le nombre lorsque le nombre atteint est déjà atteint, et de renvoyer -1 après avoir parcouru chaque élément.
Cependant, il utilise un moyen astucieux pour stocker les nombres qui sont apparus sans utiliser de mémoire supplémentaire: pour les stocker en tant que signe de l'élément indexé par le nombre. Par exemple, je peux représenter le fait que
2
et3
est déjà apparu en ayanta[2]
eta[3]
négatif, si le tableau est 1-indexé.la source
i
où un [i]> n?1
a.length mais pour un [i] = a.length cela ne serait-il pas hors limites?t=abs(a[i])-1=a.length-1
Perl 6 , 13 octets
L'essayer
Explication
Le
*
est dans une position à terme, donc la déclaration entière est un lambda WhateverCode .Le
.repeated
est une méthode qui donne chaque valeur sauf la première fois que chaque valeur est vue.[0]
renvoie simplement la première valeur de la Seq .S'il n'y a pas de valeur, Nil est renvoyé.
( Nil est la base des types d' échec , et tous les types ont leur propre valeur indéfinie, donc Nil est différent d'une valeur indéfinie dans la plupart des autres langues)
Notez que depuis l’ implémentation de
.repeated
génère une Seq, cela signifie qu’il ne commence à faire aucun travail tant que vous n’avez pas demandé une valeur et qu’il ne fait que suffisamment de travail pour générer ce que vous demandez.Il serait donc facile de dire que cela a au pire une complexité temporelle en O (n) , et au mieux une complexité temporelle en O (2) si la seconde valeur est une répétition de la première.
On peut probablement en dire autant de la complexité de la mémoire.
la source
APL (Dyalog) , 20 octets
Essayez-le en ligne!
2⍴¯1
négatif une r eshaped dans une liste d' ancienneté deux⎕,
obtenir une entrée (mnémonique: console) et y ajoutern←
stocker que dans n,\
préfixes de n (lit. concaténation cumulative)(
…)¨
Applique la fonction tacite suivante à chaque préfixe,
[est] le ravel (assure juste que le préfixe est une liste)≢
différent de∪
les éléments uniques [?] (le préfixe a-t-il des doublons?)n/⍨
utilisez cela pour filtrer n (supprime tous les éléments jusqu'au premier pour lequel un doublon a été trouvé)⊃
choisir le premier élément de celuila source
APL (Dyalog) , 11 octets
Conformément aux nouvelles règles , génère une erreur si aucun doublon n’existe.
Essayez-le en ligne!
⍳⍨
les indices de la première occurrence de chaque élément~
retiré de⍳∘≢
de tous les indices⍬⍴
remodeler cela en un scalaire (donne zéro si aucune donnée n'est disponible)⊃⍨
utilisez-le pour choisir (donne l'erreur sur zéro)⊢
l'argumentla source
APL, 15
On dirait que nous pouvons renvoyer 0 au lieu de -1 lorsqu'il n'y a pas de doublons (merci Adám pour le commentaire). Donc 3 octets de moins.
Un peu de description:
Pour référence, l'ancienne solution ajoutait -1 à la liste à la fin. Ainsi, si la liste était vide, elle contiendrait -1 et le premier élément serait -1.
Essayez-le sur tryapl.org
la source
¯1
, vous{⊃⍵[(⍳⍴⍵)~⍵⍳⍵]}
devriez le faire.Retina ,
26 à24 octetsEssayez-le en ligne! Explication: fait
\b(\d+)\b
correspondre chaque numéro à tour de rôle, puis la recherche précédente cherche à savoir si le nombre est un doublon; si c'est la première1
correspondance qui est!
produite, plutôt que le nombre de correspondances. Malheureusement, mettre le lookbehind en premier ne semble pas fonctionner, sinon cela économiserait plusieurs octets. Edit:7 octets ajoutés pour se conformer à la2 octets sauvés grâce à @MartinEnder.-1
valeur de retour sur aucune correspondance.la source
-1
.MATL , 8 octets
Donne une erreur (sans sortie) s'il n'y a pas de doublon.
Essayez sur MATL Online!
Explication
la source
R, 34 octets
Coupez quelques caractères de la réponse de @djhurio, n’avez pas assez de réputation pour commenter.
la source
-1
mais avec la nouvelle spécification, j'ai réussi à le réduire davantage. C'est encore solide et c'est une approche différente de la façon dont il l'a fait, je vais donc vous donner un +1!J,
1716 octetsComment?
la source
R , 28 octets
Essayez-le en ligne!
la source
NA
pour les valeurs manquantes car la spécification a changé; donc(x=scan())[duplicated(x)][1]
est parfaitement valide.J , 12 octets
Essayez-le en ligne!
Explication
la source
Dyalog APL Classic, 18 caractères
Ne fonctionne que dans
⎕IO←0
.Supprimez de la liste des index des éléments de l'argument avec "-1" ajouté la liste des index de son nœud, puis choisissez le premier de ce qui reste. Si, après la suppression, il ne reste qu'un vecteur vide, son premier élément est, par définition, 0 et sert à indexer l'argument étendu produisant le -1 souhaité.
la source
¯1
afin de pouvoir supprimer¯1,
et utiliser⎕IO←1
.Ruby ,
2836 octetsIncompris le défi la première fois.
O(n)
temps,O(n)
espace.Essayez-le en ligne!
la source
Java (OpenJDK 8) ,
65117109 octetsSolution précédente de 65 octets:
Nouvelle solution. 19 octets sont inclus pour
import java.math.*;
-8 octets grâce à @Nevay
Essayez-le en ligne!
modifier
L'algorithme de mon programme d'origine fonctionnait bien, mais la taille statique du type de données utilisé signifiait qu'il s'était cassé assez rapidement une fois que la taille avait dépassé un certain seuil.
J'ai changé le type de données utilisé dans le calcul pour augmenter la limite de mémoire du programme afin de s'adapter à cela (en utilisant
BigInteger
une précision arbitraire au lieu deint
oulong
). Cependant, cela rend discutable si cela compte ou non commeO(1)
complexité d'espace.Je laisserai mon explication ci-dessous intacte, mais j’aimerais ajouter que j’estime maintenant qu’il est impossible de réaliser
O(1)
la complexité de l’espace sans faire quelques hypothèses.Preuve
Définir
N
comme un entier tel que2 <= N
.Soit
S
une liste représentant une série d’entiers aléatoires[x{1}, ..., x{N}]
, oùx{i}
a la contrainte1 <= x{i} <= N
.La complexité temporelle (en notation Big-O) requise pour parcourir cette liste exactement une fois par élément est
O(n)
Le défi consiste à trouver la première valeur dupliquée dans la liste. Plus précisément, nous recherchons la première valeur
S
qui est un duplicata d’un élément précédent de la liste.Laissez
p
etq
soyez les positions de deux éléments dans la liste tels quep < q
etx{p} == x{q}
. Notre défi consiste à trouver le plus petitq
qui réponde à ces conditions.L'approche évidente de ce problème est de parcourir S et de vérifier si notre
x{i}
existe dans une autre listeT
: S'ilx{i}
n'existe pas dansT
, nous le stockons dansT
. Six{i}
existe dansT
, c'est la première valeur en double et donc la plus petiteq
, et en tant que telle, nous la retournons. Cette efficacité spatiale estO(n)
.Pour atteindre
O(1)
la complexité de l’espace tout en maintenant laO(n)
complexité temporelle, nous devons stocker des informations uniques sur chaque objet de la liste dans un espace fini. De ce fait, la seule façon pour un algorithme de fonctionner àO(1)
la complexité de l'espace est si: 1. N se voit attribuer une limite supérieure correspondant à la mémoire nécessaire pour stocker le nombre maximal de valeurs possibles pour un type de données fini particulier. 2. La réaffectation d'une seule variable immuable ne compte pas dans la complexité, mais uniquement dans le nombre de variables (une liste étant plusieurs variables). 3. (Basé sur d'autres réponses) La liste est (ou au moins, les éléments de la liste sont) mutable, et le type de données de la liste est prédéfini comme un entier signé, ce qui permet d'apporter des modifications aux éléments plus loin dans la liste. sans utiliser de mémoire supplémentaire.1 et 3 nécessitent à la fois des hypothèses et des spécifications sur le type de données, tandis que 2 requiert que seul le nombre de variables soit pris en compte pour le calcul de la complexité de l'espace, plutôt que la taille de ces variables. Si aucune de ces hypothèses n’est acceptée, il serait impossible d’obtenir à la
O(n)
fois une complexité temporelle et uneO(1)
complexité spatiale.Explication
Whoo Boy, celui-ci a mis
un temps long à imaginerun peu de puissance cérébrale.Donc, aller au bonus est difficile. Nous avons besoin que les deux contrôlent une seule fois la totalité de la liste et identifient les valeurs sur lesquelles nous avons déjà effectué une itération sans complexité d'espace supplémentaire.
La manipulation de bits résout ces problèmes. Nous initialisons notre
O(1)
«stockage», une paire d’entiers, puis nous parcourons la liste, OU le bit indiqué dans notre premier entier et le stockage du résultat dans le second.Par exemple, si nous
1101
effectuons une opération OR avec10
, nous obtenons1111
. Si nous faisons un autre OU avec10
, nous avons toujours1101
.Ainsi, une fois que nous avons effectué l'opération OR et que nous nous retrouvons avec le même numéro, nous avons trouvé notre duplicata. Aucun doublon dans le tableau ne provoque l'exécution du programme et une exception.
la source
PHP,
56 44 3832 octetsCourez comme ça:
Explication
Tweaks
Complexité
Comme le montre la version commentée du code, la complexité temporelle est linéaire
O(n)
. En termes de mémoire, un maximum den+1
variables sera attribué. Donc c'est çaO(n)
.la source
error_reporting
option au nombre d'octets (ou utiliser-n
, qui est gratuit)./dev/null
, ce qui est la même chose.O(1)
pour plus d'espace? Vous attribuez littéralement une nouvelle variable parn
, qui estO(n)
Java 8,
827876 octetsN'est plus viable,756764 octets ci-dessous en modificationEn tant que fonction lambda:
Peut être probablement beaucoup plus petit, c'était très rapide.
Explication:
*Modifier*
756764 octets utilisant la stratégie de négation:Essayez-le en ligne!
(-3 octets grâce à @Nevay)
Explication:
Boucle sur le tableau, nier pour garder une trace. S'il n'y a pas de dupes, il suffit de lancer une erreur.
Tous deux travaillent sur la complexité en temps O (n) et en espace O (n).
la source
Number
, cari
est unlong
et-1
est unint
.long
, mais pasLong
comme il se doit, pour que le lambda soit attribué à unFunction
. L'avez-vous testé? Quoi qu'il en soit, cette solution peut être remplacée par votre nouvelle.Set s=new HashSet();
pour économiser 7 octets. (De plus, l'importationjava.util.*;
doit toujours être incluse dans le nombre d'octets -> +19 octets.) L'instruction return peut êtrereturn++j
, l'instruction if peut être suppriméea->{int i=0,j;for(;(a[j=Math.abs(a[i++])-1]*=-1)<0;);return++j;}
(-3 octets).Brachylog , 5 octets
Essayez-le en ligne!
Explication
Le préfixe intégré à Adfix
a
répertorie d'abord tous les préfixes par ordre croissant de longueur, puis les suffixes par ordre décroissant. Ainsi, la sortie est produite par le préfixe le plus court qui le permet, le cas échéant. Si un préfixe n'a pas de doublons, le reste du programme échoue car chaque sous-séquence d'éléments égaux a une longueur de 1 et le premier élément de sa queue n'existe pas. Si un préfixe a un élément répété, nous pouvons choisir la sous-séquence de longueur 2 contenant les deux, et le programme renvoie la dernière.la source
a⊇Ċ=h
qui ne porte que sur une longueur de 2 sous-ensembles.C #, 145 octets
Probablement un moyen beaucoup plus court de faire cela en C # avec une simple boucle mais je voulais l'essayer avec Linq.
Essayez-le en ligne!
Version complète / formatée:
la source
Haskell ,
7869 octetsEssayez-le en ligne!
9 octets sauvés grâce à @nimi
Un chemin de base à travers la liste. Si l'élément actuel n'a pas encore été vu (
i<0
) et qu'il est dans la liste d'accumulateur (elem x a
), stockez l'index actuel. Sinon, gardez l'index -1. Dans tous les cas, ajoutez l'élément en cours à la liste des accumulateurs.EDIT : Je n’ai pas lu la question suffisamment attentivement: ce code affiche l’index du deuxième élément d’un élément dupliqué.
la source
\ ... ->(last$i:[j|i<0,elem x a],x:a)
. Aussi: pas besoin de laf=
, car les fonctions sans nom sont autorisées.Python 2,
7165 octetsRenvoie
None
s'il n'y a pas d'élément en doubleEdit: -6 octets grâce à @ musicman523
Essayez-le en ligne!
O (n) complexité temporelle, O (n) complexité spatiale, O (1) espace auxiliaire.
Comme la liste d’entrée utilise O (n) espace, la complexité de l’espace est liée à cela. Ce qui signifie que nous ne pouvons pas avoir une complexité d'espace inférieure à O (n)
Modifie la liste d'origine. Si ce n'est pas autorisé, nous pourrions le faire avec la même complexité avec 129 octets.
Explication
Étant donné que chaque élément est supérieur à 0 et inférieur ou égal à la taille de la liste, la liste a pour chaque élément a, un élément d'indice a - 1 (0 indexé). Nous exploitons cela en disant que si l'élément d'indice i est négatif, nous l'avons déjà vu.
Pour chaque élément a de la liste n, on laisse u négatif la valeur absolue de a. (Nous le laissons négatif car python peut indexer des listes avec des index négatifs, sinon nous aurions besoin de le faire
u=abs(a)-1
) Si l'élément à l'index u dans la liste est négatif, nous l'avons déjà vu et pouvons donc renvoyer -u (pour obtenir le valeur absolue de a, car tous les éléments sont positifs) . Sinon, nous définissons l'élément à l'index u comme négatif, pour nous rappeler que nous avons déjà vu un élément de valeur a.la source
1
etn
, comme c'est le cas, alors cela ne fonctionne évidemment pas.Gelée , 4 octets
Essayez-le en ligne!
Si tous les éléments sont uniques, cela retourne
0
(comportement indéfini).la source