Kéo từ trong một mảng


20

Lý lịch

Tôi có một hàng nam châm cực mạnh và một loạt các vật kim loại nằm giữa chúng. Nam châm sẽ kéo chúng ở đâu?

Đầu vào

Đầu vào của bạn là một mảng các số nguyên không âm, sẽ chứa ít nhất một số nguyên 1. Bạn có thể sử dụng bất kỳ định dạng hợp lý.

Các 0s của mảng đại diện cho không gian trống rỗng, và 1là đại diện cho nam châm cố định. Tất cả các số khác là các vật kim loại, được kéo bởi các nam châm. Mọi vật thể được kéo về phía nam châm gần nhất (nếu có một chiếc cà vạt, vật thể được kéo sang phải) và nó di chuyển theo hướng đó cho đến khi chạm vào nam châm hoặc một vật thể khác. Cuối cùng, tất cả các đối tượng đã tập trung xung quanh các nam châm. Thứ tự của các đối tượng được bảo tồn.

Đầu ra

Đầu ra của bạn là mảng mà mọi đối tượng đã được kéo càng gần nam châm gần nhất càng tốt. Nó nên có cùng định dạng với đầu vào.

Thí dụ

Hãy xem xét các mảng

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

Phần ngoài cùng bên trái 2được kéo về phía cặp nam châm đầu tiên, cũng như phần thứ hai 2. Cái 3này có một nam châm cách bốn bước ở cả hai hướng, vì vậy nó bị kéo sang phải. Cái này 5cũng được kéo sang phải, và nó nằm giữa 3nam châm và nam châm. Đầu ra đúng là

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

Quy tắc và tính điểm

Bạn có thể viết một chương trình đầy đủ hoặc một chức năng. Số byte thấp nhất sẽ thắng và các sơ hở tiêu chuẩn không được phép.

Các trường hợp thử nghiệm

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

Câu trả lời:


7

Bình thường 28 20

o@.e?bhaDk_x1QkQ~hZQ

Cảm ơn @ThomasKwa vì đã chơi golf 6 byte!

Điều này lạm dụng sắp xếp ổn định bằng cách gán cho tất cả các giá trị 1 hoặc cao hơn trong danh sách chỉ số của 1 gần nhất (các mối quan hệ bị phá vỡ ở bên phải 1) và sau đó sắp xếp danh sách theo các giá trị này. Số không được đưa ra chỉ mục riêng của họ như là giá trị sắp xếp của họ.

Phòng thử nghiệm

Bộ xác minh

Giải trình:

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

Thí dụ:

Lấy trường hợp thử nghiệm [1,0,3,0,1,0,3,0,1], ví dụ. Khi chúng ta áp dụng phép liệt kê, các số 0 sẽ lấy chỉ số riêng của chúng làm giá trị sắp xếp, vì vậy tôi sẽ bỏ qua chúng và thực hiện một và ba.

Đối với người đầu tiên, chúng tôi nhận được các chỉ số của những người : [0, 4, 8]. Sau đó đảo ngược nó và sắp xếp theo giá trị tuyệt đối của các chỉ số trừ chỉ số của một chỉ số, điều này xảy ra bằng không ở đây. Vì vậy, chúng tôi [0, 4, 8]trở lại một lần nữa. Giá trị đầu tiên là 0vì vậy chúng tôi sử dụng đó.

Đối với ba, chúng ta có các chỉ số đảo ngược và thực hiện sắp xếp giống nhau nhưng sử dụng hai là chỉ số của ba, vì vậy cả hai 04giá trị đều cho cùng một giá trị cho sự khác biệt tuyệt đối, vì vậy chúng tôi nhận được: [4, 0, 8]và chúng tôi lấy 4.

Sau đó, mảng "sắp xếp giá trị" cuối cùng sẽ là [0, 1, 4, 3, 4, 5, 8, 7, 8]. Nhờ sắp xếp ổn định, các mối quan hệ bị phá vỡ theo thứ tự mà các giá trị ban đầu xuất hiện, vì vậy chúng tôi có được mảng cuối cùng mà chúng tôi muốn.


Sắp xếp theo chỉ số gần nhất 1là một ý tưởng hay!
Zgarb

4

Võng mạc , 97 72 byte

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

Đầu vào dự kiến ​​là một danh sách các số nguyên unary được phân tách bằng dấu phẩy (các dấu phân cách hàng đầu và dấu như [...]làm việc tốt).

Chạy tất cả các trường hợp thử nghiệm ở đây. (Để thuận tiện, việc này sẽ tự động chuyển đổi từ và sang số thập phân.)

Dưới đây là một ý tưởng hoàn toàn khác để tránh các nhóm cân bằng đắt tiền bằng cách sử dụng nhiều giai đoạn. Nó hiện dài hơn 6 byte, nhưng có thể dễ chơi hơn:

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

Ngay khi nhìn thấy thử thách này, tôi đã nghĩ Retina sẽ phù hợp (+1)
Michael Klein

@MichaelKlein Cảm ơn, nhưng tôi không thực sự nghĩ vậy. Tôi ngạc nhiên khi nó thậm chí đánh bại JavaScript, nhưng tôi khá chắc chắn rằng nó sẽ không có cơ hội chống lại bất kỳ ngôn ngữ chơi gôn nào.
Martin Ender

Rất phù hợp như trong tôi ngay lập tức bắt đầu nghĩ cách giải quyết trong Retina
Michael Klein

3

JavaScript (ES6), 108 byte

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

Giải trình

Lặp lại trên mỗi ô và nếu nó có chứa kim loại, hãy kiểm tra xem ô tiếp theo theo hướng của nam châm gần nhất có trống không và nếu có, hãy di chuyển nó đến đó. Quá trình này được lặp đi lặp lại nhiều lần cho đến khi tất cả kim loại đã di chuyển xa nhất có thể.

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 ký tự

<?$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";?>

Vâng, điều này rất dài, bởi vì PHP không thực sự là một ngôn ngữ để chơi gôn, nhưng nó hoạt động và tôi đã làm cho nó trở nên tốt với tôi. Tất nhiên tôi mở cho những thiếu sót có thể.

Ngoài ra có một tính năng lỗi nhỏ mà nghĩ, vì vậy, ví dụ ở đây:

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

Có vẻ như 12 người kỳ diệu đã đứng trước 3 người, nhưng điều đó không đúng!

Cả 3 tôn trọng số lượng lớn hơn và cho phép nó đến gần hơn với các pháp sư!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.