Sayılardaki güvenlik


22

Pozitif tamsayıların periyodik bir dizisinin n, sekansta meydana gelen her tam sayı için , nardışık iki oluşum arasında diğer tamsayılardan daha fazla bulunmadığını belirten bir özelliğe sahip olup olmadığını belirlemek için bir program yazın n.

Örneğin, 2, 3, 5, 2, 3, 6, 2, 3, 5, 2, 3, 6, ...ard arda olaylar her çifti: bu özellik var 2gibi aralarında en fazla iki tamsayı (en sahip 2, 3, 5, 2ve 2, 3, 6, 2, ardışık olaylar her çifti 3Aralarında, en fazla üç tamsayı de ve aynı 5ve 6.

Bununla birlikte, 2, 3, 5, 2, 3, 4, 2, 3, 5, 2, 3, 4, ...bu özelliğe sahip değildir: ardışık iki oluşum 4, yani 4, 2, 3, 5, 2, 3, 4aralarında dörtten fazla tam sayı bulunur.

Giriş : periyodik bir pozitif tam sayı dizisinin makul bir temsili. Örneğin, yukarıdaki {2, 3, 5, 2, 3, 6}birinci sonsuz diziyi temsil edebilecek gibi bir sonlu liste 2, 3, 5, 2, 3, 6, 2, 3, 5, 2, 3, 6, .... (Bu konuda, sonsuz periyodik listeler yerine sarılı sonlu listeler için sorun belirtilebilir.)

Çıktı : bir truthy / falsy değeri.

Truthy örnekleri:

{1}
{8, 9}
{2, 3, 4}
{5, 5, 3, 3, 6}
{2, 3, 5, 2, 3, 6}
{6, 7, 3, 5, 3, 7}
{9, 4, 6, 7, 4, 5}
{1, 1, 1, 1, 1, 100, 1}
{1, 9, 1, 8, 1, 7, 1, 11}

Sahte örnekler:

{1, 2, 3}
{2, 3, 9, 5}
{3, 5, 4, 4, 6}
{2, 3, 5, 2, 3, 4}
{3, 5, 7, 5, 9, 3, 7}
{5, 6, 7, 8, 9, 10, 11}
{1, 9, 1, 8, 1, 6, 1, 11}

Bu , yani en kısa kod kazanıyor. Tüm dillerdeki cevaplar teşvik edilir.


Giriş listesi her zaman en az bir öğe içeriyor mu?
nimi

2
aksi halde @nimi sonsuz bir periyodik diziyi temsil etmez.
Martin Ender

1
Mors dizisini alırsanız ve her terime 1'den büyük herhangi bir sabit pozitif tamsayı eklerseniz, bu özelliğe sahip bir aperiodik sonsuz diziye sahip olursunuz.
SuperJedi224

Yanıtlar:


7

Haskell, 60 57 56 55 bayt

f(a:b)=b==[]||length(fst$span(/=a)b)<=a&&f b
g x=f$x++x

Giriş listesinin en az bir öğe içerdiğini varsayalım.

Kullanım örneği: g [1]-> True. Çevrimiçi deneyin!

Let alistesi ve başkanı olmak bkuyruk. Sonuç, Trueeğer bboşsa ya da başlangıcındaki elementlerin sayısı, bona eşit olmayandan adaha büyük değildir ave özyinelemeli çağrı f bda Truebaşkadır False. Giriş listesinin iki katı ile başlayın.

Düzenleme: @Leo 3 bayt kaydetti. Teşekkürler!

Düzenleme 2: @Laikoni 1 byte kaydetti. Teşekkürler!


Yayılma yerine takeWhile kullanarak, desen eşleştirmesinden kaçınabilir ve bu arada üç byte tasarruf Nice çözümü! :)
Leo

@ Leo: Güzel yakalamak! Genelde kullanmak span, kullanmaktan daha kısadır takeWhile, bu yüzden hiç bakmadım.
nimi

takeWhilehemen hemen her zaman kısaltılabilir fst$spanveya fst.spanbaşka bir bayttan tasarruf sağlar.
Laikoni

@Likonik: Tabii ki evet! Teşekkürler!
nimi

Aşk
haskell

6

Python , 57 56 bayt

-1 Dennis bayt sayesinde (yerine i+1:i+v+2sahip i:i-~vbir ile iila 1 offset enumerate)

lambda a:all(v in(a+a)[i:i-~v]for i,v in enumerate(a,1))

Çevrimiçi deneyin!

Adsız fonksiyon, bir liste alarak ave her değer, bu şartı test v, görünür inbir birleştirme onun sağında alakalı dilim a, kendisiyle (a+a)[i:i-~v], 1 tabanlı dizin viçinde a, itarafından sağlanır enumerate(a,1).


1
Bu 8 baytlık Jelly cevabı ilham verdi. :) Bir bayt kaydedebilirsiniz böyle .
Dennis,

6

JavaScript (ES6), 67 65 55 54 51 49 bayt

@ETHproductions sayesinde 3B, @Arnauld sayesinde 2B kaydedildi

a=>!a.some((b,c)=>a.concat(a).indexOf(b,++c)>b+c)

açıklama

Bu, diziyi agirdi olarak alan bir işlevi tanımlar . Ardından, .someyöntem her dizi için başka bir işlev yürüten dizinin üzerinde yinelenir.

Bu iç fonksiyon iki argüman alır bve c, geçerli değerini ve dizinini. İşlev, dizinden başlayarak geçerli değerin dizinini bulur c + 1. Ardından, bu endeksin mevcut değerden artı mevcut dizinden daha büyük olup olmadığını kontrol eder (aynı değerin iki oluşumu arasındaki fark büyüktür b). Bunun istediğimizin tam tersini döndürdüğünü unutmayın.

Bu dönüş değerlerinden biri ise true, .someişlev de geri döner true. Çeklerden hiçbiri geri dönmezse true, .someişlev geri döner false. Bir kez daha dönmek istediğimiz değerin tam tersi, bu nedenle sonuç reddedildi ve sonra döndürüldü.

Dene

Tüm test durumlarını burada deneyin:

let f=
a=>!a.some((b,c)=>a.concat(a).indexOf(b,++c)>b+c)

let truthy = [[1], [8, 9], [2, 3, 4], [5, 5, 3, 3, 6], [2, 3, 5, 2, 3, 6], [6, 7, 3, 5, 3, 7], [9, 4, 6, 7, 4, 5], [1, 1, 1, 1, 1, 100, 1], [1, 9, 1, 8, 1, 7, 1, 11]];
let falsy  = [[1, 2, 3], [2, 3, 9, 5], [3, 5, 4, 4, 6], [2, 3, 5, 2, 3, 4], [3, 5, 7, 5, 9, 3, 7], [5, 6, 7, 8, 9, 10, 11], [1, 9, 1, 8, 1, 6, 1, 11]];

console.log("Truthy test cases:");
for (let test of truthy) {
    console.log(`${test}: ${f(test)}`);
}

console.log("Falsy test cases:");
for (let test of falsy) {
    console.log(`${test}: ${f(test)}`);
}


Çok hoş, aynen öyle bir şey buldum :-) .shift()a=>!a.some(b=>z.indexOf(z.shift())>b,z=a.concat(a))
İkili

Hehe, büyük golfçüler aynı düşünüyor ;-). Vardiya kullanmayı da düşündüm ama daha uzun sürdüğü için kullanmadım. Çift diziyi bir kez oluşturmak ve her seferinde değiştirmek gerçekten zekice. Teşekkürler!
Luke

Çalışır a=>!a.some((n,i)=>a.concat(a).indexOf(n,++i)>n+i)mı?
Arnauld

Evet öyle. Teşekkürler!
Luke

4

Jöle , 11 bayt

ṣZL
;çЀ<‘P

Çevrimiçi deneyin!

Nasıl çalışır

;çЀ<‘P  Main link. Argument: A (array)

;        Concatenate A with itself.
 çD€     For each n in A, call the helper with left arg. A + A and right arg. n.
     ‘   Increment all integers in A.
    <    Perform element-wise comparison of the results to both sides.
      P  Take the product of the resulting Booleans.


ṣZL      Helper link. Left argument: A. Right argument: n

ṣ        Split A at all occurrences of n.
 Z       Zip to transpose rows and columns.
  L      Length; yield the number of rows, which is equal to the number of columns
         of the input to Z.

3

Jöle , 8 bayt

ṙJḣ"‘Œpċ

@ JonathanAllan'ın Python cevabı tarafından yazılmıştır .

Çevrimiçi deneyin!

Nasıl çalışır

ṙJḣ"‘Œpċ  Main link. Argument: A (array)

 J        Yield the indicies of A, i.e., [1, ..., len(A)].
ṙ         Rotate; yield A, rotated 1, ..., and len(A) units rotated to the left.
    ‘     Increment; add 1 to all elements of A.
  ḣ"      Head zipwith; truncate the n-th rotation to length A[n]+1.
     Œp   Take the Cartesian product of all resulting truncated rotations.
       ċ  Count the number of times A appears in the result.

2

SWI-Prolog, 83 bayt

a(L,[H|R]):-nth0(X,R,H),H>=X,a(L,R);length(R,N),nth0(X,L,H),H>=N+X,a(L,R).
a(_,[]).


Liste iki kez girilmelidir:

a([1,2,3],[1,2,3]).

Bu kabul edilebilir olarak kabul edilmezse, yüklemeyi ekleyebilirsiniz

a(L):-a(L,L).

fazladan 14 bayt ekler.

Çevrimiçi deneyin


nb: Sorgularınızı ';' ile ayırarak farklı yanlış durumları bir kerede test edebilirsiniz. (veya) ve farklı gerçek durumlar için ',' (ve) ile ayırarak test edin.

yani OP örneklerini kullanarak:

a([1],[1]),
a([8, 9],[8, 9]),
a([2, 3, 4],[2, 3, 4]),
a([5, 5, 3, 3, 6],[5, 5, 3, 3, 6]),
a([2, 3, 5, 2, 3, 6],[2, 3, 5, 2, 3, 6]),
a([6, 7, 3, 5, 3, 7],[6, 7, 3, 5, 3, 7]),
a([9, 4, 6, 7, 4, 5],[9, 4, 6, 7, 4, 5]),
a([1, 1, 1, 1, 1, 100, 1],[1, 1, 1, 1, 1, 100, 1]),
a([1, 9, 1, 8, 1, 7, 1, 11],[1, 9, 1, 8, 1, 7, 1, 11]).

ve

a([1, 2, 3],[1, 2, 3]);
a([2, 3, 9, 5],[2, 3, 9, 5]);
a([3, 5, 4, 4, 6],[3, 5, 4, 4, 6]);
a([2, 3, 5, 2, 3, 4],[2, 3, 5, 2, 3, 4]);
a([3, 5, 7, 5, 9, 3, 7],[3, 5, 7, 5, 9, 3, 7]);
a([5, 6, 7, 8, 9, 10, 11],[5, 6, 7, 8, 9, 10, 11]);
a([1, 9, 1, 8, 1, 6, 1, 11],[1, 9, 1, 8, 1, 6, 1, 11]).

2

PHP, 52 bayt

for(;$n=$argv[++$i];$$n=$i)!$$n|$i-$$n<$n+2?:die(1);

komut satırı argümanlarından dizi alır; 1truthy için, falsy koduyla çıkar 0.
İle koş -nr.

  • $nbağımsız değişkenler arasında döngü :
  • kodla çıkmak 0(örtük)

Deli değişken isimleriniz geçersiz ama hoşuma gitti.
Jörg Hülsermann

2

Retina , 50 bayt

$
,$`
M!&`\b(1+),.*?\b\1\b
+%`(^1*)1,1+
$1
M`1,
^0

Virgülle ayrılmış tekli sayılar listesi olarak giriş yapın.

Çevrimiçi deneyin!

açıklama

$
,$`

Girişi çoğaltın, böylece sonuna saran adımları kontrol edebiliriz.

M!&`\b(1+),.*?\b\1\b

Eşleştirin ve her bir (en kısa) bölümü iki özdeş değer arasında eşleştirin, örn 11,111,1,11.

+%`(^1*)1,1+
$1

Ardı ardına bir sayıyı tekrar tekrar ilk numaradan kaldırın. Boşluk yeterince küçükse, bu ilk sayıyı tamamen kaldıracaktır. Aksi halde, en az bir hane kalacaktır.

M`1,

1,Tüm satırlarda ne sıklıkta göründüğünü sayın . Herhangi bir yerde görünürse, adımlardan biri çok genişti.

^0

İle başlayan bir sayı ile eşleştirmeye çalışın 0(yani sadece 0kendisi). Bu, çıktının mantıklı bir olumsuzlamasıdır.


2

JavaScript (ES6), 47 bayt

a=>![...a,...a].some((n,i)=>a[-n]-(a[-n]=i)<~n)

Nasıl çalışır

Girilen diziyi a, her bir tamsayıdaki son karşılaşılan oluşum konumunu saklamak için yeniden kullanırız a. -nBu konumu saklamak için anahtarı kullanırız, böylece orijinal endekslerine engel olmaz.a .

Var a[-n]olduğunda, gerçek test gerçekleşir. Ne zaman a[-n]mevcut değil, ifade a[-n] - (a[-n] = i)eşittir undefined - i == NaNve karşılaştırma ile~n beklenen bir sonuçtur ki, her zaman falsy olduğunu.

Test durumları


2

Retina ,  41 39 bayt

2 baytlık Martin Ender sayesinde golf oynadı, bu arada beni SO'daki muhteşem rehberiyle dengeleme grupları ile tanıştırdı.

$
,$`,
((1)+,)(?=(?<-2>1+,)*(\1|$))

^$

Giriş, virgülle ayrılmış bir unary sayıları listesidir. Çıktı 0yanlış ve 1doğru.

Çevrimiçi deneyin!(Otomatik olarak ondalık sayıdan dönüştürülen test paketi)

Geçenlerde dengeleme gruplarını öğrendim, bu yüzden denemek istedim. Kullanımı en kolay araçlar arasında değiller, ancak güçlü olduklarından eminler.

açıklama

$
,$`,

Diğer birçok gönderimde olduğu gibi, listeyle sarmalama ile başa çıkacağız. Ayrıca sonuna bir virgül ekleriz, bu yüzden her sayı bir virgül izler (bu durum işleri biraz daha kolaylaştırır)

((1)+,)(?=(?<-2>1+,)*(\1|$))

Burası işlerin ilginçleştiği yer. Bu yeni bir aşamadır, ilk satırla eşleşen her şeyi ikinci satırla değiştiririz, bu durumda n, n+1diğer farklı sayılarla takip edilmeyen tüm sayıları çıkarmak istiyoruz .

Bunu yapmak için önce 1gruptaki her birini yakalayan sayıyı eşleştiriyoruz (bu durumda 2 numaralı grup yakalama). Daha sonra, olumlu bir bakış açısıyla, sıfır genişlikte bir iddiaya sahip olmak için, defalarca grup -2tarafından yapılan yakalama sayısından daha fazla başarılı olamayacak bir dengeleme grubunda eşleşmeye çalışırız.2 , bir sayı ve ardından virgül izlemez. Bu sayı dizisinden sonra, tekrar ilk sayıya veya satırın sonuna ulaşırsak memnun oluruz.

Not: Bu ifade, tam sayı ile bir eşleşme bulamazsa, sayının yalnızca son kısmıyla eşleşebilir. Bu bir sorun değil, çünkü sayının ilk kısmı dizgede kalacaktır ve değişimin tamamen başarılı olmadığını öğreneceğiz.

^$

Son olarak, listedeki tüm sayıları tamamen çıkardıysak, sonuç çok garip olmalıdır. Boş dizgiyi eşleştirmeye ve bulunan eşleşme sayısını döndürmeye çalışırız.


1
İyi iş! :) Buna gerek yok \b. Bunu kaldırmak, başıboş eşleşmelere neden olur, ancak sayının tamamını kaldıramadıkları için boş bir dize ile bitmezsiniz.
Martin Ender

@MartinEnder Elbette haklısın, teşekkür ederim :)
Leo

1

Jöle , 11 bayt

ẋ2ĠṢI_2<"QȦ

Çevrimiçi deneyin!

ẋ2ĠṢI_2<"QȦ  Main link. Argument: A (array)

ẋ2           Repeat A twice to account for wrap-around.
  Ġ          Group all indices of A + A by their respective values, sorting the
             index groups by the associated values.
   Ṣ         Sort the groups lexicographically, i.e., by first appearance in A.
    I        Increments; compute the forward differences of adjacent indices in
             each of the groups.
     _2      Subtract 2 from the differences.
         Q   Unique; yield A, deduplicated.
       <"    Compare all differences in the index group corresponding to the n-th
             unique value in A with the n-th unqiue value in A.
          Ȧ  All; yield 1 if and only if none of the comparisons returned 0.


1

Röda , 50 bayt

f a{seq 0,#a-1|[indexOf(a[_],a[_1+1:]..a)<=a[_1]]}

Çevrimiçi deneyin!

En sonunda! Ben olmuştur bekleyen için bu meydan ...

Bu bir gerçeği ya da sahte bir değer döndüren bir işlevdir. Dizi bir argüman alır.

Bir dizin akışı üzerinde yinelenir ve her bir dizin _1için geçerli dizinin ve bir sonraki dizinin mesafesinden a[_1]daha fazla olmadığını kontrol eder a[_1].


Tam olarak nasıl _1çalışıyor?
Kritixi Lithos

@KritixiLithos Bu _, ancak ilk çekilen değeri ifade eder. Birden çok _s kullanmış olsaydım , her biri ayrı bir değer alırdı. Örneğin, [1, 2, 3] | print(_, _, _)yazdırır 123, ancak [1,2,3] | print(_, _1, _1)yazdırır 111 222 333(ayrı satırlarda).
fergusq

0

05AB1E , 13 bayt

Dì©v®¦©yky›_P

Çevrimiçi deneyin! veya Test paketi olarak

açıklama

Dì             # duplicate input and prepend the copy to the original
  ©            # store a copy in the register
   v           # for each element in the list
    ®          # push the list from register
     ¦©        # remove the first element and store a copy in the register
       yk      # get the index of the current element in the list
         y›_   # check if it's less than or equal to the current element
            P  # product of stack
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.