Sequenze binarie


23

Dato un numero binario A come input con cifre d> 1, emettere un numero binario B con cifre d secondo le seguenti regole per trovare l'ennesima cifra di B:

  • La prima cifra di B è zero se la prima e la seconda cifra di A sono uguali; altrimenti, è uno.

  • Se 1 <n <d, quindi se le cifre (n-1) th, nth e (n + 1) th di A sono uguali, allora l'ennesima cifra di B è zero; altrimenti, è uno.

  • La cifra dth di B è zero se le cifre (d-1) th e dth di A sono uguali; altrimenti, è uno.

Regole

Il formato input / output stringa / elenco va bene. Un altro modo consentito di input / output è un numero intero seguito dal numero di zeri precedenti (o seguendo il numero di zeri precedenti).

Rendi il tuo codice il più breve possibile.

Casi test

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

Dovresti aspettare altri 10 minuti, quindi avresti un cappello . Bella sfida però!
caird coinheringaahing il

@cairdcoinheringaahing Ricordo quelli dell'anno scorso ... oh, bene. :-(
0WJYxW9FMN

2
Caso di prova suggerito: 1100 -> 0110(le prime 2 cifre dell'output sono sempre identiche in tutti gli altri casi di test; idem per le ultime 2 cifre)
Arnauld

È bello vedere che non sono stati espressi voti negativi su questa sfida o sulle sue venticinque risposte. Ben fatto a tutti!
0WJYxL9FMN

Risposte:


7

Haskell, 59 58 54 byte

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

Provalo 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

Modifica: @ Ørjan Johansen ha salvato 4 byte. Grazie!


Se non ti dispiace passare all'output di stringa, "0110"!!(a+b+c)salva un byte.
Laikoni,

@Laikoni: Grazie, ma ho anche trovato un byte in matematica.
nimi

2
[last s]può essere spostato sul scanrvalore iniziale.
Ørjan Johansen,

Wow. inits (con l'importazione); addominali; if-then-else; mappa (prendere 3); zipWith; takeWhile (not.null); pezzi di (con la sua importazione) ... tutti a golf ! c'è una hall di fama golfistica, da qualche parte, da qualche parte?
Will Ness,

7

Gelatina , 9 byte

.ịṚjṡ3E€¬

Provalo online!

I / O come elenco di cifre.

Spiegazione:

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

Quasi lo stesso con il mio tentativo : P
Leaky Nun

@LeakyNun è abbastanza comune ottenere codice identico in sfide più facili; p
Erik the Outgolfer

2
Potresti aggiungere una spiegazione?
caird coinheringaahing

@cairdcoinheringaahing Molto probabilmente capisci il codice , ma sto aggiungendo questo come riferimento per tutti fino a quando Erik ne aggiunge uno (se lo fa): .ị- Ottiene l'elemento all'indice 0.5 . Dal piano (0,5) ≠ ceil (0,5) , restituisce gli elementi agli indici 0 e 1 . La gelatina è una indicizzata, quindi 0 prende effettivamente l'ultimo elemento. inverte la coppia (perché vengono restituiti come last, first). Quindi junisce la coppia sull'input e la ṡ3suddivide in sezioni sovrapposte di lunghezza 3. E€verifica (per ciascun elenco) se tutti gli elementi sono uguali e ¬nega logicamente ciascuno.
Mr. Xcoder il

6

05AB1E , 6 byte

¥0.ø¥Ā

L'I / O è in forma di matrici di bit.

Provalo online!

Come funziona

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

Provalo online! o come una suite di test

Spiegazione

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

Provalo online! L'input è un elenco di zero e uno, l'output è una stringa. Esempio di utilizzo: g [0,1,0,1,1,1,1,0,0,1,1,1]rese "111100111100".


Precedente soluzione a 61 byte:

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

Provalo online!


4

J , 26 14 byte

Ringraziamo la soluzione 05AB1E di Emigna

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

Provalo online!

Tentativo originale

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

Provalo 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

Modo intelligente di fare infissi di 3 all'inizio e alla fine.
Cole


2

Buccia , 15 11 byte

Ẋȯ¬EėSJ§e←→

Prende l'input come elenco, provalo online! Oppure prova questo che utilizza stringhe per l'I / O.

Spiegazione

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

Gelatina , 8 byte

I0;;0In0

L'I / O è in forma di matrici di bit.

Provalo online!

Come funziona

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.

Sono arrivato a un'alternativa divertente, forse puoi trarre ispirazione da questo:I0,0jI¬¬
Mr. Xcoder il

2

JavaScript (ES6), 45 byte

Accetta input come una matrice di caratteri. Restituisce una matrice di numeri interi.

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

Casi test

Commentate

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

Gelatina , 16 byte

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

Provalo online!

Stavo andando a giocare a golf, ma Erik ha già una soluzione più breve e la mia da golf avrebbe semplicemente avvicinato la mia alla sua. Sto ancora giocando a golf ma non aggiornerò se non riesco a batterlo o a trovare un'idea unica.

Spiegazione

ḣ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

Usando meno soldi e non è più simile a quello di Erik
caird coinheringaahing il

1

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

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

Provalo online!


Ridotto a 49 byte: provalo online!
Dada,

Dovresti pubblicarlo come risposta. Non voglio prendermi il merito per il tuo lavoro. Quel s;..$;costrutto alla fine è elegante. Dovrò ricordare quello.
Xcali,


1

Japt , 14 13 12 byte

Portato parzialmente dalla soluzione Jelly di Dennis. Input e output sono matrici di cifre.

ä- pT äaT mg

Salvataggio di un byte grazie a ETHproductions.

Provalo


Spiegazione

Input implicito di array U. ä-ottiene i delta dell'array. pTspinge 0 alla fine dell'array. äaTprima aggiunge un altro 0 all'inizio dell'array prima di ottenere i delta assoluti. mgmappa sugli elementi dell'array restituendo il segno di ciascun elemento come -1 per i numeri negativi, 0 per 0 o 1 per i numeri positivi.


Hmm, mi chiedo se c'è un buon modo per creare un metodo che metta un oggetto all'inizio e alla fine di un array, come nella risposta 05AB1E. Penso che lo renderebbe più corto di 1 byte ...
ETHproductions

@ETHproductions, per i A.ä()quali antepone il secondo argomento, è possibile aggiungere un terzo argomento che viene aggiunto. Quindi, in questo caso, pT äaTpotrebbe diventare äaTTun risparmio di 2 byte.
Shaggy,


1

J, 32 byte

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

Come funziona:

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

Ho lasciato un po 'di @ e parentesi, che assicurano che vada bene insieme.

Un esempio passo dopo passo:

    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

Provalo online! Il link include casi di test. Spiegazione: La regex inizia abbinando ciascuna cifra di input a turno. Un gruppo di acquisizione tenta di far corrispondere una cifra diversa prima o dopo la cifra in esame. Il ?suffisso consente quindi alla cattura di corrispondere 0 o 1 volte; $#2trasforma questo nella cifra in uscita.


0

Pyth , 15 byte

mtl{d.:++hQQeQ3

Provalo qui!

In alternativa:

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

Questo antepone il primo elemento e accoda l'ultimo elemento, quindi ottiene tutte le sottostringhe sovrapposte di lunghezza 3 e infine prende il numero di elementi distinti in ciascun elenco secondario e lo decrementa. Questo pasticcio è stato fatto su cellulare a mezzanotte, quindi non sarei sorpreso se ci fossero dei golf facili.


0

Gaia , 9 byte

ọ0+0¤+ọ‼¦

Provalo online!

Spiegazione

ọ0 + 0¤ + ọ‼ ¦ ~ Un programma che accetta un argomento, un elenco di cifre binarie.

Del ~ Delta.
 0+ ~ Aggiungi uno 0.
   0 ~ Spingere uno zero nello stack.
    ¤ ~ Scambia i primi due argomenti in pila.
     + ~ Concatenare (gli ultimi tre byte hanno sostanzialmente anteposto uno 0).
      Del ~ Delta.
        ¦ ~ E per ogni elemento N:
       ‼ ~ Resa 1 se N ≠ 0, altrimenti 0.

Gaia , 9 byte

ọ0¤;]_ọ‼¦

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

Non è esattamente una lingua adatta per il golf, ma merita comunque una risposta. Provalo qui !

Spiegazione

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

Benvenuto in PPCG :)
Shaggy il

0

APL + WIN, 29 byte

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

Richiede l'inserimento dello schermo come vettore di cifre e genera un vettore di cifre.

Spiegazione

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

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

L'I / O è in forma di stringhe. La funzione f modifica l'argomento s in atto.

Provalo online!


0

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

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.