Sıralı olarak bölünebilir


24

Bazen uykuya dalmak için olabildiğince yüksek, sayısız kare atlayarak sayıları sayacağım . Üst üste birkaç sayıyı atladığımda biraz heyecanlanıyorum - örneğin, 48,49,50hepsi karesizdir (48 2 ^ 2, 49 x 7 ^ 2 ve 50 x 5 ^ 2 ile bölünebilir).

Bu beni, bazı rasgele bölen dizileri tarafından bölünebilen en yakın bitişik sayı örneği hakkında merak etmeme neden oldu.

Giriş

Giriş, a = [a_0, a_1, ...]en az 1 öğe içeren kesinlikle pozitif tam sayıların sıralı bir listesidir .

Çıktı

Çıktı, bölen , bölen ve daha genel olarak bölen nözellik ile en küçük pozitif tam sayıdır . Eğer böyle bir şey yoksa, fonksiyon / programın davranışı tanımlanmaz.a_0na_1n+1a_kn+kn

Test Kılıfları

[15] -> 15
[3,4,5] -> 3
[5,4,3] -> 55
[2,3,5,7] -> 158
[4,9,25,49] -> 29348
[11,7,5,3,2] -> 1518

puanlama

Bu ; en kısa sonuç (dil başına) palavra haklarını kazanır. Her zamanki boşluklar hariçtir.


Yanıtlar:



6

Kabuğu , 7 bayt

VδΛ¦⁰ṫN

Çevrimiçi deneyin!

açıklama

VδΛ¦⁰ṫN  Input is a list x.
      N  The list [1,2,3...
     ṫ   Tails: [[1,2,3...],[2,3,4...],[3,4,5...]...
V        Index of first tail y satisfying this:
  Λ       Every element
    ⁰     of x
   ¦      divides
 δ        the corresponding element of y.

5

MATL , 11 bayt

`Gf@q+G\a}@

Çevrimiçi deneyin!

`           % Do ....
 Gf         %   Convert input to [1,2,...,]
   @q+      %   Add current iteration index minus one, to get [n, n+1, ....]
      G\    %   Elementwise mod([n,n+1,...],[a_0,a_1,...])
        a   % ...while any of the modular remainders is nonzero.
         }  % Finally:
          @ %   Output the iteration index.

Hız için tam olarak optimize edilmemiş ... en büyük test çantası MATL kullanarak tam bir dakika ve MATLAB üzerinde yaklaşık 0.03 saniye sürer. MATL'in biraz daha fazla ek yükü olma ihtimali çok düşük.


ah, n:q`QtG\a]1)12 bayt vardı ama n:belli ki fburada olduğu gibi . Bunu hep unutuyorum, böylece alternatif bir 11 bayt olarak ekleyebilirsiniz.
Giuseppe

1
@Giuseppe Çok kötü fq`QtG\a}@, girişin yabancı bir kopyasını döndürür.
18'de Sanchises

5

JavaScript, 42 40 bayt

Çözüm yoksa (veya çözüm çok büyükse) bir özyineleme hatası atar.

a=>(g=y=>a.some(x=>y++%x)?g(++n):n)(n=1)

Rick Hitchcock'dan bir işaretçi ile 2 bayt kurtardı


Dene

Virgülle ayrılmış bir numara listesi girin.

o.innerText=(f=
a=>(g=y=>a.some(x=>y++%x)?g(++n):n)(n=1)
)(i.value=[5,4,3]);oninput=_=>o.innerText=f(i.value.split`,`.map(eval))
<input id=i><pre id=o>


Güzel bir yaklaşım, ancak, örneğin, özyineleme sınırlarını aşarak başarısız olur [4,9,25,49].
Chas Brown

1
@ChasBrown, kod golf amacıyla, sonsuz belleği varsayabiliriz.
Shaggy

38 bayt için işe yarayacağını düşünüyorum:(a,y=n=0)=>a.some(x=>y++%x)?f(a,++n):n
Rick Hitchcock

Oo, güzel olan, @RickHitchcock - teşekkürler. f=Yine de unutma .
Shaggy

Ah, elbette. 40 bayttır.
Rick Hitchcock


3

05AB1E , 9 bayt

Xµā<N+sÖP

Çevrimiçi deneyin!

açıklama

Xµ          # loop until counter equals 1
  ā         # push range [1 ... len(input)]
   <        # decrement
    N+      # add current iteration index N (starts at 1)
      sÖ    # elementwise evenly divisible by
        P   # product
            # if true, increase counter
            # output N

17 byte cevabımı mahvetti, ah.
Magic Octopus Urn


3

Temiz , 61 bayt

import StdEnv
$l=hd[n\\n<-[1..]|and[i/e*e==i\\i<-[n..]&e<-l]]

Çevrimiçi deneyin!


2
Singleton listeleri için pozitif olmayan bir tamsayı çıkarmaktan kaçınmak [1..]yerine ihtiyacınız olduğunu düşünüyorum . [0..]0
Laikoni

@Likonik teşekkürler, sabit.
Ocak'ta

3

Pyth , 11 bayt

f!s.e%+kTbQ 

Çevrimiçi deneyin!


f!s.e%+kTbQ         Full program - inputs list from stdin and outputs to stdout
f                   First number T such that
   .e     Q         The enumerated mapping over the Input Q
      +kT           by the function (elem_value+T)
     %   b          mod (elem_index)
 !s                 has a false sum, i.e. has all elements 0

2Sonuna ihtiyacın var mı? Burada kurtarılacak daha çok şey olduğuna eminim ama Pyth'i tanımıyorum.
Shaggy

@Shaggy ve @Giuseppe, ikiniz de haklısınız ve sonunu bırakmak 2sorunu düzeltir
Dave

2

J , 23 bayt

[:I.0=]+/@:|"1#]\[:i.*/

Çevrimiçi deneyin!


Güzel. Yalnızca girdilerin ürününü kontrol etmenizi sağlayan matematiksel gerçek nedir? Bunun ötesinde bir çözüm olamayacağını nasıl bilebiliriz? Ayrıca, I.sadece 1 sonuç getireceğini nasıl bilebiliriz ? Birden fazla olması mümkün değil mi?
Jonah

1
@Jonah - Her zaman işe yarayıp yaramadığını bilmiyorum; Sadece yaptığım tüm testler bu sınırlardaydı.
Galen Ivanov

2

R , 51 bayt

function(l){while(any((F+1:sum(l|1))%%l))F=F+1
F+1}

Çevrimiçi deneyin!

Kullanımı anyatar körtülü dönüşümü hakkında uyarı logical, kdönüş değeridir.



@ plannapus Ben düşündüm ama maalesef bu durumda l=c(15), çünkü başarısız seq(l)==1:l. seqböyle sinir bozucu!
Giuseppe

gerçekten ve sonra zorlamak seq_alongçok uzun.
plannapus

Yani, ancak bu uyarılardan kurtulmak sumyerine kullanmak any, FYI.
plannapus


2

APL (Dyalog Unicode) , 24 23 22 bayt

{∨/×⍺|⍵+⍳⍴⍺:⍺∇⍵+1⋄⍵}∘1

Çevrimiçi deneyin!

Teknik olarak, bu tam bir işlevdir. Bunu yapmak zorundaydım çünkü izin verilen tek girdi tamsayıların listesi. Kullanım Alanları ⎕IO←0(0-indexing)

İşlev yoksa n, zaman aşımına uğrarsa dikkat edin .

Her biri 1 byte için @ngn ve @ H.PWiz'e teşekkürler.

Nasıl?

{∨/×⍺|⍵+⍳≢⍺:⍺∇⍵+1⋄⍵}∘1  Main function. ⍺=input; ⍵=1.
{                   }∘1  Using 1 as right argument and input as left argument:
           :             If
        ⍳≢⍺              The range [0..length(⍺)]
      ⍵+                 +⍵ (this generates the vector ⍵+0, ⍵+1,..., ⍵+length(⍺))
    ⍺|                   Modulo 
   ×                     Signum; returns 1 for positive integers, ¯1 for negative and 0 for 0.
 ∨/                      Logical OR reduction. Yields falsy iff the elements of the previous vector are all falsy.
            ⍺∇⍵+1        Call the function recursively with ⍵+1.
                 ⋄⍵      Else return ⍵.


1

Japt, 10 bayt

undefinedİlk önce tarayıcınızı kilitlememesi durumunda, hiçbir çözüm yoksa, sonuçta çıkacaktır .

@e_X°vZÃ}a

Dene


açıklama

               :Implicit input of array U
@       }a     :Loop and output the first integer X that returns true.
 e_    Ã       :For every element Z in U
   X°          :X, postfix increcemnted
     vZ        :Is it divisible by Z?



1

Standart ML (MLton) , 96 bayt

open List;fun$n% =if all hd(tabulate(length%,fn i=>[1>(n+i)mod nth(%,i)]))then n else$(n+1)%;$1;

Çevrimiçi deneyin!

Ungolfed:

open List
fun f n l = 
    if all (fn x=>x)
           (tabulate ( length l
                     , fn i => (n+i) mod nth(l,i) = 0))
    then n 
    else f (n+1) l
val g = f 1

Çevrimiçi deneyin! Başlangıçtan itibaren n=1, işlev yerine getirilene kadar fartar , bu durumda döndürülür.nalln

tabulate(m,g)bazı tamsayı mve fonksiyonlarla glisteyi oluşturur [g 0, g 1, ..., g m]. Bizim durumumuzda tabulategiriş listesinin uzunluğu lve ith öğesinin lbölünüp bölünmediğini kontrol eden bir işlev ile çağrılır n+i. Bu, bir boole listesi verir, böylece allkimlik fonksiyonu ile fn x=>xtüm öğelerin doğru olup olmadığını kontrol eder.

Dört bayt Bu durumda kimlik fonksiyonu kısaltmak için iyi bir golf hile Bulunan: yerine lambda (fn x=>x), yapı-fonksiyon hdlistesi ilk elemanı döndüren kullanılır ve elde edilen bool değerlerden oluşan içinde tabulatesarılır [ve ]hiç singleton listeleri oluşturun.


1

PowerShell , 65 62 bayt

for(){$o=1;$i=++$j;$args[0]|%{$o*=!($i++%$_)};if($o){$j;exit}}

Çevrimiçi deneyin!

PowerShell bir eşdeğer yoktur anyya somebiz biraz daha farklı bir yaklaşıma ihtiyacımız nedenle, benzeri veya.

Bu, $args[0]diziyi girdi olarak alır , sonra sonsuz bir fordöngüye girer . Her belirlediğimiz yineleme $oolmak 1(daha sonra açıklanacaktır) ve seti $iolmak ++$j. Artış $j, önerilen çözümün $igeri kalanı üzerinde artmaya devam ederken, önerilen çözümün ilk sayısının ne olduğuna dair sekmeleri tutar .

Daha sonra girişin her elemanını $args[0]bir ForEach-Objectdöngüye göndeririz . İç döngü içinde, $obir hesaplama sonucu Boole ile çarpılırız . Bu, hesaplama bir değer için başarısız olursa $o, dönüşecek şekilde yapacaktır 0. Hesaplama !($i++%$_)veya modulo işleminin Boole değeridir. PowerShell'de sıfır olmayan herhangi bir değer eksik olduğundan, bu, kalanları bir yanlış değere dönüştürür $ove böylece dönüşür 0.

İç döngünün dışında if $o, sıfır değil, işe yarayan artan bir çözüm bulduk, çıktı alıyoruz $jve exit.


1

tinylisp , 108 bayt

(load library
(d ?(q((L N)(i L(i(mod N(h L))0(?(t L)(inc N)))1
(d S(q((L N)(i(? L N)N(S L(inc N
(q((L)(S L 1

Son satır, liste alan ve bir tamsayı döndüren adsız bir lambda işlevidir. Çevrimiçi deneyin!

Ungolfed

(load library)

(comment Function to check a candidate n)
(def sequentially-divisible?
 (lambda (divisors start-num)
  (if divisors
   (if (divides? (head divisors) start-num)
    (sequentially-divisible? (tail divisors) (inc start-num))
    0)
   1)))

(comment Function to check successive candidates for n until one works)
(def search
 (lambda (divisors start-num)
  (if (sequentially-divisible? divisors start-num)
   start-num
   (search divisors (inc start-num)))))

(comment Solution function: search for candidates for n starting from 1)
(def f
 (lambda (divisors)
  (search divisors 1)))


1

Python 2,78 bayt

def f(a,c=0):
 while [j for i,j in enumerate(a) if(c+i)%j<1]!=a:c+=1
 return c

EDIT: -26 @Chas Brown sayesinde


Güzel! Döngü çıkış koşulunuzu ters çevirdim ve 78 bayt almak için fikriniz geliştirilebilir .
Chas Brown,

@ HasBrown teşekkürler, bu şekilde yapmayı düşünmedim. Değişti!
sonrad10


0

APL NARS, 140 bayt, 70 karakter

r←f w;i;k
i←r←1⊃,w⋄k←¯1+⍴w⋄→0×⍳k=0
A:→0×⍳0=+/(1↓w)∣(k⍴r)+⍳k⋄r+←i⋄→A

Ölçek

  f 15
15
  f 3 4 5
3
  f 5 4 3
55
  f 2 3 5 7
158
  f 4 9 25 49
29348
  f 11 7 5 3 2 
1518

0

Java 8, 82 75 bayt

a->{for(int r=1,i,f;;r++){i=f=0;for(int b:a)f+=(r+i++)%b;if(f<1)return r;}}

Açıklama:

Çevrimiçi deneyin.

a->{                 // Method with integer-array parameter and integer return-type
  for(int r=1,       //  Return-integer, starting at 1
          i,         //  Index-integer
          f;         //  Flag-integer
      ;r++){         //  Loop indefinitely, increasing `r` by 1 after every iteration
    i=f=0;           //   Reset both `i` and `f` to 0
    for(int b:a)     //   Inner loop over the input-array
      f+=(r+i++)%b;  //    Increase the flag-integer by `r+i` modulo the current item
    if(f<1)          //   If the flag-integer is still 0 at the end of the inner loop
      return r;}}    //    Return `r` as result

0

Ruby , 47 46 43 42 bayt

->a{(1..).find{|i|a.all?{|v|i%v<1&&i+=1}}}

Çevrimiçi deneyin!

Not: (1..)sözdizimi sadece Ruby 2.6'da desteklenir, çünkü TIO sadece 2.5'i desteklediği için bağlantı eski bir sürüme (43 bayt) gelir.

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.