İkili Diziler


23

D> 1 basamaklı giriş olarak bir A ikili rakamı verildiğinde, B'nin onuncu hanesini bulmak için aşağıdaki kurallara göre d basamaklı bir ikili B rakamı verin:

  • A'nın birinci ve ikinci rakamları eşit ise, B'nin ilk basamağı sıfırdır; Aksi takdirde, bir tanesidir.

  • Eğer 1 <n <d ise, o zaman A'nın (n-1) inci, nth ve (n + 1) inci rakamları eşit ise, o zaman B nin digit basamağı sıfırdır; Aksi takdirde, bir tanesidir.

  • A'nın (d-1) inci ve dördüncü rakamları eşit ise, B'nin dördüncü basamağı sıfırdır; Aksi takdirde, bir tanesidir.

kurallar

Dize / liste giriş / çıkış formatı iyi. Bir başka izin verilen giriş / çıkış yolu, önceki sıfırların sayısını takip eden bir tamsayıdır (veya önceki sıfırların sayısını takip eder).

Kodunuzu mümkün olduğunca kısa yapın.

Test Kılıfları

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

10 dakika daha beklemelisin, sonra bir şapka alırdın . Yine de güzel bir meydan okuma!
Caird coinheringaahing

@cairdcoinheringaahing Geçen yılları hatırlıyorum ... ah, peki. :-(
0WJYxW9FMN

2
Önerilen test durumu: 1100 -> 0110(çıktının ilk 2 basamağı diğer tüm sınamalarda her zaman aynıdır; son 2 basamağın aynısı)
Arnauld

Bu zorluğa veya yirmi beş yanıtına hiçbir indirimin kullanılmadığını görmek güzel. Herkese tebrikler!
0WJYxW9FMN

Yanıtlar:


7

Haskell, 59 58 54 bayt

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

Çevrimiçi deneyin!

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

Düzenleme: @ Ørjan Johansen 4 bayt kaydetti. Teşekkürler!


Dize çıkışına geçmeyi sakıncası yoksa, "0110"!!(a+b+c)bir bayt kaydeder.
Laikoni

@Likonik: Teşekkürler, ama matematiğimde bir de bayt buldum.
nimi

2
[last s]scanrbaşlangıç ​​değerine taşınabilir .
Ørjan Johansen

vay. girişler (ithalatla birlikte); abs; if-then-else; harita (3 al); zipWith; takeWhile (not.null); (ile chunksOf onun ithalat) ... tüm golfed uzakta! Bir yerde golf şöhreti salonu var mı?
Ness,

7

Jöle , 9 bayt

.ịṚjṡ3E€¬

Çevrimiçi deneyin!

Rakam listesi olarak G / Ç.

Açıklama:

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

Benim girişimle neredeyse aynı : P
Leaky Rahibe

@LeakyNun daha kolay zorluklarda özdeş kod elde etmek oldukça yaygındır, p
Outgolfer Erik

2
Bir açıklama ekler misiniz?
Caird coinheringaahing

@cairdcoinheringaahing Büyük olasılıkla kodu anlıyorsunuz , ancak Erik bir tane ekleyene kadar bunu herkes için referans olarak ekliyorum: (eğer öyleyse): .ị- Elemanı 0.5 dizininde alır . İtibaren taban (0.5) ≠ ceil (0.5) , dizinler elemanları döner 0 ve 1 . Jöle endeksli olanıdır, dolayısıyla 0 aslında son elementi alır. çifti tersine çevirir (çünkü döndürüldüler last, first). Ardından jgirişte parite katılır ve ṡ3üst üste gelen uzunluktaki dilimlere bölünür 3. E€tüm öğeler eşit olup olmadığını kontrol eder (her liste için) ve ¬her birini mantıksal olarak olumsuzlar.
Bay Xcoder

6

05AB1E , 6 bayt

¥0.ø¥Ā

G / Ç, bit dizileri şeklindedir.

Çevrimiçi deneyin!

Nasıl çalışır

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

¬s¤)˜Œ3ù€Ë_

Çevrimiçi deneyin! veya Test paketi olarak

açıklama

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

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

Çevrimiçi deneyin! Giriş, sıfırların bir listesidir, çıktı bir dizedir. Kullanım örneği: g [0,1,0,1,1,1,1,0,0,1,1,1]verim "111100111100".


Önceki 61 byte çözüm:

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

Çevrimiçi deneyin!


4

J , 26 14 bayt

Emigna'nın 05AB1E çözümüne teşekkür

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

Çevrimiçi deneyin!

Orijinal girişim

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

Çevrimiçi deneyin!

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

Başlangıçta ve sonda 3 eki yapmanın akıllıca yolu.
cole,


2

Kabuğu , 15 11 bayt

Ẋȯ¬EėSJ§e←→

Listeye girdi olarak giriş yapın, çevrimiçi deneyin! Veya I / O için dize kullanan bunu deneyin .

açıklama

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

Jöle , 8 bayt

I0;;0In0

G / Ç, bit dizileri şeklindedir.

Çevrimiçi deneyin!

Nasıl çalışır

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.

Komik bir alternatife geldim, belki bundan ilham alabilirsin:I0,0jI¬¬
Bay Xcoder

2

JavaScript (ES6), 45 bayt

Girdiyi karakter dizisi olarak alır. Bir tamsayı dizisi döndürür.

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

Test durumları

Yorumlananlar

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

Jöle , 16 bayt

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

Çevrimiçi deneyin!

Bunu golf oynayacaktım ama Erik'in daha kısa bir çözümü vardı ve golf madeni benimkine daha yakın olacaktı. Hala golf oynuyorum ama onu yenemediğim ya da benzersiz bir fikir bulamadığım sürece güncelleme yapmayacağım.

açıklama

ḣ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 bayt

Kısmen Dennis'in Jelly çözümünden alınmıştır. Giriş ve çıkış, basamak dizileridir.

ä- pT äaT mg

ETHproductions sayesinde bir bayt kurtardı.

Dene


açıklama

Dizinin örtük girişi U. ä-dizinin deltalarını alır. pT0 dizinin sonuna kadar iter. äaTmutlak deltaları almadan önce ilk önce dizinin başlangıcına 0 ekler. mgHer elemanın işaretini negatif sayılar için -1, pozitif sayılar için 0 veya 1 olarak döndüren dizinin öğelerinin üzerinde eşler.


Hmm, 05AB1E cevaplarında olduğu gibi, bir diziyi dizinin başına ve sonuna koyan bir yöntem yapmanın iyi bir yolu olup olmadığını merak ediyorum . Bunun 1 bayt daha kısa olacağını düşünüyorum ...
ETHproductions

@ETHproductions, A.ä()ikinci argümanı hazırlayanların beğenisine göre , eklenecek 3. argümanı ekleyebilirsiniz. Böylece, bu durumda, 2 baytlık bir tasarruf için pT äaTolabilir äaTT.
Shaggy


1

J, 32 Bayt

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

Nasıl çalışır:

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

Bazıları ve parantezleri bıraktım.

Bir adım adım örnek:

    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 bayt

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

Çevrimiçi deneyin! Link, test durumlarını içerir. Açıklama: Regex sırayla her bir giriş hanesini eşleştirerek başlar. Bir yakalama grubu, dikkate alınan rakamdan önce veya sonra farklı bir rakamla eşleşmeye çalışır. Son ?ek, yakalamanın 0 veya 1 kez eşleşmesini sağlar; $#2bunu çıkış rakamına çevirir.


0

Pyth , 15 bayt

mtl{d.:++hQQeQ3

Burada dene!

Alternatif:

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

Bu, ilk elemanı hazırlar ve son elemanı ekler, daha sonra 3 uzunluğunun üst üste gelen tüm alt dizgilerini alır ve son olarak her bir alt listede farklı elemanların sayısını alır ve onu azaltır. Bu karışıklık gece yarısı cep telefonunda yapıldı, bu yüzden bazı kolay golfların olsaydı şaşırmam.


0

Gaia , 9 bayt

ọ0+0¤+ọ‼¦

Çevrimiçi deneyin!

açıklama

ọ0 + 0¤ + ọ‼ ¦ ~ Bir argümanı kabul eden bir program, ikili basamakların bir listesi.

Del ~ Deltas.
 0+ ~ 0 ekleyin.
   0 ~ Yığına bir sıfır itin.
    ¤ ~ Yığındaki ilk iki argümanı değiştir.
     + ~ Birleştir (son üç bayt temel olarak bir 0 hazırlar).
      Del ~ Deltas.
        Each ~ Ve her öğe için N:
       ‼ ~ Verim 1, N ≠ 0 ise, başka 0.

Gaia , 9 bayt

ọ0¤;]_ọ‼¦

Çevrimiçi deneyin!


0

C , 309 bayt

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

Tam olarak golf oynamak için uygun bir dil değil, cevapsız bir cevap. Burada dene !

açıklama

#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 hoş geldiniz
Shaggy

0

APL + WIN, 29 bayt

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

Ekran girişi için bir basamak vektörü ister ve bir basamak vektörü çıkarır.

açıklama

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 bayt

	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

Çevrimiçi deneyin!

	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

Ortak Lisp, 134 bayt

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

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.