빈 공백을 채워서 빈 공간을 채 웁니다.


10

placeAt음이 아닌 정수의 배열과 음이 아닌 정수인 인덱스를 취하는 함수 (예 :)를 작성하십시오 . 주어진 색인에 1을 배치하여 다른 항목을 한 자리 씩 이동하여 해당 자리를 비우고 0은 빈 자리를 나타냅니다.

  • 원하는 색인의 항목이 0이면 1로 채 웁니다.
  • 그렇지 않으면 색인 왼쪽에서 가장 가까운 0을 찾으십시오. 공백을 만들기 위해 항목을 한 자리 왼쪽으로 이동 한 다음 색인을 1로 채 웁니다.
  • 왼쪽에 0이 없으면 오른쪽으로 동일하게 수행하십시오.
  • 둘 다 가능하지 않은 경우 (예 : 0이없는 경우) 배열을 변경하지 않고 반환합니다.

항목은 인덱스가 0입니다. 함수 이름은 원하는 것이 될 수 있습니다.

예 :

(문자는 양의 정수 값을 나타냅니다.)

[a, b, 0, c, d, 0] placeAt 2    // output [a, b, 1, c, d, 0]    place 2 is 0, just fill
[a, b, 0, c, d, 0] placeAt 3    // output [a, b, c, 1, d, 0]    place 3 is filled, shift items left
[a, b, 0, c, d, 0] placeAt 0    // output [1, a, b, c, d, 0]    place 0 is filled, can't shift left, shift items right
[a, b, 0, c, d, 0] placeAt 1    // output [a, 1, b, c, d, 0]    place 1 is filled, can't shift left, shift items right
[0, a, b, 0, c, d, 0] placeAt 2 // output [a, b, 1, 0, c, d, 0] place 2 is filled, shift items left
[0, a, b, 0, c, d, 0] placeAt 4 // output [0, a, b, c, 1, d, 0] place 4 is filled, shift items left (notice you keep shifting up until a 0)
[0, 2, 0, 2] placeAt 3          // output [0, 2, 2, 1]          place 3 is filled, shift items left

이것은 코드 골프 도전입니다. 9 일이 지나면 가장 짧은 항목이 이깁니다.


4
둘 다 가능할 때 왼쪽 또는 오른쪽으로 이동할지 어떻게 알 수 있습니까? 또한없는 경우 어떻게 0합니까?
xnor

에 대해 [0, 2, 0, 2] placeAt 3출력하는 것이 합법적 [2, 0, 2, 1]입니까? 코드는 실제로라는 함수 여야 placeAt합니까? 일부 언어에는 정확히 기능이 없습니다. "예외 발생"은 일부 언어에는 적용되지 않을 수도 있습니다. 오류를 나타내는 출력을 허용하는 것이 좋습니다.
xnor

배열이 음수 값을 가질 수 있습니까?
Kade

99 %가이 챌린지 규칙을 통해 OP의 의도를 이해한다고 확신하므로 게시물을 재구성하고 (현재 대기열에 있음) 질문에 답변하려고합니다. eguneys, 필요한 경우 내 답변을 수정할 수 있습니다.
ETHproductions

@xnor 왼쪽으로 이동하면 항상 오른쪽으로 이동하는 것보다 우선합니다. 0이 없으면 원래 배열을 반환하십시오. 또한 [2, 0, 2, 1]가능한 적은 수의 요소를 항상 이동해야하며 원하는대로 함수의 이름을 지정할 수 있으므로 올바른 출력이 아닙니다.
ETHproductions

답변:


4

자바 스크립트 (ES6), 85

EcmaScript 6 호환 브라우저에서 스 니펫 실행 테스트 (특히 MSIE가 아닌 Chrome이 아닙니다. Firefox에서 테스트 한 경우 Safari 9로 이동 가능)

(나는 다른 답변을 보지 않고 이것을 찾았습니다. 이제 그것이 링크와 매우 유사하다는 것을 알았습니다. 그러나 훨씬 더 짧습니다.

F=(a,p,q=~a.lastIndexOf(0,p)||~a.indexOf(0))=>(q&&(a.splice(~q,1),a.splice(p,0,1)),a)

// Ungolfed
U=(a,p)=>{
  q = a.lastIndexOf(0, p)
  if (q < 0) q = a.indexOf(0)
  if (q >= 0) {
    a.splice(q, 1)
    a.splice(p, 0, 1)
  }
  return a
}  

// TEST
out=x=>O.innerHTML+=x+'\n';

[ [['a', 'b', 0, 'c', 'd', 0], 2, ['a', 'b', 1, 'c', 'd', 0]] // place 2 is 0, just fill
, [['a', 'b', 0, 'c', 'd', 0], 3, ['a', 'b', 'c', 1, 'd', 0]] // place 3 is filled, shift items left
, [['a', 'b', 0, 'c', 'd', 0], 0, [1, 'a', 'b', 'c', 'd', 0]] // place 0 is filled, can't shift left, shift items right
, [['a', 'b', 0, 'c', 'd', 0], 1, ['a', 1, 'b', 'c', 'd', 0]] // place 1 is filled, can't shift left, shift items right
, [[0, 'a', 'b', 0, 'c', 'd', 0], 2, ['a', 'b', 1, 0, 'c', 'd', 0]] // place 2 is filled, shift items left
, [[0, 'a', 'b', 0, 'c', 'd', 0], 4, [0, 'a', 'b', 'c', 1, 'd', 0]] // place 4 is filled, shift items left (notice you keep shifting up until a 0)
, [['a', 'b', 'c', 'd'], 2, ['a', 'b', 'c', 'd']] // impossible
, [[0, 2, 0, 2], 3, [0, 2, 2, 1]]] // place 3 is filled, shift items left
.forEach(t=>{
  i=t[0]+''
  r=F(t[0],t[1])+''
  k=t[2]+''
  out('Test ' + (r==k?'OK':'Fail') +'\nInput: '+i+' '+t[1]+'\nResult:'+r+'\nCheck: '+k+'\n')
})
<pre id=O></pre>


내가 쉼표 연산자에 대해 배웠고 나를 때리는 것에 대해 +1
rink.attendant.6

@ rink.attendant.6 그러나 &&를 사용하는 splice것이 나의 쉼표보다 낫습니다
edc65

3

줄리아, 122 바이트

일을 시작하기위한 스펙의 순진한 구현.

f(x,i)=(i+=1;x[i]==0?(x[i]=1):i>2&&x[i-1]==0?(x[i-1]=x[i];x[i]=1):i<length(x)-1&&x[i+1]==0?(x[i+1]=x[i];x[i]=1):error();x)

언 골프 드 :

function placeAt(x::Array, i::Int)
    # Make i 1-indexed
    i += 1

    # Shift and modify the array as necessary
    if x[i] == 0
        x[i] = 1
    elseif i > 2 && x[i-1] == 0
        x[i-1], x[i] = x[i], 1
    elseif i < length(x)-1 && x[i+1] == 0
        x[i+1], x[i] = x[i], 1
    else
        error()
    end

    # Return the modified array
    x
end

1

JavaScript (ES6), 98 바이트

CoffeeScript 답변 과 거의 같은 접근 방식 이지만 return문장 을 저장하기 위해 극단적으로 단락하고 있습니다 .

f=(a,x)=>(~($=a.lastIndexOf(0,x))||~(_=a.indexOf(0,x)))&&a.splice(~$?$:_,1)&&a.splice(x,0,1)&&a||a

설명

쉽게 설명하기 위해 코드를 약간 재정렬했습니다.

// Declare function f with two arguments: array and position
f = (a, x) => {
    // Take the part of the array from beginning to x and find the last 0
    $ = a.lastIndexOf(0, x)

    // Find the first 0 after position x
    _ = a.indexOf(0, x);

    // indexOf returns -1 if they aren't found
    // ~1 == 0 so I am checking if either $ or _ is truthy (zeros were found)
    if (~$ || ~_)
       // If zeros were found in the left, use that.
       // Otherwise use the found zero in the right.
       // Delete it from the array
       // Array.prototype.splice will return an array which evaluates to truthy
       // and continues execution with the &&
       // Insert value 1 at position x, deleting 0 elements
       // The last value is returned
       return a.splice(~$ ? $ : _, 1) && a.splice(x, 0, 1) && a
    else
       // No zeros were found so just return the original
       // In the golfed code the if would have evaluated to false to cut into the || part
       return a
}

다음 은 JS 단락 평가에 대한 정보입니다.

데모

현재이 데모는 ES6 사용으로 인해 Firefox 및 Edge에서만 작동합니다.

f=(a,x)=>(~($=a.lastIndexOf(0,x))||~(_=a.indexOf(0,x)))&&a.splice(~$?$:_,1)&&a.splice(x,0,1)&&a||a

// Snippet stuff
console.log = x => O.innerHTML += x + '\n';

console.log(f(['a', 'b', 0, 'c', 'd', 0], 2))
console.log(f(['a', 'b', 0, 'c', 'd', 0], 3))
console.log(f(['a', 'b', 0, 'c', 'd', 0], 0))
console.log(f([0, 'a', 'b', 0, 'c', 'd', 0], 2))
console.log(f([0, 'a', 'b', 0, 'c', 'd', 0], 4))
console.log(f(['a', 'b', 0, 'c', 'd', 0], 2))
console.log(f(['a', 'b', 0, 'c', 'd', 0], 1))
<pre id=O></pre>


이 작업은 어떻게 설명 할 수 있습니까?
eguneys

@eguneys 설명 추가
rink.attendant.6

그것은 작동하지 않습니다f(['a', 'b', 0, 'c', 'd', 0], 2)
eguneys

@eguneys 수정되었습니다. 속기 슬라이스를 사용할 때 CoffeeScript가 자동으로 하나를 추가하는 것을 잊었습니다 [a..b].
rink.attendant.6

작동하지 않습니다f(['a', 'b', 0, 'c', 'd', 0], 1)
eguneys

1

루비, 208 바이트

def f(a,i)
  x=a.take(i).rindex(0);y=a[i+1..-1].index(0)
  if a[i]==0
    a[i]=1
  elsif !x.nil?
    a.delete_at(x);a.insert(i,1)
  elsif !y.nil?
    a.delete_at(y+i+1);a.insert(i,1)
  end
  a
end

PPCG에 오신 것을 환영합니다! 루비에 대한 간단한 골프 팁 : 들여 쓰기가 필요하지 않으므로 모든 공간을 제거 할 수 있습니다. 그런 다음 단일 줄 바꿈이 동일한 바이트 수이므로 세미콜론도 필요하지 않습니다. 명령문 끝의 메소드 호출은 괄호가 필요하지 않으므로 예를 들어 .rindex 0매번 1 바이트를 절약 할 수 있습니다 . 메소드 대신 proc을 사용하여 바이트를 저장할 수도 있습니다. 이름을 지정할 필요조차 없습니다 ->a,i{...}. 중첩 된 삼항 연산자로 if / elsif / elsif를 줄일 수 있습니다 ...?...:...?...:....
마틴 엔더

친절한 조언에 감사드립니다. 나는 그것을 조사하고 내가 할 수있는 것을 볼 것이다.
handrake

1

하스켈, 119 바이트

e=elem 0
r=reverse
f=(g.).splitAt
g(a,y@(x:b))|e(x:a)=r(h(x:r a)1)++b|e y=a++h y 1|1<2=a++y 
h(0:r)n=n:r
h(a:r)n=n:h r a

사용 예 :

*Main> mapM_ (print.uncurry f) [ 
                (2,[2,3,0,4,5,0]),
                (3,[2,3,0,4,5,0]),
                (0,[2,3,0,4,5,0]),
                (1,[2,3,0,4,5,0]),
                (2,[0,2,3,0,4,5,0]),
                (4,[0,2,3,0,4,5,0]),
                (3,[0,2,0,2]),
                (2,[2,3,4,5])  ]
[2,3,1,4,5,0]
[2,3,4,1,5,0]
[1,2,3,4,5,0]
[2,1,3,4,5,0]
[2,3,1,0,4,5,0]
[0,2,3,4,1,5,0]
[0,2,2,1]
[2,3,4,5]

작동 방식 : 주어진 위치의 입력 목록을 왼쪽 부분 a, 위치 자체 x및 오른쪽 부분 의 요소 로 나눕니다 b. 있을 경우 0a++x첫째로, 메이크업 룸까지 0의 역으로 a++x. 있을 경우 0x++b가, 메이크업 룸. 전혀없는 경우 0모든 부품을 변경하지 않고 원래 목록을 다시 가져 오십시오.


0

CoffeeScript, 96 바이트

f=(a,_)->a.splice((if~($=a.lastIndexOf 0,_)then $ else a.indexOf 0),1);a.splice(_,0,1)if 0in a;a

0

파이썬 2, 102 바이트

def f(a,i):
 x=(a[i-1::-1]+a[i:]+[0]).index(0)
 if x<len(a):del a[(x,i-x-1)[x<i]];a[i:i]=[1]
 return a

삽입 색인으로 거꾸로 된 목록을 색인 뒤의 부품과 정상적인 순서로 연결 한 다음 첫 번째 0의 색인을 찾아 제거 할 0의 색인을 계산합니다. 0이 ValueError없으면 예외 를 피하기 위해 0이 끝에 추가 됩니다. 그런 다음 삭제, 삽입 및 반환하십시오.


0

R, 87 바이트

f=function(a,i)if(0%in%a)append(a[-abs(min((b=which(a==0))*(1-(b<=i+1)*2)))],1,i)else a

설명

function(a,i)
if(0%in%a)                      # as long as a 0 exists
    append(                     # append 1 after i
        a[
          -abs(                 # remove absolute of min index
            min(                # minimum of adjusted index
              (b=which(a==0))*  # index of all 0's
              (1-(b<=i+1)*2)    # multiple -1 if <= i
              )
            )
        ]
        ,1
        ,i
    )
else                            # otherwise return untouched
    a

테스트

> f(c(2, 3, 0, 4, 5, 0) , 2)   
[1] 2 3 1 4 5 0
> f(c(2, 3, 0, 4, 5, 0) , 3)   
[1] 2 3 4 1 5 0
> f(c(2, 3, 0, 4, 5, 0) , 0)   
[1] 1 2 3 4 5 0
> f(c(2, 3, 0, 4, 5, 0) , 1)   
[1] 2 1 3 4 5 0
> f(c(0, 2, 3, 0, 4, 5, 0) , 2)
[1] 2 3 1 0 4 5 0
> f(c(0, 2, 3, 0, 4, 5, 0) , 4)
[1] 0 2 3 4 1 5 0
> f(c(0, 2, 0, 2) , 3)         
[1] 0 2 2 1
> 

0

C #, 265 바이트

골프 (265 자)

static void placeAt(String[]Q,int P){int I;if(Q[P]=="0"){Q[P]="1";}else{I=Array.IndexOf(Q,"0");if(I>=0){if(I<P){for(int i=I;i<=P;i++){Q[i]=(i==P)?"1":Q[i+1];}}else if(I>P){for(int i=I;i>=P;i--){Q[i]=(i==P)?"1":Q[i-1];}}}}foreach(String s in Q)Console.Write(s+" ");}

공백과 들여 쓰기

static void placeAt(String[] Q, int P)
    {
        int I;

        if(Q[P] == "0")
        {
            Q[P] = "1";
        }
        else
        {
            I = Array.IndexOf(Q, "0");
            if (I >= 0)
            {
                if (I < P)
                {
                    for (int i = I; i <= P; i++)
                    {
                        Q[i] = (i == P) ? "1" : Q[i + 1];
                    }
                }
                else if (I > P)
                {
                    for (int i = I; i >= P; i--)
                    {
                        Q[i] = (i == P) ? "1" : Q[i - 1];
                    }
                }
            }
        }

        foreach (String s in Q)
            Console.Write(s + " ");
    }

전체 프로그램

using System;

class FillZero
{
    static void placeAt(String[] Q, int P)
    {
        int I;

        if(Q[P] == "0")
        {
            Q[P] = "1";
        }
        else
        {
            I = Array.IndexOf(Q, "0");
            if (I >= 0)
            {
                if (I < P)
                {
                    for (int i = I; i <= P; i++)
                    {
                        Q[i] = (i == P) ? "1" : Q[i + 1];
                    }
                }
                else if (I > P)
                {
                    for (int i = I; i >= P; i--)
                    {
                        Q[i] = (i == P) ? "1" : Q[i - 1];
                    }
                }
            }
        }

        foreach (String s in Q)
            Console.Write(s + " ");
    }

    static void Main()
    {
        String[] X = {"a", "b", "0", "c", "d", "0"};
        placeAt(X , 1);

    }

}

테스트 사례 여기에 이미지 설명을 입력하십시오


1
이것은 작동하지 않습니다([0, 'a', 'b', 0, 'c', 'd'], 2)
eguneys

1
당신은 예를 들어, 모든 불필요한 공백을 제거하여 일부 문자를 저장할 수 있습니다 String[] Q, int PString[]Q,int P.
ProgramFOX

@eguneys 님, 안녕하세요. 지적 해 주셔서 감사합니다. 논리를 수정 했으므로 모든 테스트 사례에서 작동합니다. 테스트 사례 이미지도 업데이트했습니다. 배치는 올바르게 수행되지만 이동 결과는 다릅니다.
Merin Nakarmi

귀하의 소중한 의견에 감사드립니다. @ProgramFOX. 약 10자를 저장했습니다.
Merin Nakarmi

0

C, 154 바이트

p(a,l,i,c)int*a;{for(c=i;c+1;c--){if(!a[c]){for(;c<i;c++)a[c]=a[c+1];return a[i]=1;}}for(c=i;c<l;c++){if(!a[c]){for(;c>i;c--)a[c]=a[c-1];return a[i]=1;}}}

주어진 테스트 케이스를 통과, A는 배열에 대한 포인터입니다, 배열 (나는이 짧은 휴식하지 않습니다) 희망의 길이, 내가 삽입을위한 인덱스이고, C는 내부적으로 사용됩니다. 왼쪽 및 오른쪽 검색 루프를 결합하여 향상시킬 수 있습니다.

int main(int argc, char * argv[]) {
    int a[] = {0, 2, 0, 2};
    p(a, 4, 3);
}

언 골프

K & R 스타일 선언 이상의 트릭은 아닙니다.

p(a,l,i,c) int *a; {
    /* Search left from i (also handles a[i] == 0) */
    for (c=i;c+1;c--) {
            if (!a[c]) {
                    /* Shift items left until i */ 
                    for (;c<i;c++) a[c]=a[c+1];
                    return a[i]=1;
            }
    }
    /* Search right from i */
    for (c=i;c<l;c++) {
            if(!a[c]) {
                    /* Shift items right until i */
                    for(;c>i;c--) a[c]=a[c-1]; 
                    return a[i]=1;
            }
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.