ต่อเนื่อง 1 บิตจะเพิ่มขึ้น


36

กำหนดรูปแบบ (สตริงหรือรูปแบบอาร์เรย์) ของ Bits: [0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1]

ภารกิจคือการแทนที่จำนวน 1 บิตต่อเนื่องใด ๆ ด้วยลำดับตัวเลขจากน้อยไปมากเริ่มต้นที่ 1

อินพุต

  • รูปแบบ (สามารถรับเป็นสตริงหรืออาร์เรย์) ตัวอย่าง:
    • สตริง: 1001011010110101001
    • อาร์เรย์: [1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1]

เอาท์พุต

  • ลำดับหมายเลขจากน้อยไปหามาก (สามารถส่งคืนเป็นสตริงหรืออาร์เรย์) ตัวอย่าง:
    • สตริง: 1 0 0 1 0 1 2 0 1 0 1 2 0 1 0 1 0 0 1
    • อาร์เรย์: [1, 0, 0, 1, 0, 1, 2, 0, 1, 0, 1, 2, 0, 1, 0, 1, 0, 0, 1]

กฎระเบียบ

  • (ใช้สำหรับสตริงเท่านั้น)อินพุตจะไม่มีช่องว่างระหว่าง1และ0
  • สมมติอินพุต length > 0
  • (ใช้สำหรับสตริงเท่านั้น)เอาต์พุตถูกคั่นด้วยช่องว่าง (ใช้ตัวคั่นอื่นหากคุณต้องการตราบใดที่ไม่ใช่ตัวเลขหรือตัวอักษรจากตัวอักษร)

ตัวอย่าง:

Given [0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1] 
Output [0,1,2,3,0,1,2,0,0,0,1,2,3,4,5,6]

--------------------------------------------------------------------------

Given 0110101111101011011111101011111111     
Output 0 1 2 0 1 0 1 2 3 4 5 0 1 0 1 2 0 1 2 3 4 5 6 0 1 0 1 2 3 4 5 6 7 8

---------------------------------------------------------------------------

Given 11111111111101    
Output 1 2 3 4 5 6 7 8 9 10 11 12 0 1

เกณฑ์การชนะ: Codegolf

คำตอบ:


19

05AB1E , 4 ไบต์

γ€ƶ˜

ลองออนไลน์! หรือเป็นชุดทดสอบ

คำอธิบาย

γ      # split input into groups of consecutive equal elements
 €ƶ    # multiply each number in each sublist by its 1-based index in the sublist
   ˜   # flatten

1
ดีกว่าของฉัน ฉันไม่เคยคิดเรื่องนี้เลย
Magic Octopus Urn

3
ฉันไม่คุ้นเคย 100% กับกฎการนับจำนวน codegolf (และ googling พบเฉพาะโพสต์นี้ซึ่งไม่ได้ข้อสรุป) ในขณะที่คำตอบของคุณคือ 4 ตัวอักษรไม่ควรเป็นอย่างน้อย 8 ไบต์ (เช่น utf-16-be ไม่มี BOM 03 B3 20 AC 01 B6 02 DC) หรือ 9 ไบต์ (utf-8:) CE B3 E2 82 AC C6 B6 CB 9Cหรือ 10 ไบต์ (เช่น UTF-16 รวมถึง 2 ไบต์ BOM) ในการเข้ารหัสที่ไม่ใช่ของเล่นใด ๆ (ใช่หนึ่งสามารถสร้างของเล่น 8 บิตการเข้ารหัสคล้ายกับ ISO-8859 การเข้ารหัสด้วยเหล่านี้ 4 สัญลักษณ์แสดงเป็น 1 ไบต์ แต่ที่ดูเหมือนว่าโกง.)
ดร jimbob

6
@drjimbob ใช่เป็นคำถามที่ดี รหัสสามารถจริงจะแปลงเป็นไฟล์ไบนารีโดยใช้หน้ารหัส 05AB1E ยกตัวอย่างเช่นจะแสดงเป็นγ€ƶ˜ 04 80 8F 98หน้ารหัสมีอยู่เป็นหลักเพื่อให้การเขียนโค้ดง่ายขึ้น หากต้องการเรียกใช้ไฟล์ 4 ไบต์คุณจะต้องเรียกใช้ตัวแปลด้วยการ--osabieตั้งค่าสถานะ
Adnan

18

Haskellขนาด 15 ไบต์

scanl1$(*).succ

ลองออนไลน์!

คำอธิบาย / Ungolfed

scanl1 วนซ้ำจากซ้ายไปยังรายการโดยใช้ฟังก์ชันซึ่งรับผลลัพธ์สุดท้ายและองค์ประกอบปัจจุบันสร้างรายการใหม่พร้อมผลลัพธ์โดยปล่อยให้รายการว่างเปล่าและซิงเกิลตัน "ไม่ได้แก้ไข"

(*).succ เท่ากับ \x y-> (x+1)*y

การใช้ฟังก์ชั่นนั้นร่วมกับการscanl1ทำงานเพียงอย่างเดียวเนื่องจากลำดับที่เพิ่มขึ้น ( 1,2,3, .. ) เริ่มต้นด้วย1และไม่มีองค์ประกอบก่อนหน้า (ในกรณีนี้มันเป็นองค์ประกอบแรกในรายการที่จะไม่ถูก "แก้ไข") หรือพวกเขาได้เป็นผู้นำ0



14

Husk , 5 4 3 ไบต์

ṁ∫g

ลองออนไลน์!

คำอธิบาย

ṁ∫g  -- full function, example input: [1,1,1,0,1]
  g  -- group: [[1,1],[0],[1]]
ṁ    -- map the following and concatenate result (example with [1,1,1])
 ∫   -- | cumulative sum: [1,2,3]
     -- : [1,2,3,0,1]

แก้ไขประวัติ

-1 ไบต์โดยใช้scanl1มากกว่าzipWith

-1 ไบต์โดย porting เดนนิส 's วิธีการแก้ปัญหา



11

JavaScript (ES6), 22 ไบต์

รับอินพุตเป็นอาร์เรย์

a=>a.map(s=n=>s=n*-~s)

ลองออนไลน์!

a=>a.map(n=>a=n*-~a)น่าเสียดายที่สั้นกว่า(20 ไบต์) น่าเสียดายที่จะล้มเหลว[1]เนื่องจากมีการบังคับอาร์เรย์แบบซิงเกิลให้เป็นจำนวนเต็มที่พวกมันถืออยู่



8

Python 2 , 39 38 ไบต์

-1 ไบต์ขอบคุณ Erik the Outgolfer

i=1
for x in input():i*=x;print i;i+=1

ลองออนไลน์!


1
,ผมไม่คิดว่าคุณต้องการ
Erik the Outgolfer

@EriktheOutgolfer มันดูดีกว่าด้วยวิธีนี้ c:
Rod

1
ขออภัยในบางครั้งในชีวิตคุณต้องเสียสละ
Erik the Outgolfer

9
RIP ,คุณไม่ได้อยู่ในรหัสอีกต่อไป แต่คุณจะอยู่ในใจของฉันตลอดไป
Rod


6

K (OK) , 11 8 ไบต์

วิธีการแก้:

{y*1+x}\

ลองออนไลน์!

คำอธิบาย:

ทำซ้ำในรายการ การเพิ่มตัวสะสมคูณด้วยรายการปัจจุบัน (ซึ่งจะรีเซ็ตตัวสะสมหากรายการเป็น 0):

{y*1+x}\ / the solution
{     }\ / iterate (\) over lambda function
     x   / accumulator
   1+    / add 1
 y*      / multiply by current item

5

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

ŒgÄF

ลองออนไลน์!

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

ŒgÄF  Main link. Argument: A (bit array)

Œg    Group adjacent, identical bits.
  Ä   Accumulate; take the cumulative sum of each chunk.
   F  Flatten.

เมื่อกลุ่มทำงานอย่างรวดเร็วเอริคได้แนะนำว่าสิ่งนี้จะเป็นสามไบต์! (ถ้าผมเข้าใจสิ่งที่มันจะทำอย่างถูกต้อง)
dylnan

@ dylnan ปัญหาคือมันยากที่จะตัดสินใจเกี่ยวกับพฤติกรรมที่รวดเร็วเช่นนี้ :( นั่นคือเหตุผลที่รวดเร็วยังคงอยู่ในที่หายไป
Erik the Outgolfer

อาจมีหลาย quicks สำหรับการใช้งานหลักที่เป็นไปได้
dylnan

5

R , 46 31 ไบต์

function(a)sequence(rle(a)$l)*a

ลองออนไลน์!

sequenceซึ่ง"ส่วนใหญ่มีอยู่ในความเคารพต่อประวัติศาสตร์ในยุคแรก ๆ ของอาร์"ค่อนข้างมีประโยชน์ที่นี่

function(a)                       # function, taking a vector as argument
                    rle(a)$l      # take the lengths of the run-length encoding
           sequence(        )     # and generate the list [1:x for x in lengths]
                             *a   # multiply by a to maintain 0s, and return

5

RAD, 8 ไบต์

(⊢×1+⊣)⍂

ลองออนไลน์!

อย่างไร?

  • (⊢×1+⊣)ถ้าอาร์กิวเมนต์ที่ถูกต้องคือ0ส่งกลับ0มิฉะนั้นจะเพิ่มอาร์กิวเมนต์ซ้าย
  • , LTR Scan ( (A f B) f CแทนA f (B f C)) ใช้สิ่งนี้กับอาร์เรย์


4

Java 8, 55 48 ไบต์

a->{int p=0,i=0;for(int v:a)a[i++]=v<1?p=0:++p;}

ปรับเปลี่ยนอินพุตอาร์เรย์แทนที่จะส่งคืนใหม่เพื่อบันทึกไบต์

-7 ไบต์ขอบคุณที่@TimSeguine

ลองออนไลน์

คำอธิบาย:

a->{             // Method with integer-array parameter and no return-type
  int p=0,       //  Previous integer, starting at 0
      i=0;       //  Index-integer, starting at 0
  for(int v:a)   //  Loop over the values of the input-array:
    a[i++]=v<1?  //   If the current value is 0:
          p=0    //    Reset the previous integer to 0
         :       //   Else:
          ++p;}  //    Increase `p` by 1 first with `++p`
                 //    and set the current item to this new value of `p`

1
คุณสามารถลดมันลงเหลือ 48:a->{int p=0,i=0;for(int b:a)a[i++]=b<1?p=0:++p;}
Tim Seguine

@ TimSeguine ขอบคุณ! ตอนนี้ฉันเห็นแล้วฉันไม่อยากเชื่อเลยว่าไม่ได้คิดเอง
Kevin Cruijssen

1
ฉันสามารถกำจัด p ได้ แต่มันมีขนาดเท่ากัน :(a->{int i=0;for(int v:a)a[i]+=v*i++<1?0:a[i-2];}
Tim Seguine

4

TIS , 68 + 33 = 101 ไบต์

รหัส (68 ไบต์):

@0
MOV UP ACC
SUB 47
MOV ACC ANY
@1
ADD 1
JRO UP
SUB ACC
MOV ACC ANY

เค้าโครง (33 ไบต์):

2 1 CC I0 ASCII - O0 NUMERIC - 32

ลองออนไลน์!

คำอธิบาย:

|    Input 0    |    Input is given in ASCII (`0` is 48, `1` is 49)
+--------+------+
| Node 0 |      |    This node prepares the input data
+--------+      |
| MOV UP ACC    |    Read in a character
| SUB 47        |    Subtract 47 to map [48, 49] to [1, 2]
| MOV ACC ANY   |    Send the 1 or 2 to the next node
|               |    Implicitly wrap back to top of node
+--------+------+
| Node 1 |      |    This node does the incrementing/printing
+--------+      |
| ADD 1         |    Increment counter (starts at zero)
| JRO UP        |    Get value from above, and jump forward that many lines  (skip next line or not)
| SUB ACC       |    Reset counter to zero (if input was zero)
| MOV ACC ANY   |    Send the counter value downward to be printed
|               |    Implicitly wrap back to top of node
+---------------+
|   Output 0    |    Output is space-delimited numeric values

4

ไกอา 5 ไบต์

ẋ+⊣¦_

ลองออนไลน์!

คำอธิบาย

ẋ+⊣¦_     Full program
ẋ         Split into chunks of equal adjacent values.
   ¦_     And for each chunk, flattening the result afterwards...
 +⊣       Reduce it cumulatively on + (addition); aka cumulative sums

ฮึฉันคิดว่าแบบอักษร SE เป็นแบบ monospace ....


พวกมันเป็นอวกาศ ... มีช่องว่างที่ขาดหายไปในบรรทัดแรก
micsthepick

ดูการแก้ไข มันยังคงอยู่ไม่ตรงแนว
Mr. Xcoder

คุณต้องมองจากอุปกรณ์มือถือหรือบางอย่าง - มันดูดีสำหรับฉัน
micsthepick


4

C (gcc) , 45 44 38 ไบต์

f(a,i)int*a;{while(--i)*++a*=-~a[-1];}

ลองออนไลน์!

บันทึกหนึ่งไบต์ด้วย Toby Speight!

บันทึก 6 ไบต์โดยใช้ * = และเงื่อนไขชาญฉลาดในขณะที่


คุณสามารถบันทึก 1 ไบต์: *(a-1)a[-1]
Toby Speight

ยินดีต้อนรับสู่ PPCG! :)
Shaggy

4

Perl 6 , 29 24 18 ไบต์

-6 ไบต์ขอบคุณ Sean!

*.map:{($+=1)*=$_}

ลองออนไลน์!

ฟังก์ชั่นภายในได้โดย($+=1)*=*แต่จากนั้นตัวแปรที่ไม่ระบุชื่อจะยังคงมีอยู่ในการเรียกใช้ฟังก์ชัน เราได้มาโดยการห่อมันไว้ในบล็อครหัสที่ชัดเจน

คำอธิบาย:

*.map:               # Map the array to
      {($+=1)    }   # The anonymous variable incremented
             *=$_    # Multiplied by the element

ผมได้ลงเดียวกันวิธีการขั้นพื้นฐานถึง 16 *.map(($+=1)*=*)ไบต์: วิธีการแก้ปัญหานี้มีเงื่อนไขว่าตัวแปรสถานะ$ยังคงมีอยู่ระหว่างการโทรไปยังฟังก์ชั่นดังนั้นหากองค์ประกอบสุดท้ายที่ผ่านไปหนึ่งสายและองค์ประกอบแรกที่ผ่านไปยังสายถัดไปเป็นทั้งที่ไม่ใช่ศูนย์การนับจะเริ่มต้นด้วยหมายเลขผิด
Sean

@Sean ใช่ฉันจำได้ว่าดิ้นรนกับที่เมื่อฉันตอบ โชคดีที่ฉันได้เรียนรู้วิธีการแก้ปัญหาตั้งแต่นั้นมา
Jo King

*.map:{...}คุณสามารถเคาะหนึ่งไบต์เพิ่มเติมออก:
ฌอน


3

Haskell , 19 ไบต์

scanl1$((*)=<<).(+)

ลองออนไลน์!

คำอธิบาย: รหัสเทียบเท่ากับscanl1(\b a->(b+a)*a)โดยที่bบิตปัจจุบันและaเป็นตัวสะสม scanl1ใช้รายการยกตัวอย่างองค์ประกอบรายการแรกเป็นตัวสะสมและพับรายการและรวบรวมค่ากลางในรายการใหม่

แก้ไข: BMO ชนะฉันโดยไม่กี่วินาทีและ 4 ไบต์


3

Pyth , 6 ไบต์

m=Z*hZ

ลองที่นี่!

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

m = Z * hZ - โปรแกรมเต็มรูปแบบ Q = อินพุตที่ได้รับการประเมิน
m - สำหรับแต่ละจำนวนเต็ม d ใน Q
 = Z - กำหนดตัวแปร Z (preinitialised เป็น 0) ให้กับ ...
   * hZ - (Z + 1) * d; (d หมายถึงตอนท้าย)

3

ต้องการรับคำตอบในการใช้นิพจน์ทั่วไป อาจมีวิธีแก้ปัญหาที่ง่ายกว่าที่ฉันทิ้งไว้เพื่อเป็นการออกกำลังกายสำหรับผู้อ่าน

PowerShell Core , 86 ไบต์

Filter F{($_-split"(0)(\B|\b)"|?{$_-ne''}|%{$_-replace'(1+)',(1..$_.Length)})-join' '}

ลองออนไลน์!



3

QBasic, 60 ไบต์

INPUT s$
FOR i=1TO LEN(s$)
b=MID$(s$,i)>="1
v=-b*v-b
?v
NEXT

รับอินพุตเป็นสตริง ให้ผลลัพธ์เป็นตัวเลขคั่นด้วยการขึ้นบรรทัดใหม่

คำอธิบาย

เราอ่านสตริงs$และวนรอบiจาก1ความยาว

MID$(s$,i)รับสตริงย่อยจากตัวละครi(ดัชนี 1) ไปยังจุดสิ้นสุดของสตริง ถ้าเรื่องนี้เริ่มต้นด้วย1ก็จะเป็น lexicographically >=สตริง"1"; ถ้ามันเริ่มต้นด้วย a 0มันจะไม่เป็นเช่นนั้น ดังนั้นbได้รับ0ถ้าตัวละครที่ดัชนีiเป็น0หรือถ้าตัวอักษรเป็น-11

vต่อไปเราจะปรับปรุงค่าปัจจุบัน หากเราเพิ่งอ่านก0เราต้องการvเป็น0; มิฉะนั้นเราต้องการเพิ่มขึ้นทีละvหนึ่ง ในคำอื่น ๆv = (-b) * (v+1); การทำให้คณิตศาสตร์ง่ายขึ้นให้นิพจน์สั้นลงที่เห็นในโค้ด ในที่สุดเราพิมพ์vและวนรอบ


3

Brain-Flakขนาด 60 ไบต์

([]){{}<>(())<>{{}<>({}({}))(<>)}{}([])}{}<>{({}[()]<>)<>}<>

ลองออนไลน์!

คำอธิบาย:

([]){  For each element in the input
    {}
    <>(())<>  Push a one to the other stack
    { If the element is one,
       {}<>({}({}))(<>)  Add the one to a copy of the previous number in the series
    }{}  Pop the element
([])}  End loop
{}<>   Pop extra zero
{({}[()]<>)<>}<>   And reverse the output stack, subtracting one from each element


3

C (gcc), 57 52 51 ไบต์

f(a,l,c,i)int*a;{for(c=i=0;i<l;)a[i++]=c=a[i]*-~c;}

คำตอบจาวาสคริปต์ของ Port of Arnauldปรับเปลี่ยนอาร์เรย์ในสถานที่ ลองออนไลน์ได้ที่นี่


จะไม่แม่นยำกว่าที่จะบอกว่านี่เป็น K&R C หรือไม่?
Tim Seguine

อาจเป็นไปได้ แต่นั่นจะเป็นจริงของคำตอบมากมาย ฉันไม่มีความเชี่ยวชาญ แต่เป็นไปได้ทั้งหมดที่ไม่ถูกต้องแม้แต่ K&R C. สิ่งนี้คือเราไม่สนใจมาตรฐานภาษาในเว็บไซต์นี้จริงๆ หาก gcc อนุญาตให้คุณผสม K&R C กับสิ่งที่ทันสมัยกว่านั้นก็คือ C ที่ถูกต้องสำหรับวัตถุประสงค์ในการเล่นกอล์ฟเพราะ gcc จะรวบรวมมัน ดูเพิ่มเติมที่: codegolf.stackexchange.com/questions/2203/tips-for-golfing-in-c
OOBalance

ฉันไม่ทราบจนกระทั่งทำการค้นหาในตอนนี้ว่า C11 ยังคงรองรับไวยากรณ์รายการฟังก์ชันตัวระบุเดิมดังนั้นไม่เป็นไร แต่ประเด็นของคุณถือโดยไม่คำนึงถึง
Tim Seguine

1
แนะนำf(a,l,c)int*a;{for(c=0;l--;)c=*a++*=c+1;}

3

เช็คสเปียร์, 365 ไบต์

I.Ajax,.Ford,.Act I:.Scene I:.[enter Ajax and Ford]Ajax:Open mind!Scene V:.Ford:Am I nicer than the sum of a big red old cute hard cat a big red old cute joy?Ford:If so,you is the sum of thyself a son!Ford:If not,you is zero!Ford:Open heart!Ajax:you is a big red old cute hard cat.Ajax:Speak mind!Ajax:Open mind!Ford:Am I nicer than zero?Ajax:If so, let us Scene V.

ลองที่นี่

รุ่น golfed น้อย

I.Ajax,.Ford,.
Act I:.
Scene I:.
[enter Ajax and Ford]
Ajax:Open mind!
Scene V:.
Ford:Am I nicer than the sum of a big red old cute hard cat a big red old cute joy?     <- smallest way to 48 (ascii "0") I could think of
Ford:If so,you is the sum of thyself a son!
Ford:If not,you is zero!
Ford:Open heart!
Ajax:you is a big red old cute hard cat.    <- get value of 32 or space
Ajax:Speak mind!                            <- then output it
Ajax:Open mind!
Ford:Am I nicer than zero?
Ajax:If so, let us Scene V.                 <- loop through inputs

280 ไบต์ ตรวจสอบหน้าเคล็ดลับ SPL สำหรับเคล็ดลับการเล่นกอล์ฟ
โจคิง

3

C ++, 47 ไบต์

[](int*a,int*b){for(int c=0;a!=b;)c=*a++*=1+c;}

แลมบ์ดาที่ปรับเปลี่ยนอาเรย์ให้พอยน์เตอร์เริ่มต้นและสิ้นสุด


ลองออนไลน์! (ต้องใช้ Javascript)


รุ่นทั่วไปที่ 55 ไบต์ (ใช้งานได้กับคอนเทนเนอร์ที่มีองค์ประกอบประเภทคณิตศาสตร์):

[](auto a,auto b){for(auto c=*a-*a;a!=b;)c=*a++*=1+c;};
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.