สิ่งอันดับตามลำดับขั้นตอนผ่านรายการในรายการ


9

ท้าทาย:

ได้รับรายชื่อของรายการว่างของจำนวนเต็มกลับรายการ tuples ของรูปแบบต่อไปนี้: ครั้งแรก tuples รายการเริ่มต้นด้วยองค์ประกอบของรายการแรกตามด้วยองค์ประกอบแรกของทุกรายการที่ตามมาแต่ละครั้งดังนั้น tuple ith [ith element of first list, first element of second list, ... , first element of last list]ที่ควรจะเป็น ตัวอย่างเช่น:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]] => [[1, 4, 7], [2, 4, 7], [3, 4, 7], ...

จากนั้นทำ tuples ของแบบฟอร์ม[last element of first list, ith element of second list, first element of third list, ..., first element of last list]ดังนั้นในตัวอย่างของเรานี้จะเป็น:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]] =>  ..., [3, 4, 7], [3, 5, 7], [3, 6, 7], ...

ดำเนินการต่อในรายการที่เหลือแต่ละรายการจนกว่าคุณจะไปที่[last element of first list, ..., last element of second to last list, ith element of last list]:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]] => ..., [3, 6, 7], [3, 6, 8], [3, 6, 9]]

ผลลัพธ์แบบเต็มมีดังนี้:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]] => 
        [[1, 4, 7], [2, 4, 7], [3, 4, 7], [3, 5, 7], [3, 6, 7], [3, 6, 8], [3, 6, 9]]

บางสำเร็จรูปสำหรับวัดที่ดี:

  • ถ้าคุณต้องการให้อินพุตเป็นรายการของสตริงหรือรายการของจำนวนเต็มบวกก็ไม่เป็นไร คำถามเกี่ยวกับการจัดการรายการไม่ใช่เกี่ยวกับสิ่งที่อยู่ในรายการ
  • input และ output สามารถอยู่ในรูปแบบที่ยอมรับใด
  • อนุญาตให้ใช้โปรแกรมหรือฟังก์ชั่นเต็มรูปแบบได้
  • ช่องโหว่มาตรฐานจะไม่ได้รับอนุญาตตามค่าเริ่มต้น
  • คำถามนี้คือการเขียนโค๊ตดังนั้นจำนวนไบต์ที่น้อยที่สุดจึงชนะ

ตัวอย่าง:

[] => [[]] (or an error, thanks to ngn for correcting the output in this case)

[[1]] => [[1]]

[[1, 2], [3, 4], [5]] => [[1, 3, 5], [2, 3, 5], [2, 4, 5]]

[[1], [2], [5, 6], [3], [4]] => [[1, 2, 5, 3, 4], [1, 2, 6, 3, 4]]

[[1, 2, 3], [4, 5]] => [[1, 4], [2, 4], [3, 4], [3, 5]]

[[1, 2, 3], []] => unspecified behavior (can be an error)

[[3, 13, 6], [9, 2, 4], [5, 10, 8], [12, 1, 11], [7, 14]] => 
     [[3, 9, 5, 12, 7], [13, 9, 5, 12, 7], [6, 9, 5, 12, 7], [6, 2, 5, 12, 7], 
      [6, 4, 5, 12, 7], [6, 4, 10, 12, 7], [6, 4, 8, 12, 7], [6, 4, 8, 1, 7], 
      [6, 4, 8, 11, 7], [6, 4, 8, 11, 14]]  

[[16, 8, 4, 14, 6, 7, 10, 15], [11, 1, 12, 2, 19, 18, 9, 3], [13, 5, 17]] =>
    [[16, 11, 13], [8, 11, 13], [4, 11, 13], [14, 11, 13], [6, 11, 13], 
     [7, 11, 13], [10, 11, 13], [15, 11, 13], [15, 1, 13], [15, 12, 13], [15, 2, 13], 
     [15, 19, 13], [15, 18, 13], [15, 9, 13], [15, 3, 13], [15, 3, 5], [15, 3, 17]]

หากใครมีชื่อที่ดีกว่าให้ฉันรู้


1
ฉันมีความรู้สึกที่[] => []ควรจะเป็น[] => [[]]แต่ไม่สามารถหาคำเพื่ออธิบายว่าทำไม
ngn

1
@ngn คุณพูดถูกต้องน่าจะเป็น[[]]เพราะมีสิ่งอันดับเดียวที่มีหนึ่งรายการจากแต่ละรายการย่อย (ศูนย์) อาจเป็นเรื่องที่น่ารำคาญเกินกว่าที่จะกำหนดให้โปรแกรมส่งออกอย่างถูกต้องดังนั้นฉันจะบอกว่าไม่จำเป็น
ฮูด

1
ใช่[]คือพูดอย่างเคร่งครัดรายการว่างเปล่าของรายการที่ไม่ว่างเปล่า แต่ผลลัพธ์ไม่ชัดเจนระหว่าง[]และ[[]]ถ้าเป็นอินพุตที่อนุญาต ("สิ่งอันดับแรกอันดับที่เริ่มต้นด้วยแต่ละองค์ประกอบของรายการแรก ... " - ไม่มีรายการแรกดังนั้นเราจึงเสร็จแล้ว -> [])
Jonathan Allan

1
@JonathanAllan ผมเชื่อว่าตอนนี้ที่ "ถูกต้อง" เอาท์พุทสำหรับควรจะเป็น[] [[]]ยกตัวอย่างเช่นจำนวน tuples ออกเป็นsum(inner list lengths) - length of outer list + 1ซึ่งในกรณีที่ว่างเปล่าให้1ซึ่งเป็นความยาวของแต่ไม่ได้ความยาวของ[[]] []นี่เป็นปัญหาเล็กน้อยที่เกิดขึ้นจริง ๆ ...
Hood

1
เราสามารถสรุปได้ว่ารายการทั้งหมดนั้นแตกต่างกันหรือไม่? หรือยิ่งการเปลี่ยนแปลงบน 1..n ชอบในตัวอย่างของคุณ?
xnor

คำตอบ:


5

JavaScript (ES6), 59 ไบต์

คาดว่ารายชื่อของรายการของบวกจำนวนเต็ม

f=a=>[a.map(a=>a[0]),...a.some(a=>a[1]&&a.shift())?f(a):[]]

ลองออนไลน์!

อย่างไร?

ในแต่ละรอบ:

  • เราแสดงรายการใหม่ที่ประกอบด้วยองค์ประกอบแรกของแต่ละรายการ
  • เราลบองค์ประกอบแรกของรายการแรกที่มีอย่างน้อย 2 องค์ประกอบและทำซ้ำกระบวนการ หรือเราหยุดการสอบถามซ้ำหากไม่มีรายการดังกล่าวอยู่

1
ว่าa.someเคล็ดลับคือน่ากลัว!
ETHproductions

1
@ETHproductions ตอนนี้กำลังมองหาความท้าทายที่การใช้งานawe.someจะไม่เป็นการสิ้นเปลืองไบต์ ... :)
Arnauld

2

Python 2 , 62 ไบต์

lambda M:[zip(*M)[l.pop(0)*0]for l in M+[[1,1]]for _ in l[1:]]

ลองออนไลน์!

การใช้ความคิดป๊อป Chas บราวน์แรงบันดาลใจจากการส่ง JS Arnauld ของ


Python 2 , 68 ไบต์

M=input()
for l in[[0,0]]+M:
 for x in l[1:]:l[0]=x;print zip(*M)[0]

ลองออนไลน์!

เปลี่ยนแปลงองค์ประกอบแรกของรายการเพื่อเก็บค่าที่ต้องการ [[0,0]]+เป็นสับน่าเกลียดที่จะพิมพ์ค่าแรกเริ่มต้น


2

เยลลี่ 15 ไบต์

ẈṚṪ×€PƊƤFQṚCịŒp

ลองออนไลน์! (ส่วนท้ายแสดงรายการที่ส่งคืนจริงแทนที่จะเป็นตัวแทนของ Jelly)

อย่างไร?

จัดทำดัชนีเป็นผลิตภัณฑ์คาร์ทีเซียนของรายการตามจุดที่กำหนด ...

ẈṚṪ×€PƊƤFQṚCịŒp - Link: list of lists  e.g. [[6,8,4,9],[7,1,5],[3,2]]
Ẉ               - length of each            [4,3,2]
 Ṛ              - reverse                   [2,3,4]
       Ƥ        - for each prefix:             [2]      [2,3]      [2,3,4]
      Ɗ         -   last 3 links as a monad:
  Ṫ             -     tail (pop rightmost)     2        3          4
     P          -     product (of remaining)   1        2          6
    €           -     for €ach (range tail)    [1,2]    [1,2,3]    [1,2,3,4]   
   ×            -       multiply               [1,2]    [2,4,6]    [6,12,18,24]
        F       - flatten                   [1,2,2,4,6,6,12,18,24]
         Q      - de-duplicate              [1,2,4,6,12,18,24]
          Ṛ     - reverse                   [24,18,12,6,4,2,1]
           C    - complement (1-x)          [-23,-17,-11,-5,-3,-1,0]
             Œp - Cartesian product (of the input)
                -         -> [[6,7,3],[6,7,2],[6,1,3],[6,1,2],[6,5,3],[6,5,2],[8,7,3],[8,7,2],[8,1,3],[8,1,2],[8,5,3],[8,5,2],[4,7,3],[4,7,2],[4,1,3],[4,1,2],[4,5,3],[4,5,2],[9,7,3],[9,7,2],[9,1,3],[9,1,2],[9,5,3],[9,5,2]]
            ị   - index into (1-based & modular)
                -   indexes:      -23,                                            -17,                                            -11,                                             -5,             -3,             -1,     0
                -    values: [[6,7,3],                                        [8,7,3],                                        [4,7,3],                                        [9,7,3],        [9,1,3],        [9,5,3],[9,5,2]]
                -         -> [[6,7,3],[8,7,3],[4,7,3],[9,7,3],[9,1,3],[9,5,3],[9,5,2]]

ẈṚ’ṣ1T$¦ƬUṚị"€(14 ไบต์) ล้มเหลวสำหรับอินพุตที่มีความยาว (ไม่ต่อท้าย) หนึ่งรายการ แต่อาจṣ1T$ถูกแทนที่ด้วยอย่างอื่นได้หรือไม่


2

K (ngn / k) , 40 21 19 18 ไบต์

{x@'/:?|\+|!|#:'x}

ลองออนไลน์!

ใช้แนวคิดจากคำตอบของ @ H.PWiz

{ } ฟังก์ชั่นที่มีข้อโต้แย้ง x

#:' ความยาวของแต่ละ

| ถอยหลัง

! ดัชนี tuples ทั้งหมดสำหรับอาร์เรย์ที่มีมิติเหล่านั้นเป็นคอลัมน์ในเมทริกซ์ (รายการของรายการ)

| ถอยหลัง

+ transpose

|\ ทำงานสูงสุด

? เป็นเอกลักษณ์

x@'/: ใช้ tuple แต่ละรายการทางด้านขวาเป็นดัชนีในรายการที่เกี่ยวข้อง x


1

ถ่าน 33 ไบต์

IE⊕ΣEθ⊖LιEθ§λ⌈⟦⁰⌊⟦⊖Lλ⁻ι∧μΣE…θμ⊖Lν

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

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

E⊕ΣEθ⊖Lι

ใช้ผลรวมของความยาวของรายการและลบความยาวของรายการ จากนั้นวนจาก 0 ถึงค่านี้รวม

Eθ§λ

แมปรายการของรายการและดัชนีลงในแต่ละรายการ

⌈⟦⁰⌊⟦⊖Lλ

แคลมป์ดัชนีเป็น 0 และดัชนีสุดท้ายในรายการ (วงเล็บปิดมีความหมายโดยนัย)

⁻ι∧μΣE…θμ⊖Lν

หลังจากรายการแรกให้ลบความยาวที่ลดลงของรายการก่อนหน้าทั้งหมดจากดัชนีด้านนอกสุด (วิธีนี้ใช้ไม่ได้กับรายการแรกเนื่องจากความยาวของรายการว่างเปล่าและผลรวมไม่ได้เป็นตัวเลข)



1

APL (Dyalog Classic) , 32 30 27 ไบต์

1↓¨∪⊃{(⍵,¨⊃⍺),⍺,¨⍨⊢/⍵}/⌽0,⎕

ลองออนไลน์!

โปรแกรมที่สมบูรณ์อินพุตจากแป้นพิมพ์ ( )

สำหรับอินพุต[]เอาต์พุต[[]](เทียบเท่า APL ของพวกเขา0⍴⊂⍬และ,⊂⍬)

ถือว่าตัวเลขที่ไม่ซ้ำกันในการป้อนข้อมูล


1
ไม่ใช่ว่ามันสร้างความแตกต่างให้กับเอาต์พุต แต่ฉันคิดว่าอินพุตสำหรับการทดสอบครั้งที่สองควรเป็น ,⊂,1
H.PWiz

@ H.PWiz ที่เหมาะสมคงที่, ไชโย
NGN

1

JavaScript (ES6), 58 54 ไบต์

h=(x,s)=>[x.map(y=>s|y?y[0]:s=y.shift()),...s?h(x):[]]

หลังจากพยายามเล่นรหัสของฉันมากกว่า 14 ครั้ง (ลบอินสแตนซ์ทั้งหมดในขณะที่ลูปpushและconcat) ฉันไปถึงอัลกอริทึมการทำซ้ำคล้ายกับคำตอบของ @ Arnauldไม่แปลกใจเลยว่ามันสั้นแค่ไหน!

ยอมรับรายการของจำนวนเต็มบวก ลองออนไลน์!

58 ไบต์

สำหรับอีก 1 ไบต์การแทนที่s = y.shift()ด้วยy.shift(s = 1)ควรจัดการกับจำนวนเต็มทั้งหมด (น่าจะเป็นเพราะฉันไม่ได้ทำการทดสอบด้วยตนเอง)

h=(x,s)=>[x.map(y=>!s/y[1]?s=y.shift():y[0]),...s?h(x):[]]

58 ไบต์

รุ่นโบนัสพร้อมการจัดเรียงใหม่เล็กน้อย:

h=x=>[x.map(y=>s&&y[1]?y.shift(s=0):y[0],s=[]),...s||h(x)]

คำอธิบาย

โค้ดรุ่นแรกพยายามแก้ไข clone ของ (อาร์เรย์ของ) องค์ประกอบแรกของแต่ละอาร์เรย์ แต่ขั้นตอนพิเศษของการเริ่มต้นอาร์เรย์นั้นมีราคาแพง ... จนกว่าฉันจะรู้ว่าการจับคู่องค์ประกอบแรกของแต่ละอาร์เรย์นั้นคร่าวๆ การดำเนินการ "เท่านั้น" จำเป็นถ้าฉันกลายพันธุ์อาร์เรย์เดิม

ใช้แฟล็กบูลีนเพื่อตรวจสอบว่ามีอาร์เรย์ใดที่เลื่อน (เช่นย่อ) ทำการตรวจสอบเงื่อนไขลงไปเพิ่มเติมโดยสังเกตว่า JS coerces อาร์เรย์ที่มีค่าตัวเลขเป็นองค์ประกอบเดียวในตัวเลขนั้นในขณะที่การบังคับใช้อาร์เรย์ที่มีหลายค่าเป็น NaN

var
h = (x, s) => 
    [
        x.map(y =>                 // map to first element of each array
            s|y                    // if s == 1 (i.e. an array has been shortened)
                                   // or the current array y has length == 1
                ? y[0]
                : s = y.shift()    // remove first element of y and set s to truthy
        ),
        ...s ? h(x) : []           // only concatenate a recurrence of the function if an array has had a value removed
    ]

1

APL (Dyalog) 15 ไบต์ ( SBCS )

ขอบคุณ ngn ที่ชี้ให้เห็นไบต์ที่ไม่จำเป็น

{∪⌈\,⍉⍳≢¨⍵}⊃¨¨⊂

ลองออนไลน์!

{∪⌈\,⍉⍳≢¨⍵}สร้างรายการเพื่อจัดทำดัชนีลงในอินพุต เช่น(1 2 3) (4 5 6) (7 8 9) -> (0 0 0) (1 0 0) (2 0 0) (2 1 0) (2 2 0) (2 2 1) (2 2 2)

≢¨⍵: ความยาวของแต่ละรายการในอินพุต

,⍉⍳สร้างชุดค่าผสมของตัวเลขทั้งหมดจนถึงอินพุต เช่น2 3 -> (0 0) (1 0) (0 1) (1 1) (0 2) (1 2)

⌈\: สแกนด้วยค่าสูงสุด เช่นตัวอย่างข้างต้นตอนนี้จะเป็น(0 0) (1 0) (1 1) (1 1) (1 2) (1 2)

: ลบรายการที่ซ้ำ

⊃¨¨⊂ การทำดัชนีจะคำนึงถึงความลึกของการโต้แย้งอย่างใดอย่างหนึ่งหรือไม่


คำตอบที่ดี! คุณตีฉันเกือบครึ่งไบต์ ดูเหมือนว่าไม่จำเป็น
ngn


@ngn ดีฉันจำไม่ได้ว่าอะไรทำให้ฉันคิดว่ามันเป็น ขอบคุณ!
H.PWiz

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