Binäre Sequenzen


23

Bei einer Binärzahl A als Eingabe mit d> 1 Stellen geben Sie eine Binärzahl B mit d Stellen gemäß den folgenden Regeln aus, um die n-te Stelle von B zu finden:

  • Die erste Ziffer von B ist Null, wenn die erste und die zweite Ziffer von A gleich sind; ansonsten ist es eins.

  • Wenn 1 <n <d, dann ist die n-te Ziffer von B Null, wenn die (n-1) -te, n-te und (n + 1) -te Ziffer von A gleich sind; ansonsten ist es eins.

  • Die d-te Ziffer von B ist Null, wenn die (d-1) -te und die d-te Ziffer von A gleich sind; ansonsten ist es eins.

Regeln

Das Eingabe- / Ausgabeformat für Zeichenfolgen / Listen ist in Ordnung. Eine andere erlaubte Art der Eingabe / Ausgabe ist eine ganze Zahl, gefolgt von der Anzahl der vorangegangenen Nullen (oder der Anzahl der vorangegangenen Nullen).

Machen Sie Ihren Code so kurz wie möglich.

Testfälle

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

Du hättest noch 10 Minuten warten sollen, dann hättest du einen Hut bekommen . Eine schöne Herausforderung!
Caird Coinheringaahing

@cairdcoinheringaahing Ich erinnere mich an die letzten Jahre ... na ja. :-(
0WJYxW9FMN

2
Vorgeschlagener Testfall: 1100 -> 0110(Die ersten beiden Stellen der Ausgabe sind in allen anderen Testfällen immer identisch; das Gleiche gilt für die letzten beiden Stellen.)
Arnauld,

Es ist schön zu sehen, dass weder zu dieser Herausforderung noch zu ihren 25 Antworten Ablehnungen gemacht wurden. Gut gemacht alle zusammen!
0WJYxW9FMN

Antworten:


7

Haskell, 59 58 54 Bytes

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

Probieren Sie es 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

Bearbeiten: @ Ørjan Johansen 4 Bytes gespeichert. Vielen Dank!


Wenn es Ihnen nichts ausmacht, zur Zeichenfolgenausgabe zu wechseln, wird "0110"!!(a+b+c)ein Byte gespeichert.
Laikoni

@Laikoni: Danke, aber ich habe auch ein Byte in meiner Mathematik gefunden.
nimi

2
[last s]kann auf den scanrAnfangswert verschoben werden.
Ørjan Johansen

Wow. Inits (mit dem Import); Abs; wenn-dann-sonst; Karte (nimm 3); zipWith; takeWhile (not.null); chunksOf (mit seinem Import) ... alles weggolfen ! Gibt es irgendwo eine Hall of Golfing Fame?
Will Ness

7

Gelee , 9 Bytes

.ịṚjṡ3E€¬

Probieren Sie es online!

I / O als Ziffernliste.

Erläuterung:

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

Fast das gleiche mit meinem Versuch : P
Leaky Nun

@LeakyNun Es ist durchaus üblich, bei leichteren Herausforderungen identischen Code zu erhalten: p
Erik the Outgolfer

2
Könnten Sie eine Erklärung hinzufügen?
Caird Coinheringaahing

@cairdcoinheringaahing Sie verstehen den Code höchstwahrscheinlich , aber ich füge dies als Referenz für alle hinzu, bis Erik einen hinzufügt (falls er dies tut): .ị- Ruft das Element bei Index 0,5 ab . Da floor (0.5) ≠ ceil (0.5) ist , werden die Elemente bei den Indizes 0 und 1 zurückgegeben . Jelly ist eins indiziert, also packt 0 tatsächlich das letzte Element. kehrt das Paar um (weil sie als zurückgegeben werden last, first). Dann jschließt sich das Paar an dem Eingang und ṡ3teilt sie in Scheiben mit einer Länge von 3 überlappenden E€Kontrollen (für jede Liste) , wenn alle Elemente gleich sind, und ¬negiert logisch jedem.
Mr. Xcoder

6

05AB1E , 6 Bytes

¥0.ø¥Ā

I / O ist in Form von Bit-Arrays.

Probieren Sie es online!

Wie es funktioniert

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

¬s¤)˜Œ3ù€Ë_

Probieren Sie es online! oder als Testsuite

Erläuterung

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

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

Probieren Sie es online! Die Eingabe ist eine Liste von Nullen und Einsen, die Ausgabe ist eine Zeichenfolge. Anwendungsbeispiel: g [0,1,0,1,1,1,1,0,0,1,1,1]Erträge "111100111100".


Vorherige 61-Byte-Lösung:

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

Probieren Sie es online!


4

J , 26-14 Bytes

Dank an die 05AB1E-Lösung von Emigna

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

Probieren Sie es online!

Ursprünglicher Versuch

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

Probieren Sie es 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

Clevere Art, am Anfang und am Ende 3er-Infixe zu machen.
Cole


2

Schale , 15 11 Bytes

Ẋȯ¬EėSJ§e←→

Nimmt Eingaben als Liste, versuche es online! Oder probieren Sie diesen aus , der Zeichenfolgen für E / A verwendet.

Erläuterung

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

Gelee , 8 Bytes

I0;;0In0

I / O ist in Form von Bit-Arrays.

Probieren Sie es online!

Wie es funktioniert

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.

Ich bin zu einer lustigen Alternative gekommen, vielleicht können Sie sich davon inspirieren lassen:I0,0jI¬¬
Mr. Xcoder

2

JavaScript (ES6), 45 Byte

Nimmt die Eingabe als Array von Zeichen. Gibt ein Array von Ganzzahlen zurück.

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

Testfälle

Kommentiert

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

Gelee , 16 Bytes

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

Probieren Sie es online!

Ich wollte Golf spielen, aber Erik hat bereits eine kürzere Lösung und Golf würde meine nur näher zu seiner bringen. Ich spiele immer noch Golf, aber ich werde nicht auf den neuesten Stand bringen, wenn ich ihn nicht schlagen oder eine einzigartige Idee finden kann.

Erläuterung

ḣ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

Japt , 14 13 12 Bytes

Teilweise aus Dennis 'Jelly-Lösung portiert. Eingabe und Ausgabe sind Arrays von Ziffern.

ä- pT äaT mg

Dank ETHproductions ein Byte gespart.

Versuch es


Erläuterung

Implizite Eingabe eines Arrays U. ä-Ruft die Deltas des Arrays ab. pTdrückt 0 an das Ende des Arrays. äaTFügen Sie dem Anfang des Arrays zunächst eine weitere 0 hinzu, bevor Sie die absoluten Deltas abrufen. mgOrdnet die Elemente des Arrays zu und gibt das Vorzeichen jedes Elements als -1 für negative Zahlen, 0 für 0 oder 1 für positive Zahlen zurück.


Hmm, ich frage mich, ob es eine gute Möglichkeit gibt, eine Methode zu erstellen, bei der ein Element am Anfang und am Ende eines Arrays steht, wie in der 05AB1E-Antwort. Ich denke, das würde es 1 Byte kürzer machen ...
ETHproductions

@ETHproductions, dem A.ä()das zweite Argument vorangestellt ist, können Sie ein drittes Argument hinzufügen, das angehängt wird. Also, in diesem Fall pT äaTkönnte sich äaTTfür eine 2 - Byte - Einsparung.
Shaggy


1

J, 32 Bytes

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

Wie es funktioniert:

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

Ich habe einige @s und Klammern weggelassen, die nur sicherstellen, dass es gut zusammenpasst.

Ein schrittweises Beispiel:

    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 Bytes

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

Probieren Sie es online! Link enthält Testfälle. Erläuterung: Der reguläre Ausdruck beginnt damit, dass nacheinander jede eingegebene Ziffer abgeglichen wird. Eine Erfassungsgruppe versucht, eine andere Ziffer vor oder nach der betreffenden Ziffer abzugleichen. Das ?Suffix ermöglicht dann, dass die Erfassung 0- oder 1-mal übereinstimmt. $#2verwandelt dies in die Ausgangsziffer.


0

Pyth , 15 Bytes

mtl{d.:++hQQeQ3

Probieren Sie es hier aus!

Alternative:

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

Dadurch wird das erste Element vorangestellt und das letzte Element angehängt, dann werden alle überlappenden Teilzeichenfolgen der Länge 3 abgerufen und schließlich die Anzahl der unterschiedlichen Elemente in jeder Unterliste ermittelt und dekrementiert. Dieses Durcheinander wurde um Mitternacht auf dem Handy durchgeführt, sodass ich mich nicht wundern würde, wenn es ein paar einfache Golfplätze gäbe.


0

Gaia , 9 Bytes

ọ0+0¤+ọ‼¦

Probieren Sie es online!

Erläuterung

ọ0 + 0¤ + ọ‼ ¦ ~ Ein Programm, das ein Argument akzeptiert, eine Liste von Binärziffern.

ọ ~ Deltas.
 0+ ~ Hänge eine 0 an.
   0 ~ Lege eine Null auf den Stapel.
    ¤ ~ Vertausche die beiden obersten Argumente auf dem Stapel.
     + ~ Verketten (die letzten drei Bytes stellen grundsätzlich eine 0 voran).
      ọ ~ Deltas.
        ¦ ~ Und für jedes Element N:
       ‼ ~ Ausbeute 1, wenn N ≠ 0, sonst 0.

Gaia , 9 Bytes

ọ0¤;]_ọ‼¦

Probieren Sie es online!


0

C , 309 Bytes

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

Nicht gerade eine Golfsprache, aber dennoch eine Antwort wert. Probieren Sie es hier aus !

Erläuterung

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

Willkommen bei PPCG :)
Shaggy

0

APL + WIN, 29 Bytes

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

Fordert zur Bildschirmeingabe als Ziffernvektor auf und gibt einen Ziffernvektor aus.

Erläuterung

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 Bytes

	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

Probieren Sie es 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

Common Lisp, 134 Bytes

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

Probieren Sie es online!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.