Danh sách * tất cả * các bộ dữ liệu!


35

Viết chương trình, với n đầu vào , sẽ tạo ra tất cả các n-tup có thể sử dụng số tự nhiên.

n=1
(1),(2),(3),(4),(5),(6)...

n=2
(1,1),(1,2),(2,1),(2,2),(1,3),(3,1),(2,3),(3,2),(3,3)...

n=6
(1,1,1,1,1,1) (1,1,1,1,2,1) (1,1,1,2,1,1)... 
  • Đầu ra có thể theo bất kỳ thứ tự nào không phá vỡ bất kỳ quy tắc nào khác.
  • Chương trình phải được viết để chạy mãi mãi và liệt kê tất cả các bộ dữ liệu áp dụng chính xác một lần, theo lý thuyết.
    • Trong thực tế, chương trình của bạn sẽ đạt đến giới hạn và sự cố loại số nguyên của bạn. Điều này có thể chấp nhận được miễn là chương trình sẽ chạy dài vô tận nếu chỉ loại số nguyên của bạn là không giới hạn.
    • Mỗi bộ dữ liệu hợp lệ phải được liệt kê trong thời gian hữu hạn, nếu chỉ chương trình được phép chạy lâu như vậy.
  • Đầu ra có thể, tùy chọn của bạn, bao gồm các số 0 ngoài các số tự nhiên.
  • Bạn có thể chọn định dạng đầu ra của chương trình để thuận tiện, miễn là sự tách biệt giữa các bộ dữ liệu và số bên trong mỗi bộ dữ liệu là rõ ràng và nhất quán. (Ví dụ: một tuple trên mỗi dòng.)
  • Đầu vào (n) là một số nguyên từ một đến sáu. Hành vi cần thiết không được xác định cho các đầu vào bên ngoài phạm vi này.
  • Luật chơi golf áp dụng, chương trình ngắn nhất sẽ thắng.

Cảm ơn "Artemis Fowl" đã phản hồi trong giai đoạn hộp cát.


Tôi giả sử nó là hợp lệ nếu khi chương trình gặp sự cố, nó tạo ra một số đầu ra bên ngoài ngoài các bộ dữ liệu được in cho đến nay, phải không?
Luis Mendo

1
Chúng ta phải xuất ra khi chúng ta đi hoặc một chức năng mang lại một danh sách vô hạn vào cuối thời gian đủ?
Jonathan Allan

6
"Bạn có thể chọn định dạng đầu ra của chương trình để thuận tiện, miễn là sự tách biệt giữa các bộ dữ liệu và số bên trong mỗi bộ dữ liệu rõ ràng và nhất quán" - chúng ta có thể xuất ra sự khác biệt (mặc dù khác nhau nhất quán) (ví dụ như thế này )?
Jonathan Allan

@Jonathan ALLan Tôi sẽ phải bao gồm đầu ra của nội dung vô hạn của đối tượng đó như là một phần của chương trình.
billpg

1
Liên quan (số nguyên thay vì số tự nhiên)
Esolanging Fruit

Câu trả lời:


24

Husk , 2 byte

πN

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

Giải trình

Nlà danh sách vô hạn của số tự nhiên [1,2,3,4,... πlà sức mạnh của Cartesian. Kết quả là một danh sách vô tận của danh sách. Mỗi danh sách độ dài mong muốn xảy ra chính xác một lần vì πtuyệt vời như thế. Đầu vào và đầu ra là ẩn.


1
Ồ, và điều này cũng không làm [1,1, n]. Có một mô hình để đặt hàng đầu ra?
billpg

1
@billpg Nó xây dựng các bộ dữ liệu theo cách đệ quy: n- Bộ dữ liệu thu được bằng cách lấy sản phẩm Cartesian của danh sách ban đầu và danh sách n-1-tuples, theo thứ tự tăng dần của các chỉ số.
Zgarb

"Thứ tự tăng dần của các chỉ số" - Bạn có thể làm rõ điều này? Tôi gặp khó khăn khi thấy tại sao, ví dụ, 2,2,2đến sau 4,1,25,1,1.
Giô-na

2
@Jonah Việc đệ quy hoạt động như thế này. Bạn bắt đầu với 1-tuples hơn N. Đối với 2 tuple, bạn dùng sản phẩm của Cartesian theo Nthứ tự tổng hợp các chỉ số. Trong cả hai danh sách, mỗi số nnằm ở chỉ mục, nvì vậy trong khoảng thời gian 2, kết quả sẽ được sắp xếp theo tổng. Để có được 3 tuple, bạn lấy sản phẩm của Cartesian Nvà danh sách 2 tuple, được sắp xếp theo tổng các chỉ số của các thành phần trong các danh sách này. Nó không nhìn vào tổng của tuple, nó nhìn vào vị trí của nó trong danh sách các bộ.
Zgarb

2
"Tìm ra các kích thước khác nhau của vô cực trong nhiệm vụ này và tìm một mẫu làm giảm nó thành vô hạn có thể đếm được, sau đó viết một chương trình lặp lại trên mẫu này." - "Này, tôi có một bản dựng sẵn cho điều đó!"
Fabian Röling

10

Haskell , 62 byte

([1..]>>=).(!)
0!s=[[]|s<1]
n!s=[a:p|a<-[1..s],p<-(n-1)!(s-a)]

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

n!stạo ra tất cả các n-tuples mà tổng hợp s.

Sau đó, câu trả lời là ([1..]>>=).(!), tức là \n -> [t | s<-[1..], t<-n!s].

Đây là một hàm ánh xạ một số nguyên nvào một danh sách các bộ dữ liệu lười biếng vô hạn (danh sách các số nguyên).


5

Haskell , 50 byte

f n=[l|k<-[0..],l<-mapM([0..k]<$f)[0..n],sum l==k]

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

Danh sách n-tuples được sắp xếp theo tổng. mapMthực hiện việc nâng vật nặng để tạo ra tất cả ncác số từ 0 đến k. Thủ <$fthuật được giải thích ở đây .

Haskell , 51 byte

f 1=pure<$>[0..]
f n=[a-k:k:t|a:t<-f$n-1,k<-[0..a]]

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

Đệ quy kéo dài tất cả các n-1-tuple thành tất cả các n-tuple bằng cách chia số đầu tiên acủa mỗi n-1-tuple thành hai số a-k,ktổng hợp với nó, theo mọi cách có thể.


4

Pyth - 9 byte

Cảm ơn @FryAmTheEggman cho golf

Vòng lặp qua tất cả x và mất [1..x] ^ n. Điều này tạo ra các bản sao, vì vậy chỉ giữ những cái mới đối với x, aka chứa x trong chúng. Định dạng hơi lạ, nhưng nó có thể được tạo chuẩn với thêm một byte,.V1j}#b^Sb

.V1}#b^Sb

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


1
f}bT-> }#bNgoài ra, số byte của bạn dường như không chính xác tại thời điểm này?
FryAmTheEggman

@FryAmTheEggman đợi, tại sao nó không chính xác? Nếu bạn đang nói về liên kết TIO, bao gồm định dạng với j(b). Ngoài ra, cảm ơn cho golf.
Maltysen

Ah, đó là điều làm tôi bối rối, xin lỗi!
FryAmTheEggman

3

Brachylog (v2), 9 byte

~l.ℕᵐ+≜∧≜

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

Đây là một trình tạo vô hạn tạo ra tất cả các bộ dữ liệu có thể. Liên kết TIO có một tiêu đề sử dụng trình tạo để tạo 1000 phần tử và in chúng (nhưng trình tạo có thể tiếp tục vô thời hạn nếu tôi yêu cầu điều đó thay vào đó; số nguyên của Brachylog không bị ràng buộc).

Cảm giác như có một cách khó khăn hơn, nhưng có rất nhiều ràng buộc và đây là điều khó khăn nhất mà tôi có thể phù hợp với chúng trong một chương trình duy nhất.

Giải trình

~l.ℕᵐ+≜∧≜
  .        Generate
        ≜  all explicit
~l         lists whose length is {the input}
    ᵐ      for which every element
   ℕ       is non-negative
     +     and whose sum
      ≜    is used to order the lists (closest to zero first)
       ∧   [remove unwanted implicit constraint]

Ngẫu nhiên, điều đó gây cho tôi sự thú vị khi cách giải thích của tôi về hai người khác nhau, mặc dù họ làm điều tương tự theo quan điểm của Brachylog. Đầu tiên là vị từ không điều kiện đầu tiên trong chương trình, do đó, nó đặt thứ tự kết quả; trong trường hợp này, nó tính toán tất cả các giá trị rõ ràng có thể có cho tổng của danh sách theo thứ tự 0, 1, 2, 3, và đang được sử dụng để đảm bảo rằng các danh sách được xuất theo thứ tự tổng của chúng (điều này đảm bảo rằng mỗi danh sách có thể danh sách xuất hiện sau một lượng đầu ra hữu hạn). Thứ hai được sử dụng để tính toán tất cả các khả năng rõ ràng cho danh sách (thay vì xuất ra một công thức chỉ định cách các phần tử của danh sách liên quan với nhau).


↰₁ẉ⊥cũng là một tiêu đề tốt, để in vô hạn.
Chuỗi không liên quan

Mặc dù tôi cảm thấy như thế này có thể không thực sự là một câu trả lời đầy đủ, vì bất kỳ lời mời độc lập nào của vị từ này sẽ chỉ tạo ra các số 0 , với phần "tạo ra tất cả" được thực hiện bởi hoặc trong tiêu đề.
Chuỗi không liên quan

1
@UnrelatedString Mã của bạn không sử dụng biến vị ngữ làm trình tạo. Chúng tôi có các quy tắc rõ ràng cho phép đầu ra danh sách bằng cách sử dụng một trình tạo . Những gì bạn đang làm trong liên kết TIO của bạn đang gọi vị từ trong một vòng lặp để có 1000 trình tạo khác nhau, sau đó lấy đầu ra đầu tiên từ mỗi trong số chúng; đó là một hoạt động thực sự không tự nhiên để thực hiện trên máy phát điện và nó sẽ không cho phép bạn thấy các yếu tố khác mà chúng có thể tạo ra.
ais523

À, vậy là tôi đã hiểu sai về ngữ nghĩa của một vị ngữ Brachylog trong suốt thời gian này - ý tưởng về "trình tạo" của tôi bị mắc kẹt trên Python. Bây giờ điều đó đã xảy ra trong đầu tôi, tôi đoán tôi sẽ loại bỏ ba byte khỏi một số câu trả lời cũ của tôi.
Chuỗi không liên quan

2

Perl 6 , 37 byte

{$++.polymod(1+$++ xx $_-1).say xx *}

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

Về cơ bản chạy polymodvới càng nhiều mục cần thiết, trong đó modulo luôn lớn hơn đầu vào, tức là 0.polymod (1,1,1), 1.polymod (2,2,2), v.v ... Bằng cách đó, chữ số luôn nằm trong phạm vi. Perl6 sẽ không cho tôi modulo vô cùng ...


5
Điều này không liệt kê mỗi tuple chính xác một lần (ví dụ, (0, 1, 0, 0)không được liệt kê).
bb94


2

C # (Trình biên dịch tương tác Visual C #) , 148 byte

n=>{var a=new int[n];int j=0;void g(int k){if(k<n)for(int i=0;i++<j;g(k+1))a[k]=i;else if(a.Sum()==j)WriteLine(string.Join(' ',a));}for(;;j++)g(0);}

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

-3 byte nhờ @ASCIIOnly!

// n: size of tuples to generate
n=>{
  // a: current tuple workspace
  var a=new int[n];
  // j: target sum value
  int j=0;
  // recursive function that works on slot k
  void g(int k){

    // tuple is not fully generated,
    if(k<n)

      // try all values from (0,j]
      for(int i=0;i++<j;
        // recursive call - generates all
        // values from (0,j] in the next slot
        g(k+1)
      )
        // update the kth slot
        a[k]=i;

    // tuple is fully generated, however
    // we should only display if the sum
    // is equal to the target sum. tuples
    // are generated many times, this
    // let's us enforce that they are only
    // displayed once.
    else if(a.Sum()==j)
      WriteLine(string.Join(' ',a));
  }
  // increment the high value forever
  // while continually starting the
  // recursive function at slot 0
  for(;;j++)
    g(0);
}

bạn đã làm điều này như thế nào
Stackstuck

chuyển thẳng điều này sang .NET Core có thể vẫn giúp tôi tiết kiệm rất nhiều byte.
Stackstuck

Thủ thuật lớn nhất ở đây là đệ quy. Hầu hết các kỹ thuật tôi từng thấy để tạo ra "hoán vị" đều sử dụng nó. Tôi có kế hoạch thêm một lời giải thích.
dana

Writevới ví dụ '<literal tab>'hoặc |có cùng độ dài và chiếm ít dòng hơn: P
ASCII - chỉ


1

Jelly , 10 (9?) Byte

9 nếu chúng ta có thể xuất bằng cách sử dụng phân tách không nhất quán (mà tôi đã hỏi về) - loại bỏ .

‘ɼṗ³ċƇ®Ṅ€ß

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

Làm sao?

‘ɼṗ³ċƇ®Ṅ€ß - Main Link: some argument, x (initially equal to n, but unused)
 ɼ         - recall v from the register (initially 0), then set register to, and yield, f(v)
‘          -   f = increment
           - (i.e. v=v+1)
   ³       - program's third command line argument (1st program argument) = n
  ṗ        - (implicit range of [1..v]) Cartesian power (n)
           - (i.e. all tuples of length n with items in [1..v])
     Ƈ     - filter keep those for which:
    ċ      -   count
      ®    -   recall from register
           - (i.e. keep only those containing v)
       Ṅ€  - print €ach
         ß - call this Link with the same arity
           - (i.e. call Main(theFilteredList), again the argument is not actually used)

1
Dựa trên " miễn là tách biệt giữa các bộ và các con số bên trong mỗi tuple là rõ ràng và nhất quán. (Ví dụ, một tuple mỗi dòng.) " Tôi cho rằng nó không được phép và là cần thiết, nhưng chúng ta hãy chờ đợi là những gì OP phải Nói.
Kevin Cruijssen

1

05AB1E , 15 11 byte

[¼¾LIãvy¾å—

-4 byte bằng cách tạo ra một cổng của @Maltysen Pyth câu trả lời 's .

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

Giải trình:

[             # Start an infinite loop:
 ¼            #  Increase the counter_variable by 1 (0 by default)
  ¾L          #  Create a list in the range [1, counter_variable]
    Iã        #  Take the cartesian power of this list with the input
      v       #  Loop over each list `y` in this list of lists:
       y¾å    #   If list `y` contains the counter_variable:
             #    Print list `y` with trailing newline

2
Khi nào chương trình sẽ đến [1,2,1]? Hãy nhớ rằng nó phải trong thời gian hữu hạn.
billpg

@billpg Nên sửa ngay.
Kevin Cruijssen

1

MATL , 16 byte

`@:GZ^t!Xs@=Y)DT

Các bộ dữ liệu được sắp xếp bằng cách tăng tổng, và trong một khoản tiền nhất định, chúng được sắp xếp theo thứ tự từ vựng.

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


1

Python 2 , 126 112 106 101 100 83 byte

n=input()
i=1
while 1:
 b=map(len,bin(i)[3:].split('0'));i+=1
 if len(b)==n:print b

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

5 byte thx đến mypetlion ; 1 byte từ mắt đại bàng của ArBo ; 17 byte từ xnor !

Xây dựng các phân vùng theo thứ tự mvào các nthùng, m = 0,1,2,3,...bằng cách chọn các số nhị phân có n-1 0s và m 1s.


if i==p:i=0;p*=2có thể trở thành i%=p;p<<=i<1để lưu 5 byte.
mypetlion

Tôi khá chắc chắn rằng không gian sau đó print blà không cần thiết: D
ArBo

Có vẻ như i+pchỉ là đếm 1, 2, 3 ... theo cách phức tạp và do đó chỉ có thể là một biến duy nhất.
xnor

@xnor: Ôi! Có rất nhiều ý tưởng, không thể nhìn thấy rừng cây.
Chas Brown

1

C # (.NET Core) , 608 570 567 byte

using C=System.Console;using L=System.Collections.Generic.List<int[]>;class A{static void Main(){L x=new L(),y=new L(),z=new L();int i=int.Parse(C.ReadLine()),j=0,k,l,m;x.Add(new int[i]);while(i>0){j++;for(m=0;m++<i;){foreach(var a in y)x.Add(a);y=new L();foreach(var a in x){for(k=0;k<i;){int[] t=new int[i];System.Array.Copy(a,t,i);t[k++]=j;var b=true;z.AddRange(x);z.AddRange(y);foreach(var c in z){for(l=0;l<i;l++)if(c[l]!=t[l])break;if(l==i)b=false;}if(b)y.Add(t);}}}}for(k=0;k<x.Count;k++){C.Write("[ ");for(l=0;l<i;l++)C.Write(x[k][l]+" ");C.WriteLine("]");}}}

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

chúa ơi tôi đã làm gì (rất nhiều vòng lặp, đó là những gì tôi đã làm)

Nó nên hoạt động, mặc dù!

Nếu bạn di chuyển vòng lặp in trở lại một dấu ngoặc, nó sẽ hiển thị cho bạn danh sách khi nó được tạo, mỗi khi nó lặp. (Tôi khuyên bạn nên thêm một dòng mới hoặc một cái gì đó để phân biệt mỗi vòng lặp nếu bạn làm.)

Thành thật mà nói, rất nhiều thời gian của tôi đã dành để chiến đấu với ngôn ngữ ... không có mảng in ấn đẹp, các loại hành vi của == ...

Hy vọng phiên bản này dễ đọc hơn.

using C=System.Console;
using L=System.Collections.Generic.List<int[]>;
class A{
    static void Main(){
        L x=new L(),y=new L(),z=new L();
        int i=int.Parse(C.ReadLine()),j=0,k,l,m;
        x.Add(new int[i]);
        while(i>0){
            j++;
            for(m=0;m++<i;){
                foreach(var a in y) x.Add(a);
                y=new L();
                foreach(var a in x){
                    for(k=0;k<i;){
                        int[] t=new int[i];
                        System.Array.Copy(a,t,i);
                        t[k++]=j;
                        var b=true;
                        z.AddRange(x);
                        z.AddRange(y);
                        foreach(var c in z){
                            for(l=0;l<i;l++) if(c[l]!=t[l])break;
                            if(l==i)b=false;
                        }
                        if(b)y.Add(t);
                    }
                }
            }
        }
        for(k=0;k<x.Count;k++){
            C.Write("[ ");
            for(l=0;l<i;l++)C.Write(x[k][l]+" ");
            C.WriteLine("]");
        }
    }
}

Tôi chỉ nhận ra rằng tôi có thể dán vòng lặp in trong câu lệnh if để nó in khi nó đi. facepalm một khoảnh khắc.
Stackstuck

chờ đợi không thể làm điều đó
Stackstuck

... oh thân yêu, tôi không chắc mã này hoạt động nữa.
Stackstuck

aaaaand nó không.
Stackstuck

1
Chúc may mắn với điều này :) Tôi đã bắt đầu mã hóa một giải pháp trong C # và nhận ra rằng nó khá phức tạp hơn tôi mong đợi. Tại sao không sử dụng trình thông dịch "Visual C # Interactive"? Điều đó sẽ tiết kiệm một bó bằng cách đơn giản là không bao gồm định nghĩa lớp. Dù sao, +1 từ tôi :)
dana

1

Perl 6 , 50 byte

{grep $_,{S/.//.split(0)>>.chars}($++.base(2))xx*}

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

Khối mã ẩn danh trả về một danh sách vô hạn lười biếng. Điều này sử dụng chiến lược tương tự như câu trả lời của Chas Brown .

Giải trình:

{grep $_,{S/.//.split(0)>>.chars}($++.base(2))xx*}
{                                                } # Anonymous code block
                                              xx*  # Repeat indefinitely
                                 ($++        )     # From the current index
                                     .base(2)      # Get the binary form
         {S/.//                 }   # Remove the first digit
               .split(0)            # And split by zeroes
                        >>.chars    # And get the length of each section
 grep   ,   # From this infinite list, filter:
      $_      # The groups with length the same as the input

0

VDM-SL , 51 byte

g(i)==if i=0then{}else{[x]^y|x:nat,y in set g(i-1)}

Hiểu tập đệ quy với nối chuỗi ..

Không phải trên TIO, bạn có thể chạy trong một chương trình (nếu bạn bật giới hạn cho loại nat hoặc nó sẽ không chấm dứt):

functions 
g:nat->set of ?
g(i)==if i=0then{}else{[x]^y|x:nat,y in set g(i-1)}

Bao gồm các số 0 tùy chọn trong câu trả lời nếu không nó sẽ là ràng buộc 52 byte trên nat1



0

perl -M5.010 122 byte

$n=shift;
$s.="for\$x$_(1..\$m){"for 1..$n;
$t.="\$x$_ "for 1..$n;
$u.='}'x$n;
eval"{\$m++;$s\$_=qq' $t';/ \$m /&&say$u;redo}"

Đã thêm một số dòng mới cho mục đích dễ đọc (không được tính vào số byte)


0

Con trăn 2 , 120 byte

from random import*
m=n=input()
a=()
while 1:
 m+=len(a)==m**n;t=[randint(1,m)for _ in[1]*n]
 if(t in a)<1:a+=t,;print t

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

Dài hơn một chút so với hầu hết các câu trả lời khác, nhưng tôi thích ý tưởng đằng sau nó.


0

Stax , 6 byte

£ƒ$↔┬ï

Chạy và gỡ lỗi nó

Đối với đầu vào n, thủ tục đại khái

for i in [0..infinity]:
    get all the distinct n length arrays of positive integers that sum to i
    for each
        join with spaces
        implicitly output

0

JavaScript (V8) , 98 byte

n=>{for(a=[],b=[j=1];;b.push(++j))(g=k=>k<n?b.map(i=>(a[k]=i)|g(k+1)):a.includes(j)&&print(a))(0)}

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

Hoan hô! Cuối cùng đã nhận được nó dưới 100 :) Về cơ bản là một cổng của câu trả lời C # của tôi .

// n: length of tuples to generate
n=>{
  // a: workspace for current tuple
  // b: range of numbers that grows
  //     - iteration 1: [1]
  //     - iteration 2: [1,2]
  //     - iteration 3: [1,2,3]
  // j: largest number in b
  for(a=[],b=[j=1];;b.push(++j))
    // g: recursive function to build tuples
    // k: index of slot for current recursive call
    (g=k=>
       // current slot less than the tuple size? 
       k<n?
         // tuple generation not complete
         // try all values in current slot and
         // recurse to the next slot
         b.map(i=>(a[k]=i)|g(k+1)):
         // tuple generation complete
         // print tuple if it contains the
         // current high value
         a.includes(j)&&print(a)
    // start recursive function at slot 0
    )(0)
}
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.