연속 1 비트 증가


36

Bits의 패턴 (문자열 또는 배열 형식)이 주어진 경우 : [0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1]

이 작업은 연속적인 1 비트 수를 1부터 시작하는 오름차순으로 바꾸는 것입니다.

입력

  • 패턴 (문자열 또는 배열로 수신 가능) 예 :
    • 끈: 1001011010110101001
    • 정렬: [1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1]

산출

  • 오름차순 번호 순서 (문자열 또는 배열로 리턴 될 수 있음) 예 :
    • 끈: 1 0 0 1 0 1 2 0 1 0 1 2 0 1 0 1 0 0 1
    • 정렬: [1, 0, 0, 1, 0, 1, 2, 0, 1, 0, 1, 2, 0, 1, 0, 1, 0, 0, 1]

규칙

  • (문자열 만 적용) 입력 사이의 공간이 포함 습관 10
  • 입력 가정 length > 0
  • (문자열에만 적용) 출력은 공백으로 구분됩니다 (알파벳의 숫자 나 문자가 아닌 경우 다른 구분 기호를 사용하십시오).

예:

Given [0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1] 
Output [0,1,2,3,0,1,2,0,0,0,1,2,3,4,5,6]

--------------------------------------------------------------------------

Given 0110101111101011011111101011111111     
Output 0 1 2 0 1 0 1 2 3 4 5 0 1 0 1 2 0 1 2 3 4 5 6 0 1 0 1 2 3 4 5 6 7 8

---------------------------------------------------------------------------

Given 11111111111101    
Output 1 2 3 4 5 6 7 8 9 10 11 12 0 1

우승 기준 : Codegolf

답변:


19

05AB1E , 4 바이트

γ€ƶ˜

온라인으로 사용해보십시오! 또는 시험 소송으로

설명

γ      # split input into groups of consecutive equal elements
 €ƶ    # multiply each number in each sublist by its 1-based index in the sublist
   ˜   # flatten

1
나보다 나아 나는 이것을 결코 생각하지 않았을 것입니다.
Magic Octopus Urn

3
나는 codegolf 바이트 계산 규칙에 100 % 익숙하지 않습니다 (그리고 인터넷 검색 은 결론에 도달하지 않은 이 게시물 만 찾았 습니다 ). 답은 4 자이지만 8 바이트 이상 (예 : utf-16-BOM없는 경우 03 B3 20 AC 01 B6 02 DC) 또는 9 바이트 (utf-8 :) CE B3 E2 82 AC C6 B6 CB 9C또는 10 바이트 (예 : 2 바이트 BOM을 포함한 UTF-16 )는 안됩니다 . 장난감이 아닌 인코딩으로? (예, 1 바이트로 표시되는이 4 개의 기호로 iso-8859 인코딩과 유사한 장난감 8 비트 인코딩을 구성 할 수 는 있지만 부정 행위처럼 보입니다.)
dr jimbob

6
@ drjimbob 네, 좋은 질문입니다. 코드는 실제로 05AB1E 코드 페이지를 사용하여 이진 파일로 변환 될 수 있습니다 . 예를 들어 γ€ƶ˜로 표시됩니다 04 80 8F 98. 코드 페이지는 주로 코드 작성을 쉽게하기 위해 존재합니다. 이 4 바이트 파일을 실행하려면 --osabie플래그를 사용 하여 인터프리터를 실행해야합니다 .
Adnan 2016 년

18

하스켈 , 15 바이트

scanl1$(*).succ

온라인으로 사용해보십시오!

설명 / 비 골프

scanl1 마지막 결과와 현재 요소가 결과와 함께 새 목록을 생성하는 함수를 사용하여 목록에서 왼쪽부터 반복하여 빈 목록과 싱글 톤은 "수정되지 않은"상태로 둡니다.

(*).succ\x y-> (x+1)*y

scanl1증가하는 시퀀스 ( 1,2,3, .. )는 1로 시작하고 선행 요소가 없기 때문에이 기능을 함께 사용할 수 있습니다 (이 경우 목록에서 첫 번째 요소가 "수정되지 않음") 또는 앞에 0이 있습니다.



14

껍질 , 5 4 3 바이트

ṁ∫g

온라인으로 사용해보십시오!

설명

ṁ∫g  -- full function, example input: [1,1,1,0,1]
  g  -- group: [[1,1],[0],[1]]
ṁ    -- map the following and concatenate result (example with [1,1,1])
 ∫   -- | cumulative sum: [1,2,3]
     -- : [1,2,3,0,1]

기록 편집

scanl1over 를 사용하여 -1 바이트zipWith

이식에 의해 -1 바이트 데니스용액을



11

자바 스크립트 (ES6), 22 바이트

입력을 배열로받습니다.

a=>a.map(s=n=>s=n*-~s)

온라인으로 사용해보십시오!

더 짧은 a=>a.map(n=>a=n*-~a)(20 바이트)는 불행히도 [1]싱글 톤 배열을 보유하고있는 정수로 강제 변환하기 때문에 실패합니다 .



8

파이썬 2 , 39 38 바이트

Outgolfer Erik 덕분에 -1 바이트

i=1
for x in input():i*=x;print i;i+=1

온라인으로 사용해보십시오!


1
나는 당신이 필요하다고 생각하지 않습니다 ,.
Outgolfer Erik

@EriktheOutgolfer 그것은 이렇게 예쁘게 보인다 c :
Rod

1
미안하지만 때로는 인생에서 희생해야합니다.
Outgolfer Erik

9
RIP ,당신은 더 이상 코드에 없지만, 당신은 내 마음 속에 영원히있을 것입니다
Rod


6

K (oK) , 11 8 바이트

해결책:

{y*1+x}\

온라인으로 사용해보십시오!

설명:

목록을 반복하십시오. 현재 항목을 곱한 누산기 (항목이 0 인 경우 누산기를 재설정 함) :

{y*1+x}\ / the solution
{     }\ / iterate (\) over lambda function
     x   / accumulator
   1+    / add 1
 y*      / multiply by current item

5

젤리 , 4 바이트

ŒgÄF

온라인으로 사용해보십시오!

작동 원리

ŒgÄF  Main link. Argument: A (bit array)

Œg    Group adjacent, identical bits.
  Ä   Accumulate; take the cumulative sum of each chunk.
   F  Flatten.

그룹이 빨리 달리면서 Erik은 이것이 3 바이트 일 것이라고 제안했습니다! (내가 올바르게 무엇을하는지 이해한다면)
dylnan

@ dylnan 문제는 그러한 빠른 행동을 결정하기 어렵다는 것입니다. :( 그래서 퀵은 여전히
쇠약 해지고

주요 구현을위한 여러 가지 정보가있을 수 있습니다
dylnan


5

RAD, 8 바이트

(⊢×1+⊣)⍂

온라인으로 사용해보십시오!

어떻게?

  • (⊢×1+⊣), 오른쪽 인수가이면 0을 반환하고 0, 그렇지 않으면 왼쪽 인수를 증가시킵니다
  • , LTR 스캔 ( (A f B) f C대신 A f (B f C))을 어레이에 적용

4

apt, 7 6 5 바이트

åÏ*°X

시도 해봐


설명

åÏ        :Cumulatively reduce
   °X     :  Increment the current total (initially 0)
  *       :  Multiply by the current element

4

자바 8, 55 48 바이트

a->{int p=0,i=0;for(int v:a)a[i++]=v<1?p=0:++p;}

바이트를 절약하기 위해 새로운 것을 반환하는 대신 입력 배열을 수정합니다.

@TimSeguine 덕분에 -7 바이트 .

온라인으로 사용해보십시오.

설명:

a->{             // Method with integer-array parameter and no return-type
  int p=0,       //  Previous integer, starting at 0
      i=0;       //  Index-integer, starting at 0
  for(int v:a)   //  Loop over the values of the input-array:
    a[i++]=v<1?  //   If the current value is 0:
          p=0    //    Reset the previous integer to 0
         :       //   Else:
          ++p;}  //    Increase `p` by 1 first with `++p`
                 //    and set the current item to this new value of `p`

1
당신은 48로 줄일 수 있습니다.a->{int p=0,i=0;for(int b:a)a[i++]=b<1?p=0:++p;}
Tim Seguine

@TimSeguine 감사합니다! 이제 나는 그것을 스스로 생각하지 않았다는 것을 믿을 수 없습니다.
Kevin Cruijssen

1
나는 p를 제거 할 수 있었지만 같은 크기입니다 :(a->{int i=0;for(int v:a)a[i]+=v*i++<1?0:a[i-2];}
Tim Seguine

4

TIS , 68 + 33 = 101 바이트

코드 (68 바이트) :

@0
MOV UP ACC
SUB 47
MOV ACC ANY
@1
ADD 1
JRO UP
SUB ACC
MOV ACC ANY

레이아웃 (33 바이트) :

2 1 CC I0 ASCII - O0 NUMERIC - 32

온라인으로 사용해보십시오!

설명:

|    Input 0    |    Input is given in ASCII (`0` is 48, `1` is 49)
+--------+------+
| Node 0 |      |    This node prepares the input data
+--------+      |
| MOV UP ACC    |    Read in a character
| SUB 47        |    Subtract 47 to map [48, 49] to [1, 2]
| MOV ACC ANY   |    Send the 1 or 2 to the next node
|               |    Implicitly wrap back to top of node
+--------+------+
| Node 1 |      |    This node does the incrementing/printing
+--------+      |
| ADD 1         |    Increment counter (starts at zero)
| JRO UP        |    Get value from above, and jump forward that many lines  (skip next line or not)
| SUB ACC       |    Reset counter to zero (if input was zero)
| MOV ACC ANY   |    Send the counter value downward to be printed
|               |    Implicitly wrap back to top of node
+---------------+
|   Output 0    |    Output is space-delimited numeric values

4

Gaia , 5 바이트

ẋ+⊣¦_

온라인으로 사용해보십시오!

설명

ẋ+⊣¦_     Full program
ẋ         Split into chunks of equal adjacent values.
   ¦_     And for each chunk, flattening the result afterwards...
 +⊣       Reduce it cumulatively on + (addition); aka cumulative sums

어, SE 코드 글꼴이 고정 폭이라고 생각했습니다 ....


그들은 단일 공간입니다 ... 첫 번째 줄에 공백이 없습니다.
micsthepick

편집 내용을보십시오. 여전히 잘못 정렬되어 있습니다.
Mr. Xcoder

당신은 모바일 장치 또는 무언가에서 찾고 있어야합니다-그것은 나에게 잘 보인다
micsthepick



4

펄 6 , 29 24 18 바이트

Sean 덕분에 -6 바이트!

*.map:{($+=1)*=$_}

온라인으로 사용해보십시오!

내부 함수는 by를 사용할 수 ($+=1)*=*있지만 익명 변수는 함수 호출 전체에서 유지됩니다. 우리는 이것을 명시적인 코드 블록으로 감싸서 얻는다.

설명:

*.map:               # Map the array to
      {($+=1)    }   # The anonymous variable incremented
             *=$_    # Multiplied by the element

16 바이트까지 동일한 기본 접근 방식이 *.map(($+=1)*=*)있습니다. 이 솔루션에는 상태 변수 $가 함수 호출에 걸쳐 지속 된다는 조건이 있으므로 한 호출에 전달 된 최종 요소와 다음 호출에 전달 된 첫 번째 요소가 모두 0이 아닌 경우 계수는 잘못된 숫자로 시작합니다.
Sean

@Sean, 네, 원래 대답 할 때 어려움을 겪었던 것을 기억합니다. 운 좋게도 그 이후로 그 길을 배웠습니다
Jo King

한 바이트 더 떨어 뜨릴 수 있습니다 *.map:{...}..
Sean



3

Pyth , 6 바이트

m=Z*hZ

여기 사용해보십시오!

작동 원리

m = Z * hZ – 전체 프로그램. Q = 평가 된 입력.
m – Q의 각 정수 d에 대해
 = Z – 변수 Z (0으로 사전 초기화 됨)를 ...
   * hZ – (Z + 1) * d; (d는 끝에 암시 적입니다).



3

Q 기본, 60 바이트

INPUT s$
FOR i=1TO LEN(s$)
b=MID$(s$,i)>="1
v=-b*v-b
?v
NEXT

입력을 문자열로 취합니다. 줄 바꿈으로 구분 된 숫자로 출력을 제공합니다.

설명

우리는 문자열 읽기 s$및 루프 i에서 1길이까지입니다.

MID$(s$,i)문자 i(1 색인)에서 문자열 끝까지 하위 문자열을 가져옵니다 . 이것이 a로 시작하면 1사전 식 >=으로 문자열이됩니다 "1". 로 시작 0하면 그렇지 않습니다. 그래서 b얻는 0인덱스에있는 문자가있는 경우 i이다 0, 또는 -1문자 인 경우 1.

다음으로 현재 값을 업데이트합니다 v. 우리는 단지를 읽는다면 0, 우리는 원하는 v되기 위해 0; 그렇지 않으면, 우리 v는 1 씩 증가시키고 싶습니다 . 즉, v = (-b) * (v+1); 수학을 단순화하면 코드에서보다 짧은 표현을 얻을 수 있습니다. 마지막으로 인쇄 v하고 반복합니다.


3

Brain-Flak , 60 바이트

([]){{}<>(())<>{{}<>({}({}))(<>)}{}([])}{}<>{({}[()]<>)<>}<>

온라인으로 사용해보십시오!

설명:

([]){  For each element in the input
    {}
    <>(())<>  Push a one to the other stack
    { If the element is one,
       {}<>({}({}))(<>)  Add the one to a copy of the previous number in the series
    }{}  Pop the element
([])}  End loop
{}<>   Pop extra zero
{({}[()]<>)<>}<>   And reverse the output stack, subtracting one from each element


3

C (gcc), 57 52 51 바이트

f(a,l,c,i)int*a;{for(c=i=0;i<l;)a[i++]=c=a[i]*-~c;}

포트 Arnauld의 자바 스크립트 대답은 , 현재 위치에서 배열을 수정합니다. 여기에서 온라인으로 사용해보십시오 .


이것이 K & R C라고 말하는 것이 더 정확하지 않습니까?
Tim Seguine

아마도 많은 답변에 해당 될 것입니다. 저는 전문가는 아니지만 유효한 K & R C조차도 불가능합니다. 사실이 사이트의 언어 표준은 신경 쓰지 않습니다. 만약 gcc가 K & R C를 더 현대적인 것들과 혼합 할 수 있다면, gcc가 컴파일 할 것이기 때문에 골프 목적으로 유효한 C입니다. 참조 : codegolf.stackexchange.com/questions/2203/tips-for-golfing-in-c
OOBalance

C11이 여전히 오래된 식별자 목록 함수 구문을 지원한다는 것을 지금까지 검색하지 못했습니다. 그러나 당신의 요점은 관계없이 유지됩니다.
Tim Seguine

1
제안f(a,l,c)int*a;{for(c=0;l--;)c=*a++*=c+1;}

3

셰익스피어, 365 바이트

I.Ajax,.Ford,.Act I:.Scene I:.[enter Ajax and Ford]Ajax:Open mind!Scene V:.Ford:Am I nicer than the sum of a big red old cute hard cat a big red old cute joy?Ford:If so,you is the sum of thyself a son!Ford:If not,you is zero!Ford:Open heart!Ajax:you is a big red old cute hard cat.Ajax:Speak mind!Ajax:Open mind!Ford:Am I nicer than zero?Ajax:If so, let us Scene V.

여기서 해봐

덜 골프 버전

I.Ajax,.Ford,.
Act I:.
Scene I:.
[enter Ajax and Ford]
Ajax:Open mind!
Scene V:.
Ford:Am I nicer than the sum of a big red old cute hard cat a big red old cute joy?     <- smallest way to 48 (ascii "0") I could think of
Ford:If so,you is the sum of thyself a son!
Ford:If not,you is zero!
Ford:Open heart!
Ajax:you is a big red old cute hard cat.    <- get value of 32 or space
Ajax:Speak mind!                            <- then output it
Ajax:Open mind!
Ford:Am I nicer than zero?
Ajax:If so, let us Scene V.                 <- loop through inputs

280 바이트 . 골프 팁 은 SPL 팁 페이지 를 확인하십시오 .
Jo King

3

C ++, 47 바이트

[](int*a,int*b){for(int c=0;a!=b;)c=*a++*=1+c;}

시작 및 끝 포인터가 주어지면 배열을 수정하는 람다.


온라인으로 사용해보십시오! (자바 스크립트 필요)


55 바이트의 일반 버전 (산술 유형의 요소가있는 모든 컨테이너에서 작동) :

[](auto a,auto b){for(auto c=*a-*a;a!=b;)c=*a++*=1+c;};
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.