Podzielna sekwencyjnie

24

Czasami zasypiam, liczę tak wysoko, jak potrafię, pomijając liczby, które nie są kwadratowe . Czuję dreszczyk emocji, gdy mogę pominąć kilka liczb z rzędu - na przykład, 48,49,50wszystkie NIE są kwadratowe (48 jest podzielne przez 2 ^ 2, 49 przez 7 ^ 2 i 50 przez 5 ^ 2).

Doprowadziło mnie to do zastanowienia się nad najwcześniejszym przykładem sąsiednich liczb podzielnych przez jakąkolwiek dowolną sekwencję dzielników.

Wkład

Dane wejściowe to uporządkowana lista a = [a_0, a_1, ...]ściśle dodatnich liczb całkowitych zawierająca co najmniej 1 element.

Wydajność

Dane wyjściowe to najmniejsza dodatnia liczba całkowita nz właściwością, która a_0dzieli n, a_1dzieli n+1i bardziej ogólnie a_kdzieli n+k. Jeśli takiego nie nma, zachowanie funkcji / programu nie jest zdefiniowane.

Przypadki testowe

[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

Punktacja

To jest ; najkrótszy wynik (na język) wygrywa prawo do chwalenia się. Zwykłe luki są wykluczone.

Chas Brown
źródło
Związane .
alephalpha

Odpowiedzi:

6

Łuska , 7 bajtów

VδΛ¦⁰ṫN

Wypróbuj online!

Wyjaśnienie

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.
Zgarb
źródło
5

MATL , 11 bajtów

`Gf@q+G\a}@

Wypróbuj online!

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

Niezupełnie zoptymalizowany pod kątem prędkości ... największa testowa metoda zajmuje MATLAB i około 0,03 s na MATLAB. Istnieje niewielka możliwość, że MATL ma nieco więcej kosztów ogólnych.

Sanchises
źródło
ah, miałem n:q`QtG\a]1)na 12 bajtów, ale n:jest oczywiście taki sam jak ftutaj. Zawsze o tym zapominam, więc możesz dodać to jako alternatywne 11 bajtów.
Giuseppe
1
@Giuseppe Too bad fq`QtG\a}@zwraca obcą kopię danych wejściowych.
Sanchises
5

JavaScript, 42 40 bajtów

Zgłasza błąd rekurencji, jeśli nie ma rozwiązania (lub rozwiązanie jest zbyt duże).

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

Zapisano 2 bajty ze wskaźnikiem od Ricka Hitchcocka


Spróbuj

Wpisz listę liczb oddzieloną przecinkami.

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>

Kudłaty
źródło
Ładne podejście, ale kończy się niepowodzeniem, przekraczając granice rekurencji np [4,9,25,49].
Chas Brown
1
@ChasBrown do celów golfa możemy założyć nieskończoną pamięć.
Kudłaty
Myślę, że to zadziała dla 38 bajtów: (a,y=n=0)=>a.some(x=>y++%x)?f(a,++n):n
Rick Hitchcock
Oo, miło, @RickHitchcock - dzięki. Nie zapomnij f=jednak.
Kudłaty
Ach, oczywiście. Ma 40 bajtów.
Rick Hitchcock
3

05AB1E , 9 bajtów

Xµā<N+sÖP

Wypróbuj online!

Wyjaśnienie

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
Emigna
źródło
Obala moją 17-bajtową odpowiedź ouch.
Magic Octopus Urn
3

Haskell , 45 44 bajtów

f a=[n|n<-[1..],1>sum(zipWith mod[n..]a)]!!0

Wypróbuj online!

Edycja: -1 bajtów dzięki nim!

Laikoni
źródło
1
sum(zipWith mod[n..]a)<1.
nimi
3

Czysty , 61 bajtów

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

Wypróbuj online!

Obrzydliwe
źródło
2
Wydaje mi się, że [1..]zamiast list [0..]wyjściowych nie należy wypisywać 0dodatniej liczby całkowitej.
Laikoni
@Laikoni dzięki, naprawiono.
Οurous
3

Pyth , 11 bajtów

f!s.e%+kTbQ 

Wypróbuj online!


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
Dave
źródło
Czy potrzebujesz 2na końcu? Jestem pewien, że jest tu więcej do uratowania, ale nie znam Pytha.
Kudłaty
@Shaggy i @Giuseppe, oboje macie rację, a upuszczenie zakończenia 2rozwiązuje problem
Dave
2

J , 23 bajty

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

Wypróbuj online!

Galen Iwanow
źródło
Miły. Jaki jest matematyczny fakt, który pozwala sprawdzić tylko iloczyn danych wejściowych? Skąd wiemy, że nie może być innego rozwiązania? Ponadto, skąd wiemy, że I.zwróci tylko 1 wynik? Czy nie jest możliwe, że jest ich wiele?
Jonasz
1
@Jonah - Nie wiem, czy to zawsze działa; tylko wszystkie testy, które przeprowadziłem, były w tych granicach.
Galen Iwanow
2

R , 51 bajtów

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

Wypróbuj online!

Zastosowanie anyrzuca kostrzeżenia o niejawnej konwersji na logical, gdzie kjest wartość zwracana.

Giuseppe
źródło
47 bajtów !
plannapus
@plannapus Rozważyłem to, ale niestety nie udaje się l=c(15), ponieważ seq(l)==1:lw takim przypadku. seqjest tak denerwujące!
Giuseppe
arf rzeczywiście, a potem zmuszanie seq_alongjest po prostu za długie.
plannapus
Więc, ale używając sumzamiast anypozbyć się tych ostrzeżeń, FYI.
plannapus
2

APL (Dyalog Unicode) , 24 23 22 bajtów

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

Wypróbuj online!

Technicznie jest to funkcja ukryta. Musiałem to zrobić, ponieważ jedynym dozwolonym wejściem jest lista liczb całkowitych. Zastosowania ⎕IO←0(indeksowanie 0)

Warto zauważyć, że funkcja przekroczy limit czasu, jeśli nnie istnieje.

Dzięki @ngn i @ H.PWiz za 1 bajt każdy.

W jaki sposób?

{∨/×⍺|⍵+⍳≢⍺:⍺∇⍵+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 ⍵.
J. Sallé
źródło
1

Perl 5 , 49 + 2 ( -pa) = 51 bajtów

$i=!++$\;($\+$i)%$_&&last,$i++for@F;$i<@F&&redo}{

Wypróbuj online!

Xcali
źródło
1

Japt, 10 bajtów

W końcu zostanie wygenerowany, undefinedjeśli nie ma rozwiązania, jeśli nie spowoduje to awarii przeglądarki w pierwszej kolejności.

@e_X°vZÃ}a

Spróbuj


Wyjaśnienie

               :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?
Kudłaty
źródło
1

Standardowy ML (MLton) , 96 bajtów

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

Wypróbuj online!

Nie golfowany:

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

Wypróbuj online! Począwszy od n=1, funkcja fzwiększa się ndo momentu allspełnienia warunku, w którym nto przypadku jest zwracana.

tabulate(m,g)z jakąś liczbą całkowitą mi funkcją gbuduje listę [g 0, g 1, ..., g m]. W naszym stanie tabulatejest wywoływany z długością listy danych wejściowych li funkcją, która sprawdza, czy ielement th ldzieli n+i. Daje to listę wartości logicznych, więc allfunkcja tożsamości fn x=>xsprawdza, czy wszystkie elementy są prawdziwe.

Znalazłem fajną sztuczkę golfową, aby skrócić funkcję identyfikacji w tym przypadku o cztery bajty: Zamiast lambda (fn x=>x) , build-funkcja hdjest używana, który zwraca pierwszy element listy, a powstałe bools w tabulateowinięto w [i ]do tworzyć listy singletonów.

Laikoni
źródło
1

PowerShell , 65 62 bajtów

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

Wypróbuj online!

PowerShell nie ma odpowiednika any lub somelub tym podobne, więc musimy nieco innego podejścia.

Pobiera dane wejściowe $args[0]jako tablicę, a następnie wchodzi w nieskończoną forpętlę. Każda iteracja ustawiamy $osię 1(wyjaśnione później), i ustawić $isię++$j . Inkrementacja $jśledzi, jaka jest pierwsza liczba proponowanego rozwiązania, podczas gdy $ibędzie się zwiększać w stosunku do reszty proponowanego rozwiązania.

Następnie wysyłamy każdy element wejścia $args[0]do ForEach-Objectpętli. Wewnątrz wewnętrznej pętli logicznie mnożymy się $odo wyniku obliczeń. Sprawi to, że jeśli obliczenie nie powiedzie się dla wartości, $ozwróci się do 0. Obliczenie to !($i++%$_)lub logiczna operacja modulo. Ponieważ każda niezerowa wartość jest prawdziwa w PowerShellu, zmienia to resztę w wartość falsey, w ten sposób zamieniając się $ow 0.

Poza wewnętrzną pętlą if $ojest niezerowa, znaleźliśmy rozwiązanie zwiększające, które działa, więc generujemy $ji exit.

AdmBorkBork
źródło
1

tinylisp , 108 bajtów

(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

Ostatni wiersz to nienazwana funkcja lambda, która pobiera listę i zwraca liczbę całkowitą. Wypróbuj online!

Bez golfa

(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)))
DLosc
źródło
1

Julia 0.6 , 79 bajtów

f(s,l=length(s),n=s[])=(while !all(mod.(collect(0:l-1).+n,s).==0);n+=s[];end;n)

Wypróbuj online!

Wejścia bez ważnego rozwiązania spowodują nieskończone zapętlenie ... :)

niczky12
źródło
1

Python 2, 78 bajtów

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

EDYCJA: -26 dzięki @Chas Brown

sonrad10
źródło
Miły! Odwróciłem warunek wyjścia z pętli, a twój pomysł można ulepszyć, aby uzyskać 78 bajtów .
Chas Brown
@ChasBrown dzięki, nie myślałem o zrobieniu tego w ten sposób. Zmieniono!
sonrad10
0

APL NARS, 140 bajtów, 70 znaków

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

test

  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
RosLuP
źródło
0

Java 8, 82 75 bajtów

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

Wyjaśnienie:

Wypróbuj online.

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
Kevin Cruijssen
źródło
0

Ruby , 47 46 43 42 bajtów

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

Wypróbuj online!

Uwaga: (1..)składnia jest obsługiwana tylko w Ruby 2.6, na razie TIO obsługuje tylko 2.5, więc link jest do starszej wersji (43 bajty).

Asone Tuhid
źródło