アレイ内の磁気プル


20

バックグラウンド

私は強力な磁石の列とそれらの間にたくさんの金属オブジェクトを持っています。磁石はどこに引っ張りますか?

入力

入力は負でない整数の配列で、少なくとも1つ含まれてい1ます。任意の合理的な形式を使用できます。

0配列のsは空のスペースを1表し、sは固定磁石を表します。他のすべての数字は、磁石によって引っ張られる金属のオブジェクトです。すべてのオブジェクトは、最も近い磁石に向かって引っ張られ(タイがある場合、オブジェクトは右に引っ張られます)、磁石または別のオブジェクトに当たるまでその方向に移動します。最終的に、すべてのオブジェクトが磁石の周りに集まっています。オブジェクトの順序は保持されます。

出力

出力は、すべてのオブジェクトが可能な限り最も近い磁石に引き寄せられた配列です。入力と同じ形式にする必要があります。

配列を考える

[0,0,2,0,1,1,0,2,0,3,0,5,0,1,0]

左端2は、2番目の磁石と同様に、最初の磁石のペアに向かって引っ張られ2ます。34つのステップ離れて両方の方向に磁石を持っているので、それが右に引っ張られます。また5、右に引っ張られ3、磁石と磁石の間に入ります。正しい出力は

[0,0,0,2,1,1,2,0,0,0,0,3,5,1,0]

ルールとスコアリング

完全なプログラムまたは関数を作成できます。最小のバイトカウントが優先され、標準の抜け穴は許可されません。

テストケース

[0,1,0] -> [0,1,0]
[1,0,2,0,0,1,0] -> [1,2,0,0,0,1,0]
[7,0,5,0,0,1,0] -> [0,0,0,7,5,1,0]
[1,0,3,0,1,0,3,0,1] -> [1,0,0,3,1,0,0,3,1]
[1,0,0,0,0,0,0,7,3] -> [1,7,3,0,0,0,0,0,0]
[1,2,3,4,5,6,7,8,9,10,11,0,0,0,1] -> [1,2,3,4,5,6,7,0,0,0,8,9,10,11,1]
[12,3,0,0,1,0,1,3,0,0,6,12,0,0,0,1] -> [0,0,12,3,1,0,1,3,6,0,0,0,0,0,12,1]

回答:


7

Pyth、 28 20

o@.e?bhaDk_x1QkQ~hZQ

ゴルフ6バイトをありがとう@ThomasKwa!

これは、リスト内の1以上のすべての値に最も近い1のインデックス(右端の1に分割されたタイ)を割り当て、これらの値でリストをソートすることにより、安定したソートを乱用します。ゼロには、ソート値として独自のインデックスが与えられます。

テストスイート

検証スイート

説明:

o@.e?bhaDk_x1QkQ~hZQ  ##  implicit: Q = eval(input())
o                  Q  ##  Sort Q using the values of the lambda below
 @              ~hZ   ##  select the value from the matching index of the enumerate
  .e           Q      ##  enumerate with b = value, k = index
    ?b                ##  ternary on b
      haDk_x1Q        ##  if true, this thing
              k       ##  otherwise use the index as the sort weight
          _x1Q        ##  the indices of 1 in Q, given in reverse order 
                      ##  (the reverse makes it sort to the right because of stable sorts)
       aDk            ##  sort those indices by |index - k|
      h               ##  take the first value

例:

[1,0,3,0,1,0,3,0,1]たとえば、テストケースを取り上げます。列挙を適用すると、ゼロはすべて独自のインデックスをソート値として取得するため、それらをスキップして、1と3を実行します。

最初のものについては、1のインデックスを取得します[0, 4, 8]。次に、それを逆にして、インデックスの絶対値からインデックスの絶対値を引いたものでソートします。インデックスはここではゼロです。それで[0, 4, 8]また戻ってきます。最初の値は0そのために使用します。

3については、我々は逆のインデックスを取得し、同じソートを行うが、3つの指標として、2を使用して、その両方04、我々が得るので、絶対差のために同じ値を与える:[4, 0, 8]と私たちは取ります4

次に、最終的な「値のソート」配列はになります[0, 1, 4, 3, 4, 5, 8, 7, 8]。安定した並べ替えのおかげで、値が最初に出現した順序によって結び付けが壊れているため、最終的な配列を取得します。


最近傍のインデックスでソートするの1は良い考えです!
ズガルブ

4

網膜97 72バイト

+`(?<=\b1(,1*)*?)(\B,(11+)|,(11+))\b(?!(?<-1>,1*)*,1\b)|(11+),\B
$3,$4$5

入力は、単項整数のコンマ区切りのリストであることが期待されます[...]作業のような先頭および末尾の区切り文字は問題なく動作します)。

ここですべてのテストケースを実行します。(便宜上、これは10進数から10進数への変換を自動的に処理します。)

これは、複数のステージを使用することにより、高価なバランスグループを回避するまったく異なるアイデアです。現在は6バイト長くなっていますが、よりゴルフに適している場合があります。

,1\b
>1
\b1,
1<
(T`,`<`<1*,
)T`,`>`,1*>
+`(1+>)>
>$1
+`<(<1+\b)(?!>)
$1<
<|>
,

この課題を見るとすぐに、Retinaがぴったりだと思いました(+1)
マイケルクライン

@MichaelKleinありがとう。でも、そうだとは思いません。JavaScriptを破っていることにも驚いていますが、どのゴルフ言語にも勝るチャンスはないと確信しています。
マーティンエンダー

私はすぐにRetinaで解決する方法を考え始めたのでいいです
マイケルクライン

3

JavaScript(ES6)、108バイト

a=>a.map(_=>a.map((x,i)=>x>1?a[j=(n=a.indexOf(1,i))<0|n-i>i-p?i-1:i+1]?0:a[a[i]=0,j]=x:x<1?0:p=i,p=-1/0))&&a

説明

各セルを反復処理し、金属が含まれている場合は、最も近い磁石の方向の次のセルが空であるかどうかを確認し、空の場合はそこに移動します。このプロセスは、すべての金属が可能な限り移動するまで何度も繰り返されます。

var solution =

a=>
  a.map(_=>                  // loop a.length times to ensure completeness
    a.map((x,i)=>            // for each cell item x at index i
      x>1?                   // if the cell contains metal
        a[j=                 // j = index of cell to move to
          (n=a.indexOf(1,i)) // n = index of next magnet
          <0|n-i>i-p?i-1:i+1 // set j to previous or next cell based on closest magnet
        ]?0:                 // if cell j is empty
          a[a[i]=0,j]=x      // set it to x and set cell i to 0
      :x<1?0:                // else if the cell contains a magnet
        p=i,                 // set p to the index of this magnet
      p=-1/0                 // p = index of previous magnet, initialise to -Infinity
    )
  )
  &&a                        // return a
<input type="text" id="input" value="1,2,3,4,5,6,7,8,9,10,11,0,0,0,1" />
<button onclick="result.textContent=solution(input.value.split(',').map(n=>+n))">Go</button>
<pre id="result"></pre>


2

PHP、337文字

<?$i=explode(",",$argv[1]);$m=$n=[];foreach($i as$k=>$v)if($v>0)eval("array_push(\$".($v<2?"m":"n").",$k);");for($p=0;$p<count($i);$p++)foreach($i as$k=>$v)if($v>1){$i[$k]=0;$r=-1;foreach($m as$_)if($r<0||abs($k-$r)>abs($_-$k))$r=$_;while($i[$r]>0)$r+=($r<$k?1:-1);$i[$r]=$v;}$s="";foreach($i as$v)$s.=$v.",";echo substr($s,0,-1)."\n";?>

はい、これは非常に長いです。なぜなら、PHPは実際にはゴルフの言語ではないからです。もちろん、短絡の可能性はあります。

また、考えている小さなバグ機能があるので、例えばここに:

root@raspberrypi:~/stack# php magnet.php 12,3,0,0,1,0,1,3,0,0,6,12,0,0,0,1
0,0,3,12,1,0,1,3,6,0,0,0,0,0,12,1

12が3の前に魔法のようになったように見えますが、そうではありません!

3はより大きな数を尊重し、それをマジェに近づけます!

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