Urutan kombinasi bilangan bulat naik

8

Tulis program atau fungsi untuk menghasilkan output berikut dalam urutan yang benar.

EDIT: Simbol-simbol itu tidak matematika! Angka-angka hanya mewakili data unik dan +dan -bisa menjadi dua simbol sembarang.

Ambil input bilangan bulat non-negatif n. Baris pertama selalu -, bahkan untuk n = 0.

  • Jika baris saat ini -, baris berikutnya adalah1+2+ ... (n-1)+n-
    • n = 4: -=>1+2+3+4-
  • Jika bilangan bulat terakhir sama dengan n, hapus semua bilangan bulat dari ujung yang segera diikuti oleh -, lalu ubah yang terakhir +menjadi-
    • n = 4: 1-2+3-4-=>1-2-
    • EDIT: Ketika string penuh (semua bilangan bulat dari 1 ke n disertakan), hapus semua bilangan bulat dari ujung yang diikuti oleh -, hingga Anda mencapai bilangan bulat diikuti oleh a +. Biarkan bilangan bulat itu tetapi ubah berikut +ke a-
    • Dengan menggunakan contoh yang sama seperti di atas (yang tidak mengikuti -), hapus 4-, hapus 3-, ubah 2+menjadi 2-. 1-tidak berubah sejak kami berhenti 2. Hasil: 1-2-
  • Jika bilangan bulat terakhir kurang dari n, tambahkan bilangan bulat yang tersisa dengan +masing-masing setelah bilangan bulat , kecuali bilangan bulat terakhir yang harusnya -ditambahkan
    • n = 4: 1+2-=>1+2-3+4-
    • EDIT: Jika string saat ini tidak penuh (tidak mengandung semua bilangan bulat dari 1 ke n), tambahkan setiap bilangan bulat yang belum termasuk dalam urutan naik hingga n-1 dengan +setelah masing-masing, dan kemudian tambahkan bilangan bulat terakhir n diikuti oleh a-
    • Jika baris saat ini adalah 1-, tambahkan 2+, tambahkan 3+yang n-1 jika n = 4. Kemudian tambahkan 4-. Hasil:1-2+3+4-
  • Jika baris saat ini berisi semua bilangan bulat dan masing-masing diikuti segera oleh a -, keluar dari kode
    • n = 4: 1-2-3-4-=> END

Tidak boleh ada spasi di depan atau di belakang garis apa pun. Harus ada jeda baris di antara setiap baris. Mungkin ada atau tidak ada jeda baris pada baris terakhir.

EDIT: Anda harus menguji kode Anda hingga setidaknya n = 10 (lebih dari 1000 baris output jadi saya tidak bisa memasukkannya di sini). Angka apa pun yang tidak menyebabkan kode Anda kehabisan sumber daya harus (akhirnya!) Menghasilkan output yang benar tetapi Anda tidak harus menunggu sampai alam semesta berakhir!

Ini adalah , jadi kode terpendek dalam byte menang!

Input n = 0:

-

Input n = 1:

-
1-

Input n = 2:

-
1+2-
1-
1-2-

Input 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-
CJ Dennis
sumber

Jawaban:

5

Haskell , 89 byte

g mengambil integer dan mengembalikan sebuah string.

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

Cobalah online!

Bagaimana itu bekerja

  • Secara longgar, algoritma membuat daftar semua 2^nkombinasi 1+2+...n+, 1+2+...n-hingga 1-2-...n-, menghilangkan +nomor-nomor yang terakhir dimusnahkan, dan jika hasilnya kosong, gantikan dengan -.

  • mapM(,)"+-"adalah cara yang lebih singkat (menggunakan fungsi monad) untuk menulis \i->[('+',i),('-',i)].

  • mapM(mapM(,)"+-")[1..n]menghasilkan (menggunakan daftar monad untuk luar mapM) daftar dengan semua kombinasi sebagai daftar tupel misalnya [(1,'+'),(2,'-'),...,(n,'+')].
  • foldr ... <$> ... menggabungkan masing-masing daftar tupel ini menjadi string, menggunakan ekspresi lambda untuk membangunnya dari kanan.
    • (s,i)adalah tuple dari tanda dan angka, dan rmerupakan string yang dibangun dari tupel ke kanan.
    • id=<<[show i++s:r|s:r>"+"]prepends idan sstring yang rdibangun sejauh ini, tetapi tidak jika tanda spositif dan rkosong.
      • Hal ini diuji dengan membandingkan s:rke "+". Untungnya, ini adalah string terkecil secara leksikografis yang dapat dihasilkan dari penggabungannya, sehingga perbandingan dapat digunakan >daripada /=.
  • Juga karena keberuntungan, "-"lebih kecil dari string nonempty yang dapat dibangun oleh flip, sehingga string kosong dapat diganti dengan itu dengan menggunakan max.
  • Akhirnya unlinesmengubah string menjadi string tunggal garis.
Ørjan Johansen
sumber
5

Python 2 , 101 byte

n=input()
for i in range(2**n):s='';m=n;exec"s=`m`+'+-'[i%2]+s;s*='-'in s;i/=2;m-=1;"*m;print s or'-'

Cobalah online!

Tidak
sumber
Penggunaan yang bagus daris*=<condition>
Chas Brown
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:]

Cobalah online!

Yang pertama -(tidak) secara mengejutkan menambahkan beberapa byte ke kode.

notjagan
sumber
Jadi solusi manipulasi string adalah lebih pendek setelah semua?
HyperNeutrino
Atau saya hanya buruk: P
HyperNeutrino
Pendekatannya memang tampak lebih pendek, tetapi ada beberapa hal yang dapat diperbaiki pada Anda; Saya akan memposting komentar dengan sedikit tips.
notjagan
n = 0 salah menghasilkan dua -baris.
CJ Dennis
@CJDennis Diperbaiki.
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

Cobalah online!

Edit: Ups! Ini harus bekerja untuk angka yang lebih besar dari 4 juga ... kemudian chip pergi ... sampai saya menyadari saya terlalu memikirkannya dan menyelamatkan 28 byte ... dan kemudian 6 lebih melalui golf kecil.

Chas Brown
sumber
Output salah untuk input di atas n = 4.
CJ Dennis
@ CJ Dennis Saya pikir ini berfungsi sekarang; output sama dengan notjagan untuk, misalnya, n = 5
Chas Brown
Outputnya tampaknya benar sekarang! Saya akan menambahkan bahwa Anda harus menguji setidaknya 10 ...
CJ Dennis
Saya baru saja memperhatikan bahwa Anda menetapkan i = 0 pada input! Itu berarti saya bisa menghasilkan garis dari saya dan seterusnya, seperti f (24,16777200)! :-)
CJ Dennis
3

Pyth, 23 byte

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

Demonstrasi

Dasar dari program ini adalah memperhatikan bahwa selain dari awal -, urutan plus dan minus sesuai dengan urutan standar kombinasi +dan -dengan penggantian, dengan semua trailing +dihapus.

Penjelasan:

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.
isaacg
sumber
2

Python 2 , 73 byte

f=lambda n,a=2,d='\n1':a<n+2and f(n,a+1,d+'+'+`a`)+d+f(n,a+1,d+`-a`)or'-'

Cobalah online!

Anders Kaseorg
sumber
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)

Cobalah online!

HyperNeutrino
sumber
Saya agak bingung dengan pencampuran tab / spasi Anda. Pertama, saya bahkan tidak berpikir Anda DAPAT menggunakan Python 3, dan kedua sepertinya tidak banyak berguna? Mengapa repot-repot melakukan <tab><space>ketika <space><space>akan menjadi # byte yang sama? Saya kira mungkin jika Anda melakukan indentasi kecil dengan <space>dan yang lebih besar dengan <tab>itu akan menghemat byte ...
nmjcman101
@ nmjcman101 erm. Saya pasti sangat lelah, atau bodoh, atau keduanya. Saya mencoba untuk menyimpan byte dengan melakukan indentasi spasi / tab tersebut bukan tab / tabspace> <terima kasih!
HyperNeutrino
Ini lebih pendek 17 byte, tetapi keluar karena kesalahan. Masih berusaha untuk mempersingkat yang sial q[-1]untuk q[0]. BTW: mencampur tab dan spasi tidak berfungsi dalam Python 3, jadi kode saat ini menghasilkan kesalahan.
notjagan
@ notjagan oh hm. tidak apa-apa, itu pasti karena sebelumnya aku bodoh: P tapi oke, terima kasih atas sarannya; Saya akan mencoba untuk bekerja dari sana
HyperNeutrino