Streak Divisibilitas


31

Kita dapat mendefinisikan Streak Divisibilitas kangka ndengan menemukan bilangan bulat non-negatif terkecil ksehingga n+ktidak dapat dibagi k+1.

Tantangan

Dalam bahasa pilihan Anda, tulis sebuah program atau fungsi yang menghasilkan atau mengembalikan Streak Divisibilitas dari input Anda.

Contoh:

n=13:
13 is divisible by 1 
14 is divisible by 2 
15 is divisible by 3 
16 is divisible by 4 
17 is not divisible by 5

Garis Divisibilty dari 13adalah4

n=120:
120 is divisible by 1 
121 is not divisible by 2 

Garis Divisibilty dari 120adalah1

Kasus uji:

n      DS
2      1
3      2
4      1
5      2
6      1
7      3
8      1
9      2
10     1
2521   10

Lebih banyak kasus uji dapat ditemukan di sini .

Catatan

Aturan

  • Anda dapat mengasumsikan input lebih besar dari 1.

Mencetak gol

: Pengajuan dengan skor terendah akan menang.


Saya menyarankan untuk mengubah "bilangan bulat positif terkecil" menjadi "bilangan bulat negatif terkecil". Itu tidak mengubah tantangan sama sekali, tetapi dengan deskripsi saat ini, itu menyiratkan kita tidak perlu memeriksa untuk dibagi 1 (yang secara teknis kita tidak perlu). Entah itu, atau Anda dapat menghapus pembagian dengan 1 cek dari deskripsi.
TehPers

Bilangan bulat positif terkecil adalah 1, dan k + 12, di mana kbilangan bulat positif terkecil. Maaf untuk nitpick.
TehPers

Bukankah ini sama dengan menemukan yang terkecil kyang tidak membelah n-1?
Paŭlo Ebermann

@ PaŭloEbermann Ambil n=7tempat k=3: n-1dapat dibagi oleh k.
Oliver

Ah, aku ketinggalan +1.
Paŭlo Ebermann

Jawaban:



17

Java 8, 44 42 41 39 byte

Dicoret 44 masih teratur 44; (

n->{int r=0;for(;~-n%--r<1;);return~r;}

-2 byte terima kasih kepada @LeakyNun .
-1 byte terima kasih kepada @TheLethalCoder .
-2 byte berkat @Nevay .

Penjelasan:

Coba di sini.

n->{                 // Method with integer as parameter and return-type
  int r=0;           //  Result-integer (starting at 0)
  for(;~-n%--r<1;);  //  Loop as long as `n-1` is divisible by `r-1`
                     //   (after we've first decreased `r` by 1 every iteration)
  return~r;          //  Return `-r-1` as result integer
}                    // End of method


1
41 byte Hanya mencukur satu byte dari saran LeakyNun.
TheLethalCoder





4

JavaScript (ES6), 28 byte

n=>g=(x=2)=>++n%x?--x:g(++x)

Menguji

o.innerText=(f=

n=>g=(x=2)=>++n%x?--x:g(++x)

)(i.value=2521)();oninput=_=>o.innerText=f(+i.value)()
<input id=i><pre id=o>





3

Cubix , 17 byte

)uUqI1%?;)qUO(;/@

Cobalah online!

Kubus

    ) u
    U q
I 1 % ? ; ) q U
O ( ; / @ . . .
    . .
    . .
  • I1 atur tumpukan dengan input dan pembagi
  • %? lakukan mod dan uji
    • ;)qU)uqUjika 0 hapus input input dan pembagi hasil. Sedikit tentang jalan untuk kembali ke%
    • /;(O@ jika tidak 0, drop hasil, pembagi penurunan, output dan keluar

Lihat saja






2

dc , 28 byte

1si[1+dli1+dsi%0=M]dsMxli1-p

Cobalah online!

Ini terasa sangat suboptimal, dengan kenaikan dan penurunan akhir, tapi saya tidak bisa benar-benar melihat cara untuk memperbaikinya. Pada dasarnya kita hanya menambah penghitung idan nilai awal kita selama nilai mod iterus menjadi nol, dan sekali itu tidak benar kita kurangi satu dari idan cetak.


2

Gaia , 8 byte

@1Ė₌)†↺(

Cobalah online!

Penjelasan

@         Push input (call it n).
 1        Push 1 (call it i).
      ↺   While...
  Ė₌       n is divisible by i:
    )†     Increment both n and i.
       (  Decrement the value of i that failed this test and print.

2

J, 17 byte

[:{.@I.>:@i.|i.+]

Cobalah online!

Saya pikir masih ada ruang untuk bermain golf di sini.

Penjelasan (ungolfed)

[: {.@I. >:@i. | i. + ]
                 i. + ]  Range [n,2n)
                 i.       Range [0,n)
                    +     Added to each
                      ]   n
         >:@i. | i. + ]  Divisibility test
         >:@i.            Range [1,n+1)
               |          Modulo (in J, the arguments are reversed)
                 i. + ]   Range [n,2n)
    {.@I.                Get the index of the first non-divisible
       I.                 Indices of non-zero values
    {.                    Head

Tutup ( [:) ada untuk memastikan bahwa J tidak memperlakukan kata kerja terakhir ( {.@I.) sebagai bagian dari kail.

Satu-satunya hal yang aneh tentang jawaban ini adalah yang I.benar - benar menggandakan indeks dari setiap angka bukan nol sebanyak nilai angka itu. misalnya

   I. 0 1 0 2 3
1 3 3 4 4 4

Tapi itu tidak masalah karena kita menginginkan indeks yang pertama (dan karena i.memberikan rentang naik, kita tahu indeks pertama akan menjadi nilai terkecil).

Akhirnya, inilah bukti yang sangat singkat bahwa valid untuk memeriksa pembagian hanya sampai n.

Kami mulai memeriksa pembagian 1 | n, sehingga dengan asumsi garis berjalan sejauh itu, setelah kami memeriksa pembagian yang nkami miliki n | 2n - 1yang tidak akan pernah benar ( 2n - 1 ≡ n - 1 (mod n)). Oleh karena itu, garis akan berakhir di sana.



2

Kode Mesin x86, 16 byte

49                 dec    ecx        ; decrement argument
31 FF              xor    edi, edi   ; zero counter

                Loop:
47                 inc    edi        ; increment counter
89 C8              mov    eax, ecx   ; copy argument to EAX for division
99                 cdq               ; use 1-byte CDQ with unsigned to zero EDX
F7 FF              idiv   edi        ; EDX:EAX / counter
85 D2              test   edx, edx   ; test remainder
74 F6              jz     Loop       ; keep looping if remainder == 0

4F                 dec    edi        ; decrement counter
97                 xchg   eax, edi   ; move counter into EAX for return
C3                 ret               ;  (use 1-byte XCHG instead of 2-byte MOV)

Fungsi di atas mengambil satu parameter n,, dalam ECXregister. Ia menghitung garis kelonggarannya k,, dan mengembalikannya melalui EAXregister. Ini sesuai dengan konvensi pemanggilan panggilan cepat 32-bit , sehingga mudah dipanggil dari kode C baik menggunakan kompiler Microsoft atau Gnu.

Logikanya cukup sederhana: hanya melakukan tes berulang mulai dari 1. Secara fungsional identik dengan sebagian besar jawaban lain di sini, tetapi dioptimalkan secara tangan untuk ukuran. Banyak bagus 1-byte petunjuk di sana, termasuk INC, DEC, CDQ, dan XCHG. Operan yang sulit dikodekan untuk divisi sedikit menyakiti kami, tetapi tidak terlalu buruk.

Cobalah online!


2

PHP , 34 byte

for(;$argv[1]++%++$r<1;);echo$r-1;

Cobalah online!

Cukup sederhana. Periksa sisa pembagian (mod) setiap loop sambil menambah setiap nilai, output ketika nomor tidak dapat dibagi lagi.


1

SOGL V0.12 , 8 byte

]e.-ē⁴I\

Coba Di Sini!

Tidak buruk untuk bahasa yang dibuat untuk jenis tantangan yang sama sekali berbeda.

Penjelasan:

]         do .. while top of the stack is truthy
 e          push the variable E contents, by default user input
  .-        subtract the input from it
    ē       push the value of the variable E and then increase the variable
     ⁴      duplicate the item below one in the stack
      I     increase it
       \    test if divides
            if it does divide, then the loop restarts, if not, outputs POP which is `e-input`

1

Mathematica, 40 byte

Min@Complement[Range@#,Divisors[#-1]-1]&

Cobalah online! (Matematika)

Pendekatan matematika, n + k dapat dibagi dengan k + 1 jika dan hanya jika n-1 dapat dibagi dengan k + 1. Dan n-1 tidak dapat dibagi dengan n, begitu Range@#juga angka yang cukup.

Awalnya saya bermaksud menggunakannya Min@Complement[Range@#,Divisors[#-1]]-1&, tetapi ini juga berfungsi.


Mengapa captcha muncul ketika saya menggunakan kiriman dari tio?
user202729

1
Karena Anda mengetik (disalin dan ditempelkan) terlalu cepat. Ini bukan tentang TIO.
Leaky Nun

1

Julia 0.6.0 (47 bytes) (38 bytes)

n->(i=1;while isinteger(n/i) i+=1;n+=1 end;i-1)

n->(i=1;while n%i<1 i+=1;n+=1end;i-1)

Cobalah online!

9 byte dipotong berkat Mr.Xcoder


2
Biasanya tautan "Coba online" memungkinkan orang untuk benar-benar mencoba kode dengan mendefinisikan beberapa kombinasi header, footer, dan argumen yang berarti bahwa menekan tombol putar memberikan hasil.
Peter Taylor

@PeterTaylor Dengan dugaan murni, saya mencoba menjalankannya seperti itu , dan yang mengejutkan saya berhasil. Saya merekomendasikan OP untuk mengedit versi yang dapat diuji.
Tn. Xcoder

46 byte (menghapus satu spasi):n->(i=1;while isinteger(n/i) i+=1;n+=1end;i-1)
Mr. Xcoder

Dugaan murni lain yang diizinkan untuk membuatnya golf hingga 38 byte:n->(i=1;while n%i<1 i+=1;n+=1end;i-1)
Mr. Xcoder

@PeterTaylor Maaf lupa!
Goysa


1

Batch, 70 byte

@set/an=%1-1,i=0
:l
@set/ai+=1,r=n%%~i
@if %r%==0 goto l
@echo %i%

Semua ini dilakukan adalah menemukan yang terbesar iyang LCM(1..i)membelah n-1.



1

Aceto , 28 27 byte

[;`%
I)@]
iIk2I(D(
rk[(&Xpu

Saya bisa menghemat satu byte jika saya tidak harus keluar.

Penjelasan:

Kami menggunakan tiga tumpukan: Tumpukan kiri memegang penghitung mulai dari 2, yang tepat memegang nomor yang diberikan (atau kenaikannya), tumpukan tengah digunakan untuk melakukan operasi modulo. Kita tentu saja dapat melakukan semuanya dalam satu tumpukan, tetapi dengan cara ini kita dapat mengatur tumpukan luar menjadi "lengket" (nilai-nilai yang muncul tidak benar-benar dihapus) dan menyelamatkan diri kita dari banyak operasi duplikasi. Berikut metode secara rinci:

Baca bilangan bulat, tambah, buat tumpukan saat ini lengket, dan "pindahkan" itu (dan diri kita sendiri) ke tumpukan di sebelah kiri:

iI
rk[

Pergi satu tumpukan lagi ke kiri, tekan 2 literal, buat tumpukan ini lengket juga. Ingat posisi ini dalam kode ( @), dan "pindahkan" nilai dan diri kita ke tumpukan tengah lagi.

  @]
  k2
   (

Sekarang kami menguji: Apakah modulo dari dua angka teratas bukan 0? Jika demikian, lompat ke ujung, jika tidak pergi satu tumpukan ke kanan, naikkan, dan dorong nilai dan kita ke tengah. Lalu pergi ke tumpukan kiri, tambahkan juga, dan melompat kembali ke tanda yang kita atur sebelumnya.

[;`%
I)
    I(
    &

Ketika hasil modulo tidak nol, kami membalikkan posisi IP bergerak, pergi satu tumpukan ke kiri (tempat penghitung kami hidup), kurangi, dan cetak nilainya, lalu keluar.

      D(
     Xpu

1

Ruby, 34 32 31 byte

f=->n,d=1{n%d<1?1+f[n+1,d+1]:0}

Lambda rekursif. Masih baru di Ruby, jadi saran dipersilahkan!

Cobalah online!


1

F #, 86 byte 84 byte

let s n = 
    let rec c n1 d r=if n1%d=0 then c(n1+1)(d+1)(r+1)else r
    c n 1 0

Cobalah online!

Edit: -2 karakter dari Oliver


Selamat datang di PPCG! Apakah program Anda menggunakan stdin? Anda dapat menggunakan TIO , yang memiliki juru bahasa F # online. Juga, dapat menghapus spasi di r = if?
Oliver

1
@Liver Terima kasih, saya mengubah tautan ke TIO, jadi sekarang Anda benar-benar dapat meneruskan argumen untuk mengujinya. :)
Vladislav Khapin

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.