Keamanan dalam angka

22

Tulis sebuah program untuk menentukan apakah urutan periodik bilangan bulat positif memiliki properti yang, untuk setiap bilangan bulat yang nterjadi dalam urutan, tidak pernah ada lebih dari nbilangan bulat lainnya antara dua kejadian berturut-turut n.

Misalnya, 2, 3, 5, 2, 3, 6, 2, 3, 5, 2, 3, 6, ...memang memiliki properti ini: setiap pasangan kejadian berurutan 2memiliki paling banyak dua bilangan bulat di antara mereka (seperti 2, 3, 5, 2dan 2, 3, 6, 2; setiap pasangan kejadian berurutan 3memiliki paling banyak tiga bilangan bulat di antara mereka, dan sama untuk 5dan 6.

Namun, 2, 3, 5, 2, 3, 4, 2, 3, 5, 2, 3, 4, ...tidak memiliki properti ini: dua kejadian berturut-turut 4, yaitu 4, 2, 3, 5, 2, 3, 4, memiliki lebih dari empat bilangan bulat di antara mereka.

Input : representasi wajar dari urutan periodik bilangan bulat positif. Misalnya, daftar hingga seperti {2, 3, 5, 2, 3, 6}dapat mewakili urutan tak terbatas pertama di 2, 3, 5, 2, 3, 6, 2, 3, 5, 2, 3, 6, ...atas. (Dalam hal ini, masalahnya bisa dinyatakan untuk daftar terbatas yang membungkus bukan untuk daftar periodik tak terbatas.)

Output : nilai kebenaran / kepalsuan.

Contoh kebenaran:

{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}

Contoh-contoh palsu:

{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}

Ini , jadi kode terpendek menang. Jawaban dalam semua bahasa dianjurkan.

Greg Martin
sumber
Apakah daftar input selalu mengandung setidaknya satu elemen?
nimi
2
@nimi kalau tidak itu tidak akan mewakili urutan periodik yang tak terbatas.
Martin Ender
1
Jika Anda mengambil urutan morse dan menambahkan bilangan bulat positif tetap yang lebih besar dari 1 untuk setiap istilah, Anda akan memiliki urutan tak terbatas aperiodik dengan properti ini.
SuperJedi224

Jawaban:

7

Haskell, 60 57 56 55 byte

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

Mengasumsikan bahwa daftar input mengandung setidaknya satu elemen.

Contoh penggunaan: g [1]-> True. Cobalah online!

Biarkan amenjadi kepala daftar dan bekor. Hasilnya adalah Truejika bkosong atau jumlah elemen pada awal byang tidak sama dengan atidak lebih besar dari adan panggilan rekursif f bjuga True, lain False. Mulai dengan dua kali daftar input.

Sunting: @ Leo disimpan 3 byte. Terima kasih!

Sunting 2: @Laikoni menyimpan 1 byte. Terima kasih!

nimi
sumber
Menggunakan takeWhile bukannya span Anda dapat menghindari pencocokan pola dan menyimpan tiga byte solusi yang bagus, omong-omong! :)
Leo
@ Leo: Tangkapan bagus! Biasanya menggunakan spanlebih pendek daripada menggunakan takeWhile, jadi saya tidak melihatnya sama sekali.
nimi
takeWhilehampir selalu dapat disingkat menjadi fst$spanatau fst.span, yang menghemat byte lain.
Laikoni
@Laikoni: ya tentu saja! Terima kasih!
nimi
Love haskell;)
theonlygusti
6

Python , 57 56 byte

-1 byte terima kasih kepada Dennis (ganti i+1:i+v+2dengan i:i-~vdengan ioffset 1 dari enumerate)

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

Cobalah online!

Fungsi yang tidak disebutkan namanya mengambil daftar,, adan menguji kondisi bahwa setiap nilai, vmuncul inirisan yang relevan di sebelah kanannya dalam gabungan adengan dirinya sendiri (a+a)[i:i-~v], di mana indeks berbasis 1 vdalam a, idisediakan oleh enumerate(a,1).

Jonathan Allan
sumber
1
Itu mengilhami jawaban Jelly 8-byte. :) Anda dapat menyimpan byte seperti ini .
Dennis
6

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

Disimpan 3B berkat @ETHproduksi dan 2B berkat @Arnauld

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

Penjelasan

Ini mendefinisikan fungsi yang mengambil array asebagai input. Kemudian, .somemetode ini mengulangi array itu, menjalankan fungsi lain untuk setiap elemen.

Fungsi dalam ini mengambil dua argumen, bdan c, nilai saat ini dan indeksnya. Fungsi menemukan indeks nilai saat ini, mulai dari indeks c + 1. Kemudian memeriksa apakah indeks ini lebih besar dari nilai saat ini ditambah indeks saat ini (perbedaan antara dua kejadian dari nilai yang sama lebih besar dari b). Perhatikan bahwa ini mengembalikan kebalikan dari apa yang kita inginkan.

Jika salah satu dari nilai-nilai ini dikembalikan true, .somefungsi kembali truejuga. Jika tidak ada cek yang kembali true, .somefungsi kembali false. Sekali lagi kebalikan dari nilai yang ingin kita kembalikan, sehingga hasil ini dinegasikan dan kemudian dikembalikan.

Menguji

Coba semua test case di sini:

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)}`);
}

Luke
sumber
Sangat bagus, itulah tepatnya yang saya .shift()a=>!a.some(b=>z.indexOf(z.shift())>b,z=a.concat(a))
hasilkan
Hehe, pegolf hebat berpikir sama ;-). Saya berpikir untuk menggunakan shift juga, tetapi saya tidak menggunakannya, karena ternyata lebih lama. Membuat array ganda sekali dan menggeser setiap waktu adalah sangat cerdas. Terima kasih!
Luke
Akan a=>!a.some((n,i)=>a.concat(a).indexOf(n,++i)>n+i)bekerja
Arnauld
Ya, benar. Terima kasih!
Luke
4

Jelly , 11 byte

ṣZL
;çЀ<‘P

Cobalah online!

Bagaimana itu bekerja

;çЀ<‘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.
Dennis
sumber
3

Jelly , 8 byte

ṙJḣ"‘Œpċ

Tertipu oleh jawaban Python @ JonathanAllan's .

Cobalah online!

Bagaimana itu bekerja

ṙ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.
Dennis
sumber
2

SWI-Prolog, 83 byte

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(_,[]).


Daftar harus dimasukkan dua kali:

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

Jika ini dianggap tidak dapat diterima, Anda dapat menambahkan predikat

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

yang menambahkan 14 byte tambahan.

Cobalah online


nb: Anda dapat menguji berbagai kasus palsu sekaligus dengan memisahkan pertanyaan Anda dengan ';' (atau) dan uji untuk berbagai kasus nyata yang berbeda dengan memisahkan dengan ',' (dan)

yaitu, menggunakan contoh OP:

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]).

dan

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]).
Maliafo
sumber
2

PHP, 52 byte

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

mengambil urutan dari argumen baris perintah; keluar dengan kode 1untuk kepalsuan, 0untuk kebenaran.
Jalankan dengan -nr.

  • loop $nmelalui argumen:
    • jika tidak ada kejadian sebelumnya atau itu cukup baru
      maka jangan lakukan apa-apa, keluar dengan kode1
    • ingat kejadian sebelumnya di $$n( variabel variabel )
  • keluar dengan kode 0(implisit)
Titus
sumber
Gila nama variabel Anda tidak valid tetapi saya menyukainya.
Jörg Hülsermann
2

Retina , 50 byte

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

Input sebagai daftar nomor unary yang terpisah koma.

Cobalah online!

Penjelasan

$
,$`

Gandakan input sehingga kami dapat memeriksa langkah-langkah yang membungkus bagian akhir.

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

Cocokkan dan kembalikan setiap bagian (terpendek) antara dua nilai yang identik, misalnya 11,111,1,11.

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

Hapus angka berulang-ulang dari angka pertama, bersama dengan seluruh nomor setelahnya. Jika celahnya cukup kecil, ini akan sepenuhnya menghapus angka pertama. Kalau tidak, setidaknya satu digit akan tetap.

M`1,

Hitung seberapa sering 1,muncul di semua baris. Jika muncul di mana saja, salah satu langkahnya terlalu lebar.

^0

Cobalah untuk mencocokkan angka yang dimulai dengan 0(yaitu hanya 0dirinya sendiri). Ini secara efektif negasi logis dari output.

Martin Ender
sumber
2

JavaScript (ES6), 47 byte

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

Bagaimana itu bekerja

Kami menggunakan kembali larik input auntuk menyimpan posisi kemunculan terakhir setiap bilangan bulat di a. Kami menggunakan kunci -nuntuk menyimpan posisi ini sehingga tidak mengganggu indeks aslia .

Ketika a[-n]ada, tes yang sebenarnya terjadi. Ketika a[-n]tidak ada, ekspresi a[-n] - (a[-n] = i)sama undefined - i == NaNdan perbandingan dengan ~nselalu palsu, yang merupakan hasil yang diharapkan.

Uji kasus

Arnauld
sumber
2

Retina ,  41 39 byte

2 byte golf berkat Martin Ender, yang omong-omong memperkenalkan saya pada menyeimbangkan kelompok dengan panduannya yang fantastis di SO

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

^$

Input adalah daftar nomor unary yang dipisahkan koma. Output 0untuk false dan 1true.

Cobalah online! (Test suite yang secara otomatis mengkonversi dari desimal)

Saya baru-baru ini belajar tentang menyeimbangkan kelompok, jadi saya ingin mencoba mereka. Mereka bukan salah satu alat termudah untuk digunakan, tetapi yakin mereka kuat.

Penjelasan

$
,$`,

Seperti banyak kiriman lainnya lakukan, kami menduplikasi daftar untuk menangani pembungkus. Kami juga menambahkan koma di bagian akhir, jadi setiap angka diikuti oleh koma (ini membuat segalanya lebih mudah nanti)

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

Di sinilah hal-hal menjadi menarik. Ini adalah tahap penggantian, kami mengganti semua yang cocok dengan baris pertama dengan baris kedua, dalam hal ini kami ingin menghapus semua angka yang ntidak diikuti olehn+1 angka berbeda lainnya.

Untuk melakukannya, pertama-tama kita mencocokkan angka, menangkap masing-masing 1dalam suatu kelompok (menangkap kelompok nomor 2 dalam kasus ini). Kemudian dengan lookahead positif, untuk memiliki penegasan nol-lebar, kami berulang kali mencoba untuk mencocokkan dalam kelompok penyeimbang -2, yang akan berhasil tidak lebih dari jumlah tangkapan yang dibuat oleh kelompok 2, angka yang diikuti oleh koma. Setelah urutan angka-angka ini, kami puas jika kami mencapai angka pertama lagi atau akhir baris.

Catatan: ungkapan ini hanya bisa cocok dengan bagian terakhir dari angka, jika tidak berhasil menemukan kecocokan dengan angka lengkap. Ini bukan masalah, karena dengan demikian bagian pertama dari angka akan tetap berada di string dan kita akan tahu bahwa penggantian tidak sepenuhnya berhasil.

^$

Akhirnya, hasilnya harus benar jika kita benar-benar menghapus semua angka dari daftar. Kami mencoba mencocokkan string kosong dan mengembalikan jumlah kecocokan yang ditemukan.

Leo
sumber
1
Kerja bagus! :) Tidak perlu untuk \b. Menghapusnya akan menyebabkan kecocokan nyasar tetapi mereka akan gagal untuk menghapus seluruh nomor, sehingga Anda tidak akan berakhir dengan string kosong.
Martin Ender
@ MartinEnder Anda tentu saja benar, terima kasih :)
Leo
1

Jelly , 11 byte

ẋ2ĠṢI_2<"QȦ

Cobalah online!

ẋ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.
Dennis
sumber
1

Python 3 , 101 byte

lambda l:all(v>=(l[i+1:].index(v)if v in l[i+1:]else len(l[i+1:])+l.index(v))for i,v in enumerate(l))

Cobalah online!

ovs
sumber
1

Röda , 50 byte

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

Cobalah online!

Akhirnya! Saya telah menunggu untuk tantangan ini ...

Ini adalah fungsi yang mengembalikan nilai yang benar atau salah. Dibutuhkan satu argumen, array.

Ini beralih pada aliran indeks dan memeriksa untuk setiap indeks _1bahwa jarak indeks saat ini dan indeks berikutnya a[_1]tidak lebih dari a[_1].

fergusq
sumber
Bagaimana tepatnya cara _1kerjanya?
Kritixi Lithos
@ KritixiLithos Seperti _, tetapi mengacu pada nilai yang ditarik pertama. Jika saya menggunakan banyak _s, masing-masing akan menarik nilai yang terpisah. Misalnya, [1, 2, 3] | print(_, _, _)mencetak 123, tetapi [1,2,3] | print(_, _1, _1)mencetak 111 222 333(pada garis yang terpisah).
fergusq
0

05AB1E , 13 byte

Dì©v®¦©yky›_P

Cobalah online! atau sebagai Test suite

Penjelasan

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
Emigna
sumber