Bölünebilirlik çizgi


31

Biz bölünebilme Streak tanımlayabilir kbir dizi ntamsayı küçük olmayan negatif bularak kbu n+ktarafından bölünebilir değildir k+1.

Meydan okuma

Tercih ettiğiniz dilde, girişinizin Bölünebilirlik Çizgisini veren veya veren bir program veya işlev yazın.

Örnekler:

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

Arasında Bölünebilme Streak 13DİR4

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

Arasında Bölünebilme Streak 120DİR1

Test Durumları:

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

Daha test durumları bulunabilir burada .

notlar

kurallar

  • Girişin 1'den büyük olduğunu varsayabilirsiniz.

puanlama

: En düşük puanı alan gönderim kazanır.


"En küçük pozitif tamsayı" nın "en küçük negatif tamsayı" olarak değiştirilmesini öneririm. Bu zorluğu hiç değiştirmez, fakat mevcut açıklama ile bölünebilirliği 1 olarak kontrol etmemize gerek olmadığını (teknik olarak gerek duymamamız gereken) ifade eder. Ya öyle, ya da bölünebilirliği açıklamadan 1 kontrol ile kaldırabilirsiniz.
TehPers

En küçük pozitif tam sayı 1'dir ve k + 12, ken küçük pozitif tam sayıdır. Nitpick için özür dilerim.
TehPers

Bu kbölünmeyen en küçüğü bulmakla aynı değil n-1mi?
Paŭlo Ebermann

@ PaŭloEbermann n=7Nereye gideceksin k=3: n-1bölünebilir k.
Oliver

Ah, özledim +1.
Paŭlo Ebermann

Yanıtlar:



17

Java 8, 44 42 41 39 bayt

44'ü geçti, hala 44'dür;

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

@LeakyNun sayesinde -2 bayt . @ TheLethalCoder
sayesinde -1 bayt . @Nevay sayesinde -2 bayt .

Açıklama:

Burada dene.

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 bytes Sadece LeakyNun adlı kişinin önerisinden bir bayt geçmiş.
TheLethalCoder,





4

JavaScript (ES6), 28 bayt

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

Dene

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 bayt

)uUqI1%?;)qUO(;/@

Çevrimiçi deneyin!

Cubified

    ) u
    U q
I 1 % ? ; ) q U
O ( ; / @ . . .
    . .
    . .
  • I1 yığını giriş ve bölen
  • %? mod ve test yapmak
    • ;)qU)uqU0 ise sonucu ve artış girişini ve böleni kaldırın. Geri dönecek yol hakkında bir tur bit%
    • /;(O@ 0 değilse, sonuç bırak, karar bölen, çıktı ve çıktı

Çalıştırılmasını izle






2

dc , 28 bayt

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

Çevrimiçi deneyin!

Bu , artan ve son azalışla gerçekten yetersiz kalıyor, ancak bunu geliştirmenin bir yolunu göremiyorum. Temel olarak, sadece bir sayacı artırıyoruz ive değer mod isıfır olmaya devam ettiği sürece başlangıç ​​değerimizi alıyoruz ve bu doğru olmadığında bir tanesini çıkartıp iyazdırıyoruz.


2

Gaia , 8 bayt

@1Ė₌)†↺(

Çevrimiçi deneyin!

açıklama

@         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 bayt

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

Çevrimiçi deneyin!

Sanırım burada hala golf oynamak için yer var.

Açıklama (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

Başlık ( [:), J'nin son fiili ( {.@I.) bir kancanın parçası olarak ele almadığından emin olmak için vardır .

Bu cevapla ilgili garip olan tek şey, I.aslında sıfır olmayan her sayının dizinini, bu sayının değerinin çoğuyla çoğaltmasıdır. Örneğin

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

Ancak, ilk endeksi istediğimizden beri önemli değil (ve i.artan bir aralık sağladığından, ilk endeksin en küçük değer olacağını biliyoruz).

Son olarak, işte bu, yalnızca bölüme kadar olan bölümleri kontrol etmenin geçerli olduğuna dair çok kısa bir kanıt n.

Biz birlikte Bölünebilme kontrol başlamadan 1 | nbiz Bölünebilme kontrol gidince böylece çizgi varsayarak, çok o gider nElimizdeki n | 2n - 1(gerçek olmayacak ki 2n - 1 ≡ n - 1 (mod n)). Bu nedenle, çizgi orada bitecek.



2

x86 Makine Kodu, 16 bayt

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)

Yukarıdaki işlev n, ECXkayıt defterinde tek bir parametre alır . Bölünebilirlik çizgisini hesaplar kve bunu EAXsicil üzerinden döndürür . 32 bitlik hızlı arama çağrısı kuralına uygundur , bu nedenle Microsoft veya Gnu derleyicilerini kullanarak C kodundan kolayca çağrılabilir.

Mantık oldukça basittir: sadece 1'den başlayarak yinelemeli bir test yapar. İşlevsel olarak buradaki diğer cevapların çoğu ile aynıdır, ancak boyut için elle optimize edilmiştir. Dahil orada güzel 1 bayt talimatlar, bir sürü INC, DEC, CDQ, ve XCHG. Bölünme için kodlanmış işlenenler bizi biraz incitti, ama korkunç bir şekilde değil.

Çevrimiçi deneyin!


2

PHP , 34 bayt

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

Çevrimiçi deneyin!

Yeterince basit. Her bir döngünün kalan kısmını (mod) her bir değeri artırırken denetler, sayı artık bölünemez olduğunda çıkar.


1

SOGL V0.12 , 8 bayt

]e.-ē⁴I\

Burada dene!

Tamamen farklı bir zorluk için yapılmış bir dil için hiç de fena değil.

Açıklama:

]         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 bayt

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

Çevrimiçi deneyin! (Mathics)

Matematiksel yaklaşım, n + k, eğer sadece n + 1 k + 1 ile bölünebilir ise k + 1 ile bölünebilir. Ve n-1, n tarafından bölünemezRange@# nedenle yeterli sayı vardır.

Başlangıçta kullanmak niyetindeyim Min@Complement[Range@#,Divisors[#-1]]-1&ama bu da işe yarıyor.


Gönderimi tio'dan kullandığımda captcha neden görünüyor?
user202729

1
Çünkü çok hızlı yazdınız (kopyalayıp yapıştırdınız). Bu TIO ile ilgili değil.
Sızdıran Rahibe

1

Julia 0.6.0 (47 bayt) (38 bayt)

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)

Çevrimiçi deneyin!

Mr.Xcoder sayesinde 9 byte kesildi


2
Normalde bir "Çevrimiçi deneyin" bağlantısı, insanların , oynatma düğmesine basmanın çıktı vereceği anlamına gelen üstbilgi, altbilgi ve argüman kombinasyonlarını tanımlayarak kodu gerçekten denemelerine olanak sağlar .
Peter Taylor

@PeterTaylor saf tahmin, ben çalışan çalıştı gibi onu ve benim için sürpriz işe yaradı. OP'nin test edilebilir sürümde düzenlemesini öneririm.
Bay Xcoder

46 bayt (bir boşluk kaldırarak):n->(i=1;while isinteger(n/i) i+=1;n+=1end;i-1)
Bay Xcoder

İzin verilen başka bir saf tahmin, onu 38 byte'a düşürmektir:n->(i=1;while n%i<1 i+=1;n+=1end;i-1)
Bay Xcoder,

@PeterTaylor Üzgünüz, unuttum!
Goysa


1

Toplu iş, 70 bayt

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

Bu yapıyor Tüm büyük bulmaktır işekilde LCM(1..i)böler n-1.



1

Aceto , 28 27 bayt

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

Çıkmak zorunda kalmazsam bir baytı kurtarabilirim.

Açıklama:

Üç yığın kullanırız: Sol yığın 2'den başlayan bir sayacı tutar, sağdaki verilen sayıyı tutar (veya artımları) tutar, orta yığın modulo işlemlerini yapmak için kullanılır. Elbette her şeyi tek bir yığında yapabiliriz, ancak bu şekilde dış yığınları "yapışkan" (patlamış olan değerler gerçekten kaldırılmaz) olarak ayarlayabilir ve kendimizi birçok çoğaltma işleminden kurtarabiliriz. İşte ayrıntılı bir yöntem:

Bir tamsayı okuyun, artırın, mevcut yığını yapışkanlaştırın ve onu (ve kendimizi) sola yığına hareket ettirin:

iI
rk[

Bir yığın sola git, değişmez 2'ye bas, bu yığını da yapışkan yap. ( @) Kodundaki bu konumu hatırlayın ve bir değeri ve kendimizi tekrar merkez yığınına “kaydırın”.

  @]
  k2
   (

Şimdi test ediyoruz: En üstteki iki sayının modülü 0 değil mi? Eğer öyleyse, sonuna atla, aksi takdirde bir yığını sağa doğru git, arttır, ve değeri ve bizi ortasına it. Sonra sola yığına git, onu da arttır ve daha önce belirlediğimiz işarete geri atla.

[;`%
I)
    I(
    &

Modülün sonucu sıfır olmadığında, IP'nin hareket ettiği konumu tersine çeviririz, bir yığını sola doğru (sayacımızın yaşadığı yer) geçiririz, azaltır ve değeri yazdırır, sonra çıkar.

      D(
     Xpu

1

Ruby, 34 32 31 bayt

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

Özyinelemeli bir lambda. Yine de Ruby için yeni, bu yüzden önerilerinizi bekliyoruz!

Çevrimiçi deneyin!


1

F #, 86 bayt 84 bayt

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

Çevrimiçi deneyin!

Düzenleme: Oliver'dan -2 karakter


PPCG'ye Hoşgeldiniz! Programınız stdin alıyor mu? Çevrimiçi bir F # yorumlayıcısı olan TIO'yu kullanabilirsiniz . Ayrıca, içindeki boşluğu kaldırabilir r = ifmi?
Oliver

1
@Oliver Teşekkürler, bağlantıyı TIO olarak değiştirdim, şimdi test etmek için aslında argümanı iletebilirsiniz. :)
Vladislav Khapin

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.