แจกแจงอาร์เรย์จัดกลุ่มรายการที่ซ้ำกัน


24

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

การแจงนับโดยไม่มีการทำซ้ำใด ๆ ทำได้โดยเพียงแค่ส่งออกอาร์เรย์ของคู่(value, index)ตัวอย่างเช่น[3, 4, 13, 9, 2]=>[[3,1],[4,2],[13,3],[9,4],[2,5]] =>

อย่างไรก็ตามหากองค์ประกอบที่กำหนดปรากฏขึ้นเป็นครั้งที่สองก็จะไม่ได้รับคู่ของมันเอง แต่จะถูกเพิ่มเข้าไปในกลุ่มที่เกิดขึ้นครั้งแรก หากในตัวอย่างข้างต้นเราแทนที่ 9 ด้วย 3 จากนั้นในผลลัพธ์ที่เราจะลบ[9,4]และแทนที่[3,1]ด้วย[3,1,4]ด้วย

ในผลลัพธ์กลุ่มจะต้องเรียงลำดับตามการเกิดขึ้นครั้งแรกและดัชนีจะต้องเรียงลำดับจากน้อยไปหามาก องค์ประกอบจะต้องเป็นอันดับแรกในกลุ่มก่อนที่ดัชนี ผลลัพธ์อาจเป็นดัชนี 0 หรือ 1 คุณอาจถือว่าอาร์เรย์มีองค์ประกอบอย่างน้อยหนึ่งองค์ประกอบ

กรณีทดสอบ:

Input           | Output (One-indexed)
[3, 2, 2, 3]    | [[3, 1, 4], [2, 2, 3]]
[17]            | [[17, 1]]
[1, 1]          | [[1, 1, 2]]
[1, 1, 2]       | [[1, 1, 2], [2, 3]]
[1, 2, 3, 4]    | [[1, 1], [2, 2], [3, 3], [4, 4]]
[1, 1, 1, 1]    | [[1, 1, 2, 3, 4]]

นี่คือไบต์ที่น้อยที่สุดชนะ!


มันจะเป็นที่ยอมรับสำหรับ indides ที่จะส่งออกเป็นสตริงเช่น[[17,"1"]]? (ยังไม่รู้ถ้าฉันสามารถบันทึกไบต์ใด ๆ ด้วยวิธีดังกล่าวยังคงทำงานอยู่!)
Shaggy

@shaggy แน่ใจว่าเป็นเรื่องที่ดี
Pavel


1
เราสามารถส่งออกสิ่งที่ต้องการ[[3, [1, 4]], [2, [2, 3]]]แทนได้หรือไม่?
Conor O'Brien

1
@Pavel ไม่มีเหตุผล: p แต่แน่นอน
Conor O'Brien

คำตอบ:


9

Dyalog APL ขนาด 5 ไบต์

(⊂,)⌸

ลองออนไลน์!

,⌸เกือบ 2 ไบต์ใช้งานได้ แต่มีศูนย์ต่อท้าย: /


ในโลกนี้ทำอะไร?
นาย Xcoder

@ Mr.Xcoder รับดัชนีของแต่ละสิ่งและเรียกผู้ดำเนินการทางซ้ายด้วยสิ่งและดัชนีที่มีอยู่
dzaima

เนื่องจาก isue with ,⌸is trailing zeroes และเลขศูนย์จะไม่อยู่ในอินพุตดังนั้นจึงเป็นไปได้ไหมที่จะลดจำนวนศูนย์ทั้งหมดในเวลาน้อยกว่า 3 ไบต์?
Pavel

@Pavel เหตุผลที่มีเลขศูนย์คือผลลัพธ์ที่ได้คือเมทริกซ์ซึ่งจะต้องมีขนาดที่แน่นอนดังนั้นจึงมีเพียง 1 ไบต์สำหรับการปล่อยเลขศูนย์สำหรับกำไรไบต์ใด ๆ ฉันรู้สึกว่าสิ่งนี้อาจเล่นกอล์ฟได้
dzaima

2
รูปแบบเอาต์พุตอาร์เรย์"fancy af" : ลองออนไลน์!
อดัม

7

J , 12 ไบต์

~.,&.><@I.@=

ศูนย์การจัดทำดัชนี

ลองออนไลน์!

หากคุณสามารถลบงานทั้งหมดที่ฉันทำกับกล่องคุณอาจลดจำนวน bytec ลงได้เล็กน้อย ฉันจะดูว่าฉันจะเข้าใจได้ไหม

คำอธิบาย

นี่อาจจะเร็วเกินไปที่จะอธิบาย (ควรจะมีสนามกอล์ฟเพิ่มเติม)

~. ,&.> <@I.@=
             =  Self-classify (comparison of each unique element to array)
            @   Composed with
          I.    Indices of ones (where it's equal)
         @      Composed with
        <       Boxed (how we deal with arrays of unequal length)
   ,&.>         Joined with
      >          Unbox each
   ,             Concatenate
    &.           Box again
~.              Unique elements

2
รูปแบบเอาต์พุตของอาเรย์นั้นเป็นที่น่าประหลาดใจมาก
Pavel

@Pavel มันใช้จำนวนไบต์เป็นจำนวนมากΠ.Π
โคล




5

ทูตขนาด 15 ไบต์

Flat=>Positions

ลองออนไลน์!

นี้เป็นกรณีที่น่าสนใจของรูปแบบการดำเนินการของ=> Mapเมื่อได้รับสองอาร์กิวเมนต์ทำงานfและg, Mapผลตอบแทนการทำงานf => g[x]มากกว่าxมากกว่านั่นคือ RHS ถูกใช้กับอินพุตจากนั้น LHS จะถูกแม็พ

builtin Positionsสร้างอาร์เรย์ที่แสดงถึงการจัดกลุ่มรายการตามดัชนี ตามค่าเริ่มต้นเมื่อไม่ได้ระบุอาร์กิวเมนต์ที่สองPositionsจะใช้อาร์กิวเมนต์แรก Flatจะถูกแมปกับแต่ละรายการตามที่เป็นสิ่งที่คำถามต้องการ

โซลูชั่นทางเลือก

31 ไบต์

MapArgs[Concat#~Indices,Unique]

ลองออนไลน์!

เป็นทางเลือกที่สั้นและสวยในตัว MapArgsเป็นฟังก์ชั่นที่ชอบMapยกเว้นคุณสามารถป้อนอาร์กิวเมนต์พิเศษลงไปได้ ยกตัวอย่างเช่นเป็นMapArgs[{_1 + _2}, 1..3, 3] [4, 5, 6]เหมือนMapมันจะกลายเป็นแกงกะหรี่เมื่อมาพร้อมกับสองอาร์กิวเมนต์ทำงาน ฟังก์ชั่นที่แมปคือConcat#~Indicesซึ่งเป็นทางแยก ทางแยกนี้จะใช้กับUniqueรายการของอินพุตและอินพุตเอง สิ่งนี้แปลเป็นConcat[_, Indices[_2, _]](ด้วยอาร์กิวเมนต์ของการIndicesสลับผ่าน~) ซึ่งจับคู่อิลิเมนต์ที่ถูกแม็พ ( _) กับดัชนีของอิลิเมนต์ที่กล่าวถึง_ในอาร์เรย์อินพุตซึ่งคือ_2(ตามที่ ffed ผ่านMapArgs)

43 ไบต์

{Flat=>Zip[Unique[_],Indices[_,Unique[_]]]}

ลองออนไลน์!

นี่เป็นเพียงการผสมผสานที่ละเอียดมากขึ้น (แต่ยังรวมถึงการอ่านที่ง่ายขึ้น) ของโซลูชัน # 1 และ # 2


4

เยลลี่ 6 ไบต์

Q;"ĠṢ$

ลองออนไลน์!

คำอธิบาย:

Q;"ĠṢ$
Q      Keep the first occurrence of each element
     $ Last two links as a monad
   Ġ    Group indices of equal elements, then sort the resulting list of groups by the element they point to
    Ṣ   Sort; used to re-order the list of groups based on first occurrence instead
  "    Vectorize link between two arguments (the first occurrences and the group list)
 ;      Concatenate

ไม่ทำงานสำหรับกรณีทดสอบที่ผ่านมา อาร์เรย์ควรซ้อนกันอีกชั้นหนึ่งเอาต์พุตนั้นมีสองมิติเสมอ
Pavel

@ โพลใช่ใช่ฉันแค่ลืมเพิ่มส่วนท้าย (คำตอบคือฟังก์ชั่น)
Erik the Outgolfer

ตกลงแล้วเจ๋ง คำอธิบายเร็ว ๆ นี้ใช่ไหม : P
Pavel

@Pavel เพิ่มคำอธิบาย
Erik the Outgolfer

4

Pyth , 7 ไบต์

0 การจัดทำดัชนี

{+VQxRQ

ลองที่นี่! ทางเลือก

อย่างไร?

{+ VQxRQ - โปรแกรมเต็มรูปแบบ

     RQ - สำหรับแต่ละองค์ประกอบ ...
    x - รับดัชนีทั้งหมด
 + V - และใช้การต่อข้อมูลเวกเตอร์
   Q - ด้วยการป้อนข้อมูล
{- ซ้ำซ้อน

4

MATL , 8 ไบต์

u"@tG=fh

ลองใช้ที่MATL Online

คำอธิบาย

        # Implicitly get the input
u       # Compute the unique values
"       # For each unique value, N
  @     # Push the value N to the stack
  t     # Duplicate N
  G     # Grab the input
  =f    # Get the 1-based indices of the elements that equal N
  h     # Horizontally concatenate N with the indices
        # Implicitly display the result

ooooohhh นั่นฉลาด! ฉันมีขนาด 18 ไบต์ที่พยายามใช้&fแต่ไม่เคยใช้งานเลย
Giuseppe

3

ที่จริงแล้ว 24 ไบต์

;;╗⌠╝╜r⌠╜E╛=⌡░⌡M@Z⌠♂i⌡M╔

ลองออนไลน์!

คำอธิบาย:

;;╗⌠╝╜r⌠╜E╛=⌡░⌡M@Z⌠♂i⌡M╔
;;                        make two copies of input
  ╗                       save a copy to register 0
   ⌠╝╜r⌠╜E╛=⌡░⌡M          map over input:
    ╝                       save the element in register 1
     ╜r                     indices for input
       ⌠╜E╛=⌡░              filter:
        ╜E                    element in input at index
          ╛=                  equals element for outer map (from register 1)
                @Z        swap, zip input with map result
                  ⌠♂i⌡M   flatten each element in zipped list
                       ╔  uniquify

3

R , 56 ไบต์

function(x)lapply(unique(x),function(y)c(y,which(x==y)))

ลองออนไลน์!


นี่เป็นความพยายามครั้งแรกของฉันที่ codegolf ดังนั้นข้อเสนอแนะใด ๆ ยินดีต้อนรับ!


3
ยินดีต้อนรับสู่ PPCG! คำตอบแรกที่ดี
Pavel

1
เฮ้มี Florian! คำตอบที่ดีมาก นี่คือตัวอย่างโค้ดแทนที่จะเป็นโปรแกรมหรือฟังก์ชั่น - สมมติว่าอินพุตถูกฮาร์ดโค้ดxแต่จะต้องมีวิธีอ่านอินพุต - โดยทั่วไปแล้วเราใช้scanหรือกำหนดฟังก์ชั่น นอกจากนี้ยังมีการส่งออก, so'd ต้องห่อนี้ในหรือprint cat
จูเซปเป้

1
ดูคำถามนี้สำหรับเทคนิคการเล่นกอล์ฟ R ที่มีประโยชน์มากขึ้น :)
Giuseppe

1
ขอบคุณเพื่อน! และลิงก์ไปยังเคล็ดลับ r มีประโยชน์อย่างแน่นอน!
Florian

2
@ Florian R ไม่เลวร้ายอย่างที่คุณคิด (ยกเว้นความท้าทายในสาย ... ) ตราบใดที่คุณยังจำได้ว่าคุณกำลังเล่นกอล์ฟกับนักกอล์ฟ R คนอื่น! อย่าลังเลที่จะ ping ฉันในการแชทหากคุณมีคำถาม มีนักกอล์ฟ R สองคนที่กระตือรือร้นและพวกเขาจะให้คำแนะนำอย่างแน่นอนและขอขอบคุณสำหรับคุณเช่นกัน! ยินดีต้อนรับสู่การเล่นกอล์ฟ :)
จูเซปเป้

3

ภาษา Wolfram (Mathematica)ขนาด 40 ไบต์

บันทึกเป็นไบต์ขอบคุณ Martin Ender

KeyValueMap[{#,##&@@#2}&]@*PositionIndex

ลองออนไลน์!


วิธีการ@*PositionIndexทำงานหรือไม่
Pavel

@Pavel @*เป็นองค์ประกอบของฟังก์ชั่น PositionIndexโดยทั่วไปแล้วจะทำงานทั้งหมด แต่ส่งคืนการเชื่อมโยงแทนที่จะเป็นรายการ
alephalpha

1
{#,##&@@#2}&บันทึกเป็นไบต์
Martin Ender

3

JavaScript (ES6), 64 ไบต์

0 จัดทำดัชนีแล้ว

a=>a.map((v,i)=>a[-v]?a[-v].push(i):a[-v]=[v,i]).filter(x=>x[0])

หมายเหตุสิ่งนี้ถือว่าตัวเลขอินพุตเป็นค่าบวกดังนั้น v> 0

ทดสอบแก้ไขเล็กน้อย (1 ดัชนี) เพื่อให้ตรงกับกรณีทดสอบ

var F=
a=>a.map((v,i)=>a[-v]?a[-v].push(i+1):a[-v]=[v,i+1]).filter(x=>x[0])

test = [ // output 1 indexed
  [3, 2, 2, 3],//    | [[3, 1, 4], [2, 2, 3]]
  [17], //           | [[17, 1]]
  [1, 1], //         | [[1, 1, 2]]
  [1, 1, 2], //      | [[1, 1, 2], [2, 3]]
  [1, 2, 3, 4], //   | [[1, 1], [2, 2], [3, 3], [4, 4]]
  [1, 1, 1, 1] //    | [[1, 1, 2, 3, 4]] 
]

test.forEach(t => {
  x = F(t)
  console.log(JSON.stringify(t)+ ' -> ' + JSON.stringify(x))
})


3

APL NARS 24 ไบต์ 12 ตัวอักษร

{∪⍵,¨⍸¨⍵=⊂⍵}

-4 ไบต์ด้วยการทดสอบของอดัม:

  f←{∪⍵,¨⍸¨⍵=⊂⍵}

  ⎕fmt f 3 2 2 3
┌2────────────────┐
│┌3─────┐ ┌3─────┐│
││ 3 1 4│ │ 2 2 3││
│└~─────┘ └~─────┘2
└∊────────────────┘
  ⎕fmt f 17
┌1──────┐
│┌2────┐│
││ 17 1││
│└~────┘2
└∊──────┘
  ⎕fmt f 1 1
┌1───────┐
│┌3─────┐│
││ 1 1 2││
│└~─────┘2
└∊───────┘
  ⎕fmt f 1 2 3 4
┌4──────────────────────────┐
│┌2───┐ ┌2───┐ ┌2───┐ ┌2───┐│
││ 1 1│ │ 2 2│ │ 3 3│ │ 4 4││
│└~───┘ └~───┘ └~───┘ └~───┘2
└∊──────────────────────────┘
  ⎕fmt f 1 1 1 1
┌1───────────┐
│┌5─────────┐│
││ 1 1 2 3 4││
│└~─────────┘2
└∊───────────┘

โกน 4 ไบต์ / 2 ตัวอักษร:{∪⍵,¨⍸¨⍵=⊂⍵}
อดัม

3

SWI-Prolog , 165 117 ไบต์

-48 ไบต์ขอบคุณที่เปิดฉากเคล็ดลับการเล่นกอล์ฟ

h(I):-I+[]-1.
[H|T]+R-N:-(select([H|A],R,[H|L],S),!,append(A,[N],L);append(R,[[H,N]],S)),O is N+1,(T+S-O,!;write(S)).

ลองออนไลน์!

คำอธิบาย

% The predicate that prints the grouped duplicates. It's a wrapper because we
% need some extra arguments to keep state:
enumerate_duplicates(Input) :- enumerate(Input, [], 1).

% In the golfed code, operators are used to represent this predicate.
% See /codegolf//a/153160
% Go through the input, build up the result on the way and print it.
enumerate([Head|Tail], Result, Index) :-
    (
        % If our current Result already contains a list that starts with the
        % current first element in our input, Head, NewIndexes will become the
        % new "tail" of that list in our next result list:
        select([Head|OldIndexes], Result, [Head|NewIndexes], NextResult),
        % Don't backtrack before this if goals below this fail:
        !,
        % The as-yet-unknown NewIndexes above should in fact be the same as
        % OldIndexes with our current Index appended:
        append(OldIndexes, [Index], NewIndexes)
    % Use ; instead of separate predicate rules.
    % See /codegolf//a/67032
    ;
        % If our current Result did not already contain Head, append a new list
        % for it with the current index:
        append(Result, [[Head, Index]], NextResult)
    ),
    % Increment our index counter:
    NextIndex is Index + 1,
    (
        % And continue with the rest of our input:
        enumerate(Tail, NextResult, NextIndex),
        % Don't backtrack if the above succeeded:
        !
    ;
        % If Tail is no longer a multi-element list, we're done. Print:
        write(NextResult)
    ).

3

K (oK) , 10 ไบต์

วิธีการแก้:

(!x),'.x:=

ลองออนไลน์!

ตัวอย่าง:

(!x),'.x:=,17
,17 0
(!x),'.x:=1 1
,1 1 2
(!x),'.x:=1 0 1
(1 1 2
2 3)
(!x),'.x:=1 2 3 4
(1 0
2 1
3 2
4 3)

คำอธิบาย:

ทำการประเมินผลจากขวาไปซ้าย ฉันยังคิดว่านี่เป็นสนามกอล์ฟที่สามารถเพิ่มเติมได้ ...

(!x),'.x:= / the solution
         = / group input into dictionary, item!indices
       x:  / save as variable x
      .    / value of x (the indices)
    ,'     / concatenate (,) each-both (') with
(  )       / do this together
 !x        / the key of x (i.e. the items)

หมายเหตุ:

  • 14 ไบต์โดยไม่ประกาศx, (,/)'+(!;.)@'=เลิกใช้วิธีนี้ ...

1
คุณสามารถกลับผลการจัดทำดัชนี 0 1+ดังนั้นฉันคิดว่าคุณสามารถข้าม
Adám


2

JavaScript (ES6), 68 ไบต์

0 การจัดทำดัชนี

a=>a.map(p=(x,i)=>1/p[x]?b[p[x]].push(i):b.push([x,p[x]=i]),b=[])&&b

กรณีทดสอบ


ป้อนข้อมูลตัวเลขที่มี = 0 ที่อาจเป็นประโยชน์เพื่อหลีกเลี่ยง / x 1 เคล็ดลับ!
edc65

2

PHP 4.1, 88 ไบต์

ใช่มันค่อนข้างยาว

สิ่งนี้จะถือว่าเป็นไฟล์เริ่มต้น php.ini ( short_open_tag = Onและregister_globals = On)

<?foreach($A as$k=>$v){!$b[$v]&&$b[$v]=array($v);$b[$v][]=$k;}print_r(array_values($b));

สิ่งนี้นำเสนออาร์เรย์ในแบบที่มนุษย์อ่านได้
ค่าสามารถส่งผ่านโดย POST, GET และ COOKIE ภายในคีย์ "A"


สำหรับรุ่นที่ทันสมัยหนึ่งสามารถใช้ (90 ไบต์):

<?foreach($_GET[A]as$k=>$v){if(!$b[$v])$b[$v]=[$v];$b[$v][]=$k;}print_r(array_values($b));

ผลลัพธ์จะเหมือนกันยกเว้นค่าทั้งหมดจะต้องถูกส่งผ่านพารามิเตอร์ GET ภายในคีย์ "A"


2

Perl 6 ,  63  61 bytes

*.pairs.classify(*.value).map({.key,|.value».key}).sort(*.[1])

ทดสอบ (ตาม 0)

{sort *.[1],map {.key,|.value».key},classify *.value,.pairs}

ทดสอบ (อัลกอริทึมเดียวกันตาม 0)

ขยาย:

# WhateverCode lambda (this is the parameter) 
*\                                            # [3,2,2,3]

# get a list of Pairs (zero based index => value)
.pairs                                        # (0=>3,1=>2,2=>2,3=>3)

# classify based on the values (unordered result)
.classify(*.value)                            # {2=>[1=>2,2=>2],3=>[0=>3,3=>3]}

# simplify the structure
.map({
  .key,         # the value
  |.value».key  # slip in the indexes
})                                            # ((3,0,3),(2,1,2))

# sort based on first index
.sort(*.[1])


2

PHP 7.4+ , 71 ไบต์

* 73 ไบต์เพื่ออ้างถึง $_GETคีย์และหลีกเลี่ยงคำเตือน

ตัวอย่าง: ( สาธิต )

<?foreach($_GET[A]as$k=>$v){$b[$v][0]=$v;$b[$v][]=$k;}print_r([...$b]);

ขึ้นอยู่กับตัวแทนผมถือว่าIsmaelMiguelรู้วิธีที่ดีที่สุดที่จะโพสต์โค้ด PHP ในชุมชนแห่งนี้ดังนั้นฉันสร้างจากมูลนิธิของเขา มันไม่ได้เป็นที่ชัดเจนกับผมถ้า<?จะรวม / นับในตัวอย่างของฉัน นี่เป็นโพสต์ครั้งแรกของฉันฉันมีความสุขสำหรับทุกคนที่จะอธิบายว่ามีไวยากรณ์ที่ไม่จำเป็น PS ฉันยังอ่านเคล็ดลับสำหรับการเล่นกอล์ฟใน PHPซึ่งดูเหมือนว่าผมชอบเป็นผู้สมัครที่ยอดเยี่ยมสำหรับการโยกย้ายไปยัง Meta

การปรับปรุงที่ทำกับตัวอย่างของ Ismael คือ:

  1. การมอบหมายอย่างไม่มีเงื่อนไขขององค์ประกอบแรกในแต่ละ subarray (การเขียนทับค่า)
  2. Splatpacking แทนการarray_values()ทำดัชนีผลลัพธ์ใหม่


1

Kotlin , 83 ไบต์

{it.mapIndexed{i,c->c to i}.groupBy({(a,b)->a},{(a,b)->b}).map{(a,b)->listOf(a)+b}}

เชิดชู

{
    it.mapIndexed { i, c -> c to i }
        .groupBy({ (a, b) -> a }, { (a, b) -> b })
        .map { (a, b) -> listOf(a) + b }
}

ทดสอบ

var f: (List<Int>) -> List<List<Int>> =
{it.mapIndexed{i,c->c to i}.groupBy({(a,b)->a},{(a,b)->b}).map{(a,b)->listOf(a)+b}}

data class Test(val input: List<Int>, val output: List<List<Int>>)

val tests = listOf(
        Test(listOf(3, 2, 2, 3), listOf(listOf(3, 0, 3), listOf(2, 1, 2))),
        Test(listOf(17), listOf(listOf(17, 0))),
        Test(listOf(1, 1), listOf(listOf(1, 0, 1))),
        Test(listOf(1, 1, 2), listOf(listOf(1, 0, 1), listOf(2, 2))),
        Test(listOf(1, 2, 3, 4), listOf(listOf(1, 0), listOf(2, 1), listOf(3, 2), listOf(4, 3))),
        Test(listOf(1, 1, 1, 1), listOf(listOf(1, 0, 1, 2, 3)))
)

fun main(args: Array<String>) {
    for (c in tests) {
        val o = f(c.input)
        if (o != c.output) {
            throw AssertionError("${c.input} -> $o != ${c.output}")
        }
    }
}

TIO

TryItOnline


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

ทำใหม่เพื่อแก้ไขปัญหาที่เกิดขึ้นโดย @Pavel
jrtapsell

1

สวิฟท์ 4, 107 ไบต์

... อืม

{a in Dictionary(grouping:a.enumerated()){$0.1}.sorted{$0.1.first!.0<$1.1.first!.0}.map{[$0]+$1.flatMap{$0.0}}}

Ungolfed:

let f = { (input: [Int]) -> [[Int]] in
    return Dictionary(grouping: input.enumerated(), by: { $0.element })
        .sorted { pairA, pairB in // Sort by order of first appearence (lowest offset)
            return pairA.value.first!.offset < pairB.value.first!.offset
        }.map { element, pairs in
            return [element] + pairs.map{ $0.offset /* +1 */} // add 1 here for 1 based indexing
        }
}

มันแย่มากที่พจนานุกรมสูญเสียการสั่งซื้อบังคับให้ฉันต้องเสียอักขระจำนวนมากในการเรียงลำดับอีกครั้ง การเรียงลำดับของการละเมิดของข้อโต้แย้งปิดโดยปริยาย (นี่$0, $1, ... ) และสมาชิก tuple นัย ( .0, .1... ) เป็น uhhhhh ไม่สวย



1

Ruby , 54 52 ไบต์

->a{a.map{|i|[i]+(0..a.size).select{|j|a[j]==i}}|[]}

รุ่นนี้อนุญาตให้ไม่มี (53 ไบต์):

->a{a.map{|i|[i]+(0...a.size).select{|j|a[j]==i}}|[]}

ลองออนไลน์!


ความท้าทายที่ระบุอาร์เรย์จะมีจำนวนเต็มบวกเท่านั้นและจะมีองค์ประกอบอย่างน้อยหนึ่งรายการ nilไม่ใช่จำนวนเต็มบวก
Pavel

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