Делится последовательно


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 и примерно 0,03 с на MATLAB. Существует небольшая вероятность того, что у 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в конце? Я уверен, что здесь можно сохранить еще кое-что, но я не знаю Пита.
Лохматый

@Shaggy и @Giuseppe, вы оба правы, и удаление финала 2решает проблему
Дэйв

2

J , 23 байта

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

Попробуйте онлайн!


Ницца. Какой математический факт позволяет вам проверять только произведение входов? Откуда мы знаем, что не может быть решения помимо этого? Кроме того, как мы узнаем, I.вернется только 1 результат? Разве не возможно, что есть несколько?
Иона

1
@ Джона - я не знаю, работает ли это всегда; только все тесты, которые я сделал, были в этих пределах.
Гален Иванов

2

R , 51 байт

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

Попробуйте онлайн!

Использование anythrows kпредупреждений о неявном преобразовании в logical, где kэто возвращаемое значение.



@plannapus Я думал об этом, но, к сожалению, это не сработало l=c(15), потому seq(l)==1:lчто в этом случае. seqтак раздражает!
Джузеппе

Арф действительно, и тогда принуждение seq_alongслишком длинное.
plannapus

Таким образом, но sumвместо того, anyчтобы избавиться от этих предупреждений, к вашему сведению.
plannapus


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;

Попробуйте онлайн!

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

Попробуйте онлайн! Начиная с n=1, функция fувеличивается nдо тех пор, пока не allбудет выполнено условиеn возвращается.

tabulate(m,g)с некоторым целым числом mи функцией gстроит список [g 0, g 1, ..., g m]. В наших условиях tabulateвызывается длина входного списка lи функция, которая проверяет, делится ли iэлемент th . Это дает список логических значений, поэтому с помощью функции identity проверяется, являются ли все элементы истинными.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

Последняя строка - это безымянная лямбда-функция, которая принимает список и возвращает целое число. Попробуйте онлайн!

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

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

РЕДАКТИРОВАТЬ: -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

0

Рубин , 47 46 43 42 байта

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

Попробуйте онлайн!

Примечание: (1..)синтаксис поддерживается только в ruby ​​2.6, на данный момент TIO поддерживает только 2.5, поэтому ссылка на более старую версию (43 байта).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.