이진 시퀀스


23

d> 1 자리의 이진수 A를 입력으로 받으면 B의 n 번째 자리를 찾기위한 다음 규칙에 따라 d 자리의 이진수 B를 출력합니다.

  • A의 첫 번째와 두 번째 숫자가 같으면 B의 첫 번째 숫자는 0입니다. 그렇지 않으면, 그것은 하나입니다.

  • 1 <n <d이면, A의 (n-1), n ​​번째 및 (n + 1) 번째 숫자가 같으면 B의 n 번째 숫자는 0입니다. 그렇지 않으면, 그것은 하나입니다.

  • A의 (d-1) 및 d 번째 숫자가 같으면 B의 d 번째 숫자는 0입니다. 그렇지 않으면, 그것은 하나입니다.

규칙

문자열 / 목록 입력 / 출력 형식이 좋습니다. 허용되는 또 다른 입력 / 출력 방법은 정수와 선행 0의 수 (또는 선행 0의 수)입니다.

코드를 가능한 짧게 만드십시오.

테스트 사례

00 -> 00
01 -> 11
11 -> 00
010111100111 -> 111100111100
1000 -> 1100
11111111 -> 00000000
01010101 -> 11111111
1100 -> 0110

10 분을 더 기다려야한다면 모자를 받았을 것 입니다. 그래도 좋은 도전입니다!
caird coinheringaahing

@cairdcoinheringaahing 나는 작년을 기억합니다 ... 아, 글쎄. :-(
0WJYxW9FMN

2
권장 테스트 사례 : 1100 -> 0110(출력의 처음 두 자리는 다른 모든 테스트 사례에서 항상 동일합니다. 마지막 두 자리에 대한 차이)
Arnauld

이 도전이나 25 가지 답변에 대한 다운 보트가 없다는 것을 알게되어 기쁩니다. 잘하셨습니다, 여러분!
0WJYxW9FMN

답변:


7

하스켈, 59 58 54 바이트

f s=[1-0^(a-b+a-c)^2|a:b:c:_<-scanr(:)[last s]$s!!0:s]

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

f s=                        -- input is a list of 0 and 1
          s!!0:s            -- prepend the first and append the last number of s to s
      scanr(:)[last s]      --   make a list of all inits of this list
     a:b:c:_<-              -- and keep those with at least 3 elements, called a, b and c
    1-0^(a-b+a-c)^2         -- some math to get 0 if they are equal or 1 otherwise

편집 : @ Ørjan Johansen은 4 바이트를 저장했습니다. 감사!


문자열 출력으로 전환하는 것이 마음에 들지 않으면 "0110"!!(a+b+c)바이트 를 저장합니다.
Laikoni

@Laikoni : 고맙지 만 수학에서 바이트도 찾았습니다.
nimi

2
[last s]scanr초기 값 으로 이동할 수 있습니다 .
Ørjan Johansen 님이

와우. inits (가져 오기 포함); 복근; 만약 그렇지 않다면; 지도 (3); zipWith; takeWhile (널이 아님); (와 chunksOf 가져 오기) ... 모두 golfed 멀리! 어딘가에 골프 명예의 전당이 있습니까?
Will Ness

7

젤리 , 9 바이트

.ịṚjṡ3E€¬

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

숫자 목록으로서의 I / O.

설명:

.ịṚjṡ3E€¬
.ịṚ       Get first and last element
   j      Join the pair with the input list, thus making a list [first, first, second, ..., last, last]
    ṡ3    Take sublists of length 3
      E€  Check if each has all its elements equal
        ¬ Logical NOT each

내 시도 와 거의 동일합니다 : P
Leaky Nun

@LeakyNun 더 쉬운 도전에서 동일한 코드를 얻는 것이 일반적입니다; p
Erik the Outgolfer

2
설명을 추가해 주시겠습니까?
caird coinheringaahing

당신은 거의 확실하게 이해 @cairdcoinheringaahing 코드를 하지만 (그는 않는 경우) 에릭은 하나를 추가 할 때까지 나는 모두에 대한 참조로이 추가 오전 : .ị- 인덱스에있는 요소를 가져옵니다 0.5 . 이후 층 (0.5) ≠ CEIL (0.5) , 인덱스의 요소 반환 01 . 젤리는 하나의 인덱스이므로 0은 실제로 마지막 요소를 가져옵니다. 로 반환되므로 쌍을 반대로 바꿉니다 last, first. 그런 다음 j입력에서 쌍을 결합하여 ṡ3길이가 3 인 겹치는 슬라이스로 분할합니다. E€모든 요소가 동일한 지 확인하고 (각 목록에 대해) ¬각각을 논리적으로 무시합니다.
Mr. Xcoder

6

05AB1E , 6 바이트

¥0.ø¥Ā

I / O는 비트 배열 형태입니다.

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

작동 원리

¥       Compute the forward differences of the input, yielding -1, 0, or 1 for each
        pair. Note that there cannot be two consecutive 1's or -1's.
 0.ø    Surround the resulting array with 0‘s.
    ¥   Take the forward differences again. [0, 0] (three consecutive equal 
        elements in the input) gets mapped to 0, all other pairs get mapped to a 
        non-zero value.
     Ā  Map non-zero values to 1.





2

껍질 , 15 11 바이트

Ẋȯ¬EėSJ§e←→

목록으로 입력을 받아 온라인으로 시도하십시오! 또는 I / O에 문자열을 사용하는 것을 사용해보십시오 .

설명

Ẋ(¬Eė)SJ§e←→ -- implicit input, for example [1,0,0,0]
      SJ     -- join self with the following
        §e   --   listify the
                  first and
                  last element: [1,0]
             -- [1,1,0,0,0,0]
Ẋ(   )       -- with each triple (eg. 1 0 0) do the following:
    ė        --   listify: [1,1,0]
   E         --   are all equal: 0
  ¬          --   logical not: 1
             -- [1,1,0,0]

2

젤리 , 8 바이트

I0;;0In0

I / O는 비트 배열 형태입니다.

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

작동 원리

I0;;0In0  Main link. Argument: A (bit array of length d)

I         Increments; compute the forward differences of all consecutive elements
          of A, yielding -1, 0, or 1 for each pair. Note that there cannot be
          two consecutive 1's or -1's.
 0;       Prepend a 0 to the differences.
   ;0     Append a 0 to the differences.
     I    Take the increments again. [0, 0] (three consecutive equal elements in A)
          gets mapped to 0, all other pairs get mapped to a non-zero value.
      n0  Perform not-equal comparison with 0, mapping non-zero values to 1.

나는 재미있는 대안에 도착했습니다. 어쩌면 이것에서 영감을 얻을 수 있습니다.I0,0jI¬¬
Mr. Xcoder

2

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

문자 배열로 입력을받습니다. 정수 배열을 반환합니다.

a=>a.map((v,i)=>(i&&v^p)|((p=v)^(a[i+1]||v)))

테스트 사례

댓글

a =>                  // given the input array a
  a.map((v, i) =>     // for each digit v at position i in a:
    (                 //   1st expression:
      i &&            //     if this is not the 1st digit:
           v ^ p      //       compute v XOR p (where p is the previous digit)
    ) | (             //   end of 1st expression; bitwise OR with the 2nd expression:
      (p = v) ^       //     update p and compute v XOR:
      (a[i + 1] ||    //       the next digit if it is defined
                   v) //       v otherwise (which has no effect, because v XOR v = 0)
    )                 //   end of 2nd expression
  )                   // end of map()


1

젤리 , 16 바이트

ḣ2W;ṡ3$;ṫ-$W$E€¬

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

나는 이것을 골프에 갔지만 Erik은 더 짧은 솔루션을 가지고 있으며 골프 광산은 내 자신을 더 가깝게 만들 것입니다. 나는 여전히 골프를 치고 있지만 그를 때리거나 독특한 아이디어를 찾을 수 없다면 업데이트하지 않을 것입니다.

설명

ḣ2W;ṡ3$;ṫ-$W$E€¬  Main Link
ḣ2                First 2 elements
  W               Wrapped into a list (depth 2)
   ;              Append
    ṡ3$           All overlapping blocks of 3 elements
       ;          Append
        ṫ-$W$     Last two elements wrapped into a list
             E€   Are they all equal? For each
               ¬  Vectorizing Logical NOT

적은 돈을 사용 하고 에릭의 더 유사하지 않다
coinheringaahing 케어 드



1

Japt , 14 13 12 바이트

Dennis 'Jelly 솔루션에서 일부 포팅되었습니다. 입력 및 출력은 숫자의 배열입니다.

ä- pT äaT mg

ETH 프로덕션 덕분에 바이트를 절약했습니다.

시도 해봐


설명

배열의 암시 적 입력 U. ä-배열의 델타를 가져옵니다. pT0을 배열의 끝으로 푸시합니다. äaT먼저 절대 델타를 얻기 전에 배열의 시작에 다른 0을 추가합니다. mg배열의 요소를 매핑하여 각 요소의 부호를 음수의 경우 -1, 0의 경우 0 또는 양수의 경우 1로 반환합니다.


흠, 05AB1E 답변 과 같이 배열의 시작과 끝에 항목을 넣는 메소드를 만드는 좋은 방법이 있는지 궁금합니다 . 나는 그것이 1 바이트 더 짧아 질 것이라고 생각합니다 ...
ETHproductions

@ETHproductions, A.ä()두 번째 인수 앞에 붙는 기호에 대해 추가되는 세 번째 인수를 추가 할 수 있습니다. 그래서,이 경우에는 pT äaT될 수있는 äaTT2 바이트 절약을 위해.
얽히고 설킨


1

J, 32 바이트

B=:2&(+./\)@({.,],{:)@(2&(~:/\))

작동 방식 :

B=:                              | Define the verb B
                       2&(~:/\)  | Put not-equals (~:) between adjacent elements of the array, making a new one
            ({.,],{:)            | Duplicate the first and last elements
   2&(+./\)                      | Put or (+.) between adjacent elements of the array

@와 괄호를 생략했습니다.

단계별 예 :

    2&(~:/\) 0 1 0 1 1 1 1 0 0 1 1 1
1 1 1 0 0 0 1 0 1 0 0

    ({.,],{:) 1 1 1 0 0 0 1 0 1 0 0
1 1 1 1 0 0 0 1 0 1 0 0 0

    2&(+./\) 1 1 1 1 0 0 0 1 0 1 0 0 0
1 1 1 1 0 0 1 1 1 1 0 0

    B 0 1 0 1 1 1 1 0 0 1 1 1
1 1 1 1 0 0 1 1 1 1 0 0

0

망막 , 35 바이트

(.)((?<=(?!\1)..)|(?=(?!\1).))?
$#2

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 설명 : 정규식은 각 입력 숫자를 차례로 일치시켜 시작합니다. 캡처 그룹은 고려중인 숫자 앞뒤에 다른 숫자를 일치 시키려고합니다. ?접미사는 0 또는 1 시간에 맞게 캡처를 할 수 있습니다; $#2이것을 출력 자리로 바꿉니다.


0

Pyth , 15 바이트

mtl{d.:++hQQeQ3

여기 사용해보십시오!

또는

  • mtl{d.:s+hQeBQ3.
  • .aM._M.+++Z.+QZ.

첫 번째 요소 앞에 추가하고 마지막 요소를 추가 한 다음 길이가 3 인 겹치는 하위 문자열을 모두 가져온 다음 각 하위 목록에서 고유 한 요소 수를 가져 와서 감소시킵니다. 이 혼란은 자정에 모바일에서 이루어 졌으므로 쉬운 골프가 있다면 놀라지 않을 것입니다.


0

가이아 , 9 바이트

ọ0+0¤+ọ‼¦

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

설명

ọ0 + 0¤ + ọ‼ ¦ ~ 하나의 인수, 이진 숫자 목록을 허용하는 프로그램.

ọ ~ 델타.
 0+ ~ 0을 추가합니다.
   0 ~ 스택에 0을 밀어 넣습니다.
    ¤ ~ 스택에서 상위 두 인수를 서로 바꿉니다.
     + ~ 연결 (마지막 3 바이트는 기본적으로 0을 붙입니다).
      ọ ~ 델타.
        ¦ ~ 그리고 각 요소 N에 대해 :
       ‼ ~ N ≠ 0이면 1, 그렇지 않으면 0

가이아 , 9 바이트

ọ0¤;]_ọ‼¦

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


0

C , 309 바이트

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char** argv){int d=strlen(argv[1]);char b[d + 1];char a[d + 1];strcpy(a, argv[1]);b[d]='\0';b[0]=a[0]==a[1]?'0':'1';for(int i=1;i<d-1;i++){b[i]=a[i]==a[i+1]&&a[i]==a[i - 1]?'0':'1';}b[d-1]=a[d-1]==a[d-2]?'0':'1';printf("%s\n",b);}

골프에 딱 맞는 언어는 아니지만 대답 할 가치가 있습니다. 여기서 사용해보십시오 !

설명

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char** argv) {
    /* Find the number of digits in number (taken in as a command line argument) */
    int d = strlen(argv[1]);

    /* d + 1 to account for d digits plus the null character */
    char b[d + 1];
    char a[d + 1];

    /* Saves having to type argv[1] every time we access it. */
    strcpy(a, argv[1]);

    /* Set the null character, so printf knows where our string ends. */
    b[d] = '\0';

    /* First condition */
    /* For those not familiar with ternary operators, this means b[0] is equal to '0' if a[0] equals a[1] and '1' if they aren't equal. */
    b[0] = a[0] == a[1] ? '0' : '1';

    /* Second condition */
    for(int i = 1; i < d - 1; i++) {
        b[i] = a[i] == a[i+1] && a[i] == a[i - 1] ? '0' : '1';
    }

    /* Third condition */
    b[d - 1] = a[d - 1] == a[d - 2] ? '0' : '1';

    /* Print the answer */
    printf("%s\n", b);
}

PPCG에 오신 것을 환영합니다 :)
Shaggy

0

APL + WIN, 29 바이트

(↑b),(×3|3+/v),¯1↑b←×2|2+/v←⎕

자릿수 벡터로 화면 입력을 요청하고 자릿수 벡터를 출력합니다.

설명

b←×2|2+/v signum of 2 mod sum of successive pairs of elements

×3|3+/v signum of 3 mod sum of successive triples of elements

(↑b),...., ¯1↑b concatenate first and last elements of b for end conditions

0

SNOBOL4 (CSNOBOL4) , 273 바이트

	I =INPUT
	D =SIZE(I)
N	P =P + 1
	EQ(P,1)	:S(S)
	EQ(P,D)	:S(E)
	I POS(P - 2) LEN(2) . L
	I POS(P - 1) LEN(2) . R
T	Y =IDENT(L,R) Y 0	:S(C)
	Y =Y 1
C	EQ(P,D) :S(O)F(N)
S	I LEN(1) . L
	I POS(1) LEN(1) . R :(T)
E	I RPOS(2) LEN(1) . L
	I RPOS(1) LEN(1) . R :(T)
O	OUTPUT =Y
END

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

	I =INPUT			;* read input
	D =SIZE(I)			;* get the string length
N	P =P + 1			;* iNcrement step; all variables initialize to 0/null string
	EQ(P,1)	:S(S)			;* if P == 1 goto S (for Start of string)
	EQ(P,D)	:S(E)			;* if P == D goto E (for End of string)
	I POS(P - 2) LEN(2) . L		;* otherwise get the first two characters starting at n-1
	I POS(P - 1) LEN(2) . R		;* and the first two starting at n
T	Y =IDENT(L,R) Y 0	:S(C)	;* Test if L and R are equal; if so, append 0 to Y and goto C
	Y =Y 1				;* otherwise, append 1
C	EQ(P,D) :S(O)F(N)		;* test if P==D, if so, goto O (for output), otherwise, goto N
S	I LEN(1) . L			;* if at start of string, L = first character
	I POS(1) LEN(1) . R :(T)	;* R = second character; goto T
E	I RPOS(2) LEN(1) . L		;* if at end of string, L = second to last character
	I RPOS(1) LEN(1) . R :(T)	;* R = last character; goto T
O	OUTPUT =Y			;* output
END


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