การใช้ชุดกำลังไฟที่สั้นที่สุด


22

นิยามปัญหา

พิมพ์ powerset ของชุดที่กำหนด ตัวอย่างเช่น:

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

แต่ละองค์ประกอบจะถูกพิมพ์บนบรรทัดแยกดังนั้นตัวอย่างข้างต้นจะถูกพิมพ์เป็น:

[]
[1]
[2]
...
[1, 2, 3]

โค้ดตัวอย่าง (ในตัวอย่าง D, python ที่นี่ ):

import std.stdio;

string[][] powerset(string[] set) {
    if (set.length == 1) {
        return [set, []];
    }

    string[][] ret;
    foreach (item; powerset(set[1 .. $])) {
        ret ~= set[0]~item;
        ret ~= item;
    }

    return ret;
}

void main(string[] argv) {
    foreach (set; powerset(argv[1 .. $]))
        writeln(set);
}

อินพุต

องค์ประกอบจะถูกส่งเป็นอาร์กิวเมนต์ ตัวอย่างเช่นตัวอย่างที่ให้ไว้ด้านบนจะถูกส่งผ่านไปยังโปรแกรมที่เรียกว่าpowerset:

powerset 1 2 3

อาร์กิวเมนต์จะเป็นตัวอักษรและตัวเลข

กฎระเบียบ

  1. ไม่มีไลบรารีนอกเหนือจาก io
  2. ไม่จำเป็นต้องสั่งเอาท์พุท
  3. Powerset ไม่จำเป็นต้องจัดเก็บพิมพ์เฉพาะ
  4. องค์ประกอบในชุดที่จะต้องคั่นด้วย (เช่น1,2,3, [1,2,3]และ['1','2','3']เป็นที่ยอมรับ แต่123ไม่ได้เป็น
    • ตัวคั่นต่อท้ายใช้ได้ดี (เช่น1,2,3, == 1,2,3)
  5. ดีที่สุดถูกกำหนดตามจำนวนไบต์

ทางออกที่ดีที่สุดจะได้รับการตัดสินไม่น้อยกว่า 10 วันหลังจากการส่งครั้งแรก


เกี่ยวข้องอย่างใกล้ชิดกับcodegolf.stackexchange.com/questions/6380
Peter Taylor

เกี่ยวข้อง: codegolf.stackexchange.com/q/51468/21348
edc65

2
หากมีการอัปเดตเฉพาะความท้าทายนี้เพื่ออนุญาตค่าเริ่มต้นเช่นการกลับมาและฟังก์ชั่น งูหลามจะเป็น 54 lambda L:reduce(lambda r,x:r+[s+[x]for s in r],L,[[]])ไบต์:
mbomb007

ฉันไม่เห็นด้วยในการพิมพ์เท่านั้น ... ทำไมไม่อนุญาตให้มีข้อมูลตัวแปรเกินไป .. ทำไมพิมพ์ในคอลัมน์และไม่อยู่ในแถว?
RosLuP

คำตอบ:


15

Mathematica 16

รหัส

Subsets มีถิ่นกำเนิดใน Mathematica

Column@Subsets@s

รหัส (ไม่มีคอลัมน์) สามารถตรวจสอบได้ใน WolframAlphaWolframAlpha (ฉันต้องใช้วงเล็บแทน@พวกเขาหมายถึงสิ่งเดียวกัน

การใช้

s={1,2,3}
Column@Subsets@s

output


วิธีนี้ (55 ตัวอักษร) ใช้วิธีการที่แนะนำโดย @ w0lf

s #&/@Tuples[{0,1},Length@s]/.{0:>Sequence[]}//Column

ทำให้พังถล่ม

สร้างสิ่งอันดับประกอบด้วย0และ1 's ความยาวLength[s]

Tuples[{0, 1}, Length@s]

{{0, 0, 0}, {0, 0, 1}, {0, 1, 0}, {0, 1, 1}, {1, 0, 0}, {1, 0, 1}, { 1, 1, 0}, {1, 1, 1}}

ทวีคูณรายการดั้งเดิม (เวกเตอร์) โดยแต่ละ tuple:

s # & /@ Tuples[{0, 1}, Length@s]

{{0, 0, 0}, {0, 0, 3}, {0, 2, 0}, {0, 2, 3}, {1, 0, 0}, {1, 0, 3}, { 1, 2, 0}, {1, 2, 3}}

ลบ 0ของ %เป็นชวเลขสำหรับ "ผลลัพธ์ก่อนหน้า"

% / {0:> ลำดับ []}

{{}, {3}, {2}, {2, 3}, {1}, {1, 3}, {1, 2}, {1, 2, 3}}

แสดงในคอลัมน์:

Mathematica graphics


@tjameson ฉันมีข้อสงสัยอย่างจริงจังเกี่ยวกับว่าฉันควรโพสต์หรือไม่ แต่ฉันคิดว่าบางคนอาจพบว่ามันน่าสนใจที่จะรู้ว่ามันมีอยู่ในตัว
DavidC

ฉันคิดว่ามันน่าสนใจ :)
ดร. เบลิซาเรี

คุณสามารถละทิ้งsและวางอินพุตที่ท้ายบรรทัดได้หรือไม่?
โซโลมอน Ucko

15 ไบต์: Subsets/*Columnสร้างฟังก์ชันที่ไม่ระบุชื่อซึ่งรับรายการและส่งคืนการแสดงผลในคอลัมน์
ชาวโรมัน

9

C, 118 115

ในขณะที่สามารถบันทึกได้ประมาณ 20 ตัวอักษรด้วยการจัดรูปแบบที่ง่ายกว่า แต่ก็ยังไม่ชนะในแง่ของรหัสกอล์ฟทั้งสองทาง

x,i,f;
main(int a,char**s){
    for(;x<1<<a;x+=2,puts("[]"+f))
        for(i=f=0;++i<a;)x&1<<i?f=!!printf("%c%s","[,"[f],s[i]):0;
}

การทดสอบ:

/a.out 1 2 3
[]
[1]
[2]
[1,2]
[3]
[1,3]
[2,3]
[1,2,3]

ดี เคล็ดลับ: K & R สไตล์ ( main(a,s)char**s;{...}) จะสั้นกว่าf|=x&1<<i&&printf ?:
ugoren

เพิ่งรู้ว่ามีอะไรอยู่ข้างหลังx+=2(และs[0]ไปไหน) เคล็ดลับที่ดีจริงๆ
ugoren

ปฏิเสธที่จะเล่นกอล์ฟกับคำตอบของคุณเพราะมัน "ยังไม่ชนะในแง่ของรหัสกอล์ฟทั้งสองทาง" ทำให้คำตอบไม่ใช่คู่แข่งที่ร้ายแรงสำหรับเกณฑ์การชนะของการท้าทาย
pppery

7

GolfScript, 22 18 ตัวอักษร

~[[]]{{+}+1$%+}@/`

ความพยายามอีกครั้งใน GolfScript ด้วยอัลกอริทึมที่แตกต่างอย่างสิ้นเชิง รูปแบบอินพุตเหมือนกับคำตอบของ w0lf ( ทดสอบออนไลน์ )


+1 สุดยอดทางออก! Mine ได้รับการปรับปรุงใหม่เพื่อให้สามารถอ่านได้ :-P
Cristian Lupascu

5

GolfScript (43 ตัวอักษร)

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

"#{ARGV.join('
')}"n/[[]]\1/{`{1$+.p}+%}%p;

เช่น

$ golfscript.rb powset.gs 1 2 3
["1"]
["2"]
["2" "1"]
["3"]
["3" "2"]
["3" "1"]
["3" "2" "1"]
[]

ไม่จำเป็นต้องใส่เครื่องหมายคำพูดหากมันสร้างความแตกต่าง
beatgammit

@tjameson คำพูดมาจากการใช้วิธีที่สั้นที่สุดในการพิมพ์ ความจริงที่ว่าค่าเหล่านั้นเป็นสตริงแทนที่จะเป็นจำนวนเต็มมาจากความไม่สามารถของ GolfScript ในการเข้าถึงอาร์กิวเมนต์บรรทัดคำสั่งโดยตรง: มันต้องพึ่งพาล่ามที่ทำ Eval ใน Ruby และวางผลลัพธ์ในสตริง
ปีเตอร์เทย์เลอร์

4

awk (82)

{for(;i<2^NF;i++){for(j=0;j<NF;j++)if(and(i,(2^j)))printf "%s ",$(j+1);print ""}}

สมมติว่าบันทึกในไฟล์ powerset.awk, การใช้งาน

$ echo 1 2 3 | awk -f powerset.awk

1
2
1 2
3
1 3
2 3
1 2 3

ป.ล.ถ้า awk ของคุณไม่มีและ () ฟังก์ชันแทนที่ด้วยint(i/(2^j))%2แต่เพิ่มสองเข้าไปในการนับ


(2^j)-> 2^jช่วยให้คุณประหยัด 2 ไบต์; .awkไฟล์ยังใช้งานได้โดยไม่ต้องต่อท้าย\nเพื่อให้คุณสามารถโกนไบต์อีก
mklement0

3

JavaScript, 98

น่าเสียดายที่มีการใช้การจัดรูปแบบผลลัพธ์ที่ดี

for(n in a=eval(prompt(i=p=[[]])))
    for(j=i+1;j;)
        p[++i]=p[--j].concat(a[n]);
alert('[]'+p.join('\n'))

อินพุต

รับอาร์เรย์ JavaScript (เช่น [1,2,3])

เอาท์พุต

[]
1
1,2
2
2,3
1,2,3
1,3
3

3

Python ( 74 70 ตัวอักษร)

def p(a,v):
 if a:i,*a=a;p(a,v);p(a,v+[i])
 else:print v
p(input(),[])

สำหรับอินพุต1,2,3หรือ[1,2,3]เอาต์พุตคือ:

[]
[3]
[2]
[2, 3]
[1]
[1, 3]
[1, 2]
[1, 2, 3]

[a[0]]=a[:1]
ugoren

ด้วยอินพุต1,2,3 a[:1]ไม่ทำงาน ไม่อนุญาตรายการ tuple + มีทางออกที่ดีกว่า
AMK

+1 สำหรับi,*a=a
primo

i,*a=aPython 3 ไม่ใช่หรือ มันใช้ไม่ได้กับ 2.7.1 ของฉัน
ugoren

หรือวันที่ 2.7.2 นั่นอาจอธิบายได้ว่าทำไมฉันไม่เคยเห็นกลอุบายนั้นมาก่อน ... โค้ดเซิร์ฟเวอร์กอล์ฟส่วนใหญ่รัน 2.7.x
โม่

3

Python 70 67 ไบต์

def p(a,*v):
 i=0;print v
 for n in a:i+=1;p(a[i:],n,*v)
p(input())

ป้อนข้อมูลดำเนินการในลักษณะเดียวกันกับการแก้ปัญหาของ ugoren ตัวอย่าง I / O:

$ echo [1,2,3] | powerset.py
()
(1,)
(2, 1)
(3, 2, 1)
(3, 1)
(2,)
(3, 2)
(3,)

1
คุณสามารถบันทึกบางคนที่มีแล้วdef p(a,*v) p(a[i:],n,*v)การส่งออกจะค่อนข้างน่าเกลียด แต่ก็ยังตกลง
ugoren

ฉลาดมากขอบคุณสำหรับเคล็ดลับ
โม่

3

J, 19 ตัวอักษร

   (<@#~#:@i.@(2&^)@#)

   (<@#~#:@i.@(2&^)@#) 1 2 3
┌┬─┬─┬───┬─┬───┬───┬─────┐
││3│2│2 3│1│1 3│1 2│1 2 3│
└┴─┴─┴───┴─┴───┴───┴─────┘

ascii Boxing ในผลลัพธ์ถูกเรียกboxingและให้การสะสมเฮเทอโรจีน (สำหรับความยาวของอาร์เรย์ที่แตกต่างกันที่นี่)


2

Golfscript 48

~:x,:§2\?,{[2base.,§\-[0]*\+x\]zip{~{}{;}if}%p}%

โปรแกรมนี้ใช้การแทนเลขฐานสองของตัวเลขตั้งแต่ 0 ถึงความยาว (อินพุต) เพื่อสร้างรายการ powerset

อินพุต

รูปแบบอินพุตเป็นรูปแบบอาร์เรย์ Golfscript (ตัวอย่าง: [1 2 3] )

เอาท์พุต

เอาท์พุทคือชุดของอาร์เรย์ที่คั่นด้วยการขึ้นบรรทัดใหม่แสดงถึงชุดไฟ ตัวอย่าง:

[]
[3]
[2]
[2 3]
[1]
[1 3]
[1 2]
[1 2 3]

แบบทดสอบออนไลน์

โปรแกรมที่สามารถผ่านการทดสอบออนไลน์ที่นี่


ยอดเยี่ยม แต่คุณสามารถคั่นด้วยบรรทัดใหม่ได้หรือไม่
beatgammit

@tjameson ฉันจัดการเพื่อคั่นผลลัพธ์ด้วยการขึ้นบรรทัดใหม่ในขณะที่ยังคงรักษาจำนวนตัวอักษรเดิม โปรดดูการอัปเดตคำตอบของฉัน
Cristian Lupascu

2

Haskell (96)

นำเข้าการควบคุม
นำเข้าระบบสิ่งแวดล้อม
main = getArgs >> = mapM print.filterM (\ _-> [เท็จ .. ])

หากControl.Monadไม่อนุญาตให้นำเข้าสิ่งนี้จะกลายเป็น100ตัวอักษร:

นำเข้าระบบสิ่งแวดล้อม
main = getArgs >> = mapM print.p
pz = case z ของ {[] -> [[]]; x: y-> p y ++ แผนที่ (x:) (py)}


2

APL (26)

อ่านอินพุตจากแป้นพิมพ์เพราะไม่มีอะไรargvเทียบเท่า

↑⍕¨(/∘T)¨↓⍉(M/2)⊤⍳2*M←⍴T←⎕

การใช้งาน:

      ↑⍕¨(/∘T)¨↓⍉(M/2)⊤⍳2*M←⍴T←⎕
⎕:
      1 2 3
3    
2    
2 3  
1    
1 3  
1 2  
1 2 3

คำอธิบาย:

  • T←⎕: อ่านอินพุตเก็บไว้ใน T
  • M←⍴T: ความยาวของร้านค้าTในM
  • (M/2)⊤⍳2*M: สร้างรูปแบบบิตสำหรับ1สูงสุด2^Mโดยใช้Mบิต
  • ↓⍉: แบ่งเมทริกซ์เพื่อให้แต่ละรูปแบบบิตแยกกัน
  • (/∘T)¨: Tสำหรับรูปแบบบิตแต่ละเลือกผู้ย่อยรายการจาก
  • ↑⍕¨: สำหรับผลลัพธ์ให้รับการแทนค่าสตริงของแต่ละองค์ประกอบ (เพื่อให้มันเติมโดยใช้ช่องว่างและไม่ใช่ศูนย์) และจัดรูปแบบเป็นเมทริกซ์ (เพื่อให้แต่ละองค์ประกอบอยู่ในบรรทัดของตัวเอง)


2

JavaScript ( ES6 ) 76

คัดลอกบางส่วนจากอันนี้: /codegolf//a/51502/21348

ใช้บิตแมปดังนั้นมันจึงถูก จำกัด ให้ไม่เกิน 32 องค์ประกอบ

เรียกใช้ตัวอย่างใน Firefox เพื่อทดสอบ

f=l=>{ 
  for(i=0;i<1<<l.length;i++)
    console.log(l.filter(v=>[i&m,m+=m][0],m=1))
}  

// TEST

// Redefine console to have output inside the page
console = { log: (...p) => O.innerHTML += p.join(' ') + '\n' }

test=()=>{
  var set = I.value.match(/[^ ,]+/g)
  O.innerHTML='';
  f(set);
}

test()
#I,#O { border: 1px solid #aaa; width: 400px; padding:2px}
Insert values, space or comma separated:<br>
<input id=I value='1 2 3'> <button onclick="test()">-></button>
<pre id=O></pre>


2

C # 164

ผู้ชายคนนี้เป็นเรื่องยากใน C #!

void P<T>(T[]c){foreach(var d in c.Aggregate<T,IEnumerable<IEnumerable<T>>>(new[]{new T[0]},(a,b)=>a.Concat(a.Select(x=>x.Concat(new[]{b})))))Console.WriteLine(d);}

2

Python 2, 64 ไบต์

การใช้อินพุตที่คั่นด้วยเครื่องหมายจุลภาค:

P=[[]]
for i in input():P+=[s+[i]for s in P]
for s in P:print s

Pyth, 4 ไบต์ (ใช้ builtin) หรือ 14 ไบต์ (ไม่รวม)

ตามที่ระบุไว้โดย @Jakube ในความคิดเห็น Pyth นั้นล่าสุดสำหรับคำถามนี้ ยังคงเป็นวิธีการแก้ปัญหาโดยใช้ตัวดำเนินการ powerset Pyth ของ:

jbyQ

และนี่คือสิ่งที่ขาดไม่ได้:

jbu+Gm+d]HGQ]Y

คุณสามารถลองแก้ปัญหาทั้งที่นี่และที่นี่ นี่คือคำอธิบายของโซลูชันที่สอง:

jb       # "\n".join(
 u       #  reduce(
  +G     #   lambda G,H: G+
   m     #    map(
    +d]H #     lambda d: d+[H],
    G    #     G),
  Q      #   input()
  ]Y     #   [[]]))

2

brainfuck, 94 ไบต์

+[[<+>>+<-]++[>-<------]>-[>]<<[>>+>]>,]++++++++++[[[<]<]+[-[>[.>]]<[<]>+[>]>]<<
.[<<[<]>-]++>]

จัดรูปแบบ:

+
[
  [<+> >+<-]
  ++[>-<------]>-[>]
  <<[>>+>]
  >,
]
++++++++++
[
  [[<]<]
  +
  print
  [
    -[>[.>]]
    <[<]
    >+[>]
    >
  ]
  <<.
  increment
  [
    <<[<]
    >-
  ]
  ++>
]

คาดหวังอินพุตของฟอร์ม9,10,11โดยไม่ขึ้นบรรทัดใหม่และชุดย่อยเอาต์พุตในรูปแบบเดียวกันบางครั้งมีคอมม่าต่อท้าย บรรทัดแรกที่พิมพ์จะว่างเสมอแสดงถึงชุดที่ว่างเปล่า

ลองออนไลน์

แนวคิดพื้นฐานคือการวางบิตถัดจากแต่ละองค์ประกอบจากนั้นเพิ่มเลขฐานสองซ้ำ ๆ ในขณะที่พิมพ์ชุดย่อยที่สอดคล้องกันก่อนที่จะเพิ่มขึ้นแต่ละครั้ง (บิตระบุว่าองค์ประกอบอยู่ในชุดย่อยหรือไม่) บิตของ Sentinel ทางด้านซ้ายของอาร์เรย์จะถูกใช้เพื่อยกเลิกโปรแกรม รุ่นนี้จะสร้างจำนวนรักษาการแทนเพื่อบันทึกบางไบต์; โซลูชั่น 99- ไบต์ที่มีประสิทธิภาพมากขึ้นที่ใช้ Sentinel เพียงตัวเดียวเท่านั้นที่สามารถพบได้ในประวัติการแก้ไข

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


2

APL (Dyalog Classic)ขนาด 13 ไบต์

⍪,⊃∘.,/⎕,¨⊂⊂⍬

ลองออนไลน์!

เอาท์พุท:

 1 2 3 
 1 2   
 1 3   
 1     
 2 3   
 2     
 3     

มีบรรทัดว่างที่ท้ายเพื่อแสดงชุดที่ว่างเปล่า

คำอธิบาย:

การประเมินการป้อนข้อมูล

⎕,¨⊂⊂⍬ ต่อท้ายรายการตัวเลขที่ว่างหลังแต่ละองค์ประกอบ

∘., ผลิตภัณฑ์คาร์ทีเซียน

/ ลด (foldr)

เปิดเผย (จำเป็นหลังจากลด APL)

ณ จุดนี้ผลลัพธ์จะเป็นอาร์เรย์ n-dimension 2-by -...- by-2 โดยที่ n คือความยาวของอินพุต

, แผ่เป็นเวกเตอร์

เปลี่ยนเวกเตอร์ให้เป็นเมทริกซ์ตั้งตรง 2 n -by-1 ดังนั้นเซตย่อยแต่ละอันจึงอยู่บนเส้นแยก


2

Haskell , 80 78 ไบต์

import System.Environment
main=getArgs>>=mapM(print.concat).mapM(\a->[[a],[]])

ลองออนไลน์!


ข้อกำหนด I / O นั้นแย่มาก แต่ผู้คนตีความพวกเขาค่อนข้างหลวม ถ้าคุณเปลี่ยนที่จะรับการป้อนข้อมูลผ่านทางstdinคุณสามารถประหยัด 15 ไบต์เห็นนี้
ბიმო


1

Python, 93 87 ตัวอักษร

Python ทำให้การจัดรูปแบบง่ายเนื่องจากอินพุต / เอาต์พุตที่ต้องการตรงกับรูปแบบดั้งเดิม
สนับสนุนเฉพาะรายการที่เป็นตัวอักษร Python (เช่น1,2,'hello'ไม่ใช่1,2,hello)
อ่านอินพุตมาตรฐานไม่ใช่พารามิเตอร์

f=lambda x:x and f(x[1:])+[x[:1]+a for a in f(x[1:])]or[()]
for l in f(input()):print l

print f(input())สั้นกว่า
AMK

@AMK ข้อกำหนดสำหรับแต่ละองค์ประกอบที่จะพิมพ์ในหนึ่งบรรทัด แต่listแน่นอนสามารถลบออกได้ (ถ้ายัง replacinf [[]]ด้วย[()].
ugoren

print'\n'.join(f(input()))บันทึกอักขระสองตัว
beary605

@ beary605 ไม่ทำงานf()มี tuples ไม่ใช่สตริง
ugoren


1

Haskell 89 ตัวอักษร

import System.Environment
main=getArgs>>=mapM print.p
p[]=[[]]
p(x:y)=(map(x:)$p y)++p y

การรับพารามิเตอร์มีความยาว: /


หนึ่งถ่านมากขึ้นสามารถโกนออกด้วยและยังสองตัวอักษรมากขึ้นดังกล่าวข้างต้นด้วยmap(x:)(p y)++p y [(x:),id]<*>p yเห็นได้ชัดว่า<*>อยู่ในโหมโรงตอนนี้ ( filterMไม่ใช่)
Will Ness


1

K, 14 ไบต์

{x@&:'!(#x)#2}

สร้างเวกเตอร์ 0/1 ทั้งหมดตราบเท่าที่อินพุทรวบรวมดัชนีของ 1s และใช้เพื่อเลือกอิลิเมนต์จากอินพุตเวกเตอร์ ในทางปฏิบัติ:

  {x@&:'!(#x)#2} 1 2 3
(!0
 ,3
 ,2
 2 3
 ,1
 1 3
 1 2
 1 2 3)

นี่ค่อนข้างเสรีกับความต้องการผลผลิต แต่ฉันคิดว่ามันถูกกฎหมาย ส่วนที่น่าสงสัยที่สุดคือชุดว่างจะถูกแสดงในรูปแบบขึ้นอยู่กับประเภท !0เป็นวิธีที่ K หมายถึงเวกเตอร์ตัวเลขที่ว่างเปล่า:

  0#1 2 3      / integers
!0
  0#`a `b `c   / symbols
0#`
  0#"foobar"   / characters
""

คำอธิบาย

การ(#x)#2สร้างเวกเตอร์2ตราบเท่าที่อินพุต:

  {(#x)#2}1 2 3
2 2 2
  {(#x)#2}`k `d `b `"+"
2 2 2 2

เมื่อ monadic !ใช้กับเวกเตอร์มันคือ "odometer":

  !2 2 2
(0 0 0
 0 0 1
 0 1 0
 0 1 1
 1 0 0
 1 0 1
 1 1 0
 1 1 1)

จากนั้นเราใช้ "where" ( &) บนแต่ละ'vector ( ) เพื่อรวบรวมดัชนีของมัน ลำไส้ใหญ่จำเป็นต้องทำให้เข้าใจผิดระหว่างรูปแบบ monadic และ dyadic ของ&:

  &0 0 1 0 1 1
2 4 5

  {&:'!(#x)#2} 1 2 3
(!0
 ,2
 ,1
 1 2
 ,0
 0 2
 0 1
 0 1 2)

ถ้าเราแค่อยากรวมเวกเตอร์เข้าด้วยกันเราก็ทำได้ แต่เราต้องใช้มันเป็นดัชนีในเซตดั้งเดิม โชคดีที่ผู้ดำเนินการจัดทำดัชนีของ K @สามารถยอมรับโครงสร้างที่ซับซ้อนของดัชนีและจะให้ผลลัพธ์ที่มีรูปร่างเหมือนกัน:

  {x@&:'!(#x)#2} `a `c `e
(0#`
 ,`e
 ,`c
 `c `e
 ,`a
 `a `e
 `a `c
 `a `c `e)

สง่างามใช่มั้ย


1
สิ่งนี้ไม่ถูกต้องอีกต่อไปเนื่องจาก "odometer" ใน oK จะสร้างเมทริกซ์ที่พลิกแล้ว {x@&:'+!(#x)#2}มันสามารถได้รับการแก้ไขที่ค่าใช้จ่ายของไบต์เดียว: ไม่เกี่ยวข้อง: เทียบเท่าสั้นมี(#x)#2 2|~x
ngn

1

Mathematica, 51

การโกงเพิ่มเติม:

Column@ReplaceList[Plus@@HoldForm/@#,x___+___->{x}]&

@{1,2,3}ใช้กับ


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

เนื่องจากการประกวดนี้ยาวนานการโพสต์จึงเป็นแนวคิดที่มากกว่า แต่ฉันได้แก้ไขแล้ว
LogicBreaker

1

JavaScript (ES6), 68 ไบต์

a=>alert(a.reduce((a,x)=>[...a,...a.map(y=>[...y,x])],[[]]).join`
`)

การสาธิต


ทำไมalert?
Shaggy

@Shaggy ความท้าทายอย่างชัดเจนขอให้พิมพ์แต่ละองค์ประกอบในบรรทัดแยกต่างหาก - ซึ่งอาจจะขมวดคิ้วตามมาตรฐานปัจจุบันของเรา คำตอบส่วนใหญ่ดูเหมือนจะติดอยู่กับกฎนี้
Arnauld

อายุติธรรมพอ; ฉันตีความ "พิมพ์" เป็น "เอาท์พุท"
ขนปุย


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