Tạo chuỗi Stöhr


12

Tôi đang học Ruby và đã viết mã không cần thiết đầu tiên của mình để giải quyết vấn đề này.

Thách thức là tạo ra n phần tử đầu tiên của chuỗi Stöhr , S , được định nghĩa như sau:

S [0] = 1

S [n] là số nhỏ nhất không thể biểu diễn dưới dạng tổng của hai phần tử khác biệt trước đó trong chuỗi.

Do đó, chuỗi bắt đầu bằng 1, 2, 4, 7 và 10. Phần tử tiếp theo là 13, vì 11 (= 1 + 10) và 12 (= 2 + 10) là tổng của các phần tử trước, nhưng 13 thì không.

Tôi đang tìm mã ngắn nhất. Riêng tôi, trong Ruby, dài 108 ký tự, nhưng có lẽ tôi sẽ chờ xem những gì người khác nghĩ ra trước khi đăng nó?


Tôi thích các câu trả lời cho đến nay. Bây giờ, có lẽ đã quá muộn để quay lại và thay đổi các yêu cầu, nhưng tôi cho rằng tôi nên đề cập rằng tôi đặc biệt quan tâm đến các giải pháp sử dụng định nghĩa của chính chuỗi đó (nghĩa là mã không biết trước rằng cuối cùng các số tăng 3). Vì vậy: điểm thưởng đạo đức nếu bạn có thể làm điều đó.
Théophile

Đó là vấn đề với trình tự toán học. Nếu bạn biết mẫu, nó thường sẽ ngắn hơn.

Trình tự này là số học mà không sử dụng (?).
dùng75200

@ user75200 Trình tự không phải là số học, như bạn có thể thấy từ sự khác biệt trong ba yếu tố đầu tiên, nhưng chuỗi bắt đầu từ yếu tố thứ ba thực sự là đối xứng. Nó được sử dụng liên quan đến vấn đề tem bưu chính.
Théophile

Câu trả lời:


13

APL, 7

Trong APL, bạn có thể chọn nếu bạn muốn làm việc với chỉ số 0 hoặc chỉ mục 1. Bạn làm điều này bằng cách đặt biến toàn cục ⎕IO ← 0

Nếu chúng ta chọn làm việc trong chỉ mục 0, chúng ta có:

+\3⌊1⌈⍳

Giải trình:

⍳    creates a sequence 0...n   (0 1 2 3 4 5)
1⌈   takes whichever is bigger, number in sequence or 1 (1 1 2 3 4 5)
3⌊   takes whichever is lower, number in sequence or 3 (1 1 2 3 3 3)
+\   partial sums for the sequence (1 2 4 7 10 13)

Dùng thử trên tryapl.org


Bạn không thể làm việc với 1 chỉ mục dựa trên và sau đó tạo mảng 1 đến n và chỉ cần thêm nó vào 1 chỉ số khác? Nếu điều đó có thể được thực hiện, nó có ngắn hơn không?
Tối ưu hóa

Mã tôi nhận được dài hơn. Đây là mã của tôi cho chỉ mục 1, 10 ký tự: + \ 3⌊1, 1 + Ngoài ra, phiên bản index-0 cũng hoạt động với đối số 0, trong khi phiên bản này thì không.
Moris Zucca

Ah. vâng APL thực sự tỏa sáng tại đây ..
Trình tối ưu hóa

9

Haskell - 11 21

Trình tự vô hạn lười biếng

1:2:[4,7..]

Hàm trả về số lượng thành viên vừa cung cấp (thở dài)

flip take$1:2:[4,7..]

Bạn phải lấy một đầu vào và chỉ in những nsố đầu tiên .
Tối ưu hóa

4
@Optimizer Vâng, về mặt kỹ thuật , bạn phải "tạo ra n phần tử đầu tiên của chuỗi Stöhr" không nói rằng bạn cũng không thể tạo ra phần còn lại của chúng! Nó cũng không nói rằng bạn phải lấy một đầu vào. Mã ban đầu của swish thực sự tạo ra các thuật ngữ n đầu tiên , cho bất kỳ n .
wchargein

1
@WChargin cố gắng trở nên quá tải không phải là mới. Lấy từ ngữ của OP quá đúng theo nghĩa đen và tạo ra sản lượng bổ sung hơn mức yêu cầu, cả hai đều được coi là sơ hở tiêu chuẩn.
Tối ưu hóa

2
@Optimizer Trên thực tế, lười biếng có nghĩa là không có đầu ra thêm sẽ được tạo ra cho đến khi bạn yêu cầu và bạn có thể yêu cầu bất kỳ điều khoản nào bạn muốn.
swish

1
@swish Tôi không hiểu. Lười ở đây là gì?
Tối ưu hóa

7

Python 2, 37 35 byte

lambda n:[1,2][:n]+range(4,n*3-4,3)

Sử dụng một mẫu ...


1
Bạn có thể bao gồm 4trong phạm vi:lambda n:[1,2][:n]+range(4,n*3-4,3)
Jakube

Đẹp tìm thấy. Đã chỉnh sửa thành 35 bây giờ.
Hiệp sĩ logic

6

CJam, 14 byte

1l~{_p_3e<+}*;

Kiểm tra nó ở đây.

Bắt đầu lúc 1. Sau đó, S [n] = S [n-1] + min (S [n-1], 3) .

1l~{_p_3e<+}*;
1              "Push 1.";
 l~            "Read and evaluate input N.";
   {       }*  "Repeat this block N times.":
    _p         "Duplicate the last number and print it.";
      _3e<     "Duplicate it again, and take minimum with 3.";
          +    "Add to last number.";
             ; "Discard final number to prevent output.";

Điều này dễ dàng khái quát hóa các chuỗi h -Stöhr nếu chúng ta thay thế 3 bằng 2 h -1 .


6

Brainfuck, 13 ký tự

+.+.++.[+++.]

Hoặc 30 ký tự nếu chúng ta muốn giới hạn ở n đầu ra:

,->+.<[->+.<[->++.<[->+++.<]]]

1
Tôi nghĩ rằng bạn cần in các nyếu tố đầu tiên , không phải là một dòng vô hạn của chúng ...
Sp3000

@ Sp3000 Việc sử dụng charcodes làm đầu vào số và đầu ra thường được chấp nhận? Không thể tìm thấy trên meta. Với điều đó, nó khá dễ dàng để sửa mã BF.
ngẫu nhiên

Cá nhân tôi không chắc sự đồng thuận chung cho việc này là gì, xin lỗi. Tôi cũng có một chút vấn đề với điều này.
Sp3000

đối với n phần tử đầu tiên, tôi nghĩ rằng tôi có thể làm -> +. <[-> +. <[-> ++. <[-> +++. <]]] (29 ký tự), nhưng điều đó không thanh lịch . Và tôi không nghĩ rằng ngôn ngữ được giới hạn cụ thể trong việc sử dụng mã ASCII cho đầu vào và đầu ra.
jgosar

1
Mã của bạn phải trả lời câu hỏi ngay cả khi nó không thanh lịch. Tôi sẽ đề nghị chỉnh sửa bài và sửa câu trả lời ,->+.<[->+.<[->++.<[->+++.<]]]. (Bạn đã bỏ lỡ dấu phẩy đọc đầu vào lúc đầu.)
ngẫu nhiên

4

Python, 136 byte

def f(n):
 if n<1:return[1]
 x=f(n-1);y=set(x)|{a+b for a in x for b in x if a!=b};return x+[min([a for a in range(1,max(y)+2)if{a}-y])]

Trực tiếp từ định nghĩa. Tôi không chắc mình có thể chơi golf này bao nhiêu - nó chắc chắn dài hơn tôi mong đợi.


3

J, 14 ký tự

Điều này chỉ mã hóa [1,2, 4+3*k (k=0..n-1) ]trình tự và mất đầu tiên N.

   ({.1,2,4+3*i.) 10
1 2 4 7 10 13 16 19 22 25

.

J, 18 ký tự

Cái này sử dụng kết hợp tuyến tính của [0,1,2,3...], [1,1,0,0...][0,1,1,1...]. Nên ngắn hơn nhưng dường như không thể đánh gôn nó.

   ((3&*+<&2-2**)@i.) 10
1 2 4 7 10 13 16 19 22 25

3

Mở đầu , 32 20

Chỉnh sửa: ... với hai lần tiếng nói bây giờ!

?(1-)
4 +3
2  ^
1 !^

Điều này giả sử trình thông dịch Python với NUMERIC_OUTPUT = True. Giống như đệ trình Brainfuck, câu trả lời này giả định rằng đầu vào được đưa ra dưới dạng một điểm mã. Đây là một phần để thu hút sự chú ý hơn cho cuộc thảo luận meta này (và một phần, vì tôi yêu Prelude). Vì vậy, nếu bạn muốn in 32 số đầu tiên, giả sử, bạn cần đặt một khoảng trắng trên STDIN. Tất nhiên, điều này có nghĩa là có giới hạn trên đối với các đầu vào hợp lệ, nhưng câu trả lời này dù sao cũng không chiến thắng, vì vậy tôi nghĩ trong giới hạn của Prelude, điều này là tốt.

Giải trình

Trong Prelude, tất cả các dòng được thực thi song song, dòng nào có ngăn xếp riêng, được khởi tạo thành một số lượng vô hạn. Chỉ có một con trỏ lệnh duy nhất (chỉ vào các cột), vì vậy nếu bạn nhập một vòng lặp trên một giọng nói, tất cả các giọng nói khác sẽ lặp cùng với nó.

Trong phần sau tôi đã chuyển mã, để tôi có thể chú thích các dòng thay vì các cột:

?421  Read a character into the first stack. Push 4, 2, 1 onto the other stacks, respectively.
      Generally, the fourth stack will hold the next number to be printed, the third stack the
      one after that, and the second stack the number two steps ahead.
(     Start a loop if the input wasn't 0.
1+ !  Push a 1 onto the first stack. Add the top elements in the second stack. On the first
      iteration this will be 0 and 4, so it does nothing. On all further iterations
      this will increment the last number by 3.
-3^^  Subtract one from the first stack. Push a 3 onto the second stack for the next iteration.
      Copy the last value from the second to the third, and the third to the fourth stack.
)     If the top of the first stack is not 0, jump back to the column after the (.

2

JavaScript (ES6) 92

Là một hàm đệ quy dựa trên định nghĩa vấn đề

S=(n,v=1,s=[],r=0)=>[for(a of s)for(b of s)r+=(a-b&&a+b==v)]|r||(s.push(v),--n)?S(n,v+1,s):s

Sử dụng mẫu 1,2, 1 + 3 * k: 58

S=(n)=>(i=>{for(t=1;n>r.push(t+=i);i+=(i<3));})(0,r=[])||r

Lưu ý bên lề: tìm chuỗi h-Stöhr (xác minh tổng số lên đến hsố thay vì chỉ 2). Các Rchức năng cố gắng toàn bộ số tiền possibile lên một số lượng nhất định các yếu tố danh sách.

S=(n,h=2,s=[],v=1,R=(t,v,l,i=0,r=t,w)=>{
  for(;r&&l&&v[i];i++)
    w=[...v],r=!R(t-w.splice(i,1),w,l-1)
  return!r;
})=>R(v,s,h)||(s.push(v),--n)?S(n,h,s,v+1):s

Ungolfed gần tương đương (và tương thích ES5)

function S(n, v, s)
{
  var r=0,a,b
  v = v||1
  s = s||[]
  for(a of s)
    for(b of s)
    {
      if (a != b && a+b == v) 
        r++;
    }
  if (r == 0) 
  {
    s.push(v);
    --n;
  }
  if (n != 0)
     return S(n,v+1,s)
  else
     return s
}

Kiểm tra trong bảng điều khiển FireFox / FireBug. Chức năng đơn giản:

S(20)

[1, 2, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49, 52, 55]

Chức năng nâng cao:

S(10,5)

[1, 2, 4, 8, 16, 32, 63, 94, 125, 156]


2

> <> (cá) , 72 65 49 46 ký tự

1n1-:?!;' 'o2n1-v
v1&no' ':<4&;!?:<
>-:?!;&3+^

Đầu vào được cung cấp cho trình thông dịch:

>fish.py stohr.fish -v 10
1 2 4 7 10 13 16 19 22 25

Chương trình đầu tiên của tôi> <>, đề xuất đánh giá cao.


Tốt thôi! Tôi đã hy vọng ai đó sẽ viết một chương trình> <>.
Théophile

2

> <>, 31 byte

4i1nao:?!;2nao1-:?!;$:nao3+$d0.

Đọc trong một char duy nhất, sử dụng điểm mã của nó (ví dụ: space = 32) và in các số một trên mỗi dòng.


2

Perl6 22/30

Tôi sẽ xem liệu Perl6 có thể suy ra trình tự cho tôi không.

Để làm điều đó tôi đã sử dụng REPL được tích hợp trong Perl6

$ perl6
> 1,2,4,7...*
Unable to deduce arithmetic or geometric sequence from 2,4,7 (or did you really mean '..'?)
> 1,2,4,7,10...*
1 2 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67 70 ...

Hmm, tôi thấy mô hình mà Perl suy luận. Sau 4 để có giá trị tiếp theo, bạn chỉ cần thêm 3.

1,2,4,*+3...*

Việc lưu một ký tự tạo mã để có được một danh sách vô hạn các số trong chuỗi Stöhr dài 13 ký tự.

Mã này chỉ thực hiện một cái gì đó hữu ích trong REPL vì nó in ý chính của kết quả cho chúng tôi. Để có được nó để in nếu không bạn sẽ phải nói rõ ràng với Perl để in kết quả.

$ perl6 -e 'say 1,2,4,*+3...*'

( * + 3chỉ đơn giản là một cách để có được một tham chiếu mã trả về 3 được thêm vào đối số duy nhất của nó. Các cách khác để viết nó sẽ là { $_ + 3 }, hoặc -> $i { $i + 3 }, { $^i + 3 }hoặc sub ($i){ $i + 3 })


Con đường ngắn nhất để tạo ra một cái gì đó Callable để tạo ra đầu tiên n yếu tố là để có được một lát trong những yếu tố.

{(1,2,4,*+3...*)[^$_]} # 22

Trong bối cảnh trống sẽ tạo ra các $_giá trị đầu tiên , sau đó nhanh chóng ném chúng đi.

Trong bất cứ điều gì khác ngoài ngữ cảnh void, nó tạo ra một khối mã ẩn danh (một chương trình con cơ bản không có tên), có một đối số.

# store it in a scalar variable
my $sub = {(1,2,4,*+3...*)[^$_]};
say $sub.(5);
# 1 2 4 7 10

# use it immediately
say {(1,2,4,*+3...*)[^$_]}.(5);
# 1 2 4 7 10

# pretend it always had a name
my &Stöhr-first = {(1,2,4,*+3...*)[^$_]};
say Stöhr-first 5;

Nếu bạn thực sự nghĩ rằng nó phải có một cái tên để đủ điều kiện là hợp lệ cho thử thách này, bạn có thể sẽ làm điều này:

sub s(\n){(1,2,4,*+3...*)[^n]} # 30

Mặc dù kể từ đó scũng được sử dụng cho toán tử thay thế, để gọi đây là parens là không tùy chọn. (Bạn có thể đặt cho nó một cái tên khác mà tôi cho là)

say s(5);
# 1 2 4 7 10

Trừ khi có quy định khác trong thử thách, bài nộp cho các thử thách chơi gôn phải có đầy đủ các chương trình hoặc chức năng , không chỉ là đoạn trích.
Martin Ender

@ MartinBüttner để công bằng 1,2,4,*+3...*thực sự tạo ra một đối tượng sẽ tạo ra các giá trị cần thiết. Tôi không nghĩ rằng nhiều người sẽ thực sự tạo ra một cái gì đó Callable xung quanh một cái gì đó như thế trong Perl6.
Brad Gilbert b2gills

2

Tôi thấy đã có một câu trả lời java tốt hơn NHIỀU nhưng tôi đã dành một chút thời gian cho việc này và tôi sẽ đăng nó. ngay cả khi nó hút.

Java 313 char (+4 để vừa với nó trên màn hình)

import java.util.*;public class S{public static void main(String[] a){
Set<Integer> S=new HashSet<Integer>();S.add(1);int i=1,k=0;
while(S.size()<=new Integer(a[0])){if(S.contains(i)){}else{k=0;for(int j:S){
for(int l:S){if(l!=j){if((j+l)==i)k=1;}}}if(k==0)S.add(i);}i++;}for(int x:S)
{System.out.println(x);}}}

luôn biết ơn để nhận được bất kỳ lời khuyên hoặc gợi ý về cách cải thiện


1

T-SQL 204

Giả sử rằng đầu vào nằm trong một biến gọi là @N. Tôi có thể thực hiện một quy trình nếu bạn muốn, nhưng thực sự không có cách nào tốt để có STD_IN trong T-SQL.

Ngoài ra, yay cho tiền thưởng đạo đức!

DECLARE @Q INT=0,@B INT=2
DECLARE @ TABLE(A INT)WHILE @N>0
BEGIN
SET @N-=1
WHILE @B>1
BEGIN
SET @Q+=1
SELECT @B=COUNT(*)FROM @ C,@ B WHERE C.A+B.A=@Q
END
INSERT INTO @ VALUES(@Q)SET @B=2
END
SELECT*FROM @

Đẹp! Tôi không biết nhiều về SQL, @N được sử dụng ở đây như thế nào? Tôi thấy rằng nó được đặt gần đầu, nhưng sau đó nó dường như không được tham chiếu sau.
Théophile

Dường như @Nlà "i" của "vòng lặp for".
Jacob

Jacob nói đúng. @N là "i" của vòng lặp for, là vòng lặp while trong SQL. Về cơ bản, nó kết hợp với bảng và tìm các cặp thêm vào @Q. Nếu có ít nhất hai cặp (tức là không chỉ một số với chính nó), thì nó sẽ bỏ qua nó. Nếu không, nó thêm nó vào bảng. @ là tên của bảng.
đánh dấu

1

Toán học, 27 byte

Hmmm, vẫn không có câu trả lời Mathicala? Đây là hai:

NestList[#+3~Min~#&,1,#-1]&
Array[i=1/2;i+=3~Min~i&,#]&

cả hai đều xác định một hàm thuần không được đặt tên sẽ nhận một số nguyên và trả về một danh sách các số nguyên. Điều này dựa trên mối quan hệ lặp lại tương tự như đệ trình CJam của tôi. Lưu ý rằng Arraymã dựa trên bắt đầu từ 1/2, bởi vì mối quan hệ lặp lại luôn được áp dụng trước khi giá trị được trả về.



1

Python - thậm chí không gần (139)

Hoạt động theo giả định rằng điều này không dễ tính như những người khác đã làm, giải pháp ngắn nhất tôi tìm thấy là dưới đây:

from itertools import combinations as C
x,i,n=[],1,input()
while len(x)<=n:
 if i not in [sum(y) for y in C(x,2)]:x.append(i)
 i+=1
print n

1

Áo choàng - 130 118

(defn s[n](last(take n(iterate #(if(<(count %)3)(conj %(+ (apply + %)1))(conj %(+(last %)(second %)(first %))))[1]))))

Phiên bản không chơi gôn:

(defn stohr [n]
  (last
    (take n
      (iterate #(if (< (count %) 3)
                   (conj % (+ (apply + %) 1))
                   (conj % (+ (last %) (second %) (first %)))) [1]))))

Chia sẻ và tận hưởng.


1

Hồng ngọc - 108 88

q=->n{*k=1;(m=k[-1];k<<([*m+1..2*m]-k.combination(2).map{|i,j|i+j})[0])while k.size<n;k}

Điều này sử dụng định nghĩa của chuỗi.

Phiên bản dễ đọc hơn:

q=->n{
    *k=1
    (
        m = k[-1]
        k << ([*m+1..2*m] - k.combination(2).map{|i,j|i+j})[0]
    ) while k.size < n
    k
}

in q [10]

[1, 2, 4, 7, 10, 13, 16, 19, 22, 25]


Mẹo chơi golf Ruby: *k=1thay vì k=[1]. foo while barthay vì while bar;foo;end. [*s..e]thay vì (s..e).to_a. .mapthay vì to_a.map. {|a,b|a+b}thay vì {|i|i.inject(:+)}.
lịch sử

@histocrat Cảm ơn, điều đó rất hữu ích!
Théophile


0

TI-BASIC, 41 27 30 byte

Đối với máy tính của bạn

Input N:For(I,1,N:I:If I>2:(I-2)3+1:Disp Ans:End

0

GML , 67 byte

n=argument0;for(i=1;i<=n;i++){t=i;if i>2t=(i-2)*3+1show_message(t)}
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.