二进制序列


23

给定一个二进制数A作为d> 1位数字的输入,请根据以下规则找到具有d位数字的二进制数B,以找到B的第n个数字:

  • 如果A的第一位和第二位相等,则B的第一位为零。否则,它是一个。

  • 如果1 <n <d,则如果A的第(n-1),第n和第(n + 1)个数字相等,则B的第n个数字为零;否则,它是一个。

  • 如果A的第(d-1)位和第d位相等,则B的第d位为零。否则,它是一个。

规则

字符串/列表输入/输出格式很好。另一种允许的输入/输出方式是整数,后跟前一个零(或后一个零)。

使您的代码越短越好。

测试用例

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

您应该再等10分钟,然后才能戴上帽子。不错的挑战!
caird coinheringaahing

@cairdcoinheringaahing我还记得去年的那些...哦,很好。:-(
0WJYxW9FMN

2
建议的测试用例:(1100 -> 0110输出的前2个数字在所有其他测试用例中始终相同;后2个数字同上)
Arnauld

很高兴看到,没有任何人对此挑战或其二十五个答案投下反对票。大家好!
0WJYxW9FMN

Answers:


7

Haskell,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

编辑:@ØrjanJohansen保存了4个字节。谢谢!


如果您不介意切换到字符串输出,则"0110"!!(a+b+c)保存一个字节。
Laikoni '17

@Laikoni:谢谢,但是我在数学中也发现了一个字节。
nimi

2
[last s]可以移动到scanr初始值。
与Orjan约翰森

哇。初始化(与导入一起);腹肌; 如果-然后-其他 地图(取3);zipWith; takeWhile(not.null); chunksOf(及其导入)...全部打掉了!在任何地方,任何地方有一个高尔夫名人堂吗?
尼斯将于

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
Outgolfer的Erik

2
您能补充说明吗?
caird coinheringaahing

@cairdcoinheringaahing您很可能理解该代码,但是我将其添加为所有人的参考,直到Erik添加一个(如果他这样做):.ị-获取索引为0.5的元素。由于floor(0.5)≠ceil(0.5),因此返回索引为01的元素。果冻是一个被索引的索引,因此0实际上抓住了最后一个元素。反转对(因为它们返回为last, first)。然后j在输入上加入该对,并将ṡ3其分成长度为3的重叠切片。E€(对于每个列表)检查所有元素是否相等,并在¬逻辑上求反。
Xcoder先生17年

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.

5

05AB1E,11个字节

¬s¤)˜Œ3ù€Ë_

在线尝试! 或作为测试套件

说明

¬             # 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

Haskell66 61 59字节

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

在线尝试!输入是零和一的列表,输出是字符串。用法示例:g [0,1,0,1,1,1,1,0,0,1,1,1]yields "111100111100"


先前的61字节解决方案:

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

在线尝试!


4

J26 14字节

归功于Emigna的05AB1E解决方案

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

在线尝试!

原始尝试

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

在线尝试!

             ,.@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

巧妙地在开头和结尾处添加3的中缀。
cole


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¬¬
Xcoder先生17年

2

JavaScript(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

使用更少的钱,不再像埃里克(Erik)的那样
共同竞标



1

贾普特14) 13 12字节

部分从Dennis的Jelly解决方案移植而来。输入和输出是数字数组。

ä- pT äaT mg

感谢ETHproductions节省了一个字节。

试试吧


说明

数组的隐式输入Uä-获取数组的增量。pT将0推送到数组的末尾。äaT在获得绝对增量之前,首先将另一个0添加到数组的开头。mg映射到数组的元素上,对于负数,每个元素的符号返回为-1,对于负数返回0,对于正数返回1。


嗯,我想知道是否有一个很好的方法可以制作一种将项放在数组开头和结尾的方法,就像05AB1E答案中那样。我认为这会使它缩短1个字节...
ETHproductions'Dec 15'17

@ETHproductions,对于喜欢A.ä()在其第二个参数之前加上的内容,您可以添加第三个参数并附加。因此,在这种情况下,pT äaT可以äaTT节省2个字节。
毛茸茸的


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

我省略了一些@s和括号,以确保它们配合得很好。

分步示例:

    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开头)。
      ọ〜三角洲。
        ¦〜并且对于每个元素N:
       N〜如果N≠0,则得出1,否则为0。

盖亚 9字节

ọ0¤;]_ọ‼¦

在线尝试!


0

C309字节

#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


0

普通Lisp,134个字节

(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#)))

在线尝试!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.