Tạo một chuỗi số nguyên


22

Định nghĩa

Chúng ta hãy gọi một chuỗi số nguyên (vô hạn) là phổ quát nếu nó chứa mọi chuỗi số nguyên hữu hạn như là một chuỗi liền kề.

Nói cách khác, chuỗi số nguyên (a 1 , a 2 , Mạnh) là phổ quát khi và chỉ khi, đối với mỗi chuỗi số nguyên hữu hạn (b 1 , Lỗi, b n ) , có một giá trị k sao cho (a k + 1 , Lọ, a k + n ) = (b 1 , Mạnh, b n ) .

Chuỗi các số nguyên tố dương, chẳng hạn, không phổ biến, trong số các số khác vì những lý do sau.

  • Nó không chứa bất kỳ số nguyên âm, 1 hoặc số tổng hợp nào.

  • Mặc dù nó chứa 3 , nhưng nó không chứa phần tiếp theo (3, 3, 3) .

  • Mặc dù nó chứa 25 , nhưng nó không chứa phần tiếp theo (2, 5) .

  • Mặc dù nó chứa phần tiếp theo liền kề (7, 11, 13) , nhưng nó không chứa phần tiếp theo liền kề (13, 11, 7) .

Bài tập

Chọn bất kỳ chuỗi số nguyên chung duy nhất nào (a 1 , 2 , Mạnh) và thực hiện nó theo ngôn ngữ lập trình bạn chọn, tuân theo các quy tắc sau.

  • Bạn có thể gửi một chương trình đầy đủ hoặc một chức năng.

  • Bạn có ba tùy chọn cho I / O:

    1. Không có đầu vào và in hoặc trả lại toàn bộ chuỗi.

    2. Lấy một chỉ số n làm đầu vào và in hoặc trả về một n .

    3. Lấy chỉ số n làm đầu vào và in hoặc trả về (a 1 , Mạnh, a n ) .

  • Đối với tùy chọn I / O 23 , bạn có thể sử dụng lập chỉ mục dựa trên 0 nếu muốn.

  • Việc gửi của bạn phải có tính xác định: nếu chạy nhiều lần với cùng một đầu vào, nó phải tạo ra cùng một đầu ra.

Ngoài ra, trừ khi nó rõ ràng ngay lập tức, vui lòng chứng minh rằng chuỗi bạn đã chọn là phổ quát. Bằng chứng của bạn có thể không phụ thuộc vào phỏng đoán chưa được chứng minh.

Luật tiêu chuẩn được áp dụng. Có thể mã ngắn nhất trong byte giành chiến thắng!


Bằng chứng của bạn có thể không phụ thuộc vào phỏng đoán chưa được chứng minh. Tôi nghĩ đó là ngụ ý: p
Erik the Outgolfer 19/10/17

và làm thế nào bạn sẽ lưu một danh sách các số trong một số?
RosLuP

Câu trả lời:


13

Husk , 5 byte

Điều này in một danh sách vô hạn

ΣṖ…ݱ

Hãy thử trực tuyến! hoặc tìm chỉ số đầu tiên của chuỗi của bạn . (Mất rất nhiều bộ nhớ cho hầu hết các chuỗi)

Giải trình:

   ݱ   Infinite list [1,-1,2,-2,3,-3,4,-4,5,-5...]
  …     Rangify       [1,0,-1,0,1,2,1,0,-1,-2,...]
 Ṗ      Powerset
Σ       Concatenate

Trong Husk cư xử độc đáo cho danh sách vô hạn. Bạn có thể thấy hành vi của nó ở đây


Bạn có thể muốn giải thích về cách làm Qviệc. (Tôi nghĩ rằng tôi đã nhận được nó, nhưng tôi không chắc chắn.)
Dennis

@Dennis hóa ra tôi muốn chứ không phảiQ
H.PWiz

9

Python 2 , 49 46 43 byte

def f(n):d=len(`n`);return n/d**(n%d)%d-d/2

f(n)chỉ trả về một n . Điều này sử dụng chữ số nhỏ nhất ntrong cơ sở dđể trích xuất một trong những chữ số cao hơn.

Hãy thử trực tuyến! Kịch bản này (lịch sự của Dennis) có bất kỳ chuỗi hữu hạn nào và cung cấp cho bạn nnơi chuỗi đó bắt đầu.

Giải trình

n/d**(n%d)%d-d/2
     (n%d)         least significant digit of n
n/d**(   )%d       get n%d-th digit of n
            -d/2   offset to get negative values

Ví dụ, đối ntrong phạm vi 3141592650đến 3141592659, d=10và chữ số cuối cùng của nlựa chọn một trong các chữ số khác. Sau đó, chúng tôi thêm -d/2để có được giá trị âm.

n%d:       0  1  2  3  4  5  6  7  8  9
f(n)+d/2:  0  5  6  2  9  5  1  4  1  3
f(n):     -5  0  1 -3  4  0 -4 -1 -4 -2

Thay thế độc lập, cũng 43 byte:

n=input();d=len(`n`);print n/d**(n%d)%d-d/2

Bạn có thể sử dụng len(`n`)thay vì len(str(n)).
Dennis

Cảm ơn @Dennis. Tôi có thể thêm lời giải thích nếu bất cứ ai cần nó.
japh

Tôi đã viết một hàm, đưa ra một chuỗi hữu hạn, tìm thấy một phần bù trong chuỗi của bạn. Hãy thử trực tuyến!
Dennis

Điều này là rất mát mẻ.
lịch sử

Tốt đẹp. Chỉ có điều là nó sẽ vượt lên n=2**63-1kể từ khi đại diện được Lnối thêm ( str(n)sẽ giải quyết điều đó cho ba byte nếu cần thiết).
Jonathan Allan

5

Brachylog 2, 11 byte

≜~×-₂ᵐ~ȧᵐ≜∋

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

Tôi cũng đã thử một thuật toán sử dụng các phân vùng phụ gia trong danh sách, nhưng nó không ngắn hơn. Đây là một trình tạo tạo ra một luồng số nguyên vô hạn làm đầu ra; liên kết TIO có một tiêu đề để in mười nghìn đầu tiên.

Giải trình

Chương trình bắt đầu bằng cách thử tất cả các số nguyên có thể theo thứ tự ( thử tất cả các khả năng còn lại, cho các số nguyên theo mặc định). Đó là 0, 1, -1, 2, -2, v.v. (mặc dù các số nguyên âm không đi đến cuối chương trình). Đây là bước "vô hạn" duy nhất của chương trình; tất cả những người khác là hữu hạn.

sau đó tạo ra tất cả các hệ số có thể có của số nguyên, coi các đơn hàng khác nhau là khác nhau và chỉ sử dụng các giá trị từ 2 trở lên (do đó chỉ có nhiều số hữu hạn); lưu ý rằng số tổng hợp được phép trong hệ số, không chỉ các số nguyên tố. Điều này có nghĩa là tất cả các chuỗi số nguyên có thể ≥ 2 sẽ được tạo bởi bước này tại một thời điểm nào đó trong quá trình thực thi chức năng (vì như vậy một chuỗi nhất thiết phải có một số sản phẩm và sản phẩm đó sẽ được tạo ra tại một số điểm vào lúc đầu ).

Sau đó, chúng ta cần ánh xạ tập hợp các chuỗi đó vào tập hợp tất cả các chuỗi số nguyên, được thực hiện theo hai bước: trừ 2 ( -₂) từ mỗi phần tử ( ), cho chúng ta tập hợp tất cả các chuỗi số nguyên không âm, sau đó lấy cộng hoặc trừ ( , tức là "một giá trị có giá trị tuyệt đối") mỗi phần tử (). Bước thứ hai rõ ràng là không xác định, vì vậy Brachylog coi nó như một trình tạo, tạo ra tất cả các danh sách có thể có các phần tử được cộng hoặc trừ phần tử tương ứng của danh sách đầu vào. Điều này có nghĩa là bây giờ chúng ta có một trình tạo cho tất cả các chuỗi số nguyên có thể và nó tạo ra chúng theo thứ tự có nghĩa là tất cả chúng được tạo ra (cụ thể là thứ tự bạn nhận được nếu bạn lấy giá trị tuyệt đối của từng phần tử, thêm 2 cho mỗi phần tử phần tử, và sau đó đặt hàng theo sản phẩm của các phần tử kết quả).

Thật không may, câu hỏi muốn một chuỗi duy nhất, không phải là một chuỗi các chuỗi, vì vậy chúng tôi cần thêm hai lệnh. Đầu tiên, yêu cầu Brachylog tạo ra một cách rõ ràng trình tự các chuỗi (trái ngược với việc tạo ra một cấu trúc dữ liệu mô tả khái niệm về một chuỗi được tạo thông qua phương thức này và không thực sự tạo ra các chuỗi cho đến khi cần thiết); cả hai điều này xảy ra để làm cho chương trình nhanh hơn trong trường hợp này và đảm bảo rằng đầu ra được sản xuất theo thứ tự được yêu cầu. Cuối cùng, làm cho trình tạo xuất ra các phần tử của từng phần một lần (chuyển sang phần tiếp theo một khi nó xuất tất cả các phần tử của phần trước đó).

Kết quả cuối cùng: mỗi chuỗi số nguyên có thể được tạo và xuất ra, một phần tử tại một thời điểm và tất cả được nối với nhau thành một chuỗi phổ quát duy nhất.


ais523, đó là bạn!?
Gây tử vong vào

Nếu không phải họ, đó là một sự trùng hợp ngẫu nhiên, xem xét các bài đăng từ tài khoản đã xóa của họ hiển thị cùng số tài khoản.
hoàn toàn là


4

Python 2 , 100 99 byte

  • Lưu một byte nhờ vào các lò nướng ; lặp đi lặp lại qua một itertoolsvòng lặp tích hợp đến vô hạn.
from itertools import*
for n in count():
 for P in permutations(range(-n,n)*n):
	for p in P:print p

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

nIn vô thời hạn tất cả các hoán vị của phạm vi số nguyên lặp lại -times [-n; n)cho tất cả các số nguyên không âm n.
Bạn có thể tìm kiếm phần bù đầu tiên kcho bất kỳ phần tiếp theo nào bằng phiên bản sửa đổi này .


while~0:. Heh heh ...
Chas Brown

99 byte bằng cách sử dụngitertools.count
ovs

@ovs Cảm ơn; không biết rằng tích hợp sẵn.
Jonathan Frech

2

Perl 6 , 91 byte

loop (my$i=1;;$i++){my@n=(-$i..$i);my@m=@n;loop (my$k=1;$k <$i;$k++){@m=@m X@n;};print @m;}

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

Điều này sử dụng một phương pháp tương tự như một số câu trả lời khác. Nó sử dụng các sản phẩm của Cartesian để in các phần tử của (-1,0,1), sau đó tất cả các cặp phần tử được (-2,-1,0,1,2)đặt hàng, sau đó tất cả các bộ ba được sắp xếp của các phần tử trong (-3,-2,-1,0,1,2,3), v.v.

Tôi mới biết đến Perl, vì vậy có thể có nhiều môn đánh gôn có thể được thực hiện.

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

loop (my $i = 1; ; $i++) {
  my @n = (-$i..$i);
  my @m = @n;
  loop (my $k=1; $k <$i; $k++) {
    @m = @m X @n;
  }
  print @m;
}
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.