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.


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.

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.


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>


Ł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

Obala moją 17-bajtową odpowiedź ouch.
Magic Octopus Urn



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

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!


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.



@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 ⍵.


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?



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.


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.


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)))

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 ... :)


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


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

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

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).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.