어레이의 자기 풀


20

배경

나는 강력한 자석 줄과 그들 사이에 많은 금속 물체를 가지고 있습니다. 자석은 어디로 끌어 당깁니까?

입력

입력 값은 음이 아닌 정수로 구성된 배열이며 하나 이상이 포함됩니다 1. 합리적인 형식을 사용할 수 있습니다.

0배열 의 s는 빈 공간을 1나타내고 s는 고정 자석을 나타냅니다. 다른 모든 숫자는 금속 물체로 자석에 의해 당겨집니다. 모든 물체는 가장 가까운 자석쪽으로 당겨지고 (타이가 있으면 오른쪽으로 당겨집니다) 자석이나 다른 물체에 부딪 칠 때까지 그 방향으로 이동합니다. 결국, 모든 물체가 자석 주위에 모여 있습니다. 개체의 순서가 유지됩니다.

산출

출력은 모든 물체가 가능한 한 가장 가까운 자석에 가깝게 당겨진 배열입니다. 입력과 동일한 형식이어야합니다.

배열을 고려하십시오

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

가장 왼쪽 2은 두 번째 자석처럼 첫 번째 자석 쌍으로 당겨집니다 2. 은 3네 단계 떨어져 양 방향으로 자석을 가지고, 그래서는 오른쪽으로 당겨됩니다. 은 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

피스, 28 20

o@.e?bhaDk_x1QkQ~hZQ

6 바이트 골프를하신 @ThomasKwa에게 감사드립니다!

이렇게하면 목록의 모든 값 1 이상에 가장 가까운 1의 인덱스 (가장 오른쪽 1로 나눈 값)를 할당 한 다음이 값을 기준으로 목록을 정렬하여 안정적인 정렬을 남용합니다. 0에는 정렬 값으로 자체 색인이 제공됩니다.

테스트 스위트

검증 스위트

설명:

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]예를 들어 테스트 사례 를 보자. 열거 형을 적용하면 0은 모두 정렬 값으로 자체 색인을 얻으므로 생략하고 1과 3을 수행합니다.

첫 번째 인덱스는 다음과 같습니다 [0, 4, 8].. 그런 다음 그것을 뒤집어 인덱스의 절대 값에서 인덱스의 인덱스를 뺀 값으로 정렬하십시오. 여기서는 0입니다. 그래서 우리는 [0, 4, 8]다시 돌아옵니다. 첫 번째 값은 0우리가 사용하는 것입니다.

3의 경우, 반대 인덱스를 가져와 같은 정렬을 수행하지만 3의 인덱스로 2를 사용하므로 절대 차이에 대해 0and와 4같은 값을 가지므로 다음 [4, 0, 8]과 같이 4됩니다.

그런 다음 최종 "정렬 값"배열이됩니다 [0, 1, 4, 3, 4, 5, 8, 7, 8]. 안정적인 정렬 덕분에 값이 원래 나타난 순서대로 연결이 끊어 지므로 원하는 최종 배열을 얻습니다.


가장 가까운 인덱스로 정렬 1하는 것이 좋습니다.
Zgarb

4

망막 , 97 72 바이트

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

입력은 쉼표로 구분 된 단항 정수 목록이어야합니다 ( [...]작업 과 같은 선행 및 후행 구분 기호는 정상적으로 작동 함).

여기에서 모든 테스트 사례를 실행하십시오. (편의를 위해, 이것은 십진수에서 십진수로의 변환을 자동으로 처리합니다.)

다음은 여러 단계를 사용하여 고가의 밸런싱 그룹을 피하는 완전히 다른 아이디어입니다. 현재 6 바이트 더 길지만 더 골프화 할 수 있습니다.

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

나는 망막 좋은 적합 (+1) 될 것이라고 생각이 도전 보았다 곧 한
마이클 클라인

@MichaelKlein 감사합니다, 그러나 나는 그것이 실제로 그렇게 생각하지 않습니다. JavaScript를 능가하는 것에 놀랐지 만 골프 언어에 대항하지 않을 것이라고 확신합니다.
Martin Ender

나는 즉시 망막에 해결하는 방법을 생각하기 시작에서 좋은 맞게
마이클 클라인

3

자바 스크립트 (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는 실제로 골프 용 언어가 아니기 때문에 매우 길지만, 작동하며 FUN으로 만들었으므로 괜찮습니다. 물론 나는 가능한 단락에 열려 있습니다.

또한 생각 하는 작은 버그 기능이 있습니다. 예를 들면 다음과 같습니다.

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은 더 큰 숫자를 존중하고 maget에 더 가까이 갈 수 있습니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.