Trình tự sắp xếp của các kết hợp số nguyên tăng dần


8

Viết chương trình hoặc hàm để tạo đầu ra sau theo đúng thứ tự.

EDIT: Các biểu tượng không phải là toán học! Các số chỉ đại diện cho dữ liệu duy nhất và +-có thể là bất kỳ hai ký hiệu tùy ý.

Lấy một đầu vào số nguyên không âm n. Dòng đầu tiên luôn luôn -, ngay cả với n = 0.

  • Nếu dòng hiện tại là -, dòng tiếp theo là1+2+ ... (n-1)+n-
    • n = 4: -=>1+2+3+4-
  • Nếu số nguyên cuối cùng bằng n, hãy xóa tất cả các số nguyên khỏi đầu ngay sau a -, sau đó thay đổi số nguyên cuối cùng +thành a-
    • n = 4: 1-2+3-4-=>1-2-
    • EDIT: Khi chuỗi đầy (bao gồm tất cả các số nguyên từ 1 đến n), hãy xóa tất cả các số nguyên khỏi đầu được theo sau bởi a -, cho đến khi bạn đạt được một số nguyên theo sau là a +. Để lại số nguyên đó nhưng thay đổi sau đây +thành một-
    • Sử dụng ví dụ tương tự như ngay lập tức ở trên ( không tuân theo -), xóa 4-, xóa 3-, thay đổi 2+thành 2-. 1-không thay đổi kể từ khi chúng tôi dừng lại ở 2. Kết quả: 1-2-
  • Nếu số nguyên cuối cùng nhỏ hơn n, hãy nối các số nguyên còn lại với +sau mỗi số nguyên, ngoại trừ số nguyên cuối cùng có -thêm một số nguyên
    • n = 4: 1+2-=>1+2-3+4-
    • EDIT: Nếu chuỗi hiện tại không đầy đủ (không chứa tất cả các số nguyên từ 1 đến n), hãy thêm từng số nguyên chưa được bao gồm theo thứ tự tăng dần lên đến n-1 với +sau một số nguyên, sau đó nối thêm số nguyên cuối n bởi một-
    • Nếu dòng hiện tại là 1-, chắp thêm 2+, nối thêm 3+n-1 nếu n = 4. Sau đó nối thêm 4-. Kết quả:1-2+3+4-
  • Nếu dòng hiện tại chứa tất cả các số nguyên và mỗi số được theo sau bởi a -, hãy thoát mã
    • n = 4: 1-2-3-4-=> HẾT

Không được có khoảng trắng ở đầu hoặc cuối trên bất kỳ dòng nào. Phải có một ngắt dòng giữa mỗi dòng. Có thể có hoặc không có ngắt dòng trên dòng cuối cùng.

EDIT: Bạn nên kiểm tra mã của mình tối thiểu n = 10 (hơn 1000 dòng đầu ra để tôi không thể đưa nó vào đây). Bất kỳ số nào không làm cho mã của bạn hết tài nguyên (cuối cùng!) Sẽ tạo ra đầu ra chính xác nhưng bạn không phải đợi vũ trụ kết thúc!

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!

Đầu vào n = 0:

-

Đầu vào n = 1:

-
1-

Đầu vào n = 2:

-
1+2-
1-
1-2-

Đầu vào n = 4:

-
1+2+3+4-
1+2+3-
1+2+3-4-
1+2-
1+2-3+4-
1+2-3-
1+2-3-4-
1-
1-2+3+4-
1-2+3-
1-2+3-4-
1-2-
1-2-3+4-
1-2-3-
1-2-3-4-

Câu trả lời:


5

Haskell , 89 byte

g lấy một số nguyên và trả về một chuỗi.

g n=unlines$max"-".foldr(\(s,i)r->id=<<[show i++s:r|s:r>"+"])""<$>mapM(mapM(,)"+-")[1..n]

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

Làm thế nào nó hoạt động

  • Nói một cách lỏng lẻo, thuật toán xây dựng một danh sách tất cả các 2^nkết hợp 1+2+...n+, 1+2+...n-tối đa 1-2-...n-, loại bỏ các +số bị hủy cuối cùng và nếu kết quả là trống, hãy thay thế nó bằng -.

  • mapM(,)"+-"là một cách ngắn hơn (sử dụng chức năng đơn nguyên) để viết \i->[('+',i),('-',i)].

  • mapM(mapM(,)"+-")[1..n]tạo (sử dụng danh sách đơn vị cho bên ngoài mapM) một danh sách với tất cả các kết hợp dưới dạng danh sách các bộ dữ liệu, vd [(1,'+'),(2,'-'),...,(n,'+')].
  • foldr ... <$> ... kết hợp mỗi danh sách các bộ dữ liệu này thành một chuỗi, sử dụng biểu thức lambda để xây dựng nó từ bên phải.
    • (s,i)là một tuple của một dấu hiệu và một số, và rlà chuỗi được xây dựng từ các bộ dữ liệu bên phải của nó.
    • id=<<[show i++s:r|s:r>"+"]trả trước ischo chuỗi được rxây dựng cho đến nay, nhưng không phải nếu dấu slà dương và rtrống.
      • Điều này được kiểm tra bằng cách so sánh s:rvới "+". May mắn thay, đây là chuỗi nhỏ nhất về mặt từ vựng có thể là kết quả của việc nối chúng, vì vậy việc so sánh có thể sử dụng >chứ không phải /=.
  • Cũng bởi may mắn, "-"nhỏ hơn bất kỳ chuỗi không trống nào có thể được xây dựng theo nếp gấp, do đó, chuỗi trống có thể được thay thế bằng chuỗi đó bằng cách sử dụng max.
  • Cuối cùng unlinesbiến các chuỗi thành một chuỗi dòng duy nhất.


3

Python 2 , 136 141 133 byte

def f(n,s="+"):
 while"+"in s:s=s[:s.rfind("+")]+"-";print s[s>"-":];s+="+".join(map(str,range(len(s)/2+1,n+1)))+"-";print(n>0)*s[1:]

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

Đầu tiên -(un) đáng ngạc nhiên đã thêm một vài byte vào mã.


Vì vậy, các giải pháp thao tác chuỗi đã ngắn hơn sau khi tất cả?
HyperNeutrino

Hoặc tôi chỉ tệ: P
HyperNeutrino

Cách tiếp cận dường như ngắn hơn, nhưng có một vài điều có thể được cải thiện trên của bạn; Tôi sẽ đăng một bình luận với một số lời khuyên trong một chút.
notjagan

n = 0 tạo ra hai -dòng không chính xác .
CJ Dennis

@CJDennis Đã sửa.
notjagan

3

Python 2 , 150 164 159 154 146 118 byte 115 112 byte

def f(n,i=0):
 while i<2**n:t=''.join(`j+1`+'+-'[i>>n+~j&1]for j in range(n));print t[:t.rfind('-')+1]or'-';i+=1

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

Chỉnh sửa: Rất tiếc! Nó cũng phải hoạt động với số lượng lớn hơn 4 ... sau đó bỏ đi ... cho đến khi tôi nhận ra mình đang lật đổ nó và lưu 28 byte ... và sau đó thêm 6 lần nữa qua các sân golf nhỏ.


Đầu ra không chính xác cho đầu vào trên n = 4.
CJ Dennis

@CJ Dennis Tôi nghĩ rằng nó hoạt động bây giờ; đầu ra giống như notjagan cho, ví dụ: n = 5
Chas Brown

Đầu ra dường như là chính xác ngay bây giờ! Tôi sẽ thêm rằng bạn nên kiểm tra ít nhất 10 ...
CJ Dennis

Tôi chỉ nhận thấy rằng bạn đặt i = 0 trong đầu vào! Điều đó có nghĩa là tôi chỉ có thể tạo các dòng từ i trở đi, chẳng hạn như f (24,16777200)! :-)
CJ Dennis

3

Bình thường, 23 byte

j+\-mssVSQd<Lx_d\-t^"+-

Trình diễn

Cơ sở của chương trình này nhận thấy rằng khác với chuỗi ban đầu -, chuỗi cộng và trừ tương ứng với chuỗi kết hợp tiêu chuẩn của +-với sự thay thế, với tất cả dấu vết được +loại bỏ.

Giải trình:

j+\-mssVSQd<Lx_d\-t^"+-
j+\-mssVSQd<Lx_d\-t^"+-"Q    Implicit string completion and variable introduction
                   ^"+-"Q    Form all sequences of + and - of length equal to
                             the input, ordered lexicographically.
                  t          Remove the first one, which we don't use.
           <L                Take the prefix of each one of length
             x               index in
              _d             the reversed string
                \-           of '-'.
    m                        Map the results to
      sV                     Apply the sum function to pairs of
        SQ                   [1, 2, 3 ... input]
          d                  and the previous string
     s                       Sum the pairs.
 +\-                         Add a '-' on to the front of the list
j                            Join on newlines.



0

Python 3 , 305 byte

x=int(input())
o=lambda:list(range(1,x+1))or[0]
q=o()
q[-1]*=-1
print('-')
def f(a):print(''.join(str(abs(x))+'-+'[x>0]for x in a))
while any([k>0 for k in q])or[-k for k in q]!=o():
	f(q)
	if-q[-1]==x:
		while q[-1]<0:q=q[:-1]
		q[-1]*=-1
	elif-q[-1]<x:
		while q[-1]<x:q+=[abs(q[-1])+1]
		q[-1]*=-1
f(q)

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


Tôi có một chút bối rối bởi sự pha trộn tab / không gian của bạn. Đầu tiên tôi thậm chí không nghĩ bạn COULD trong Python 3, và thứ hai nó dường như phục vụ mục đích nhỏ? Tại sao phải làm <tab><space>khi nào <space><space>sẽ là cùng một # byte? Tôi đoán có lẽ nếu bạn thực hiện các thụt lề nhỏ <space>và lớn hơn với <tab>nó sẽ tiết kiệm được một byte ...
nmjcman101

@ nmjcman101 erm. Tôi phải thực sự mệt mỏi, hoặc ngu ngốc, hoặc cả hai. Tôi đã cố gắng lưu byte bằng cách thực hiện không gian / tab thụt lề chứ không phải tab / tabspace> <cảm ơn!
HyperNeutrino

Đây là 17 byte ngắn hơn, nhưng nó thoát khỏi một lỗi. Vẫn đang cố gắng để rút ngắn mà pesky q[-1]tới q[0]. BTW: trộn các tab và dấu cách không hoạt động trong Python 3, do đó mã hiện tại gây ra lỗi.
notjagan

@notjagan oh hm. Đừng bận tâm, điều đó chắc chắn là vì trước đó tôi đã bị câm: P nhưng không sao, cảm ơn vì lời đề nghị; Tôi sẽ cố gắng làm việc từ đó
HyperNeutrino
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.