Послідовно ділиться


24

Іноді засинаю, я буду рахувати стільки, скільки можу, пропускаючи цифри, які не є квадратними . У мене виникає невелике збудження, коли мені стає пропускати кілька рядів підряд - наприклад, 48,49,50всі НЕ є квадратними (48 ділиться на 2 ^ 2, 49 на 7 ^ 2, а 50 на 5 ^ 2).

Це змусило мене замислитися про найдавніший приклад сусідніх чисел, що ділиться на якусь довільну послідовність дільників.

Вхідні дані

Введення - це упорядкований список a = [a_0, a_1, ...]строго позитивних цілих чисел, що містять щонайменше 1 елемент.

Вихідні дані

Вихід - це найменше додатне ціле число nз властивістю, яке a_0ділить n, a_1ділить n+1і загалом a_kділить n+k. Якщо такого не nіснує, поведінка функції / програми не визначається.

Випробування

[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

Оцінка балів

Це ; найкоротший результат (за мовою) виграє хвастощі. Звичайні лазівки виключаються.


Відповіді:




5

MATL , 11 байт

`Gf@q+G\a}@

Спробуйте в Інтернеті!

`           % 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.

Не зовсім оптимізований для швидкості ... найбільший тест займає повну хвилину за допомогою MATL, а MATLAB - приблизно 0,03 секунди. Є невелика можливість, що MATL має трохи більше накладних витрат.


ах, у мене було n:q`QtG\a]1)12 байт, але n:, очевидно, те саме, що fтут. Я про це завжди забуваю, тож ви можете додати його як альтернативний 11 байт.
Джузеппе

1
@Giuseppe Занадто погано fq`QtG\a}@повертає сторонні копії даних.
Санчіз

5

JavaScript, 42 40 байт

Якщо помилки не буде (або рішення занадто велике), виникла помилка рекурсії.

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

Збережено 2 байти з покажчиком від Ріка Хічкока


Спробуй це

Введіть список цифр, розділених комами.

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>


Хороший підхід, але зазнає невдачі при перевищенні меж рекурсії, наприклад, з [4,9,25,49].
Час Браун

1
@ChasBrown, для цілей коду гольфу, ми можемо вважати нескінченну пам'ять.
Кудлатий

Я думаю, це спрацює на 38 байт: (a,y=n=0)=>a.some(x=>y++%x)?f(a,++n):n
Рік Хічкок

О, приємний, @RickHitchcock - спасибі. Не забувайте f=, однак.
Кудлатий

Ах, звичайно. Це 40 байт.
Рік Хічкок





3

Pyth , 11 байт

f!s.e%+kTbQ 

Спробуйте в Інтернеті!


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

Вам потрібен 2кінець? Я впевнений, що тут можна зберегти більше, але Pyth не знаю.
Кудлатий

@Shaggy та @Giuseppe, ви обидва маєте рацію, і відмовившись від кінця, 2вирішує проблему
Дейв

2

J , 23 байти

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

Спробуйте в Інтернеті!


Приємно. Що таке математичний факт, що дозволяє перевірити лише добуток вхідних даних? Як ми можемо знати, що поза цим рішенням не може бути рішення? Крім того, як ми знаємо, що I.повернеться лише 1 результат? Чи не можливо їх кілька?
Йона

1
@Jonah - я не знаю, чи працює це завжди; просто всі тести, які я робив, були в цих межах.
Гален Іванов

2

R , 51 байт

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

Спробуйте в Інтернеті!

Використання anyзакидів kпопереджень про неявну конверсію в logical, де kє повернене значення.



@plannapus я вважав це, але це, на жаль, не вдається l=c(15), оскільки seq(l)==1:lв цьому випадку. seqдратує так!
Джузеппе

arf дійсно, а потім примушувати seq_alongзанадто довго.
планнапус

Отже, але використовуючи sumзамість того, anyщоб позбутися цих попереджень, FYI.
планнапус


2

APL (Dyalog Unicode) , 24 23 22 байт

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

Спробуйте в Інтернеті!

Технічно це негласна функція. Мені довелося зробити так, оскільки єдиний дозволений вхід - це список цілих чисел. Використання ⎕IO←0(0-індексація)

Варто зазначити, що функція вимкнено, якщо її nнемає.

Завдяки @ngn та @ H.PWiz по 1 байту кожен.

Як?

{∨/×⍺|⍵+⍳≢⍺:⍺∇⍵+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 байт

Зрештою буде виведено, undefinedякщо рішення не існує, якщо воно не вибиває браузер спочатку.

@e_X°vZÃ}a

Спробуй це


Пояснення

               :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

Стандартний ML (MLton) , 96 байт

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

Спробуйте в Інтернеті!

Безголівки:

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

Спробуйте в Інтернеті! Починаючи з n=1, функція fкроком , nпоки all-Умови не виконується, і в цьому випадку n, повертається.

tabulate(m,g)з деяким цілим mі функцією gбудує список [g 0, g 1, ..., g m]. У нашому стані tabulateвикликається довжина списку вхідних даних lі функція, яка перевіряє, чи ділиться цей iелемент . Це дає список булевих, тому функція ідентичності перевіряє, чи всі елементи істинні.ln+iallfn x=>x

Я знайшов хороший гольф трюк , щоб скоротити тотожну функцію в цьому випадку чотири байти: Замість лямбда (fn x=>x), збірка-функції hdвикористовуються, яка повертає перший елемент списку, і в результаті Bools в tabulateобгорнутий [і ]до створити списки однотонних.


1

PowerShell , 65 62 байт

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

Спробуйте в Інтернеті!

PowerShell не має еквівалента того anyчи іншого some, тому нам потрібен дещо інший підхід.

Це приймає вхід $args[0]як масив, після чого надходить у нескінченний forцикл. Кожну ітерацію, яку ми встановимо, $oбуде 1(пояснено пізніше), і встановимо $iяк ++$j. Приріст $jведе облік того, що є першим номером пропонованого рішення, в той час $iяк приріст буде над рештою запропонованого рішення.

Потім відправляємо кожен елемент вводу $args[0]в ForEach-Objectцикл. Всередині внутрішньої петлі ми булеві множимо на $oрезультат обчислення. Це зробить так, що якщо обчислення не вдасться до значення, $oперейде до 0. Обчислення - !($i++%$_)або булеве значення - не модульна операція. Оскільки будь-яке ненулеве значення є простим у PowerShell, це перетворює будь-які залишки у значення фальси, таким чином перетворюючись $oна 0.

Поза внутрішньої петлі - if $oце ненульове значення, ми знайшли рішення, що збільшується, що працює, тому ми виводимо $jі exit.


1

тинілісп , 108 байт

(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

Останній рядок - це неназвана лямбда-функція, яка бере список і повертає ціле число. Спробуйте в Інтернеті!

Безумовно

(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 байт

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


Приємно! Я обернув ваш стан виходу з циклу, і ваша ідея може бути покращена, щоб отримати 78 байт .
Час Браун

@ChasBrown спасибі, я не думав робити це так. Змінено!
sonrad10


0

APL NARS, 140 байт, 70 символів

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

тест

  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 байт

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.