Geri alma sayma algoritması


14

Saymayı öğrenen çocuklar genellikle sayı dizilerini bilir, ancak bu dizileri düzgün bir şekilde bir araya getiremezler.

Örneğin, şöyle diyebilirler:

1,2,3,4,7,8,9,10

Bazen çocuklar bazı sayıları atladıklarını fark eder ve geri döner:

1,2,3,4,7,8,5,6,7,8,9,10

Bu açıkça üstün kalıptır. Onları tanımlamamız gerekiyor.

Bu listeleri tanımlamak için:

  1. Listenin minimum Mve maksimum Ndeğerlerini belirliyoruz

  2. Listede ilerliyoruz. Geçerli sayı, sağındaki listenin herhangi bir üyesinden büyük veya ona eşitse, geçerli sayıyı kaldırırız.

  3. Kalan listede - arasındaki tüm sayıları içeriyorsa, Mdoğru Nbir değer döndürürüz.

Giriş listenizde en az 1 öğe bulunduğunu varsayabilirsiniz. Tüm tamsayıların negatif olmayacağını varsayabilirsiniz.

Test senaryoları:

Doğru:

0
10
0 0 0 
1 0 1
0 1 2 3 4 5 6 7 8 9 10
0 1 2 3 0 1 2 3
0 1 2 3 4 5 5
0 1 1 2 2 3
0 3 6 1 4 7 2 5 8 3 4 5 6 7 8
1 3 5 7 2 3 4 5 6 7
5 6 0 1 2 3 6 7 4 5 6 7
5 6 7 8
5 5 6 7 8
4 6 7 8 3 4 5 6 7 8

Falsy:

1 0
4 3 2 1
1 2 3 7 8 9
0 1 2 3 1 3
0 1 2 3 1 3 4
0 1 2 3 1 3 2 4
0 1 2 3 1 3 2 4 3
1 3 5 7 2 4 6 8
0 1 2 1 3 4 5 6
4 5 6 3 4 5

Bu , bu yüzden cevaplarınızı mümkün olduğunca kısa yapın!


Çok net değil: [0,1,2,3,4,5,4,3,2,1] doğru mu yanlış mı olmalı?
GB

1
@GB Yanlış. İkinci öğe üzerindeyken, 2. adımda kaldırabilirsiniz (çünkü daha 1sonra başka bir satır daha vardır ). Ayrıca, (son 1 hariç) her eleman çıkarmak istiyorum böylece ile bitirmek istiyorum 0 1olmadığı,0 1 2 3 4 5
Nathan Merrill

Yanıtlar:


6

05AB1E , 5 bayt

Bunun işe yaradığından% 100 emin değilim, ancak tüm test örneklerini geçiyor ve başarısız olduğu bir durum bulamadım.

Ú¥1QP

Çevrimiçi deneyin!

Ú¥1QP   Main link. Argument a
Ú       Reverse uniquify a, keeps only last occurence of each element
 ¥      Get all deltas - all 1 if ascending list
  1Q    Compare all deltas to 1
    P   Product of all results

7 bayt, aslında
val diyor Reinstate Monica

2
@val No, 05AB1E, 05AB1E özel kodlaması kullanır.
Outgolfer Erik

2

Jöle , 10 9 bayt

ṀrṂɓṚ«\Q⁼

Çevrimiçi deneyin!

Nasıl çalışır

ṀrṂɓṚ«\Q⁼  Main link. Argument: A (array)

Ṁ          Yield the maximum of A.
  Ṃ        Yield the minimum of A.
 r         Yield R := [max(A), ... min(A).
   ɓ       Begin a new chain. Left argument: A. Right argument: R
    Ṛ      Reverse A.
     «\    Take the cumulative minimum.
       Q   Unique; deduplicate the results.
        ⁼  Compare the result with R.

İlginç, ɓnispeten yeni bir özellik mi?
ETHproductions

Evet, Jonathan Allan tarafından yapılan bir çekme talebinden.
Dennis

Aha, 13 gün önce. Henüz kullanılmış olsa görmemişti (belki sen ya da Jonathan var ve ben sadece özledim).
ETHproductions

Burada asıl ilginç olan «\nokta bence.
Outgolfer Erik



1

PHP , 148130 bayt

-18 bayt, teşekkürler @Christoph

$a=explode(' ',$argn);$b=range(min($a),max($a));foreach($a as$i=>&$k)for(;++$i<count($a);)$k<$a[$i]?:$k=-1;echo!array_diff($b,$a);

Çevrimiçi deneyin!


Burada yorum yapmak çok şey var: $argnher zaman bir dize üzerinde foreachçalışmıyor. $argvBir diziyi giriş olarak almak için kullanabilirsiniz , ancak her zaman ilk öğe olarak dosya adını içerdiğine dikkat edin. Sen kullanmak $mve $nsadece bu kez oluştururken bayt bir çok kaydedebilirsiniz $bönceki: $b=range(min($a),max($a));. Oyuncular (bool)tamamen gereksiz. if($k>=$a[$s])$a[$i]=null;için $k<$a[$s]?:$a[$i]=-1;. : Bunu yapabilmemiz referansı kullanarak foreach($a as$i=>&$k)(1 bayt) ve $a[$i]karşı $k(-4 byte). Üstelik bu düşmemize izin veriyor, $s=$içünkü $işimdi doğrudan tekrarlayabiliriz .
Christoph

Sonuç şöyle görünür $a=$argn;$b=range(min($a),max($a));foreach($a as$i=>&$k)for(;++$i<count($a);)$k<$a[$i]?:$k=-1;echo!array_diff($b,$a);(117 bayt). Ama yine $argnde yanlış kullanıyor . $a=explode(' ',$argn);13 ek bayt için bunu düzeltir.
Christoph

1
Sorun değil ! Her zaman yeni bir PHP golfçü bulmak güzel Umarım daha fazla görmeyi umuyoruz :) Ya Titus, Jörg ya da ben her zaman yardım etmek için varız!
Christoph

1
@Christoph Neden $_GETGiriş dizisi olarak kullanılmıyor ? Bu durumda explode, $bdeğişkeni kullanmak için ek -6 bayt kullanmaya gerek yoktur
Jörg Hülsermann

1
@Christoph Tamam Bu durumda 7.1 altında bir Sürüme ihtiyacımız var ve ~ çevrimiçi deneyin
Jörg Hülsermann

1

Java 8, 264 262 bayt

import java.util.*;l->{int m=Collections.max(l),n=Collections.min(l),i=0,q;for(;i<(q=l.size());i++)if(l.subList(i+1,q).size()>0&&l.get(i)>=Collections.min(l.subList(i+1,q)))l.remove(i--);for(i=0;n<=m;)if(i<l.size()&&l.get(i++)==n)n++;else return 0>1;return 1>0;}

Açıklama:

Burada deneyin.

import java.util.*;                 // Import for Collections

l->{                                // Method with integer-ArrayList parameter and boolean return-type
  int m=Collections.max(l),         //  Max of the list
      n=Collections.min(l),         //  Min of the list
      i=0,q;                        //  Two temp integers
  for(;i<(q=l.size());i++)          //  Loop (1) over the list
    if(l.subList(i+1,q).size()>0    //   If the sublist right of the current item is not empty
    &&l.get(i)>=Collections.min(l.subList(i+1,q))) 
                                    //   and if the current item is larger or equal to the lowest value of this sublist
      l.remove(i--);                //    Remove the current item from the main list
                                    //  End of loop (1) (implicit / single-line body)
  for(i=0;n<=m;)                    //  Loop (2) from min to max
    if(i<l.size()                   //   If the current item doesn't exceed the list's size
    &&l.get(i++)==n)                //   and the items are in order so far
      n++;                          //    Go to the next item
    else                            //   Else:
      return 0>1;//false            //    Return false
                                    //  End of loop (2) (implicit / single-line body)
  return 1>0;//true                 //  Return true
}                                   // End of method

1

R, 88 85 bayt

y=NULL;for(i in x<-scan())if(all(i<x[-(1:(F<-F+1))]))y=c(y,i);all(min(x):max(x)%in%y)

Bu muhtemelen daha da aşağı golf edilebilir. Öğelerinin üzerindeki döngüler x, yaklaşan tüm değerlerin daha büyük olup olmadığını denetler ve yalnızca o öğeyi tutar. Döngü sonra bir diziyi oluşturur min(x)etmek max(x)ve çekler %in%tüm değerlerinin budanmış sürümünde dahil edilip edilmediğini x.


Dennis'in cevabını taşıyarak 53 bayta düşebiliriz. function(n)all(unique(cummin(rev(n)))==max(n):min(n))
Giuseppe

1

JavaScript (ES6), 60 bayt

s=>(o={},s.reverse().every((n,i)=>!i|o[n+1]|o[n]&&(o[n]=1)))

Ungolfed:

s=>(
  o={},
  s.reverse().every((n,i)=>
    !i|o[n+1]|o[n]&&(o[n]=1)
  )
)

Bu daha basit bir algoritmadır:

Diziyi tersine yineleyin ve her bir sayının (ilk hariç) daha önce görülen bir sayıdan küçük veya ona eşit olduğundan emin olun.

Pasaj:


1

Haskell, 62 bayt

g(a:b)=[a|all(a<)b]++g b
g a=a
f x=g x==[minimum x..maximum x]

Çevrimiçi deneyin!

Tanımın g, sağındaki öğelerden> = ise öğeleri kaldırdığı doğrudan bir uygulaması .


1

C #, 69 bayt

s=>s.Where((e,i)=>s.Skip(i+1).All(r=>e<r)).Count()==s.Max()-s.Min()+1

Kısacası:
s = giriş (ler) eşitliği
, bundan sonraki tüm öğelerin (atla (I) ndex + 1 öğe) bulunduğu s öğesinden alınır, geçerli değer daha yüksektir
ve kalan miktarın beklenen miktara eşit olup olmadığını görün ((max) imum değeri eksi (min) imum) sayı sayısı

Çevrimiçi deneyin!


@MDXF Onu ağırlamak ister misiniz?
Stan Strum

@StanStrum kuralları yanlış mı anladım? ingilizcem çok dağınık mı? i-am- ilk kez
gönderiyor

Hayır hayır! PPCG'ye yeni gelenleri ağırlamak bir ayrıcalık ve ona merhaba demek isteyip istemediğini soruyordum
Stan Strum

Ayrıcalık ikinize de ait gibi görünüyor. Teşekkürler, insanlar ^^
Barodus

Bu harika bir ilk cevap, gelecekteki PPCG'de eğlenmenizi umuyoruz!
Stan Strum

0

JavaScript (ES6), 82 73 72 70 bayt

Bir boole döndürür.

a=>a.filter((x,i)=>k-=a.every(y=>~i--<0|y>x,m=x>m?x:m),m=k=0)[0]+~m==k

Nasıl?

Biz yineleme her bir eleman ile x Girdi dizisi bir a maksimum karşılaşılan değeri takip, m ve sayı -k daha büyük olan ya da sağa doğru bir üyesine eşit değerler. Tanım olarak, geçerli değerler kesinlikle artan sırada görünür.

Bunun filter()yerine k'yi negatif map()olana kadar tüm elemanların filtrelenmesi yerine kullanırız . Bu, dizinin minimum değeri olduğu garanti edilen ilk geçerli öğeyi izole etmemizi sağlar.

Son olarak minimum - (maximum + 1) == -number_of_valid_elements:

a.filter(...)[0] + ~m == k

Test senaryoları

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.