ลำดับไบนารี


23

ให้เลขฐานสอง A เป็นอินพุตที่มี d> 1 ดิจิตเอาท์พุทเป็นเลขฐานสอง B พร้อมตัวเลข d ตามกฎต่อไปนี้สำหรับการค้นหาตัวเลขที่ n ของ B:

  • ตัวเลขแรกของ B คือศูนย์ถ้าตัวเลขตัวแรกและตัวที่สองของ A มีค่าเท่ากัน; มิฉะนั้นจะเป็นหนึ่ง

  • ถ้า 1 <n <d ดังนั้นถ้า (n-1) th, n และ (n + 1) ตัวเลข th ของ A มีค่าเท่ากันดังนั้นตัวเลขที่ n ของ B เป็นศูนย์; มิฉะนั้นจะเป็นหนึ่ง

  • ตัวเลข dth ของ B เป็นศูนย์ถ้าตัวเลข (d-1) th และ dth ของ A มีค่าเท่ากัน; มิฉะนั้นจะเป็นหนึ่ง

กฎระเบียบ

รูปแบบสตริง / รายการอินพุต / เอาต์พุตนั้นใช้ได้ วิธีการอินพุต / เอาท์พุตอื่นที่อนุญาตคือจำนวนเต็มตามด้วยจำนวนศูนย์นำหน้า (หรือตามจำนวนศูนย์ก่อนหน้า)

ทำให้รหัสของคุณสั้นที่สุด

กรณีทดสอบ

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

คุณควรจะมีรอ 10 นาทีแล้วคุณจะได้มีหมวก แม้ว่าจะท้าทายดี!
caird coinheringaahing

@cairdcoinheringaahing ฉันจำได้เมื่อปีที่แล้ว ... โอ้ดี :-(
0WJYxW9FMN

2
กรณีทดสอบที่แนะนำ: 1100 -> 0110(2 หลักแรกของผลลัพธ์จะเหมือนกันเสมอในกรณีทดสอบอื่น ๆ ทั้งหมดเหมือนกันสำหรับ 2 หลักสุดท้าย)
Arnauld

เป็นเรื่องดีที่ได้เห็นว่าไม่มีการลงคะแนนสำหรับการท้าทายนี้หรือคำตอบที่ยี่สิบห้า ทำได้ดีทุกคน!
0WJYxW9FMN

คำตอบ:


7

Haskell, 59 58 54 ไบต์

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

ลองออนไลน์!

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

แก้ไข: @ Ørjan Johansen บันทึกแล้ว 4 ไบต์ ขอบคุณ!


หากคุณไม่รังเกียจที่จะเปลี่ยนไปใช้เอาต์พุตสตริงให้"0110"!!(a+b+c)บันทึกไบต์
Laikoni

@Laikoni: ขอบคุณ แต่ฉันก็พบว่าไบต์ในคณิตศาสตร์ของฉัน
nimi

2
[last s]สามารถย้ายไปเป็นscanrค่าเริ่มต้น
Ørjan Johansen

ว้าว. inits (พร้อมการนำเข้า); เอบีเอส; ถ้า-แล้วอื่น; แผนที่ (ใช้เวลา 3); zipWith; takeWhile (ไม่ใช่ null); chunksOf (มีของนำเข้า) ... ทุกแข็งแรงเล่นกอล์ฟออกไป! มีห้องโถงแห่งชื่อเสียงกอล์ฟที่ไหนสักแห่งที่ไหน?
Will Ness

7

เยลลี่ขนาด 9 ไบต์

.ịṚjṡ3E€¬

ลองออนไลน์!

I / O เป็นรายการตัวเลข

คำอธิบาย:

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

เกือบเหมือนกันกับความพยายามของฉัน : P
Leun Nun

@LeakyNun เป็นเรื่องปกติมากที่จะได้รับรหัสที่เหมือนกันในความท้าทายที่ง่ายขึ้น p
Erik the Outgolfer

2
คุณสามารถเพิ่มคำอธิบายได้ไหม?
caird coinheringaahing

@cairdcoinheringaahing คุณมักเข้าใจรหัสแต่ผมเพิ่มนี้เป็นข้อมูลอ้างอิงสำหรับทุกคนจนกว่า Erik เพิ่มหนึ่ง (ถ้าเขาไม่): .ị- ได้รับองค์ประกอบที่ดัชนี0.5 ตั้งแต่ชั้น (0.5) ≠ ceil (0.5) , ผลตอบแทนองค์ประกอบที่ดัชนี0และ1 เยลลี่เป็นดัชนีหนึ่งดัชนีดังนั้น0จึงคว้าองค์ประกอบสุดท้าย กลับคู่ (เพราะพวกเขาจะถูกส่งกลับเป็นlast, first) จากนั้นjร่วมคู่กับการป้อนข้อมูลและṡ3แยกมันกลายเป็นที่ทับซ้อนกันชิ้นความยาว 3. E€การตรวจสอบ (สำหรับแต่ละรายการ) ถ้าองค์ประกอบทั้งหมดที่มีค่าเท่ากันและ¬มีเหตุผลขัดแย้งแต่ละ
Mr. Xcoder

6

05AB1E , 6 ไบต์

¥0.ø¥Ā

I / O อยู่ในรูปแบบของบิตอาร์เรย์

ลองออนไลน์!

มันทำงานอย่างไร

¥       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

Haskell , 66 61 59 ไบต์

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

ลองออนไลน์! อินพุตเป็นรายการของศูนย์และคนส่งออกเป็นสตริง ตัวอย่างการใช้งาน:g [0,1,0,1,1,1,1,0,0,1,1,1]"111100111100"อัตราผลตอบแทน


โซลูชัน 61 ไบต์ก่อนหน้า:

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

ลองออนไลน์!


4

J , 26 14 ไบต์

มอบเครดิตให้แก่โซลูชัน 05AB1E ของ Emigna

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

ลองออนไลน์!

ความพยายามต้นฉบับ

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

ลองออนไลน์!

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

วิธีการผสมอย่างชาญฉลาดของ 3 เมื่อเริ่มต้นและสิ้นสุด
โคล


2

Husk , 15 11 ไบต์

Ẋȯ¬EėSJ§e←→

รับข้อมูลเป็นรายการลองออนไลน์! หรือลองอันนี้ที่ใช้สตริงสำหรับ I / O

คำอธิบาย

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

เยลลี่ขนาด 8 ไบต์

I0;;0In0

I / O อยู่ในรูปแบบของบิตอาร์เรย์

ลองออนไลน์!

มันทำงานอย่างไร

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.

ฉันมาถึงทางเลือกที่ตลกบางทีคุณอาจวาดแรงบันดาลใจจากสิ่งนี้:I0,0jI¬¬
Mr. Xcoder

2

JavaScript (ES6), 45 ไบต์

รับอินพุตเป็นอาร์เรย์ของอักขระ ส่งคืนอาร์เรย์ของจำนวนเต็ม

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

กรณีทดสอบ

แสดงความคิดเห็น

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

เยลลี่ขนาด 16 ไบต์

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

ลองออนไลน์!

ฉันกำลังจะตีกอล์ฟนี้ แต่ Erik มีวิธีแก้ปัญหาที่สั้นกว่าและการเล่นกอล์ฟของฉันจะทำให้ฉันเข้าใกล้เขามากขึ้น ฉันยังเล่นกอล์ฟอยู่ แต่จะไม่อัปเดตจนกว่าฉันจะสามารถเอาชนะเขาหรือค้นหาไอเดียที่แปลกใหม่ได้

คำอธิบาย

ḣ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

ใช้เงินน้อยลงและไม่คล้ายกับ Erik's
caird coinheringaahing

1

Perl 5 , 62 + 1 ( -n) = 63 ไบต์

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

ลองออนไลน์!


ย่อเหลือ 49 ไบต์: ลองออนไลน์!
Dada

คุณควรโพสต์มันเป็นคำตอบ ฉันไม่ต้องการเครดิตสำหรับงานของคุณ การs;..$;สร้างในตอนท้ายนั้นดีมาก ฉันจะต้องจำไว้
Xcali


1

Japt , 14 13 12 ไบต์

พอร์ตบางส่วนจากโซลูชัน Dennis 'Jelly อินพุตและเอาต์พุตเป็นอาร์เรย์ของตัวเลข

ä- pT äaT mg

บันทึกเป็นไบต์ด้วย ETHproductions

ลองมัน


คำอธิบาย

Uการป้อนข้อมูลโดยปริยายของอาร์เรย์ ä-รับ deltas ของอาร์เรย์ pTกด 0 ถึงจุดสิ้นสุดของอาร์เรย์ äaTก่อนอื่นให้บวก 0 เข้ากับจุดเริ่มต้นของอาร์เรย์ก่อนที่จะได้ delta แบบสัมบูรณ์ mgจับคู่องค์ประกอบของอาร์เรย์ที่ส่งคืนเครื่องหมายของแต่ละองค์ประกอบเป็น -1 สำหรับตัวเลขลบ, 0 สำหรับ 0 หรือ 1 สำหรับตัวเลขบวก


อืมฉันสงสัยว่ามีวิธีที่ดีในการสร้างวิธีการวางรายการที่จุดเริ่มต้นและจุดสิ้นสุดของอาร์เรย์เช่นในคำตอบ 05AB1E ฉันคิดว่ามันจะทำให้สั้นลง 1 ไบต์ ...
ETHproductions

@ETHproductions สำหรับสิ่งที่ชอบA.ä()ซึ่งเป็นการสรุปอาร์กิวเมนต์ที่สองคุณสามารถเพิ่มอาร์กิวเมนต์ที่ 3 ที่ต่อท้ายได้ ดังนั้นในกรณีนี้pT äaTอาจกลายäaTTเป็นการประหยัด 2 ไบต์
Shaggy


1

J, 32 ไบต์

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

มันทำงานอย่างไร:

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

ฉันปล่อย @s และวงเล็บออกไปซึ่งทำให้แน่ใจว่ามันจะเข้ากันได้ดี

ตัวอย่างทีละขั้นตอน:

    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

เรติน่า 35 ไบต์

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

ลองออนไลน์! ลิงค์มีกรณีทดสอบ คำอธิบาย: regex เริ่มต้นโดยการจับคู่แต่ละอินพุตหลักในทางกลับกัน กลุ่มจับภาพพยายามจับคู่ตัวเลขที่แตกต่างกันก่อนหรือหลังตัวเลขที่อยู่ระหว่างการพิจารณา ?ต่อท้ายแล้วจะช่วยให้การจับภาพให้ตรงกับ 0 หรือ 1 ครั้ง; $#2เปลี่ยนสิ่งนี้ให้เป็นเอาต์พุตหลัก


0

Pyth , 15 ไบต์

mtl{d.:++hQQeQ3

ลองที่นี่!

อีกวิธีหนึ่งคือ:

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

สิ่งนี้จะเป็นการเตรียมองค์ประกอบแรกและผนวกองค์ประกอบสุดท้ายจากนั้นจะได้รับสตริงย่อยทั้งหมดที่มีความยาว 3 และในที่สุดก็ใช้จำนวนองค์ประกอบที่แตกต่างกันในแต่ละรายการย่อยและลดลง ความยุ่งเหยิงนี้เกิดขึ้นบนมือถือตอนเที่ยงคืนดังนั้นฉันจะไม่แปลกใจถ้ามีสนามกอล์ฟง่าย ๆ


0

Gaiaขนาด 9 ไบต์

ọ0+0¤+ọ‼¦

ลองออนไลน์!

คำอธิบาย

ọ0 + 0¤ + ọ‼ ¦ ~ โปรแกรมรับอาร์กิวเมนต์หนึ่งรายการของเลขฐานสอง

Del ~ Deltas
 0+ ~ ผนวก 0
   0 ~ ดันศูนย์ถึงกองซ้อน
    ¤ ~ สลับสองอันดับแรกของอาร์กิวเมนต์บนสแต็ก
     + ~ Concatenate (สามไบต์สุดท้ายโดยทั่วไปเติม 0)
      Del ~ Deltas
        ¦ ~ และสำหรับแต่ละองค์ประกอบ N:
       ‼ ~ ให้ผลผลิต 1 ถ้า N ≠ 0, อีก 0

Gaiaขนาด 9 ไบต์

ọ0¤;]_ọ‼¦

ลองออนไลน์!


0

C , 309 ไบต์

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

ไม่ใช่ภาษาที่เหมาะสำหรับการเล่นกอล์ฟ แต่ก็คุ้มกับคำตอบที่ไม่น้อย ลองที่นี่ !

คำอธิบาย

#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 :)
Shaggy

0

APL + WIN, 29 ไบต์

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

แสดงพร้อมต์สำหรับอินพุตหน้าจอเป็นเวกเตอร์ของตัวเลขและแสดงผลเวกเตอร์ของตัวเลข

คำอธิบาย

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 ไบต์

	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

ลองออนไลน์!

	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


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.