アルゴリズム編組-母の日


11

仕事:

あなたの仕事は、多くのストランドと三つ編みの反復回数が与えられると、各ストランドがどこに行くかを伝えるプログラムを作成することです。ルールは次のとおりです。

  • ストランドの数は常に奇数で、3〜6000(両端を含む)の間です。
  • 開始すると、ストランドは2つの(ほぼ)等しいバンチ、leftおよびに分割されrightます。leftあなたが起動したときにもう一本鎖を持つことになります。

入力が7の場合:

/ / / / \ \ \
1 2 3 4 5 6 7
  • 繰り返しごとに、より多くのストランドを持つ側の最も外側のストランドが反対方向に面する中央に配置されます。中心は、向かい合うストランドの間として定義されます////middle\\\。

入力7の1回の繰り返し(ストランド1は中央に移動しました):

/ / / \ \ \ \
2 3 4 1 5 6 7

例:

入力:

3 4

計算:

1 2 3
 \
2 1 3
   /
2 3 1
 \
3 2 1
   /
3 1 2

出力:

3 1 2

ルール:

  • ストランド方向のスラッシュを表示する必要はなく、数字のみを表示する必要があります。
  • 最後の反復の後に数値を表示するだけです。
  • 出力は、スペースで区切られたストランドのIDになります
  • 入力は次の形式になります。 strands [space] iterations
  • ストランドの数は常に奇数であり、3 <= x <= 6000
  • これはなので、最短のコードが優先されます!

3
6000は奇数ではないので、3から5999ではないので、「最大6000」はありませんか?
— kitcar2000

そのため、出力は11 2可能でしょうか2345611178910?
— マーティンエンダー

1
あなたの投稿は、私の変化を破った@Howard
— TheDoctor

1
@TheDoctorあなたの変更の前に私の答えがありました。
— ハワード

1
あなたの例は読むべきだと思います123 -> 213 -> 231 -> 321 -> 312。
— ハワード

回答:



6

Pythonの:179 240、152の文字

まず、179

以下のためNのストランドとiの反復、この答えは、使用しO(1)た空間とO(N)時間を。各ストランドの終了位置を計算するだけで、中間位置で反復することはありません!

大きな編集:条件をブール代数に変更することで、この答えを打ち立てました。それがどのように機能するかについての長い説明も書きました。TL; DR:定型パターン、モジュロ除算。

from sys import *
N,i=map(int,stdin.readline().split())
h,t=N/2,3*N
f=lambda p:(p>N)*(t/2-(p&-2))+p/2+1
for s in xrange(N):print f((2*s+1+(s>h)*(t-4*s-2)+i*(N+1-N*(s!=h)))%(2*N)),

今152

これはより合理的にゴルフされたpythonです。(編集:165から152まで編集してくれたAlex Thorntonに感謝)

from sys import*;l=map;r=range;n,m=l(int,stdin.readline().split());b=r(1,n+1)
for k in r(m):v=b.pop((0,n-1)[k%2]);b.insert(n/2,v)
print' '.join(l(str,b)

興味のある方はさらに151までゴルフしてください:pastebin.com/1pbwax6s
— アレックスソーントン

簡単な変更ですが、非常に効果的です。ありがとう!
— 間違った

私はあなたが除去することにより、さらにそれを切ることができると思うlとv、変数を変更し、insertスライス割り当てに。
— user2357112は、2014

ゴルフはもっと短くなると思います。正直なところ、私は最初のコメントにコメントを期待していました!
— 間違った

とにかく説明を書き、投稿を更新しました:)
— wrongu

2

Python 2(109)/ Python 3(121)

Python 2

s,n=map(int,raw_input().split())
b=range(s)
for i in range(n):b[s/2:s/2]=[b.pop(0-i%2)]
for x in b:print x+1,

Python 3

s,n=map(int,input().split())
b=list(range(s))
for i in range(n):b[s//2:s//2]=[b.pop(0-i%2)]
for x in b:print(x+1,end=' ')

このコードは、Python 3に比べてゴルフの利点を示すためにPython 2によって賄われていたに違いありません。奇妙なの0-i%2は、と-i%2評価されるため(-i)%2です。

おそらく、反復するよりも効率的なアプローチ、つまり各最終結果を直接計算する方法があります。編組作業には周期2 * sがあるため、それほど複雑にすることはできません。


2

ルビー、105

ただたくさんのセット操作。プッシュ、ポップ、リバース、シフト!入力を整数に変換しないようにしましたが、約20文字追加されました。

n,i=$*.map(&:to_i)
f=l=(1..n).to_a
t=r=l.pop(n/2).reverse
i.times{f,t=t<<f.shift,f}
$><<(l+r.reverse)*' '

l及びr(leftおよびright)「スレッド」キューです。rightが逆になるので、外側から引っ張り始めます。

tand f(toand from)はそれぞれrightand として始まりますleftが、最後の「スレッド」を常にシフトfromしてto(f,t=t<<f.shift,f)にプッシュできるように、これらをスワップし続けます。これにより、多くのスペースを節約できます。

その後right、最後に逆戻りします。

変更ログ:

2.2 105そうそう、マップはprocを取ることができます

2.1 108そして実際には、操作の一部として物事を反転させます。

2.0 116は、その一時配列を使用しません。代わりに、2つのポインター変数を使用して、再ポイントを操作および維持できます。次に、最後のみを表示します

1.0 123最初のアイデア


0

Java、270文字

ゴルフ:

import java.util.*;class B{public static void main(String[] a){int n=Integer.valueOf(a[0]),t=Integer.valueOf(a[1]),i=0;List<Integer> r=new ArrayList<Integer>();for(;i<n;i++){r.add(i+1);}for(i=0;i<t;i++){int k=i%2==0?0:n-1;r.add(n/2,r.remove(k));}System.out.println(r);}}

ゴルフをしていない:

import java.util.*;
public class Braid {
    public static void main(String[] args) {
        int num = Integer.valueOf(args[0]);
        int iterations = Integer.valueOf(args[1]);

        //populate array
        List<Integer> arr = new ArrayList<Integer>();
        for (int i=0; i < num; i++) {
            arr.add(i+1);
        }
        for (int i=0; i < iterations; i++) {
            int index = i%2==0?0:num-1; 
            arr.add(num/2, arr.remove(index));
        }
        System.out.println(arr);
    }
}

オンラインで実行

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