Chunk + ระบุรายการตัวเลข


12

ฉันมีรายการเลขทศนิยม:

4, 4, 4, 7, 7, 9, 9, 9, 9, 2, 2, 2, 4, 4

รายการเลขฐานสิบเป็นที่รู้จักกันในชื่อรายการ เราสามารถสร้าง "ชิ้นส่วน" จากรายการเหล่านี้โดยจัดกลุ่มหมายเลขที่เหมือนกันและติดกัน ฉันต้องการกำหนดหมายเลขที่ไม่ซ้ำกันให้แต่ละอันเริ่มต้นจาก 1 และเพิ่มขึ้น 1 ตามลำดับที่จะปรากฏในรายการต้นฉบับ ดังนั้นเอาต์พุตสำหรับตัวอย่างที่กำหนดจะมีลักษณะดังนี้:

1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5

รูปแบบอินพุต

รายการของตัวเลข (0-9) คุณสามารถใช้ภาษาในตัวเพื่ออ่านรายการนี้ได้ตามต้องการ การเข้ารหัส: ASCII

รูปแบบเอาต์พุต

ชุดตัวเลขทศนิยมคั่นด้วยตัวคั่น โปรแกรมของคุณต้องใช้ตัวคั่นเดียวกันเสมอ ตัวคั่นต้องยาวกว่า 0 บิต การเข้ารหัส: ASCII

ช่องโหว่มาตรฐานใช้


8
มีเหตุผลใดสำหรับรูปแบบอินพุตและเอาต์พุตที่เข้มงวด?
สตริงที่ไม่เกี่ยวข้อง

2
@ ไม่เกี่ยวข้องStringอืมฉันจะคลายพวกเขา
noɥʇʎԀʎzɐɹƆ

8
IO ยังค่อนข้างเข้มงวด คุณไม่เพียงแค่พูดว่า "อินพุทและเอาท์พุทเป็นรายการ" และปล่อยให้ค่าเริ่มต้นของไซต์ดูแลให้คุณหรือไม่
Jo King

2
เราสามารถสมมติว่ารายการไม่ว่างเปล่าได้หรือไม่?
Jo King

1
รายการตามคำนิยามมีตัวคั่นอยู่แล้ว นั่นเป็นเหตุผลที่มันเป็นรายการ You may use your language built-ins to read this list however you want.ฉันยังไม่เข้าใจสิ่งที่คุณหมายถึงโดย หมายความว่าเราต้องรวมสตริงเพื่อแปลงรายการในการส่งของเราหรือไม่ และได้รับการที่เราได้รับอนุญาตให้ส่งออกเป็นรายการ?
โจคิงเมื่อ

คำตอบ:


7

Python 3.8 (เผยแพร่ล่วงหน้า) , 41 ไบต์

lambda l,n=0:[n:=n+(l!=(l:=x))for x in l]

ลองออนไลน์!

สรรเสริญวอลรัสเวทย์มนตร์:=ของการมอบหมายการแสดงออก


Python 2 , 42 ไบต์

n=0
for x in input():n+=x!=id;id=x;print n

ลองออนไลน์!


อืมสิ่งนี้จะอยู่ใน Pyth นานแค่ไหน?
noɥʇʎԀʎzɐɹƆ

อืมฉันหลีกเลี่ยงidเพราะมันยาว 2 ไบต์ ...
Erik the Outgolfer

แนวคิดที่ดีของid
ส่งต่อ

@ noɥʇʎԀʎzɐɹƆ 8 ไบต์สำหรับการแปลตรงไปตรงมา: ลองออนไลน์!
isaacg



3

เยลลี่ , 6 5 ไบต์

ŒɠµJx

ลองออนไลน์!

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

อินพุตและเอาต์พุตเป็นอาร์เรย์ (พร้อมวงเล็บเปิด / ปิด)

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

ŒɠµJx - Main link, takes one argument:                       [7, 7, 5, 5, 5, 1]
Œɠ    - Get the lengths of consecutive elements:             [2, 3, 1]
  µ   - Call these lengths A
   J  - range(length(A))                                     [1, 2, 3]
    x - Repeat each element by the corresponding value in A: [1, 1, 2, 2, 2, 3]


1
@ ไม่เกี่ยวข้องStringอะตอมแบบใหม่ทั้งหมดเหล่านี้!
caird coinheringaahing




2

Perl 6 , 21 ไบต์

{+<<[\+] $,|$_ Zne$_}

ลองออนไลน์!

การบล็อกโค้ดแบบไม่ระบุชื่อที่รับรายการและส่งคืนรายการ สิ่งนี้ทำงานโดยการเปรียบเทียบว่าองค์ประกอบที่อยู่ติดกันแต่ละคู่ไม่เท่ากันหรือไม่กว่าการหาผลรวมสะสมของรายการ









1

Perl 5 , 27 ไบต์

s/\d/$i+=$&!=$p;$p=$&;$i/ge

ลองออนไลน์!

ตัวเลือกบรรทัดคำสั่ง-pทำให้ Perl อ่านบรรทัดการป้อนข้อมูลจาก STDIN เป็น $_"ตัวแปรเริ่มต้น" จากนั้นการค้นหาแทนที่ตัวเลขทั้งหมดในกับเคาน์เตอร์$_ $iและจะเพิ่มขึ้นสำหรับแต่ละหลักซึ่งจะแตกต่างกว่าบาทก่อนหน้านี้ซึ่งก็ยังเป็นที่หลักแรกดังนั้นเคาน์เตอร์เริ่มต้นที่$i หลักก่อนหน้านี้จะถูกเก็บไว้ใน1$p


1

Pyth , 13 11 ไบต์

s.e*]hkhbr8

ลองออนไลน์!

         r8  # Run-length encode (implicit argument is the input) (-> [[frequency, char], ...]
 .e          # Enumerated map (current element is b, index is k) over rQ8
   *]hk      # [ k+1 ] *
       hb    #           b[0]
s            # Reduce list on + ([a]+[b] = [a,b])

-2 ไบต์ขอบคุณ Mr. Xcoder


hMsM._+0nVtสำหรับ -2 ไบต์
นาย Xcoder

หรือถ้าคุณต้องการให้แนวทางของคุณrQ8เป็นเช่นเดียวกับr8และ.nอาจเป็นs-2 เช่นกัน
Mr. Xcoder

อ๋อเอกสารเหล่านี้ไม่ได้พูดถึงว่าฟังก์ชั่นใช้อะไรโดยปริยายQ
ar4093

1

สกาลา , 75 ไบต์

s=>s.scanLeft(("",0))((x,y)=>(y,x._2+(if(x._1!=y)1 else 0))).tail.map(_._2)

ลองออนไลน์!

หากอินพุตและเอาต์พุตต้องคั่นด้วยเครื่องหมายจุลภาคString (และไม่ใช่รายการ) ดังนั้น 102 ไบต์

s=>s.split(", ").scanLeft(("",0))((x,y)=>(y,x._2+(if(x._1!=y)1 else 0))).tail.map(_._2).mkString(", ")

1

เยลลี่ 5 ไบต์

nƝÄŻ‘

ลองออนไลน์!

ตอนแรกฉันมีจุดประสงค์เพื่อ 4-byter (โปรแกรมเดียวกัน แต่ไม่มีŻ) แต่ก็รู้ได้อย่างรวดเร็วว่า1ต้องถูกเตรียมทุกครั้งเนื่องจากการกำกับดูแล ... แม้ว่าจะมีอีก 5-byter ใน Jelly ฉันจะ จริง ๆ แล้วเก็บไว้นี้เนื่องจากใช้วิธีการอื่น

LLiLi+1,1i<|L|



1

JavaScript (ES6), 30 ไบต์

รับอินพุตเป็นอาร์เรย์ของจำนวนเต็ม

a=>a.map(p=n=>i+=p!=(p=n),i=0)

ลองออนไลน์!

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

a =>                // a[] = input array
  a.map(p =         // initialize p to a non-numeric value
  n =>              // for each value n in a[]:
    i +=            //   increment i if:
      p != (p = n), //     p is not equal to n; and update p to n
    i = 0           //   start with i = 0 (chunk counter)
  )                 // end of map()

1

PHP , 52 ไบต์

while(''<$d=$argv[++$x])echo$i+=$argv[$x-1]!=$d,' ';

ลองออนไลน์!

STDOUTการป้อนข้อมูลผ่านทางบรรทัดคำสั่งออกไป

ขอบคุณ @ @ Night2 สำหรับ'0' == 0ข้อผิดพลาดการเปรียบเทียบข้อผิดพลาด!


@ Night2 จับดี! อัปเดตและแก้ไขแล้ว ขอบคุณ!
640KB



0

เพิ่ม ++ , 23 ไบต์

D,f,@*,BGd€bL$bLRz€¦XBF

ลองออนไลน์!

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

D,f,@*,     - Define a function, f, that takes one argument:  [7 7 5 5 5 1]
       BG   - Group neighbouring elements together:           [[[7 7] [5 5 5] [1]]]          
       d    - Duplicate:                                      [[[7 7] [5 5 5] [1]] [[7 7] [5 5 5] [1]]]
       €bL  - Get the length of each:                         [[[7 7] [5 5 5] [1]] [2 3 1]]
       $bLR - Length, then range of length:                   [[2 3 1] [1 2 3]]
       z    - Zip together:                                   [[2 1] [3 2] [1 3]]
       €¦X  - Reduce each by repetition:                      [[1 1] [2 2 2] [3]]
       BF   - Flatten:                                        [1 1 2 2 2 3]
            - Due to the * in the function definition,
                 return the whole stack:                      [1 1 2 2 2 3]


0

เรติน่า 0.8.2 , 34 ไบต์

\b\d+\b(?<=(\b(\3|(\d+))\D*)*)
$#3

ลองออนไลน์! คำอธิบาย:

\b\d+\b

จับคู่ตัวเลขแต่ละตัว

(?<=(...)*)

เริ่มมองย้อนกลับเพื่อดูการแข่งขันให้ได้มากที่สุด (รายการถัดไปจะอยู่ในลำดับจากขวาไปซ้ายเนื่องจากเป็นวิธีที่ lookbehind ทำงาน)

\D*

ข้ามตัวคั่น

(\3|(\d+))

พยายามจับคู่หมายเลขเดิมเป็นครั้งสุดท้าย แต่ล้มเหลวเพียงแค่จับคู่หมายเลขใด ๆ แต่โปรดจำไว้ว่าเราต้องจับคู่หมายเลขใหม่

\b

ตรวจสอบให้แน่ใจว่าหมายเลขทั้งหมดตรงกัน

$#3

นับจำนวนตัวเลขใหม่


0

Stax , 10 ไบต์

▓ª2ªmD?Ä╧╖

เรียกใช้และแก้ไขข้อบกพร่อง

เอาท์พุทใช้พื้นที่เป็นตัวคั่น อินพุตเป็นไปตามข้อกำหนดที่แม่นยำโดยใช้เครื่องหมายจุลภาคเป็นตัวคั่นและตอนนี้ใส่วงเล็บปีกกา


0

C (gcc) , 62 61 ไบต์

นี่เป็นหนึ่งในไม่กี่รายการที่ฉันทำไปโดยที่โปรแกรมสั้นกว่าการส่งฟังก์ชั่น!

ในรอบแรกฉันไม่สนใจค่าก่อนหน้าดังนั้นฉันจึงต้องพึ่งพาความจริงที่argvเป็นตัวชี้ไปยังที่ใดที่หนึ่งและไม่น่าเป็นไปได้อย่างยิ่งที่จะอยู่ระหว่าง [0..9]!

s;main(i,j){for(;~scanf("%d,",&i);j=i)printf("%d ",s+=j!=i);}

ลองออนไลน์!



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