Tuần tự chia hết


24

Thỉnh thoảng để ngủ, tôi sẽ tính cao nhất có thể, trong khi bỏ qua những con số không vuông . Tôi có một chút hồi hộp khi tôi bỏ qua nhiều số liên tiếp - ví dụ, 48,49,50tất cả đều KHÔNG vuông góc (48 chia hết cho 2 ^ 2, 49 cho 7 ^ 2 và 50 cho 5 ^ 2).

Điều này khiến tôi băn khoăn về ví dụ sớm nhất về các số liền kề chia hết cho một số ước số tùy ý.

Đầu vào

Đầu vào là một danh sách theo thứ tự a = [a_0, a_1, ...]các số nguyên dương hoàn toàn chứa ít nhất 1 phần tử.

Đầu ra

Đầu ra là số nguyên dương nhỏ nhất nvới thuộc tính a_0chia n, a_1chia n+1a_kchia chung hơn n+k. Nếu không có như vậy n, hành vi của chức năng / chương trình không được xác định.

Các trường hợp thử nghiệm

[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

Chấm điểm

Đây là ; kết quả ngắn nhất (theo ngôn ngữ) giành được quyền khoe khoang. Các sơ hở thông thường được loại trừ.


Câu trả lời:



6

Husk , 7 byte

VδΛ¦⁰ṫN

Hãy thử trực tuyến!

Giải trình

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 byte

`Gf@q+G\a}@

Hãy thử trực tuyến!

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

Không được tối ưu hóa chính xác cho tốc độ ... bản thử nghiệm lớn nhất mất toàn bộ thời gian sử dụng MATL và khoảng 0,03 giây trên MATLAB. Có một khả năng nhỏ MATL có thêm một chút chi phí.


ah, tôi đã có n:q`QtG\a]1)12 byte nhưng n:rõ ràng là giống như fở đây. Tôi luôn quên điều đó, vì vậy bạn có thể thêm nó dưới dạng thay thế 11.
Giuseppe

1
@Giuseppe Quá xấu fq`QtG\a}@trả về một bản sao đầu vào không liên quan.
Chiếm 23/1/18

5

JavaScript, 42 40 byte

Sẽ ném một lỗi đệ quy nếu không có giải pháp (hoặc giải pháp quá lớn).

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

Đã lưu 2 byte với một con trỏ từ Rick Hitchcock


Thử nó

Nhập một danh sách các số được phân tách bằng dấu phẩy.

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>


Cách tiếp cận đẹp, nhưng thất bại bằng cách vượt quá giới hạn đệ quy với, ví dụ , [4,9,25,49].
Chas Brown

1
@ChasBrown, với mục đích chơi gôn, chúng tôi có thể sử dụng bộ nhớ vô hạn.
Xù xì

Tôi nghĩ rằng điều này sẽ làm việc cho 38 byte: (a,y=n=0)=>a.some(x=>y++%x)?f(a,++n):n
Rick Hitchcock

Ồ, một cái hay đấy, @RickHitchcock - cảm ơn. Đừng quên f=, mặc dù.
Xù xì

À, tất nhiên rồi. Đó là 40 byte.
Rick Hitchcock




3

Sạch , 61 byte

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

Hãy thử trực tuyến!


2
Tôi nghĩ rằng bạn cần [1..]thay vì [0..]để tránh xuất ra 0, một số nguyên không tích cực, cho danh sách đơn.
Laikoni

@Laikoni cảm ơn, đã sửa.
Οurous

3

Bình thường , 11 byte

f!s.e%+kTbQ 

Hãy thử trực tuyến!


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

Bạn có cần 2ở cuối không? Tôi chắc chắn có nhiều hơn để được cứu ở đây nhưng tôi không biết Pyth.
Xù xì

@Shaggy và @Giuseppe, cả hai bạn đều đúng và bỏ kết thúc 2khắc phục sự cố
Dave

2

J , 23 byte

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

Hãy thử trực tuyến!


Tốt đẹp. Thực tế toán học cho phép bạn chỉ kiểm tra sản phẩm của đầu vào là gì? Làm thế nào để chúng ta biết không thể có một giải pháp nào ngoài điều đó? Ngoài ra, làm thế nào để chúng ta biết I.sẽ chỉ trả lại 1 kết quả? Không thể có nhiều?
Giô-na

1
@Jonah - Tôi không biết nếu nó hoạt động luôn; tất cả các bài kiểm tra tôi đã làm là trong những giới hạn này.
Galen Ivanov

2

R , 51 byte

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

Hãy thử trực tuyến!

Việc sử dụng các cảnh báo anyném kvề chuyển đổi ngầm định logical, kgiá trị trả về ở đâu.



@plannapus Tôi đã xem xét nhưng không may thất bại l=c(15), vì seq(l)==1:ltrong trường hợp đó. seqThật phiền phức như thế!
Giuseppe

arf thực sự và sau đó buộc seq_alonglà quá dài.
plannapus

Vì vậy, nhưng sử dụng sumthay vì anyloại bỏ những cảnh báo đó, FYI.
plannapus


2

APL (Dyalog Unicode) , 24 23 22 byte

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

Hãy thử trực tuyến!

Về mặt kỹ thuật, đây là một chức năng ngầm. Tôi phải làm như vậy vì đầu vào duy nhất được phép là danh sách các số nguyên. Sử dụng ⎕IO←0(lập chỉ mục 0)

Điều đáng chú ý là hàm sẽ hết thời gian nếu nkhông tồn tại.

Cảm ơn @ngn và @ H.PWiz cho mỗi 1 byte.

Làm sao?

{∨/×⍺|⍵+⍳≢⍺:⍺∇⍵+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 byte

Cuối cùng sẽ xuất ra undefinednếu không có giải pháp nào tồn tại, nếu nó không làm sập trình duyệt của bạn trước.

@e_X°vZÃ}a

Thử nó


Giải trình

               :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 chuẩn (MLton) , 96 byte

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

Hãy thử trực tuyến!

Ung dung:

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

Hãy thử trực tuyến! Bắt đầu với n=1, hàm ftăng dần ncho đến khi allhoàn thành điều kiện, trong trường hợp nnày được trả về.

tabulate(m,g)với một số nguyên mvà hàm gxây dựng danh sách [g 0, g 1, ..., g m]. Trong điều kiện của chúng tôitabulate được gọi với độ dài của danh sách đầu vào lvà một hàm kiểm tra xem iphần tử thứ lchia n+i. Điều này mang lại một danh sách các booleans, vì vậy allvới hàm nhận dạng fn x=>xkiểm tra xem tất cả các phần tử có đúng không.

Tôi đã tìm thấy một mẹo chơi golf hay để rút ngắn chức năng nhận dạng trong trường hợp này bằng bốn byte: Thay vì lambda (fn x=>x), hàm dựng sẵn hdđược sử dụng, trả về phần tử đầu tiên của danh sách và các bool kết quả tabulateđược bọc trong[]để tạo danh sách đơn.


1

PowerShell , 65 62 byte

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

Hãy thử trực tuyến!

PowerShell không có tương đương với anyhoặcsome tương tự, vì vậy chúng tôi cần một cách tiếp cận hơi khác.

Điều này nhận đầu vào $args[0]như một mảng, sau đó đi vào một forvòng lặp vô hạn . Mỗi lần lặp chúng ta thiết lập $ođược 1(giải thích sau), và thiết lập $iđược ++$j. Gia số $jgiữ các tab về số đầu tiên của giải pháp được đề xuất là gì, trong khi mức $ităng sẽ so với phần còn lại của giải pháp được đề xuất.

Sau đó chúng tôi gửi từng phần tử của đầu $args[0]vào thành một ForEach-Objectvòng lặp. Trong vòng lặp bên trong, chúng tôi nhân Boolean vào $okết quả của phép tính. Điều này sẽ làm cho nó để nếu tính toán thất bại cho một giá trị, $onó sẽ chuyển sang 0. Tính toán là !($i++%$_), hoặc Boolean - không phải của phép toán modulo. Vì bất kỳ giá trị khác nào là trung thực trong PowerShell, điều này biến mọi phần còn lại thành giá trị falsey, do đó biến$o thành 0.

Bên ngoài vòng lặp bên trong, if $olà khác không, chúng tôi đã tìm thấy một giải pháp gia tăng hoạt động, vì vậy chúng tôi xuất ra $jexit.


1

tinylisp , 108 byte

(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

Dòng cuối cùng là một hàm lambda không tên, lấy danh sách và trả về một số nguyên. Hãy thử trực tuyến!

Bị đánh cắp

(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 byte

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 nhờ @Chas Brown


Tốt đẹp! Tôi đã chuyển điều kiện thoát vòng lặp của bạn và ý tưởng của bạn có thể được cải thiện để có được 78 byte .
Chas Brown

@ChasBrown cảm ơn, tôi đã không nghĩ làm theo cách đó. Thay đổi!
sonrad10


0

APL NARS, 140 byte, 70 ký tự

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

kiểm tra

  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 byte

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

Giải trình:

Hãy thử trực tuyến.

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 byte

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

Hãy thử trực tuyến!

NB: (1..)cú pháp chỉ được hỗ trợ trong ruby ​​2.6, hiện tại TIO chỉ hỗ trợ 2.5 nên liên kết là phiên bản cũ hơn (43 byte).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.