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.