Urutan Biner


23

Diberi nomor biner A sebagai input dengan d> 1 digit, hasilkan angka biner B dengan digit d menurut aturan berikut untuk menemukan digit ke-B:

  • Digit pertama dari B adalah nol jika digit pertama dan kedua dari A sama; jika tidak, itu adalah satu.

  • Jika 1 <n <d, maka jika digit (n-1) th, nth dan (n + 1) th adalah sama, maka digit n dari B adalah nol; jika tidak, itu adalah satu.

  • Digit dth dari B adalah nol jika (d-1) digit ke-d dan ke-A sama; jika tidak, itu adalah satu.

Aturan

Input / format input string / daftar baik-baik saja. Cara input / output yang diizinkan lainnya adalah bilangan bulat diikuti oleh jumlah nol sebelumnya (atau mengikuti jumlah nol sebelumnya).

Buat kode Anda sesingkat mungkin.

Uji Kasus

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

Anda harus menunggu 10 menit lagi, maka Anda akan mendapatkan topi . Tantangan yang bagus!
caird coinheringaahing

@cairdcoinheringaahing Saya ingat tahun lalu ... oh, well. :-(
0WJYxW9FMN

2
Test case yang disarankan: 1100 -> 0110 (2 digit pertama dari output selalu identik dalam semua test case lainnya; ditto untuk 2 digit terakhir)
Arnauld

Sangat menyenangkan untuk melihat bahwa tidak ada downvotes yang diberikan pada tantangan ini atau pada dua puluh lima jawabannya. Kerja bagus semuanya!
0WJYxW9FMN

Jawaban:


7

Haskell, 59 58 54 byte

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

Cobalah online!

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

Sunting: @ Ørjan Johansen menyimpan 4 byte. Terima kasih!


Jika Anda tidak keberatan beralih ke output string, maka "0110"!!(a+b+c)simpan satu byte.
Laikoni

@Laikoni: Terima kasih, tetapi saya juga menemukan byte dalam matematika saya.
nimi

2
[last s]dapat dipindahkan ke nilai scanrawal.
Ørjan Johansen

Wow. inits (dengan impor); abs; jika-maka-lain; peta (ambil 3); zipDengan; takeWhile (not.null); chunksOf (dengan yang impor) ... semua golfed pergi! apakah ada aula ketenaran golf, di suatu tempat, di mana saja?
Will Ness

7

Jelly , 9 byte

.ịṚjṡ3E€¬

Cobalah online!

I / O sebagai daftar digit.

Penjelasan:

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

Hampir sama dengan upaya saya : P
Leaky Nun

@ LeakyNun itu cukup umum untuk mendapatkan kode yang identik dalam tantangan yang lebih mudah; p
Erik the Outgolfer

2
Bisakah Anda menambahkan penjelasan?
caird coinheringaahing

@cairdcoinheringaahing Anda kemungkinan besar memahami kode , tetapi saya menambahkan ini sebagai referensi untuk semua orang sampai Erik menambahkan satu (jika dia tahu): .ị- Mendapat elemen pada indeks 0,5 . Sejak lantai (0,5) ≠ ceil (0,5) , mengembalikan elemen pada indeks 0 dan 1 . Jelly adalah salah satu yang diindeks, sehingga 0 benar-benar meraih elemen terakhir. membalikkan pasangan (karena mereka dikembalikan sebagai last, first). Kemudian jbergabung dengan pasangan pada input dan ṡ3membaginya menjadi irisan panjang yang tumpang tindih 3. E€memeriksa (untuk setiap daftar) jika semua elemen sama, dan ¬secara logis meniadakan masing-masing.
Mr. Xcoder

6

05AB1E , 6 byte

¥0.ø¥Ā

I / O dalam bentuk bit array.

Cobalah online!

Bagaimana itu bekerja

¥       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ù€Ë_

Cobalah online! atau sebagai Test suite

Penjelasan

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

Cobalah online! Input adalah daftar nol dan satu, output adalah string. Contoh penggunaan: g [0,1,0,1,1,1,1,0,0,1,1,1]hasil "111100111100".


Solusi 61 byte sebelumnya:

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

Cobalah online!


4

J , 26 14 byte

Kredit untuk solusi 05AB1E Emigna

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

Cobalah online!

Upaya asli

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

Cobalah online!

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

Cara pintar membuat infiks 3 di awal dan akhir.
cole


2

Sekam , 15 11 byte

Ẋȯ¬EėSJ§e←→

Mengambil input sebagai daftar, coba online! Atau coba yang ini yang menggunakan string untuk I / O.

Penjelasan

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

Jelly , 8 byte

I0;;0In0

I / O dalam bentuk bit array.

Cobalah online!

Bagaimana itu bekerja

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.

Saya tiba di alternatif yang lucu, mungkin Anda dapat mengambil inspirasi dari ini:I0,0jI¬¬
Mr. Xcoder

2

JavaScript (ES6), 45 byte

Mengambil input sebagai array karakter. Mengembalikan array bilangan bulat.

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

Uji kasus

Berkomentar

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

Jelly , 16 byte

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

Cobalah online!

Saya akan bermain golf ini tetapi Erik sudah memiliki solusi yang lebih pendek dan golf milik saya hanya akan membawa milik saya lebih dekat dengannya. Saya masih bermain golf tetapi saya tidak akan memperbarui kecuali saya bisa mengalahkannya atau menemukan ide yang unik.

Penjelasan

ḣ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

Menggunakan lebih sedikit uang dan tidak lebih mirip dengan Erik
caird coinheringaahing

1

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

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

Cobalah online!


Dipendekkan menjadi 49 byte: Cobalah online!
Dada

Anda harus mempostingnya sebagai jawaban. Saya tidak ingin mengambil kredit untuk pekerjaan Anda. Yang s;..$;membangun di akhir adalah bagus. Saya harus ingat yang itu.
Xcali


1

Japt , 14 13 12 byte

Sebagian diangkut dari larutan Dennis 'Jelly. Input & output adalah array angka.

ä- pT äaT mg

Disimpan satu byte berkat produk ETH.

Cobalah


Penjelasan

Input array secara implisit U. ä-mendapatkan delta dari array. pTmendorong 0 ke akhir array. äaTpertama menambahkan 0 ke awal array sebelum mendapatkan delta absolut. mgmemetakan elemen-elemen array mengembalikan tanda setiap elemen sebagai -1 untuk angka negatif, 0 untuk 0 atau 1 untuk angka positif.


Hmm, saya bertanya-tanya apakah ada cara yang baik untuk membuat metode yang menempatkan item pada awal dan akhir array, seperti pada jawaban 05AB1E. Saya pikir itu akan membuatnya 1 byte lebih pendek ...
ETHproduksi

@ ETHproductions, untuk yang suka A.ä()dengan argumen kedua, Anda bisa menambahkan argumen ke-3 yang ditambahkan. Jadi, dalam hal ini, pT äaTbisa menjadi äaTTpenghematan 2 byte.
Shaggy


1

J, 32 Bytes

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

Bagaimana itu bekerja:

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

Saya meninggalkan beberapa @s dan tanda kurung, yang hanya memastikan itu berjalan dengan baik.

Contoh langkah demi langkah:

    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

Retina , 35 byte

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

Cobalah online! Tautan termasuk kasus uji. Penjelasan: Regex dimulai dengan mencocokkan setiap digit input secara bergantian. Grup tangkapan mencoba untuk mencocokkan angka yang berbeda sebelum atau setelah angka yang dipertimbangkan. The ?akhiran kemudian memungkinkan penangkapan untuk mencocokkan 0 atau 1 kali; $#2mengubahnya menjadi digit output.


0

Pyth , 15 byte

mtl{d.:++hQQeQ3

Coba di sini!

Kalau tidak:

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

Ini menambahkan elemen pertama dan menambahkan elemen terakhir, lalu mendapatkan semua substring yang panjangnya 3, dan akhirnya mengambil jumlah elemen berbeda di setiap sublist dan menguranginya. Kekacauan ini telah dilakukan pada ponsel di tengah malam jadi saya tidak akan terkejut jika ada beberapa golf yang mudah.


0

Gaia , 9 byte

ọ0+0¤+ọ‼¦

Cobalah online!

Penjelasan

ọ0 + 0¤ + ọ‼ ¦ ~ Program yang menerima satu argumen, daftar digit biner.

ọ ~ Delta.
 0+ ~ Tambahkan 0.
   0 ~ Tekan angka nol ke tumpukan.
    ¤ ~ Tukar dua argumen teratas di stack.
     + ~ Concatenate (tiga byte terakhir pada dasarnya menambahkan 0).
      ọ ~ Delta.
        ¦ ~ Dan untuk setiap elemen N:
       ‼ ~ Hasilkan 1 jika N ≠ 0, kalau tidak 0.

Gaia , 9 byte

ọ0¤;]_ọ‼¦

Cobalah online!


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

Bukan bahasa yang cocok untuk bermain golf, tapi layak untuk dijawab. Cobalah di sini !

Penjelasan

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

Selamat datang di PPCG :)
Shaggy

0

APL + WIN, 29 byte

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

Meminta input layar sebagai vektor digit dan menampilkan vektor digit.

Penjelasan

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

Cobalah online!

	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

C (tcc) , 64 62 56 byte

c,p;f(char*s){for(p=*s;c=*s;p=c)*s=p-c==c-(*++s?:c)^49;}

I / O dalam bentuk string. Fungsi f memodifikasi argumen s di tempat.

Cobalah online!


0

Common Lisp, 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#)))

Cobalah online!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.