昇順の整数の組み合わせの順序付けられたシーケンス


8

次の出力を正しい順序で生成するプログラムまたは関数を記述します。

編集:シンボルは数学ではありません!番号は一意のデータを表し、+および-は任意の2つの任意の記号にすることができます。

負でない整数の入力nを取ります。-n = 0の場合でも、最初の行は常にです。

  • 現在の行がの-場合、次の行は1+2+ ... (n-1)+n-
    • n = 4:-=>1+2+3+4-
  • 最後の整数がnに等しい場合は、最後にaが続く整数をすべて削除し、最後の整数をa -に変更+します。-
    • n = 4:1-2+3-4-=>1-2-
    • EDIT:文字列がいっぱいです(1からすべての整数nに含まれている)、続いている端からすべての整数を削除する-あなたが続く整数に到達するまで、+。その整数を残します+が、その次をaに変更-
    • 上記と同じ例を使用します(これには従いませ-)、削除4-、削除3-、に変更2+2-ます。1-で止まるので変化しません2。結果: 1-2-
  • 最後の整数がn未満の場合は、最後の整数+を除いて、残りの整数をそれぞれの後に-追加します
    • n = 4:1+2-=>1+2-3+4-
    • 編集:現在の文字列がいっぱいでない場合(1からnまでのすべての整数が含まれていない場合)、昇順で含まれていない各整数をn-1 +まで追加し、その後に最後の整数nを追加しますによって-
    • 現在の行がの場合は1-、を追加2+します3+。n= 4の場合は、n-1を追加します。次に追加します4-。結果:1-2+3+4-
  • 現在の行にすべての整数が含まれ、各整数の直後にが続いている-場合、コードを終了します
    • n = 4:1-2-3-4-=>終了

行の先頭または末尾にスペースがあってはなりません。各行の間には改行が必要です。最終行に改行がある場合とない場合があります。

編集:あなたはコードを少なくともn = 10までテストする必要があります(1000行以上の出力なので、ここに含めることはできません)。コードがリソースを使い果たすことのない数であれば、(最終的には!)正しい出力が生成されますが、ユニバースが終了するのを待つ必要はありません。

これはなので、バイト単位の最短コードが優先されます。

入力n = 0:

-

入力n = 1:

-
1-

入力n = 2:

-
1+2-
1-
1-2-

入力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-

回答:


5

Haskell、89バイト

g 整数を取り、文字列を返します。

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

オンラインでお試しください!

使い方

  • 大まかに言えば、アルゴリズムは、までのすべての2^n組み合わせのリストを作成し、最終的に終了する数値を取り除き、結果が空の場合はに置き換えます。1+2+...n+1+2+...n-1-2-...n-+-

  • mapM(,)"+-"(関数モナドを使用して)を書く短い方法\i->[('+',i),('-',i)]です。

  • mapM(mapM(,)"+-")[1..n]mapMタプルのリストとしてすべての組み合わせのリストを生成します(外側のリストモナドを使用)[(1,'+'),(2,'-'),...,(n,'+')]
  • foldr ... <$> ... これらのタプルの各リストを文字列に結合し、ラムダ式を使用して右から構築します。
    • (s,i)は、符号と数値rのタプルであり、その右側のタプルから構成される文字列です。
    • id=<<[show i++s:r|s:r>"+"]前に付加iし、s文字列には、rこれまでに構築しますが、ない記号があればs正で、r空です。
      • これはと比較s:rしてテストされ"+"ます。運では、これは比較が使用できるようにし、それらを連結から生じうる辞書順最小の文字列である>のではなく/=
  • また運"-"によって、フォールドによって構築できる空でない文字列よりも小さいので、空の文字列はを使用してそれと置き換えることができますmax
  • 最後unlinesに、文字列を1行の文字列に変換します。


3

パイソン2136の 141 133バイト

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:]

オンラインでお試しください!

最初の-(予想外の)驚くほど数バイトがコードに追加されました。


結局のところ、文字列操作ソリューション短くなったのですか?
HyperNeutrino 2017

または私はただ悪いです:P
HyperNeutrino 2017

アプローチはより短いように見えますが、あなたの方法で改善できることがいくつかあります。少しヒントをつけてコメントを投稿します。
notjagan 2017

n = 0は誤って2 -行を生成します。
CJデニス

@CJDennis修正済み。
notjagan 2017

3

パイソン2150 164 159 154 146 118バイト 115の 112バイト

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

オンラインでお試しください!

編集:おっと!それは4 より大きい数値でも機能する必要があります...それからチップを削除します...私がそれを過剰に考えていて28バイトを節約していることに気づくまで...そして、小さなゴルフでさらに6つ。


n = 4を超える入力の出力は正しくありません。
CJデニス

@CJ Dennis今はうまくいくと思います。出力はnotjaganと同じです。たとえば、n = 5
Chas Brown

出力は正しいように見えます!少なくとも10までテストする必要があることを追加します...
CJ Dennis

入力でi = 0に設定したことに気づきました!つまり、f(24,16777200)のように、i以降の行を生成できます。:-)
CJデニス

3

Pyth、23バイト

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

デモンストレーション

このプログラムの基本は、初期以外のことに気付いている-の組み合わせの標準配列に対して、プラスとマイナスの順序が対応+し、-すべての末尾がして、交換とを+取り除きます。

説明:

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バイト

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)

オンラインでお試しください!


タブとスペースの混在に少し混乱しています。最初に私はあなたがPython 3でCOULDをしているとさえ思っていませんでした。同じバイト数<tab><space><space><space>なるのになぜわざわざ行うのですか?おそらく、小さなインデントを行う<space>と、それを大きくする<tab>ことでバイトを節約できると
思い

@ nmjcman101えーと。私は本当に疲れているか、愚かであるか、またはその両方です。タブ/タブスペースではなくスペース/タブのインデントを行うことでバイトを節約しようとしていました> <ありがとうございます!
HyperNeutrino 2017

これは17バイト短くなりますが、エラーで終了します。まだその厄介なq[-1]ことをに短縮しようとしていq[0]ます。ところで、タブとスペースの混在はPython 3では機能しないため、現在のコードではエラーが発生します。
notjagan 2017

@notjaganああ 気にしないでください、それは以前私がばかだったからだったに違いありません:Pしかし、大丈夫、提案をありがとう; そこから仕事をしよう
HyperNeutrino 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.