一連の数値を並べ替える


8

質問

m[]ランダムな順序で1から9までの数字のみが含まれ、2つの数字が同じではない9つの数字のセットが与えられた場合、任意の言語でプログラムを作成し、数字を数字順に並べ替えます(1、2、3、など)互いに隣り合う2つの番号を切り替えるだけ(つまり、1、3、2→1、2、3)。

ルール

  • セットを変更するには、隣り合う2つの番号を切り替える必要があります
  • 終了番号(1〜9の順)は、 m[]
  • あなたは好きな言語を使うことができます
  • バイト数が最も少ない答えが勝つ

編集:

あなたのコードではないではない出力を印刷する必要がありますが、再編成された配列は、である必要がありますm[]


6
つまり、基本的にはバブルソートアルゴリズムですか?
オプティマイザ、

@Optimizer正解
Meow Mix

1
中間ステップを印刷する必要がありますか?
xnor

もっと例を示してもらえますか?
Ismael Miguel

7
1、2、3、4、5、6、7、8、9だけを返すことができますか?
Ewan

回答:


10

CJam、15バイト

q~A{{a+$~}*]}*p

使い方:

q~                     e# Read the CJam styled input array (For ex. [1 3 4 2 5 6 8 7 9])
  A{        }*         e# Run the loop 10 times. This is enough times for a 10 length
                       e# input array in a bubble sort
    {    }*            e# reduce
     a+$~              e# Rearrange the pair so that they are sorted
           ]           e# After each loop, wrap the numbers back into the array
              p        e# Print the array after the loops are done

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


9

Mathematica、38バイト

#//.{a___,b_,c_,d___}/;b>c:>{a,c,b,d}&

これは、配列を取得する名前のない関数であり、パターンが検出されなくなるまで置換ルールを適用します。パターンは2つの連続した要素bcwhereを含むリストでb > cあり、ルールはを交換することbを示してcいますが、それ以外の場合は配列をそのままにしておきます。

ここには多くの構文糖がありますが、Mathematicaを少し知っていれば、コードは実際には非常に読みやすくなっています。

# //. {a___,b_,c_,d___} /; b>c :> {a,c,b,d} &
^  ^     ^   ^          ^      ^            ^
|  |     |   |          |      |            |
|  |     |   | Declares an unnamed function |
|  |     |   |          |      |
| The function's argument      |
   |     |   |          |      |
   | Replace while possible... |
         |   |          |      |
         | Zero or more list elements.
             |          |      |
             | A single list element
                        |      |
                        | A condition for the pattern
                               |
                               | What to replace the pattern with

9

Python 3、72バイト

from random import*
while m!=sorted(m):p=randrange(8);m[p:p]=m.pop(p+1),

ボゴソート(別名愚かソート)アプローチ:スワップ隣接素子アレイがソートされ、ランダムにまで。通常は1秒未満で実行されます。

@xnorのおかげで2バイト。


4

Python 2、45

for i in range(8)*8:m[i:i+2]=sorted(m[i:i+2])

リストを循環し、要素の連続したペアをソートします。インデックスi0,1,2,3,4,5,6,78回循環します。これにより、すべての要素がバブルスルーし、リストがソートされます。


4

Pyth、13〜15バイト

要求されたスワッピングを実行し、出力を生成しないソリューション:

#X=Qhf>FT.:Q2

要求されたスワッピングを実行し、すべてのステップでリストの中間状態を出力するソリューション:

#QX=Qhf>FT.:Q2

要求されたスワッピングを実行し、リストの最終的な状態を出力するソリューション:

#X=Qhf>FT.:Q2;Q

上記の中間ソリューションのデモ。

隣接する値を交換する方法は、@ Jakubeの回答から取得されます。

プログラムは#、loop to errorステートメントを使用して、誤った順序の要素の隣接するペアがなくなるまで交換します。このようなペアがなくなるhと、ヘッド関数がエラーをスローし、プログラムが終了します。


質問で要求されなかった追加の出力は、標準の抜け穴と見なされます。
オプティマイザ2015年

@Optimizer実際には、OPは出力についてまったく言及していません。それは単に数値のセットを変更することについて話します。したがって、ここでのほとんどの回答について同じ反対意見が出される可能性があります。これについては、私の回答に書き留めておきます。
isaacg

代わりにOPに問い合わせてください。聞いただけ。しかし、私はそれが与えられたと思います、そしてあなたは単にあなたのプログラムをより短くするために沈黙を悪用しているだけです:P
オプティマイザ

@オプティマイザーはそれに応じて私の答えを更新しました。
isaacg 2015年

1
最初のバージョンに投票すると、セットがソートされ、出力は必要ありません。プログラムが機能することを確認するためだけに出力を追加すると便利ですが、テストの一部であり、カウントされません。
edc65

3

Retina95 93バイト

特に競争力はない(そしておそらくまだゴルフができる)が、ここで...

(.)1
1$1
([^1])2
2$1
([4-9])3
3$1
([5-9])4
4$1
([6-9])5
5$1
([7-9])6
6$1
(8|9)7
7$1
)`98
89
<empty>
<empty>

どこ<empty>空行でなければなりません。

すべての数値は1桁であるため、これは9桁すべての文字列を入力として期待し、123456789正常にソートした後に出力されます。各ステージは1つのスワップを実行し)1`、最終ステージを除くすべてのステージを、結果の変化が止まるまで繰り返す必要があることを示します。

98ステージが処理されるたびに中間結果が得られるため、最後に空のステージが必要です。

以下は、実行例のすべての中間結果(変更された場合)です。

451629387
451269387
451263987
451263978
415263978
412563978
412536978
412536798
412536789
142536789
124536789
124356789
123456789

:各ステージにオプションを追加してこれを取得し、連続する重複を手動で削除しました。)


3

Pyth、17バイト

uXGhaf>FT.:G2]Z)Q

リスト内のアイテムの切り替えは、Pythでは非常に高価です。だからここに楽しい解決策があります、それはルールを少し伸ばします。おそらく無効です。

オンラインで試す:Pyth Compiler / Executor

説明

まず、コードの時間の複雑さはO(n^3)です。しかし、これは興味深い部分ではありません。質問は複雑さについては何も述べていません。

重要なのは、リストの2つの要素を切り替える方法です。要素m[3]とを切り替えたいとしましょうm[4]。私は、インデックスを気にしない34、すべてで。私は単に2番目のリストを作成します。これは、すべての等しい要素をm[3]数値にm[4]、すべての等しいm[4]数値を値に置き換えますm[3]。リストには重複が含まれていないため、これはこれら2つの値の切り替えをシミュレートします。入力のように重複がある場合[1, 3, 2, 2]、出力はになります[1, 2, 3, 3]。そして、入力を与えると[1, 2, 1]、それは無限ループで終わります。私は明示的に2番目のリストを作成しません。それは、Pythの変換メソッドの実装の一部にすぎません。現在のリストを印刷する場合(ここを参照))、それはあなたが期待する正しい値を与えます。

                   implicit: Q = input list
u               Q  set G = Q, update G as long with the following statements, 
                   until it stops changing: 
         .:G2         all pairs (G[i],G[i+1])
     f>FT             filter for pairs T, where T[0] > T[1]
    a        ]Z       add to this list of pairs [0] 
                      (ensures that the filtered list is always non-empty)
   h                  take the first element
 XG            )      translate G by this pair (switches the values T[0] with T[1])
                   print implicitly at the end 

2

JavaScript(ES6)56

指定されたリストを所定の位置に再配置する再帰関数。

F=l=>l.some((v,i)=>v>l[++i]&&[l[i-1]=l[i],l[i]=v])&&F(l)

ノート

  • JSでは、任意の数値v:v> undefined == false、v <undefined == falseの場合。したがって、適切な比較を使用すれば、配列の境界の外に出ても問題ありません。

  • 最後に配列がソートされると、「some」内の関数がfalseを返し、再帰が終了します

  • スワップの場合に返される値は2要素の配列であり、その値は常に 'truthy'です。1つ以上の配列要素が0の場合でも機能します

  • 実際、この関数は、単一の数字や繰り返される数字だけでなく、あらゆる数値入力で機能します。このOP制約を利用する方法が見つかりませんでした。

スニペットを使用してテストする(Firefoxの場合)-スニペットバージョンは、各ステップで現在のリスト値を出力します。

F=l=>(log('L='+l), l.some((v,i)=>v>l[++i]&&[l[i-1]=l[i],l[i]=v])&&F(l))

function log(x) {
   L.innerHTML = L.innerHTML +x+'\n' 
}

function go() {
  l = I.value.split(/\D+/g).map(x=>x|0)
  F(l)
  O.innerHTML = '' + l
}  

go()
Unsorted: <input id=I value="2 8 4 7 5 3 9 1 6"><button onclick="go()">-></button>
<br>Sorted: <span id=O></span>
<br>Operations log:<br>
<pre id=L></pre>


1

Javascript(ES6)、66 61 53バイト

新しいルールのおかげで、私はさらに減らすことができます:)

f=x=>x.map((a,i)=>a<(b=x[--i])&&f(x,x[i]=a,x[i+1]=b))


// Snippet demo: (Firefox only)
f(z=prompt().split(/\D+/).map(x=>+x))
alert(z.join(', '));

コメントしました

f=x=> // recursive function f
    x.map( // map function to array
        (a, i)=> // a = current value, i = current index
            a < (b = x[--i]) && // poll value of previous index, compare less than
                                // comparison always false at first index as undefined will always be less
                f(x, x[i] = a, x[i + 1] = b) // if true, swap values and call f
    )

0

C、183

main(c,d,s){int a[10];for(c=0;c<10;c++)scanf("%d", &a[c]);for (c=0;c<10;c++){for(d=0;d<10-c-1;d++){if(a[d]>a[d+1]){s=a[d];a[d]=a[d+1];a[d+1]=s;}}}for(c=0;c<10;c++)printf("%d", a[c]);}

変数名を除いて、まだゴルフはしていません。


0

Haskell、59バイト

s e(h:t)=min e h:max e h:t
f l=iterate(init.foldr s[9])l!!9

この関数sは、要素eがリストの最初の要素よりも小さいか大きいかに応じて、リストの前または2番目に要素を配置します。折りたたみs入力リストには、前に最小の要素バブルをすることができます。空のリストをで確認する必要がないように、9後ですぐに削除するシングルを含むリストに折りたたみinitますsiterate折りたたみプロセスを永久に繰り返し、中間結果のリストを作成します。最終結果は、このリストの9番目の要素です。


0

Perl、68バイト

{for(0..7){if($m[$_]>$m[$_+1]){splice@m,$_,2,$m[$_+1],$m[$_];redo}}}

ゴルフではないコード

 {                                             # Block runs once unless redo is called

     for (0..7) {                                 # Loop index is in $_

         if ($m[$_] > $m[$_+1]) {                 # Check if swap needed

             splice @m, $_, 2, $m[$_+1], $m[$_];  # Replace a two element slice of
                                                  # the array with those 
                                                  # two elements reversed

             redo                                 # Restart the block over
         }
     }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.