Séquences binaires

23

Étant donné un nombre binaire A en entrée avec d> 1 chiffres, sortez un nombre binaire B avec d chiffres selon les règles suivantes pour trouver le nième chiffre de B:

  • Le premier chiffre de B est nul si les premier et deuxième chiffres de A sont égaux; sinon, c'est un.

  • Si 1 <n <d, alors si les (n-1) ème, nième et (n + 1) ème chiffres de A sont égaux, alors le nième chiffre de B est nul; sinon, c'est un.

  • Le dième chiffre de B est nul si les (d-1) e et dième chiffres de A sont égaux; sinon, c'est un.

Règles

Le format d'entrée / sortie chaîne / liste est correct. Un autre moyen autorisé d'entrée / sortie est un entier suivi du nombre de zéros précédents (ou suivant le nombre de zéros précédents).

Faites votre code aussi court que possible.

Cas de test

00 -> 00
01 -> 11
11 -> 00
010111100111 -> 111100111100
1000 -> 1100
11111111 -> 00000000
01010101 -> 11111111
1100 -> 0110
0WJYxW9FMN
la source
Vous auriez dû attendre 10 minutes de plus, puis vous auriez obtenu un chapeau . Beau défi cependant!
caird coinheringaahing
@cairdcoinheringaahing Je me souviens de ceux de l'année dernière ... oh, eh bien. :-(
0WJYxW9FMN
2
Cas de test suggéré: 1100 -> 0110(les 2 premiers chiffres de la sortie sont toujours identiques dans tous les autres cas de test; idem pour les 2 derniers chiffres)
Arnauld
C'est agréable de voir qu'aucun vote négatif n'a été émis sur ce défi ou sur ses vingt-cinq réponses. Bravo à tous!
0WJYxW9FMN

Réponses:

7

Haskell, 59 58 54 octets

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

Essayez-le en ligne!

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

Edit: @ Ørjan Johansen a enregistré 4 octets. Merci!

nimi
la source
Si cela ne vous dérange pas de passer à la sortie de chaîne, "0110"!!(a+b+c)enregistre un octet.
Laikoni
@Laikoni: Merci, mais j'ai aussi trouvé un octet dans mes calculs.
nimi
2
[last s]peut être déplacé à la scanrvaleur initiale.
Ørjan Johansen
sensationnel. inits (à l'importation); abdos; if-then-else; carte (prendre 3); zipWith; takeWhile (not.null); chunksOf (avec son importation) ... tous golfés ! existe-t-il un temple de la renommée du golf, quelque part, n'importe où?
Will Ness
7

Gelée , 9 octets

.ịṚjṡ3E€¬

Essayez-le en ligne!

E / S sous forme de liste de chiffres.

Explication:

.ịṚ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
Erik le Outgolfer
la source
Presque la même chose avec ma tentative : P
Leaky Nun
@LeakyNun, il est assez courant d'obtenir du code identique dans des défis plus faciles; p
Erik the Outgolfer
2
Pourriez-vous ajouter une explication?
caird coinheringaahing
@cairdcoinheringaahing Vous comprenez très probablement le code , mais j'ajoute ceci comme référence pour tout le monde jusqu'à ce qu'Erik en ajoute un (s'il le fait): .ị- Obtient l'élément à l'index 0,5 . Puisque floor (0,5) ≠ ceil (0,5) , renvoie les éléments aux indices 0 et 1 . Jelly est un indexé, donc 0 saisit en fait le dernier élément. inverse la paire (car ils sont retournés comme last, first). ensuite jla paire sur l'entrée et la ṡ3divise en tranches superposées de longueur 3.E€ vérifie (pour chaque liste) si tous les éléments sont égaux, et les ¬annule logiquement.
M. Xcoder
6

05AB1E , 6 octets

¥0.ø¥Ā

Les E / S se présentent sous la forme de tableaux de bits.

Essayez-le en ligne!

Comment ça marche

¥       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.
Dennis
la source
5

05AB1E , 11 octets

¬s¤)˜Œ3ù€Ë_

Essayez-le en ligne! ou comme suite de tests

Explication

¬             # 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
Emigna
la source
5

Haskell , 66 61 59 octets

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

Essayez-le en ligne! L'entrée est une liste de zéros et de uns, la sortie est une chaîne. Exemple d'utilisation: g [0,1,0,1,1,1,1,0,0,1,1,1]rendements"111100111100" .


Solution précédente de 61 octets:

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

Essayez-le en ligne!

Laikoni
la source
4

J , 26 14 octets

Crédit à la solution 05AB1E d'Emigna

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

Essayez-le en ligne!

Tentative originale

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

Essayez-le en ligne!

             ,.@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
FrownyFrog
la source
Une façon intelligente de faire des infixes de 3 au début et à la fin.
cole
2

Husk , 15 11 octets

Ẋȯ¬EėSJ§e←→

Prend la contribution sous forme de liste, essayez-le en ligne! Ou essayez celui-ci qui utilise des chaînes pour les E / S.

Explication

Ẋ(¬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]
ბიმო
la source
2

Gelée , 8 octets

I0;;0In0

Les E / S se présentent sous la forme de tableaux de bits.

Essayez-le en ligne!

Comment ça marche

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.
Dennis
la source
Je suis arrivé à une alternative amusante, peut-être pouvez-vous vous en inspirer:I0,0jI¬¬
M. Xcoder
2

JavaScript (ES6), 45 octets

Prend l'entrée comme un tableau de caractères. Renvoie un tableau d'entiers.

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

Cas de test

Commenté

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()
Arnauld
la source
1

Gelée , 16 octets

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

Essayez-le en ligne!

J'allais jouer au golf, mais Erik a déjà une solution plus courte et jouer au mien rapprocherait le mien du sien. Je joue toujours au golf, mais je ne mettrai pas à jour à moins que je puisse le battre ou trouver une idée unique.

Explication

ḣ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
HyperNeutrino
la source
Utiliser moins d'argent et ne ressemble plus à celui d'Erik
caird coinheringaahing
1

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

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

Essayez-le en ligne!

Xcali
la source
Raccourci à 49 octets: essayez-le en ligne!
Dada
Vous devez le poster comme réponse. Je ne veux pas m'attribuer le mérite de votre travail. Cette s;..$;construction à la fin est astucieuse. Je dois m'en souvenir.
Xcali
1

Husk , 10 octets

Ẋo±≠↔Θ↔ΘẊ-

Essayez-le en ligne!

Merci à Zgarb pour -1 octet.

M. Xcoder
la source
Ẋo±≠enregistre un octet.
Zgarb
1

Japt , 14 13 12 octets

Partiellement porté depuis la solution Jelly de Dennis. L'entrée et la sortie sont des tableaux de chiffres.

ä- pT äaT mg

Un octet enregistré grâce à ETHproductions.

Essayez-le


Explication

Entrée implicite du tableau U. ä-obtient les deltas du tableau. pTpousse 0 à la fin du tableau. äaTajoute d'abord un autre 0 au début du tableau avant d'obtenir les deltas absolus. mgmappe les éléments du tableau en retournant le signe de chaque élément comme -1 pour les nombres négatifs, 0 pour 0 ou 1 pour les nombres positifs.

Hirsute
la source
Hmm, je me demande s'il existe un bon moyen de créer une méthode qui place un élément au début et à la fin d'un tableau, comme dans la réponse 05AB1E. Je pense que cela ferait 1 octet plus court ...
ETHproductions
@ETHproductions, pour ceux A.ä()qui préfèrent son deuxième argument, vous pouvez ajouter un troisième argument qui est ajouté. Donc, dans ce cas, pT äaTpourrait devenir äaTTpour une économie de 2 octets.
Shaggy
1

Python 3 , 54 octets

lambda x:[n^1in x[i-(i>0):i+2]for i,n in enumerate(x)]

Les E / S se présentent sous la forme de tableaux booléens.

Essayez-le en ligne!

Dennis
la source
1

J, 32 octets

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

Comment ça marche:

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

J'ai laissé de côté des @ et des parenthèses, qui s'assurent juste que ça va bien ensemble.

Un exemple pas à pas:

    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
Bolce Bussiere
la source
0

Rétine , 35 octets

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

Essayez-le en ligne! Le lien inclut des cas de test. Explication: L'expression régulière commence par faire correspondre tour à tour chaque chiffre d'entrée. Un groupe de capture essaie de faire correspondre un chiffre différent avant ou après le chiffre considéré. Le ?suffixe permet alors à la capture de correspondre à 0 ou 1 fois; $#2transforme cela en chiffre de sortie.

Neil
la source
0

Pyth , 15 octets

mtl{d.:++hQQeQ3

Essayez-le ici!

Alternativement:

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

Cela ajoute le premier élément et ajoute le dernier élément, puis obtient toutes les sous-chaînes qui se chevauchent de longueur 3, et prend finalement le nombre d'éléments distincts dans chaque sous-liste et le décrémente. Ce gâchis a été fait sur mobile à minuit donc je ne serais pas surpris s'il y a des golfs faciles.

M. Xcoder
la source
0

Gaia , 9 octets

ọ0+0¤+ọ‼¦

Essayez-le en ligne!

Explication

ọ0 + 0¤ + ọ‼ ¦ ~ Un programme acceptant un argument, une liste de chiffres binaires.

ọ ~ Deltas.
 0+ ~ Ajoutez un 0.
   0 ~ Poussez un zéro dans la pile.
    ¤ ~ Échangez les deux premiers arguments de la pile.
     + ~ Concaténation (les trois derniers octets ajoutent essentiellement un 0).
      ọ ~ Deltas.
        ¦ ~ Et pour chaque élément N:
       ‼ ~ Rendement 1 si N ≠ 0, sinon 0.

Gaia , 9 octets

ọ0¤;]_ọ‼¦

Essayez-le en ligne!

M. Xcoder
la source
0

C , 309 octets

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

Pas exactement une langue digne du golf, mais mérite néanmoins une réponse. Essayez-le ici !

Explication

#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);
}
McLemore
la source
Bienvenue à PPCG :)
Shaggy
0

APL + WIN, 29 octets

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

Invite à saisir l'écran en tant que vecteur de chiffres et génère un vecteur de chiffres.

Explication

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
Graham
la source
0

SNOBOL4 (CSNOBOL4) , 273 octets

	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

Essayez-le en ligne!

	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
Giuseppe
la source
0

C (tcc) , 64 62 56 octets

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

Les E / S sont sous forme de chaînes. La fonction f modifie son argument s en place.

Essayez-le en ligne!

Dennis
la source
0

Lisp commun, 134 octets

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

Essayez-le en ligne!

Renzo
la source