İlk çoğaltılan öğeyi bulun


39

Yalnızca 1 ile a.ongth arasındaki sayıları içeren bir dizi a verildiğinde, ikinci oluşumun minimum dizine sahip olduğu ilk kopya numarasını bulun. Başka bir deyişle, 1'den fazla çoğaltılmış sayı varsa, ikinci oluşumun diğer sayıdan ikinci oluşumundan daha küçük bir dizine sahip olduğu sayıyı döndürün. Böyle bir eleman yoksa, programınız / fonksiyonunuz tanımsız davranışa neden olabilir.

Örnek:

Çünkü a = [2, 3, 3, 1, 5, 2]çıktı olması gerekir firstDuplicate(a) = 3.

2 yineleme vardır: 2 ve 3 sayıları. 3'ün ikinci oluşumu, 2'nin ikinci oluşumundan daha küçük bir dizine sahiptir, bu nedenle cevap 3'tür.

Çünkü a = [2, 4, 3, 5, 1]çıktı olması gerekir firstDuplicate(a) = -1.

Bu , bayt cinsinden en kısa cevap kazanır.

BONUS: O (n) zaman karmaşıklığı ve O (1) ek alan karmaşıklığı ile çözebilir misiniz?


Yorumlar uzun tartışmalar için değildir; bu konuşma sohbete taşındı .
Martin Ender

Yanıtlar:


15

Python 2,34 bayt

O (n 2 ) süre, O (n) boşluk

@Vaultah sayesinde 3 byte kurtarıldı ve @xnor'dan 3 tane daha kaydedildi!

lambda l:l[map(l.remove,set(l))<0]

Çevrimiçi deneyin!


1
lambda l:l[map(l.remove,set(l))<0]Değerlendirme sırası garip olsa bile, işler gibi görünüyor .
xnor

Bu -1'altbilgi kodu' olmadan yinelenen bir dosya bulunmadığında geri dönmez , bu kod baytlara sayılmaz mı? Ben golf kodlamak için yeni, temel bir soru ise üzgünüm!
Chris_Rands

@Chris_Rands Müzisyenin sorusunun altında -1 yerine istisna tamam mı diye sordu ve OP tamam olduğunu söyledi ve müzisyenin cevabı istisna atar.
LiefdeWen

Bunu anlamak biraz zaman aldı. Güzel oynadı. 0 'ı elementi değiştirdikten sonra koşullu kullanmak gerçekten zekice.
Thoth19,

Python, set.remove gibi standart kütüphane fonksiyonlarının zaman ve mekan karmaşıklığını garanti ediyor mu?
Draconis

11

JavaScript (ES6), 47 36 31 25 bayt

ThePirateBay sayesinde 6 bayt kaydedildi

Bir undefinedçözüm yoksa döndürür .

Zaman karmaşıklığı: O (n) :-)
Uzay karmaşıklığı: O (n) :-(

a=>a.find(c=>!(a[-c]^=1))

Nasıl?

Biz yeni olarak kaydederek zaten karşılaştı değerlerin takip özelliklerinin orijinal dizi ait a negatif sayıları kullanarak. Bu şekilde, orijinal girişlere müdahale edemezler.

gösteri


25 bayt:a=>a.find(c=>!(a[-c]^=1))

@PirateBay Ah, elbette. Teşekkürler!
Arnauld,

Sadece JavaScript'teki Nesnelerin karma tablo olarak uygulanmayabileceğini unutmayın. Bazı nesnelerin erişim tuşlarına erişimin zaman karmaşıklığı O (1) olmayabilir.
tsh

6

Mathematica, 24 bayt

#/.{h=___,a_,h,a_,h}:>a&

Mathematica'nın desen eşleştirme özelliği çok harika!

ListGeçersiz girişi için orijinali döndürür .

açıklama

#/.

Girişte, değiştirin ...

{h=___,a_,h,a_,h}

Bir Listönceki 0 veya daha fazla unsurları arasındaki, ve kopyalarda sonra bir yinelenen elemanı ile ...

... :>a

Yinelenen eleman ile.


6

Jöle , 5 bayt

Ṛœ-QṪ

Çevrimiçi deneyin!

Nasıl çalışır

Ṛœ-QṪ  Main link. Argument: A (array)

Ṛ      Yield A, reversed.
   Q   Unique; yield A, deduplicated.
 œ-    Perform multiset subtraction.
       This removes the rightmost occurrence of each unique element from reversed
       A, which corresponds to the leftmost occurrence in A.
    Ṫ  Take; take the rightmost remaining element, i.e., the first duplicate of A.

œ-en sağdaki olayları siler mi? TIL
Outgolfer Erik,

Bu -1hiçbir yinelenen için dönüş gibi görünmüyor . OP'ye göre bir istisna atmak tamamdır, ancak 0aralıkta olmasa da emin değilim .
Outgolfer Erik,


4

Jöle , 6 bayt

xŒQ¬$Ḣ

Çevrimiçi deneyin!

İlk kopyayı ya da kopya yoksa 0'ı döndürür.

açıklama

xŒQ¬$Ḣ  Input: array M
    $   Operate on M
 ŒQ       Distinct sieve - Returns a boolean mask where an index is truthy
          for the first occurrence of an element
   ¬      Logical NOT
x       Copy each value in M that many times
     Ḣ  Head

Böyle kullanımı indeksleme golfier var: ŒQi0ị.
Outgolfer Erik,

Hiçbir çiftleri varsa @EriktheOutgolfer, i0nerede, 0 döneceğini endeksi olur ve 0. yerine girdi son değeri döndürmek
mil

4

Japt , 7 bayt

æ@bX ¦Y

Çevrimiçi test edin!

açıklama

 æ@   bX ¦ Y
UæXY{UbX !=Y}  Ungolfed
               Implicit: U = input array
UæXY{       }  Return the first item X (at index Y) in U where
     UbX         the first index of X in U
         !=Y     is not equal to Y.
               In other words, find the first item which has already occured.
               Implicit: output result of last expression

Alternatif:

æ@¯Y øX

Çevrimiçi test edin!

açıklama

 æ@   ¯ Y øX
UæXY{Us0Y øX}  Ungolfed
               Implicit: U = input array
UæXY{       }  Return the first item X (at index Y) in U where
     Us0Y        the first Y items of U (literally U.slice(0, Y))
          øX     contains X.
               In other words, find the first item which has already occured.
               Implicit: output result of last expression

4

Pyth, 5 bayt

h.-Q{

Test odası

Q içindeki her öğenin ilk görünümünü Q'dan kaldırın, ardından ilk öğeyi döndürün.


@LuisMendo Tamam, teşekkürler. Karışıklık yarattığım için üzgünüm, okumayı öğrenmeliyim ...
Mr. Xcoder

@ Mr.Xcoder Hayır, OP'nin suçu. Bu bilgi metninde yazılı olmalıdır, ancak sadece yorumda
Luis Mendo

4

Dyalog APL, 27 24 20 19 13 12 11 bayt

⊢⊃⍨0⍳⍨⊢=⍴↑∪

Şimdi v16'ya bağlı olmayacak şekilde değiştirildi! Çevrimiçi deneyin!

Nasıl? ( N girişi ile )

  • ⊢⊃⍨...- Bu endekste N :
    • ⍴↑∪- N kopyaları kaldırılmış, N0 sığacak şekilde sağ yastıklı N
    • ⊢=- N ile element-akıllı eşitlik
    • 0⍳⍨- İlk dizini 0. '

neyse, soruyu yanlış anladım. Ancak yetersiz test vakaları ...
Uriel

Yanıltıcı olduğum için üzgünüm, soruyu da yanlış anladım.
mil,

Bana 36 bayt gibi geldi.
Adám

Aman Tanrım, iota underbar içeride değil ⎕AVmi?
Zacharý

@ Zacharý Right, Classic ⎕U2378 yüklerken çevirir . Çevrimiçi deneyin!
Adám

3

Python 3 , 94 92 bayt

O (n) süre ve O (1) ekstra bellek.

def f(a):
 r=-1
 for i in range(len(a)):t=abs(a[i])-1;r=[r,i+1][a[t]<0>r];a[t]*=-1
 return r

Çevrimiçi deneyin!

Algoritmanın kaynağı .

açıklama

Algoritmanın temel fikri, her bir eleman arasında soldan sağa doğru koşmak, ortaya çıkan sayıları takip etmek ve daha önce ortaya çıkmış bir sayıya ulaştığında sayıyı geri döndürmek ve her bir öğeyi geçtikten sonra -1 döndürmektir.

Ancak, fazladan bellek kullanmadan ortaya çıkan sayıları kaydetmek için akıllıca bir yol kullanır: Sayılarla indekslenen öğenin işareti olarak saklamak için. Örneğin, bu gerçeği temsil edebilir 2ve 3halihazırda sahip olarak ortaya çıkmıştır a[2]ve a[3]dizi 1 endeksli ise, olumsuz.


Bu i, [i]> n'nin neresinde olabilir?
Downgoat

@Downgoat soruyu tekrar okudu.
Leaky Nun

Soru bir 1uzunluğa diyor ama bir [i] = a uzunluğuna göre bu sınırların dışına çıkmaz mı?
Downgoat

@Downgoatt=abs(a[i])-1=a.length-1
Leaky Nun


3

Perl 6 , 13 bayt

*.repeated[0]

Dene


açıklama

  • Bu *bir Terim konumunda olduğundan tüm deyim bir WhateverCode lambda'dır.

  • .repeatedHer değeri sonuçları, her bir değer görüldü ilk kez hariç olduğu bir yöntemdir.

    say [2, 3, 3, 3, 1, 5, 2, 3].repeated.perl; # (3, 3, 2, 3).Seq
    #   (      3, 3,       2, 3).Seq
  • [0]sadece Sıradaki ilk değeri döndürür .
    Değer yoksa Nil döner .
    ( Nil , Arıza türlerinin temelidir ve tüm türlerin kendi tanımsız değerleri vardır, bu nedenle Nil , diğer birçok dilde tanımsız bir değerden farklıdır)


Not o yana uygulanması.repeated bir üretir Seq Eğer bir değere istemek kadar herhangi bir işi başlamaz araçlarının ve sadece yeterli çalışma Ne istediğine üretmek için yok.
Dolayısıyla  , ikinci değer birincinin tekrarı ise , en kötü O (n)  zaman karmaşıklığına ve en iyi ihtimalle O (2) zaman karmaşıklığına sahip olduğunu söylemek kolay olacaktır .
Benzer muhtemelen bellek karmaşıklığı söylenebilir.


3

APL (Dyalog) , 20 bayt

n/⍨(,≢∪)¨,\n←⎕,2⍴¯1

Çevrimiçi deneyin!

2⍴¯1 bir negatif r uzunluğu iki liste halinde eshaped

⎕, girdi almak (anımsatıcı: konsol kutusu) ve buna hazırlanın

n← bunu n olarak sakla

,\n  önekleri (lit. kümülatif bitiştirme)

( Her önek için aşağıdaki tacit işlevini uygulayın

, [bir] ravel (sadece önek bir liste olmasını sağlar)

 dan farklı

 benzersiz öğeler [?] (yani önekde çoğaltmalar var mı?)

n/⍨n'yi  filtrelemek için kullanın (bir yinelemenin bulunduğu ilk öğeye kadar tüm öğeleri kaldırır)

 ondan ilk elemanı seç


Vay canına, üç kez dövüldün. Yine de +1. Ve bunun nasıl çalıştığına dair bir açıklama ekleyebilir misiniz?
Zacharý

@ Zacharý Görünüşe göre sadece topu almak için gerekli. Hadi bakalım.
Adám

@ Zacharý Sonunda hepsini yenmeyi başardım .
Adám

3

APL (Dyalog) , 11 bayt

Gereğince yeni kurallar hiçbir çiftleri varsa, hata verir.

⊢⊃⍨⍬⍴⍳∘≢~⍳⍨

Çevrimiçi deneyin!

⍳⍨ Her elementin ilk oluşum endeksleri

~ dan silindi

⍳∘≢ tüm endekslerin

⍬⍴ Bunu bir skalaya yeniden şekillendirin (eğer veri mevcut değilse sıfır verir)

⊃⍨ almak için kullanın (sıfır hata verir)

 argüman


Evet, kurallar değiştiğinde, elbette hepsini yenebilirsin!
Zacharý

Ben seni bağladım.
Zacharý,

3

APL, 15

{⊃⍵[(⍳⍴⍵)~⍵⍳⍵]}

Yinelenen bir şey olmadığında -1 yerine 0 değerini verebiliriz gibi görünüyor (yorum için Adám'a teşekkürler). Yani 3 bayt daha az.

Bir açıklama:

⍵⍳⍵         search the argument in itself: returns for  each element the index of it's first occurrence
(⍳⍴⍵)~⍵⍳⍵   create a list of all indexes, remove those found in ⍵⍳⍵; i.e. remove all first elements
⊃⍵[...]     of all remaining elements, take the first. If the array is empty, APL returns zero

Başvuru için, eski çözüm sonunda listeye -1 ekledi, yani liste boş bırakılırsa, bunun yerine -1 içerecekti ve ilk eleman -1 olacaktı.

{⊃⍵[(⍳⍴⍵)~⍵⍳⍵],¯1}

Tryapl.org'da deneyin


Bunun yerine sıfır döndürebilirsiniz¯1 , öyle {⊃⍵[(⍳⍴⍵)~⍵⍳⍵]}olmalıdır.
Adám

3

Retina , 26 24 bayt

1!`\b(\d+)\b(?<=\b\1 .*)

Çevrimiçi deneyin! Explanation: \b(\d+)\bsırayla her numarayla eşleşiyor ve ardından gözbebeki sayının kopya olup olmadığını görmek için bakıyor; 1st ise, eşleşme !sayısı yerine çıktıdır. Maalesef ilk önce gözbebekini takmak işe yaramıyor gibi görünüyor, aksi takdirde birkaç bayt kurtarır. Düzenleme: Eşleşmedeki -1dönüş değerine uyması için 7 bayt eklendi . @ Martininder sayesinde 2 bayt kaydedildi.


2
Kayıt için, arama geriye dönüşü olmayacak. Daha önce koymayı denerseniz bu çalışmasını önler. Bu hatayı birçok kez yaptım ve Martin her zaman beni düzeltti.
FryAmTheEggman

Bir gözbebek yerine bir gözetleme kullanarak 30 bayt aldım. Ayrıca, kurallar artık geri dönmene gerek olmadığını söylüyor -1.
Value Ink

@ValueInk Ancak bu test durumu için doğru cevap 3 ...
Neil

OH. Mücadeleyi yanlış okudum, boğmaca
Value Ink

2

MATL , 8 bayt

&=Rsqf1)

Yinelenen bir dosya yoksa, hata verir (çıktı olmadan).

MATL Online'da deneyin !

açıklama

&=   % Implict input. Matrix of all pairwise equality comparisons
R    % Keep the upper triangular part (i.e. set lower part to false)
s    % Sum of each column
q    % Subtract 1
f    % Indices of nonzero values
1)   % Get first. Gives an error is there is none. Implictly display

2

R, 34 bayt

c((x=scan())[duplicated(x)],-1)[1]

@Djhurio tarafından verilen cevaptan bir kaç karakter kesin, yorum yapmak için yeterli itibarınız yok.


oh ... Bu cevabı görmedim; Bu, eksik değerler gerektiğinde önceki teknik özellikler için iyidir, -1ancak yeni teknik özelliklerle daha da golf oynamayı başardım. Bu hala sağlam ve onun yapma biçiminden farklı bir yaklaşım, bu yüzden size bir + 1 vereceğim!
Giuseppe

2

J, 17 16 bayt

(*/{_1,~i.&0)@~:

Nasıl?

(*/{_1,~i.&0)@~:

             @~: returns the nub sieve which is a vector with 1 for the first occurrence of an element in the argument and 0 otherwise

        i.&0     returns the first index of duplication

    _1,~         appends _1 to the index

 */              returns 0 with duplicates (product across nub sieve)

     {           select _1 if no duplicates, otherwise return the index

2

R , 28 bayt

(x=scan())[duplicated(x)][1]

Çevrimiçi deneyin!


NASpesifikasyon değiştiğinden , artık eksik değerler için geri dönebileceğinizi düşünüyorum ; bu yüzden (x=scan())[duplicated(x)][1]geçerli.
Giuseppe

2

J , 12 bayt

,&_1{~~:i.0:

Çevrimiçi deneyin!

açıklama

,&_1{~~:i.0:  Input: array M
      ~:      Nub-sieve
          0:  The constant 0
        i.    Find the index of the first occurrence of 0 (the first duplicate)
,&_1          Append -1 to M
    {~        Select the value from the previous at the index of the first duplicate

2

Dyalog APL Classic, 18 karakter

Sadece işe yarıyor ⎕IO←0.

     w[⊃(⍳∘≢~⍳⍨)w←¯1,⎕]

Öngörülen "-1" olan ve nub listesinin indekslerini içeren argüman öğelerinin indeks listesinden çıkar ve kalanların ilkini seç. Kaldırma işleminden sonra sadece boş bir vektör kalırsa, ilk elemanı istenen -1'i üreten genişletilmiş argümanı indekslemek için kullanılan tanım 0'dır.


Um ... rastgele önde gelen boşlukların nesi var? Bir bayt beni alt ettiğim için +1 .
Zacharý

Geri dönmek yerine bir hata atabilir¯1 , böylece kaldırabilir ¯1,ve kullanabilirsiniz ⎕IO←1.
Adám


2

Java (OpenJDK 8) , 65 117 109 bayt

Önceki 65 baytlık çözüm:

r->{for(int a,b=0,z,i=0;;b=a)if((a=b|1<<(z=r[i++]))==b)return z;}

Yeni çözüm 19 bayt dahilimport java.math.*;

@Nevay sayesinde -8 bayt

r->{int z,i=0;for(BigInteger c=BigInteger.ZERO;c.min(c=c.setBit(z=r[i++]))!=c;);return z;}

Çevrimiçi deneyin!

Düzenle

Orijinal programımdaki algoritma iyiydi, ancak kullanılan veri tipinin statik büyüklüğü, boyut belirli bir eşiğin üzerine çıktığında oldukça hızlı bir şekilde kırıldığı anlamına geliyordu.

Programın hafıza sınırını arttırmak için hesaplamada kullanılan veri tipini değiştirdim BigInteger( intveya yerine rastgele kesinlik için kullanmak long). Bununla birlikte, bu durumun O(1)uzay karmaşıklığı olarak sayılıp sayılmadığını tartışılabilir kılar .

Açıklamamı aşağıda tam olarak bırakacağım, ancak şimdi O(1)bazı varsayımlar yapmadan uzay karmaşıklığına ulaşmanın imkansız olduğuna inanıyorum .

Kanıt

NÖyle bir tamsayı olarak tanımlayın 2 <= N.

Kısıtlamanın olduğu Sbir dizi rasgele tamsayıyı temsil eden bir liste olsun .[x{1}, ..., x{N}]x{i}1 <= x{i} <= N

Her öğe için tam olarak bir kez bu listeyi yinelemek için gereken zaman karmaşıklığı (Big-O notasyonunda) O(n)

Verilen zorluk, listedeki ilk kopyalanan değeri bulmaktır. Daha spesifik Solarak, listedeki bir önceki öğenin kopyası olan ilk değeri arıyoruz .

Bu ve listede iki elementin pozisyonları olsun pve olsun . Mücadelemiz , bu koşulları karşılayan en küçüğü bulmak olur .qp < qx{p} == x{q}q

Bu soruna açık olan yaklaşım S ile yineleme yapmak ve x{i}başka bir listede var olup olmadığımızı kontrol etmektir T: Eğer x{i}yoksa T, içinde saklıyoruz T. Eğer x{i}mevcut değil T, bu nedenle ilk yinelenen değer ve küçüğüdür qve bu nedenle biz geri ver. Bu alan verimliliği O(n).

Zaman karmaşıklığını O(1)korurken alan karmaşıklığını elde etmek için O(n), her nesne hakkında benzersiz bilgiyi sınırlı bir alanda saklamamız gerekir. Bu nedenle, herhangi bir algoritmanın gerçekleştirebileceği tek yolO(1)boşluk karmaşıklığı şöyledir: 1. N, belirli bir sonlu veri türü için mümkün olan maksimum değer sayısını saklamak için gereken belleğe karşılık gelen bir üst sınır verilir. 2. Tek bir değişmez değişkenin yeniden atanması karmaşıklığa karşı sayılmaz, sadece değişkenlerin sayısı (bir liste birden fazla değişkendir). 3. (Diğer cevaplara dayanarak) Liste (veya en azından listenin elemanları) değişkendir ve listenin veri türü, listedeki öğelerde değişiklik yapılmasını sağlayan imzalı bir tamsayı olarak önceden ayarlanmıştır. ek bellek kullanmadan.

1 ve 3'ün her ikisi de veri türü hakkında varsayımlar ve spesifikasyonlar gerektirirken, 2 bu değişkenlerin büyüklüğü yerine alan karmaşıklığının hesaplanması için sadece değişkenlerin sayısının dikkate alınmasını gerektirir. Bu varsayımların hiçbiri kabul edilmezse, hem O(n)zaman karmaşıklığına hem de O(1)mekan karmaşıklığına ulaşmak imkansız olacaktır .

açıklama

Kim çocuğum, bu biraz beyin gücü düşünmek için çok utanç verici bir zaman aldı .

Bu yüzden bonusu almak zordur. Biz de tam olarak listenin tamamının üzerinde çalışmasına gerek ve biz zaten ek alan karmaşıklığı olmadan iterated ettik değerleri iz.

Bit manipülasyon bu sorunları çözer. O(1)Bir çift tamsayı olan 'depolamamızı' başlattıktan sonra listeyi yineledik, ith bitini ilk tamsayıya yerleştirip ikincisini sakladık.

Mesela 1101bizde bir VEYA işlemi gerçekleştirirsek 10, anlıyoruz 1111. Başka bir VEYA ile 10yaparsak, yine de sahibiz 1101.

Ergo, OR işlemini yaptığımızda ve aynı numara ile bittikten sonra, kopyamızı bulduk. Dizideki hiçbir kopya, programın çalışıp bir istisna atmasına neden olmaz.


Ayrıca, ikinci sınavınız 100 sayısını içeriyor, fakat dizinin kendisi sadece 5 uzun olduğundan bu mümkün değil
SchoolBoy

Ayrıca, bir int yeterli depolama alanına sahip olmadığından bu başarısız olur.
SchoolBoy

@ OkulBoy İyi yakala. Tek sorunum, dizinin büyüklüğünde herhangi bir üst sınır bulunmaması, bu yüzden bellek sorunlarını çözmek için kodumu gerçekçi bir şekilde değiştiremem.
Xanderhall

@ Xanderhall Doğru, ama 32 gibi hissediyorum (veya uzun, 64 kullanıyorsanız) sayılar çok az: p. Her iki durumda da, girişe bir sınır koyma ve ardından gereken maksimum belleği ayırma ve onu O (1) bellek olarak adlandırma sadece bir hiledir. Bu hala O (n) 'dir, çünkü eğer girişin boyutu artarsa, bu üst hafızaya bağlanır. Bu yüzden O (n) O (1) algoritması yaratmanın imkansız olduğunu düşünüyorum
SchoolBoy

@Xanderhall PS 65'ine yaklaşıyorum, 67 byte'dayım: p
SchoolBoy

2

PHP, 56 44 38 32 bayt

for(;!${$argv[++$x]}++;);echo$x;

Bu şekilde koş:

php -nr 'for(;!${$argv[++$x]}++;);echo$x;' -- 2 3 3 1 5 2;echo
> 3

açıklama

for(
  ;
  !${                 // Loop until current value as a variable is truthy
    $argv[++$x]       // The item to check for is the next item from input
  }++;                // Post increment, the var is now truthy
);
echo $x;              // Echo the index of the duplicate.

Düzenlemeler

  • Bir dizi yerine değişkenler kullanarak 12 bayt kaydedildi
  • Eşleşme olmadığı zaman için "tanımsız davranış" kuralını kullanarak 6 bayt kurtarıldı.
  • Her döngüden sonra 1 olarak ayarlamak yerine artım sonrası kullanılarak 6 bayt kaydedildi

karmaşa

Kodun yorumlanan versiyonundan da anlaşılacağı gibi, zaman karmaşıklığı doğrusaldır O(n). Hafıza açısından, maksimum n+1değişken atanacaktır. Yani bu O(n).


Tuhaf bir kodlama kullanmadığınız için teşekkürler. Ancak, error_reportingseçeneği bayt sayımına eklemelisiniz (veya kullanımı -nücretsiz).
Titus

Daha önce burada bulunduk. PHP bildirimleri ve uyarıları dikkate alınmaz. Onları aynı şekilde boruya çekebilirim /dev/null.
17'de

Yanlış yorumları hatırlama eğilimindeyim. :) Bu O (n) değil mi?
Titus

Evet, doğrusal
ağustos

Bu O(1)ilave alan için nasıl ? Kelimenin tam anlamıyla n, başına yeni bir değişken O(n)
atarsınız

2

Java 8, 82 78 76 bayt Artık uygun değil, düzenlemede 75 67 64 bayt

Bir lambda işlevi olarak:

a->{Set<Long>s=new HashSet<>();for(long i:a)if(!s.add(i))return i;return-1;}

Muhtemelen çok daha küçük yapılabilir, bu çok hızlıydı.

Açıklama:

a->{                                //New lambda function with 'a' as input
    Set<Long>s=new HashSet<>();     //New set
    for(long i:a)                   //Iterate over a
        if(!s.add(i))               //If can't add to s, already exists
            return i;               //Return current value
        return-1;                   //No dupes, return -1
}

*Düzenle*

Olumsuzlama stratejisini kullanarak 75 67 64 bayt:

a->{int i=0,j;while((a[j=Math.abs(a[i++])-1]*=-1)<0);return++j;}

Çevrimiçi deneyin!

(@Nevay sayesinde -3 bayt)

Açıklama:

a->{                                         //New lambda expression with 'a' as input
    int i=0,j;                               //Initialise i and declare j
    while((a[j=Math.abs(a[i++])-1]*=-1)<0);  //Negate to keep track of current val until a negative is found
    return++j;                               //Return value
}

Dizi üzerinde döngü kurar, takip etmeyi reddeder. Eğer sıfır yoksa, sadece çalışır ve bir hata atar.

Her ikisi de O (n) zamanı ve O (n) uzay karmaşıklığı üzerinde çalışır.


Bunun bir lambda dönüşüne atanması gerektiğine dikkat çekiyor Number, çünkü ia longve -1bir int.
Jakob

@Jakob Gerekli değil, -1 bir int olmak, oyuncu kadrosunu açıkça belirtmeden otomatik olarak uzun süre kullanılacaktır
SchoolBoy

Lambda a atanacak şekilde örtük olarak long, ancak gerektiği Longgibi döküm olacaktır Function. Test ettin mi? Ne olursa olsun, bu çözüm yenisiyle değiştirilebilir.
Jakob

Set s=new HashSet();7 bayt kaydetmek için ham türleri kullanabilirsiniz . (Ayrıca: afaik'in ithalatının java.util.*;bayt sayısı -> +19 bytes'a dahil edilmesi gerekir.) Dönüş ifadesi olabilir return++j, if-ifadesi kaldırılabilir a->{int i=0,j;for(;(a[j=Math.abs(a[i++])-1]*=-1)<0;);return++j;}(-3 bayt).
Nevay

2

Brachylog , 5 bayt

a⊇=bh

Çevrimiçi deneyin!

açıklama

a⊇=bh  Input is a list.
a      There is an adfix (prefix or suffix) of the input
 ⊇     and a subsequence of that adfix
  =    whose elements are all equal.
   b   Drop its first element
    h  and output the first element of the rest.

Eklenti yerleşimi aönce tüm önekleri artan uzunluk sırasına göre sıralar, ardından azalan uzunluk sırasına ekler. Bu nedenle çıktı, varsa izin veren en kısa ön ek tarafından üretilir. Bir önekde hiçbir kopya yoksa, programın geri kalanı bunun için başarısız olur, çünkü eşit elemanların her bir sırası 1 uzunluğa sahiptir ve kuyruğunun ilk elemanı yoktur. Bir önekde tekrarlanan bir eleman varsa, her ikisini de içeren uzunluk-2 sırasını seçebiliriz ve program ikincisini döndürür.


Başka bir 5 baytlık çözüm: a⊇Ċ=hyalnızca uzunluk-2 altkümesine bakar.
Aralık’ta

1

C #, 145 bayt

using System.Linq;a=>{var d=a.Where(n=>a.Count(t=>t==n)>1);return d.Select((n,i)=>new{n,i}).FirstOrDefault(o=>d.Take(o.i).Contains(o.n))?.n??-1;}

Muhtemelen C # 'da basit bir döngü ile bunu yapmanın çok daha kısa bir yoludur ama Linq ile denemek istedim.

Çevrimiçi deneyin!

Tam / Biçimli sürüm:

namespace System.Linq
{
    class P
    {
        static void Main()
        {
            Func<int[], int> f = a =>
            {
                var d = a.Where(n => a.Count(t => t == n) > 1);
                return d.Select((n, i) => new { n, i }).FirstOrDefault(o => d.Take(o.i).Contains(o.n))?.n ?? -1;
            };

            Console.WriteLine(f(new[] { 2, 3, 3, 1, 5, 2 }));
            Console.WriteLine(f(new[] { 2, 4, 3, 5, 1 }));

            Console.ReadLine();
        }
    }
}

İşte basit döngü versiyonu. Ama Linq versiyonunu daha çok seviyorum.
LiefdeWen

@LiefdeWen Bir cevap olarak gönderin :) Genellikle Linq'i daha çok sevmeme rağmen :) Linq ile daha kısa elde etmek mümkün olabilir, ama şimdi eminim.
TheLethalCoder

Hayır, bu soru aşırı doludur ve bu soruya oy vermenizi tercih ederim
LiefdeWen

1

Haskell , 78 69 bayt

 fst.foldl(\(i,a)(j,x)->(last$i:[j|i<0,elem x a],x:a))(-1,[]).zip[1..]

Çevrimiçi deneyin!

@Nimi sayesinde 9 bayt kaydedildi

Listede temel bir yol. Geçerli öğe henüz görülmediyse ( i<0) ve akümülatör listesinde ( elem x a) ise, geçerli dizini saklayın. Aksi takdirde, -1 dizinini koru. Her durumda, geçerli öğeyi akümülatör listesine ekleyin.

EDIT : Soruyu yeterince dikkatlice okumadım: bu kod bir kopya elemanın ikinci elemanının indeksini çıkarır.


Sen kullanabilirsiniz "Shorter şartlı" Bizim dan "Haskell golf için ipuçları" : \ ... ->(last$i:[j|i<0,elem x a],x:a). Ayrıca: f=Adsız işlevlere izin verildiğinden, buna gerek yok .
nimi

@nimi bahşiş için teşekkürler!
jferard,

1

Python 2, 71 65 bayt

NoneYinelenen öğe yoksa döndürür

Düzenleme: -6 bayt @ musicman523 sayesinde

def f(n):
 for a in n:
	u=-abs(a)
	if n[u]<0:return-u
	n[u]=-n[u]

Çevrimiçi deneyin!

O (n) zaman karmaşıklığı, O (n) alan karmaşıklığı, O (1) yardımcı alan.

Giriş listesi O (n) boşluğu kullandığından , boşluk karmaşıklığı buna bağlıdır. Yani O (n) ' den daha düşük bir alan karmaşıklığına sahip olamayız.

Orijinal listeyi değiştiriyor mu, eğer izin verilmezse, 129 byte ile aynı karmaşıklıkta yapabiliriz.

açıklama

Her öğe 0'dan büyük ve listenin boyutuna eşit veya ondan daha küçük olduğundan, liste her öğe için a - 1 (0 dizinlenmiş) dizininde bir öğe içerir. Bunu, i indeksindeki eleman negatifse daha önce gördüğümüzü söyleyerek sömürüyoruz.

N listesindeki her eleman için, a'nın mutlak değerini negatif olarak verelim. (Biz bunu olumsuz endeksleri ile piton kutu endeksi listelerinde beri negatif olalım ve biz başka türlü yapmak gerekir u=abs(a)-1 ) listesinde indeksi u eleman negatif, bunu daha önce de gördük edilirse ve bu nedenle -u dönebilirsiniz almak için ( Tüm elemanlar pozitif olduğu için a'nın mutlak değeri) . Aksi takdirde, daha önce bir değer elementi gördüğümüzü hatırlamak için u indeksindeki elementi negatif olarak ayarladık.


İyi iş! 65 bayt
musicman523

Bunun bellekte O (1) olduğundan emin misin ? Hangi işaretlerin önceden ziyaret edildiğini, işaretler içinde olmasına rağmen, hala n bit bellek kullanıyorsunuz . Bana öyle geliyor ki , kılık değiştirmiş O (n)
Buğday Sihirbazı

Teknik olarak bu, O (n) alanını kullanır - n işareti bit. Dizi sadece 1ve değerleri arasındaki değerleri tutabiliyorsa n, o zaman belli ki çalışmaz.
Oliver Ni

Bu gerçekten sadece sayılar için seçtiğiniz gösterime gelir. İmzasız sayılar kullanılıyorsa, bu O (n) yardımcı alandır. İmzalı sayılar kullanılıyorsa, işaret biti zaten oradadır, yani O (1) yardımcı alan.
Halvard Hummel

Orada seninle aynı fikirdeyim. Ben şahsen , işaret biti kullanmadığınız sürece, işaretli tamsayıları kullanarak kaydırmanıza izin verecektim , bu, sistemin teknik özellikleri değil algoritması ile ilgili olmalı. Tabi bu işareti kullanacaksanız, onları saymanız gerektiğini düşünüyorum. Bence bu cevap oldukça zekice. Bugün oylar bıraksaydım, oy kullanmaya karşı oy kullandım.
Buğday Sihirbazı

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