Trình tự nhị phân


23

Cho số nhị phân A làm đầu vào có d> 1 chữ số, xuất số nhị phân B có chữ số d theo các quy tắc sau để tìm chữ số thứ n của B:

  • Chữ số đầu tiên của B bằng 0 nếu chữ số thứ nhất và thứ hai của A bằng nhau; mặt khác, nó là một.

  • Nếu 1 <n <d, thì nếu các chữ số (n-1) th, n và (n + 1) của A bằng nhau, thì chữ số thứ n của B bằng 0; mặt khác, nó là một.

  • Chữ số dth của B bằng 0 nếu chữ số thứ (d-1) và dth của A bằng nhau; mặt khác, nó là một.

Quy tắc

Định dạng đầu vào / đầu ra chuỗi / danh sách là tốt. Một cách khác được cho phép của đầu vào / đầu ra là một số nguyên theo sau là số 0 trước (hoặc theo số 0 trước).

Làm cho mã của bạn càng ngắn càng tốt.

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

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

Bạn nên đợi thêm 10 phút nữa, sau đó bạn sẽ có một chiếc mũ . Mặc dù thử thách rất hay!
caird coinheringaahing

@cairdcoinheringaahing Tôi nhớ những năm ngoái ... ồ, tốt. :-(
0WJYxW9FMN

2
Trường hợp thử nghiệm được đề xuất: 1100 -> 0110(2 chữ số đầu tiên của đầu ra luôn giống hệt nhau trong tất cả các trường hợp thử nghiệm khác; ditto cho 2 chữ số cuối)
Arnauld

Thật tuyệt khi thấy rằng không có câu trả lời nào được đưa ra cho thử thách này hoặc trên hai mươi lăm câu trả lời của nó. Làm tốt lắm mọi người!
0WJYxW9FMN

Câu trả lời:


7

Haskell, 59 58 54 byte

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

Hãy thử trực tuyến!

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

Chỉnh sửa: @ rjan Johansen đã lưu 4 byte. Cảm ơn!


Nếu bạn không ngại chuyển sang đầu ra chuỗi, thì hãy "0110"!!(a+b+c)lưu một byte.
Laikoni

@Laikoni: Cảm ơn, nhưng tôi cũng đã tìm thấy một byte trong toán học của mình.
nimi

2
[last s]có thể được chuyển đến scanrgiá trị ban đầu.
Ørjan Johansen

ồ inits (với việc nhập khẩu); cơ bụng; nếu-thì-khác; bản đồ (lấy 3); khóa kéo; TakeWhile (không.null); chunksOf (với nhập khẩu của nó ) ... tất cả đều bị đánh gôn ! Có một hội trường của sự nổi tiếng golf, ở đâu đó, bất cứ nơi nào?
Will Ness

7

Thạch , 9 byte

.ịṚjṡ3E€¬

Hãy thử trực tuyến!

I / O là danh sách các chữ số.

Giải trình:

.ịṚ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

Gần giống với nỗ lực của tôi : P
Leaky Nun

@LeakyNun khá phổ biến để có được mã giống hệt nhau trong các thử thách dễ dàng hơn; p
Erik the Outgolfer 14/12/17

2
Bạn có thể thêm một lời giải thích?
caird coinheringaahing

@cairdcoinheringaahing Rất có thể bạn hiểu , nhưng tôi đang thêm mã này làm tài liệu tham khảo cho mọi người cho đến khi Erik thêm một (nếu anh ta làm như vậy): .ị- Lấy phần tử ở chỉ số 0,5 . Vì sàn (0,5) ≠ trần (0,5) , trả về các phần tử ở các chỉ số 01 . Jelly là một chỉ mục, do đó 0 thực sự lấy phần tử cuối cùng. đảo ngược cặp (vì chúng được trả lại là last, first). Sau đó jnối cặp trên đầu vào và ṡ3chia nó thành các lát dài có độ dài 3. E€kiểm tra (cho mỗi danh sách) nếu tất cả các phần tử đều bằng nhau và ¬phủ định logic từng phần.
Ông Xcoder

6

05AB1E , 6 byte

¥0.ø¥Ā

I / O ở dạng mảng bit.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

¥       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.

5

05AB1E , 11 byte

¬s¤)˜Œ3ù€Ë_

Hãy thử trực tuyến! hoặc như một bộ thử nghiệm

Giải trình

¬             # get head of input
 s            # move it to the bottom of the stack
  ¤           # get the tail of the input
   )˜         # wrap in list ([head,input,tail])
     Œ3ù      # get sublists of length 3
        €Ë    # check each sublists for equality within the list
          _   # logical negation

5

Haskell , 66 61 59 byte

g t@(x:s)=map("0110"!!)$z(x:t)$z t$s++[last s]
z=zipWith(+)

Hãy thử trực tuyến! Đầu vào là một danh sách các số không và số một, đầu ra là một chuỗi. Ví dụ sử dụng: g [0,1,0,1,1,1,1,0,0,1,1,1]sản lượng "111100111100".


Giải pháp 61 byte trước đó:

g s=["0110"!!(a+b+c)|(a,b,c)<-zip3(s!!0:s)s$tail s++[last s]]

Hãy thử trực tuyến!


4

J , 26 14 byte

Tín dụng cho giải pháp 05AB1E của Emigna

2=3#@=\{.,],{:

Hãy thử trực tuyến!

Nỗ lực ban đầu

2|2#@="1@|:@,,.@i:@1|.!.2]

Hãy thử trực tuyến!

             ,.@i:@1              -1, 0, 1
                    |.!.2]         shift filling with 2
  2         ,                      add a row of 2s on top
         |:                        transpose
   #@="1                           count unique elements in each row
2|                                 modulo 2

Cách thông minh để tạo ra các kết hợp của 3 ở đầu và cuối.
cole


2

Chồng , 15 11 byte

Ẋȯ¬EėSJ§e←→

Lấy đầu vào là một danh sách, hãy thử trực tuyến! Hoặc thử cái này sử dụng chuỗi cho I / O.

Giải trình

Ẋ(¬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

Thạch , 8 byte

I0;;0In0

I / O ở dạng mảng bit.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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.

Tôi đã đến một giải pháp thay thế vui nhộn, có lẽ bạn có thể lấy cảm hứng từ điều này:I0,0jI¬¬
Ông Xcoder

2

JavaScript (ES6), 45 byte

Đưa đầu vào như một mảng các ký tự. Trả về một mảng các số nguyên.

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

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

Đã bình luận

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

Thạch , 16 byte

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

Hãy thử trực tuyến!

Tôi đã định chơi golf này nhưng Erik đã có một giải pháp ngắn hơn và việc chơi golf của tôi sẽ giúp tôi đến gần anh ấy hơn. Tôi vẫn đang chơi gôn nhưng tôi sẽ không cập nhật trừ khi tôi có thể đánh bại anh ta hoặc tìm một ý tưởng độc đáo.

Giải trình

ḣ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


1

Perl 5 , 62 + 1 ( -n) = 63 byte

s/^.|.$/$&$&/g;for$t(0..y///c-3){/.{$t}(...)/;print$1%111?1:0}

Hãy thử trực tuyến!


Rút ngắn xuống còn 49 byte: Hãy thử trực tuyến!
Dada

Bạn nên đăng nó như một câu trả lời. Tôi không muốn lấy tín dụng cho công việc của bạn. s;..$;Cấu trúc đó ở cuối là tiện lợi. Tôi sẽ phải nhớ điều đó.
Xcali


1

Japt , 14 13 12 byte

Một phần được chuyển từ giải pháp Dennis 'Jelly. Đầu vào và đầu ra là mảng các chữ số.

ä- pT äaT mg

Đã lưu một byte nhờ vào ETHproductions.

Thử nó


Giải trình

Đầu vào ngầm định của mảng U. ä-được deltas của mảng. pTđẩy 0 đến cuối mảng. äaTđầu tiên thêm 0 khác vào đầu mảng trước khi nhận được các vùng đồng bằng tuyệt đối. mgánh xạ qua các phần tử của mảng trả về dấu của từng phần tử là -1 cho các số âm, 0 cho 0 hoặc 1 cho các số dương.


Hmm, tôi tự hỏi liệu có một cách hay để tạo một phương thức đặt một mục ở đầu và cuối của một mảng, như trong câu trả lời 05AB1E. Tôi nghĩ rằng nó sẽ làm cho nó ngắn hơn 1 byte ...
Sản phẩm ETH

@ETHproductions, để thích các A.ä()đối số thứ hai của nó, bạn có thể thêm đối số thứ 3 được nối thêm. Vì vậy, trong trường hợp này, pT äaTcó thể trở thành äaTTtiết kiệm 2 byte.
Xù xì


1

J, 32 byte

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

Làm thế nào nó hoạt động:

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

Tôi đã bỏ qua một số @ và dấu ngoặc đơn, điều này chỉ đảm bảo rằng nó đi cùng nhau một cách độc đáo.

Một ví dụ từng bước:

    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

Võng mạc , 35 byte

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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Giải thích: regex bắt đầu bằng cách lần lượt khớp từng chữ số đầu vào. Một nhóm chụp cố gắng khớp một chữ số khác nhau trước hoặc sau chữ số đang xem xét. Các ?hậu tố sau đó cho phép người chụp để phù hợp với 0 hoặc 1 lần; $#2biến điều này thành chữ số đầu ra.


0

Bình thường , 15 byte

mtl{d.:++hQQeQ3

Hãy thử nó ở đây!

Cách khác:

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

Điều này chuẩn bị phần tử đầu tiên và nối phần tử cuối cùng, sau đó lấy tất cả các phần tử chồng lấp có độ dài 3 và cuối cùng lấy số phần tử riêng biệt trong mỗi danh sách con và giảm nó. Sự lộn xộn này đã được thực hiện trên điện thoại di động vào nửa đêm vì vậy tôi sẽ không ngạc nhiên nếu có một số sân golf dễ dàng.


0

Gaia , 9 byte

ọ0+0¤+ọ‼¦

Hãy thử trực tuyến!

Giải trình

ọ0 + 0¤ + ọ ~ Một chương trình chấp nhận một đối số, một danh sách các chữ số nhị phân.

ọ ~ Deltas.
 0+ ~ Nối 0.
   0 ~ Đẩy số 0 vào ngăn xếp.
    ~ Hoán đổi hai đối số trên cùng trên ngăn xếp.
     + ~ Concatenate (ba byte cuối cùng về cơ bản là 0).
      ọ ~ Deltas.
        ¦ ~ Và với mỗi phần tử N:
       ~ Năng suất 1 nếu N ≠ 0, khác 0.

Gaia , 9 byte

ọ0¤;]_ọ‼¦

Hãy thử trực tuyến!


0

C , 309 byte

#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);}

Không chính xác là một ngôn ngữ phù hợp để chơi golf, nhưng đáng để trả lời không hơn không kém. Hãy thử nó ở đây !

Giải trình

#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);
}

Chào mừng bạn đến với PPCG :)
Shaggy

0

APL + THẮNG, 29 byte

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

Nhắc nhở đầu vào màn hình dưới dạng vectơ chữ số và xuất ra vectơ chữ số.

Giải trình

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 byte

	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

Hãy thử trực tuyến!

	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


0

Lisp thông thường, 134 byte

(lambda(a &aux(x(car a))(y(cadr a)))`(,#1=(if(= x y)0 1),@(loop for(x y z)on a while y if z collect(if(= x y z)0 1)else collect #1#)))

Hãy thử trực tuyến!

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.