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.

Oliver
sumber
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
Kevin Cruijssen
sumber
1
42 byte
Leaky Nun
1
41 byte Hanya mencukur satu byte dari saran LeakyNun.
TheLethalCoder
2
39 byte
Nevay
8

Haskell , 35 byte

f n=[k|k<-[1..],rem(n+k)(k+1)>0]!!0

Cobalah online!

Menggunakan untiljuga 35 byte

f n=until(\k->rem(n+k)(k+1)>0)(+1)1
H.Piz
sumber
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>

Shaggy
sumber
4

Mathematica, 30 27 byte

0//.i_/;(i+1)∣(#+i):>i+1&

Fungsi tanpa nama yang mengambil argumen integer.

Cobalah di Wolfram Sandbox

Pemakaian:

0//.i_/;(i+1)∣(#+i):>i+1&[2521]

10

JungHwan Min
sumber
4

Perl 5 , 23 21 + 1 (-p) = 22 byte

1until$_++%++$\}{$\--

Cobalah online!

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

MickyT
sumber
2

Python 2 , 44 40 byte

-4 byte terima kasih untuk Leaky Nun.

f=lambda n,x=1:~-n%-~x and x or f(n,x+1)

Cobalah online!

benar-benar manusiawi
sumber
1
40 byte
Leaky Nun
2

Swift 4 , 56 byte

Ini adalah fungsi penuh f, dengan parameter integer iyang mencetak output.

func f(i:Int){var k=0;while(i-1)%(k+1)<1{k+=1};print(k)}

Coba di sini.

Swift 4 , 56 byte

Ini adalah fungsi anonim, yang mengembalikan hasilnya.

{var k=0;while($0-1)%(k+1)<1{k+=1};return k}as(Int)->Int

Coba di sini.

Lihatlah Test Suite!

Tuan Xcoder
sumber
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.

brhfl
sumber
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.
Kucing Bisnis
sumber
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.

cole
sumber
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!

Cody Grey
sumber
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.

Xanderhall
sumber
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`
dzaima
sumber
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.

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

Goysa
sumber
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.

Neil
sumber
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
L3viathan
sumber
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!

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

Vladislav Khapin
sumber
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