เคล็ดลับเลขฐานสอง


28

ความท้าทายนั้นง่าย เอาท์พุทอาร์เรย์จำนวนเต็มสองมิติหกมิติต่อไปนี้:

[[ 1, 11, 21, 31, 41, 51],
 [ 3, 13, 23, 33, 43, 53],
 [ 5, 15, 25, 35, 45, 55],
 [ 7, 17, 27, 37, 47, 57],
 [ 9, 19, 29, 39, 49, 59]]

[[ 2, 11, 22, 31, 42, 51],
 [ 3, 14, 23, 34, 43, 54],
 [ 6, 15, 26, 35, 46, 55],
 [ 7, 18, 27, 38, 47, 58],
 [10, 19, 30, 39, 50, 59]]

[[ 4, 13, 22, 31, 44, 53],
 [ 5, 14, 23, 36, 45, 54],
 [ 6, 15, 28, 37, 46, 55],
 [ 7, 20, 29, 38, 47, 60],
 [12, 21, 30, 39, 52]]

[[ 8, 13, 26, 31, 44, 57],
 [ 9, 14, 27, 40, 45, 58],
 [10, 15, 28, 41, 46, 59],
 [11, 24, 29, 42, 47, 60],
 [12, 25, 30, 43, 56]]

[[16, 21, 26, 31, 52, 57],
 [17, 22, 27, 48, 53, 58],
 [18, 23, 28, 49, 54, 59],
 [19, 24, 29, 50, 55, 60],
 [20, 25, 30, 51, 56]]

[[32, 37, 42, 47, 52, 57],
 [33, 38, 43, 48, 53, 58],
 [34, 39, 44, 49, 54, 59],
 [35, 40, 45, 50, 55, 60],
 [36, 41, 46, 51, 56]]

อาร์เรย์จำนวนเต็ม 2D เหล่านี้คืออะไร นี่คือตัวเลขที่ใช้ในการเล่นกลกับการ์ดที่มีตัวเลขเหล่านี้:

ป้อนคำอธิบายรูปภาพที่นี่

เคล็ดลับมายากลขอให้ใครบางคนคิดถึงตัวเลขที่อยู่ในช่วง [1, 60] และให้คนหนึ่งแสดงกลมายากลทั้งหมดที่มีหมายเลขนี้ คนที่แสดงเล่ห์กลสามารถรวมหมายเลขบนซ้าย (พลังทั้งหมด 2) ของไพ่ที่กำหนดเพื่อไปยังหมายเลขที่บุคคลนั้นกำลังคิด บางคำอธิบายเพิ่มเติมว่าทำไมงานนี้ถึงได้ที่นี่

กฏท้าทาย:

  • คุณสามารถแสดงผลอาร์เรย์จำนวนเต็มสองมิติหกอาร์เรย์ในรูปแบบที่เหมาะสม สามารถพิมพ์ด้วยตัวคั่น สามารถเป็นอาร์เรย์จำนวนเต็ม 3D ที่มีอาร์เรย์จำนวนเต็มสองมิติหกชุด สามารถเป็นรายการสตริงของเส้น; เป็นต้น
  • คุณได้รับอนุญาตให้เติมตำแหน่งด้านล่างขวาของไพ่สี่ใบสุดท้ายที่มีค่าลบในช่วง[-60, -1]หรือตัวอักษร'*'แทนที่จะปล่อยทิ้งไว้เพื่อให้อาร์เรย์จำนวนเต็ม 2D เป็นเมทริกซ์รูปสี่เหลี่ยมผืนผ้า (ไม่คุณไม่ได้รับอนุญาตให้เติมด้วย0หรือไม่ใช่ - ผู้ลงคะแนนเช่นnull/ undefinedเป็นทางเลือกยกเว้น*ตั้งแต่มีการใช้ดาวในการ์ดจริงด้วย)
  • ลำดับของตัวเลขในเมทริกซ์เป็นสิ่งจำเป็น แม้ว่ามันจะไม่ได้เรื่องสำหรับเคล็ดลับมายากลทางกายภาพผมเห็นความท้าทายนี้ส่วนใหญ่เป็น - หนึ่งด้วยเหตุนี้ข้อ จำกัด ในการสั่งซื้อ
    ลำดับของเมทริกซ์ในรายการผลลัพธ์สามารถอยู่ในลำดับใดก็ได้เนื่องจากมันชัดเจนจากการ์ดมุมบนซ้ายซึ่งเมทริกซ์นั้นเป็นแบบใด

กฎทั่วไป:

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ
    อย่าปล่อยให้ภาษาโค้ดกอล์ฟกีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่ได้เข้ารหัส พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาโปรแกรม 'ใด ๆ '
  • กฎมาตรฐานใช้สำหรับคำตอบของคุณด้วยกฎ I / O เริ่มต้นดังนั้นคุณจึงได้รับอนุญาตให้ใช้ STDIN / STDOUT ฟังก์ชั่น / วิธีการที่มีพารามิเตอร์ที่เหมาะสมและประเภทผลตอบแทนโปรแกรมเต็มรูปแบบ การโทรของคุณ
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
  • หากเป็นไปได้โปรดเพิ่มลิงก์พร้อมทดสอบรหัสของคุณ (เช่นTIO )
  • นอกจากนี้ขอแนะนำให้เพิ่มคำอธิบายสำหรับคำตอบของคุณ

ที่เกี่ยวข้อง (เช่นเดียวกับในที่อ้างถึงเล่ห์กลเดียวกัน แต่ไม่มีประโยชน์จริง ๆ ที่จะได้รับแรงบันดาลใจจากความท้าทายนี้ฉันคิดว่าความท้าทายนั้นขอให้ส่งออกค่าความจริง / เท็จว่าหมายเลขnปรากฏบนkบัตร 'th ซึ่งความท้าทายของฉันคือ KC ความท้าทายในการแสดงผลหกเมทริกซ์)
Kevin Cruijssen

1
@DigitalTrauma อืมฉันไม่แน่ใจว่านี่จะซ้ำกันจริงๆหรือเปล่าเพราะความท้าทายของคุณคือascii-art (ไม่ใช่การติดแท็กเช่นนี้ แต่มันเป็น) ในขณะที่อันนี้ให้คุณสามารถส่งออกอาร์เรย์ในรูปแบบที่ผ่อนปรน (ไม่ใช่แค่สี่วิธีที่เหมือนกัน) แต่ฉันไม่สามารถลงคะแนนเพื่อเปิดใหม่ได้เพราะฉันมีค้อน
Erik the Outgolfer

@EriktheOutgolfer Woops .. ลืมฉันด้วยเช่นกัน>>> บางครั้งความสามารถในการปิด / เปิดค้อนนั้นค่อนข้างน่ารำคาญ .. แต่ก็มี 2 โหวตแล้วดังนั้นด้วยตัวคุณเองและของฉัน แต่ถ้ามีคนต้องการปิดอีกครั้งฉันก็ไม่รังเกียจ พวกเขาจะคล้ายกันมากถึงแม้ว่าความท้าทายของเขาจะเป็นสิ่งที่[ascii-art]ท้าทายกับกฎเอาท์พุทที่เข้มงวด (MD5) ซึ่งเหมืองของฉันมีความยืดหยุ่นมาก (และแถว / คอลัมน์จะถูกสลับและช่วงนั้น[1,60]แทน[1,63]ความแตกต่างเล็กน้อย แต่ก็ยังดี)
Kevin Cruijssen

ดูเหมือนว่าคุณไม่ได้ลอง VTRO ด้วยทัศนคติของ "นี่คือความท้าทายอันมีค่าของฉัน !!!" อย่างน้อย ... : P
Erik the Outgolfer

1
ฉันก็ลืมค้อนด้วย ฉันยังคงคิดว่ามันใกล้พอที่จะให้คะแนนซ้ำ แต่ฉันจะเลื่อนไปสู่ภูมิปัญญาของชุมชนหากเปิดขึ้นอีกครั้ง
Digital Trauma

คำตอบ:


6

MATL , 12 11 ไบต์

-1 ไบต์ขอบคุณอาจารย์ตัวเอง :)

60:B"@fQ6eq

คำอธิบาย:

60:           % create a vector [1,2,3,...,60]
   B          % convert to binary matrix (each row corresponds to one number)
    "         % loop over the columns and execute following commands:
     @f       % "find" all the nonzero entries and list their indices
       Q      % increment everything
        6e    % reshape and pad with a zero at the end
          q   % decrement (reverts the increment and makes a -1 out of the zero
              % close loop (]) implicitly
              % display the entries implicitly

ลองออนไลน์!



7

Python 2 , 76 ไบต์

r=range;print[[[i for i in r(61)if i&2**k][j::5]for j in r(5)]for k in r(6)]

ลองออนไลน์!

วิธีการที่นี่คือการสร้างรายการของตัวเลขที่เป็นไปได้ทั้งหมดแล้วเหลาลงไปที่รายชื่อของตัวเลขสำหรับบัตรr(61)i&2**k

จากนั้นโดยใช้หั่นรายการว่ารายการ 1D [card nums][j::5]for j in r(5)ของตัวเลขที่มีการปรับปรุงใหม่ให้มีขนาด

จากนั้นเครื่องกำเนิดไฟฟ้านี้ซ้ำแล้วซ้ำอีกเพียงสำหรับ 6 for k in r(6)ใบ


ในขณะที่ฉันไม่พบวิธีแก้ปัญหาใด ๆ ที่น้อยกว่า 76 ไบต์นี่คืออีกสองวิธีที่มี 76 ไบต์ด้วย:

r=range;print[[[i for i in r(61)if i&1<<k][j::5]for j in r(5)]for k in r(6)]

ลองออนไลน์!

นี้อย่างใดอย่างหนึ่งต่อไปคือแรงบันดาลใจจากโจนาธานอัลลัน

k=32
while k:print[[i for i in range(61)if i&k][j::5]for j in range(5)];k/=2

ลองออนไลน์!

ความคิดเห็นใด ๆ ที่ชื่นชมอย่างมาก


6

ถ่าน 26 ไบต์

E⁶E⁵⪫E⁶§⁺§⪪Φ⁶¹&πX²ι⁵ν⟦*⟧λ 

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

E⁶                          Loop over 6 cards
  E⁵                        Loop over 5 rows
     E⁶                     Loop over 6 columns
           Φ⁶¹              Filter over 0..60 where
               π            Current value
              &             Bitwise And
                 ²          Literal 2
                X           Raised to power
                  ι         Card index
          ⪪        ⁵        Split into groups of 5
         §          ν       Indexed by column
        ⁺                   Concatenated with
                      *     Literal string `*`
                     ⟦ ⟧    Wrapped in an array
       §                λ   Indexed by row
    ⪫                       Joined with spaces
                            Implicitly print

ฉันเพิ่มกฎนั้น*เพื่อความสนุกสนานหลังจากที่ฉันเห็นดวงดาวบนการ์ดจริง สงสัยว่าจะมีภาษาใดใช้หรือไม่ แต่ฉันดีใจที่เห็นอย่างน้อยหนึ่งภาษา :) คำตอบที่ดี!
Kevin Cruijssen

1
@KevinCruijssen Charcoal ไม่มีตัวดำเนินการขนย้ายและทรานสดิวเรนท์นั้นต้องการขนาดที่เป็นที่รู้จักดังนั้นฉันต้องเพิ่มบางสิ่งเพื่อทำให้มีขนาดและ*อย่างน้อยก็สั้นที่สุดเท่าที่จะเป็นได้
Neil

ผมไม่คิดว่านี่เป็น 26 ไบต์ ...
Tvde1

@ Tvde1 Charcoal เช่นเดียวกับ esolangs บนเว็บไซต์นี้ใช้หน้ารหัสที่กำหนดเอง อักขระจากหน้านั้นมีราคา 1 ไบต์ในขณะที่อักขระอื่นมีราคาสูงสุด 4 ไบต์
Neil

6

05AB1E , 16 ไบต์

60L2вíƶ0ζε0K5ô®ζ

ลองออนไลน์!

คำอธิบาย

60L                 # push [1 ... 60]
   2в               # convert each to a list of binary digits
     í              # reverse each
      ƶ             # multiply each by its 1-based index
       0ζ           # transpose with 0 as filler
         ε          # apply to each list
          0K        # remove zeroes
            5ô      # split into groups of 5
              ®ζ    # zip using -1 as filler

05AB1E , 17 ไบต์

6F60ÝNoôāÈϘ5ô®ζ,

ลองออนไลน์!

คำอธิบาย

6F                  # for N in [0 ... 5] do
  60Ý               # push [0 ... 60]
     Noô            # split into groups of 2^N numbers
        āÈÏ         # keep every other group
           ˜        # flatten
            5ô      # split into groups of 5
              ®ζ    # transpose with -1 as filler
                ,   # print

5

Husk , 13 ไบต์

ṠMöTC5Wnünḣ60

ลองออนไลน์!

คำอธิบาย

          ḣ60  Range [1..60]
        ü      Uniquify using equality predicate
         n     bitwise AND: [1,2,4,8,16,32]
 M             For each number x in this list,
Ṡ     W        take the indices of elements of [1..60]
       n       that have nonzero bitwise AND with x,
    C5         cut that list into chunks of length 5
  öT           and transpose it.



4

JavaScript (ES6),  90  88 ไบต์

_=>[1,2,4,8,16,32].map(n=>(g=i=>i<60?g(++i,i&n?m[y%5]=[...m[y++%5]||[],i]:0):m)(y=m=[]))

ลองออนไลน์!

ความคิดเห็น

_ =>                        // anonymous function taking no argument
  [1, 2, 4, 8, 16, 32]      // list of powers of 2, from 2**0 to 2**5
  .map(n =>                 // for each entry n in this list:
    ( g = i =>              //   g = recursive function taking a counter i
      i < 60 ?              //     if i is less than 60:
        g(                  //       recursive call:
          ++i,              //         increment i
          i & n ?           //         if a bitwise AND between i and n is non-zero:
            m[y % 5] =      //           update m[y % 5]:
            [ ...m[y++ % 5] //             prepend all previous values; increment y
              || [],        //             or prepend nothing if it was undefined so far
              i             //             append i
            ]               //           end of update
          :                 //         else:
            0               //           do nothing
        )                   //       end of recursive call
      :                     //     else:
        m                   //       return m[]
    )(y = m = [])           //   initial call to g with i = y = m = []
                            //   (i and y being coerced to 0)
  )                         // end of map()


4

C (gcc) , 95 ไบต์

i,j,k;f(int o[][5][6]){for(i=6;i;)for(o[--i][4][5]=j=k=-1;j<60;)++j&1<<i?o[i][++k%5][k/5]=j:0;}

ลองออนไลน์!

ส่งคืนเมทริกซ์เป็นอาร์เรย์ 3 มิติใน o

เมทริกซ์ 4 ตัวสุดท้ายมี -1 เป็นค่าสุดท้าย

บันทึก 2 ไบต์ขอบคุณ Kevin Cruijssen

บันทึกแล้ว7 8 ไบต์ขอบคุณ Arnauld


คุณสามารถบันทึก 2 ไบต์โดยการเปลี่ยนo[i][4][5]=-1;for(j=k=0;ไปfor(o[i][4][5]=-1,j=k=0;เพื่อให้วงเล็บสามารถถอดออกได้ เป็นคำตอบที่ดี btw +1 จากฉัน
Kevin Cruijssen


(โปรดทราบว่าฉันไม่แน่ใจ 100% ว่าผ่านอาร์เรย์แบบ 3 มิติที่จัดสรรแล้วด้วยมิติที่ถูกต้องแล้ว แต่ฉันจะให้นักกอล์ฟ C ทั่วไปให้ข้อมูลเชิงลึกที่ดีกว่านี้)
Arnauld

@ Arnauld ฉันกำลังคิดเกี่ยวกับสิ่งนั้น แต่ตัดสินใจกับมัน
Matej Mulej

ดีกว่าที่จะออกไป#includeเพื่อแสดงว่ามันใช้งานได้
ASCII- เท่านั้น

3

CJam (18 ไบต์)

6{61{2A#&},5/zp}fA

สาธิตออนไลน์ นี่เป็นโปรแกรมเต็มรูปแบบที่ส่งออกไปยัง stdout

การผ่า

6{             }fA    # for A = 0 to 5
  61{2A#&},           #   filter [0,61) by whether bit 2^A is set
           5/z        #   break into chunks of 5 and transpose to get 5 lists
              p       #   print

3

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

60&ƇⱮs€5LÐṂZ€

ลิงก์ niladic ที่ให้รายการ (6) รายการของรายการจำนวนเต็ม (มันแสดงผลโดยใช้ตัวเลือกเริ่มต้นของการมี*หรือไม่มีฟิลเลอร์ลบ)

ลองออนไลน์!

อย่างไร?

60

60[1,60]5

60&ƇⱮs€5LÐṂZ€ - Link: no arguments
60            - set the left argument to 60
    Ɱ         - map across ([1..60]) with:  (i.e. [f(60,x) for x in [1..60]])
   Ƈ          -   filter keep if:  (N.B. 0 is falsey, while non-zeros are truthy)
  &           -     bitwise AND
      €       - for each:
     s 5      -   split into chunks of five
         ÐṂ   - keep those with minimal:
        L     -   length
           Z€ - transpose each

มากมาย 15s โดยไม่ต้องรู้ "เคล็ดลับน้อยที่สุดเมื่อแบ่งออกเป็นห้า":

5Ż2*Ɱ60&ƇⱮs€5Z€
6µ’2*60&Ƈ)s€5Z€
60&ƇⱮ`LÞḣ6s€5Z€

... และในขณะที่พยายามค้นหาให้สั้นลงฉันได้รับอีก 13 โดยไม่ต้องใช้เคล็ดลับเลย:

60B€Uz0Ts5ZƊ€

3

ภาษา Wolfram (Mathematica) , 88 ไบต์

Transpose@Partition[#~Append~-1,5]&/@Last@Reap[Sow[,NumberExpand[,2]]~Do~{,60},Except@0]

ฉันใช้เสรีภาพในการเพิ่มลิงค์ TIO (ตามคำตอบของ@ J42161217 ) +1 จากฉัน
Kevin Cruijssen


@ Mr.Xcoder ขอบคุณ ผมเคยใช้นี้~เคล็ดลับในสถานที่หนึ่งที่มากขึ้นและแทนที่ตัวแปรโดยk Nullขออภัยไม่มีเวลาที่จะเพิ่มลิงค์ tio
Bruno Le Floch

2

ภาษา Wolfram (Mathematica) , 99 ไบต์

Transpose@Partition[#~FromDigits~2&/@Last@GatherBy[{0,1}~Tuples~6,#[[-k]]&],5]~Table~{k,6}/. 61->-1

ลองออนไลน์!


คุณสามารถบันทึกตัวละครสองสามตัวโดย: ทำTranspose@แทนTranspose[...]; ขยายไปยัง 30 รายการก่อนทำการแบ่งพาร์ติชัน ใช้เพื่อหลีกเลี่ยงการต้องTable[...,{k,6}] k=#
Bruno Le Floch

@Bruno Le Floch Table อาจบันทึกได้หนึ่งไบต์ คุณลอง transpose @ หรือไม่ เพราะมันไม่ทำงานถ้าคุณดูอย่างระมัดระวัง ฉัน afk แต่จะเล่นกอล์ฟในภายหลัง
J42161217

ขออภัยTranspose@ทำงานหลังจากที่คุณย้ายภายในPadRight Partitionความคิดเห็นอื่นก็คือคำถามดูเหมือนจะไม่อนุญาตให้""มีตัวยึดตำแหน่ง คุณสามารถแทนที่มันได้โดย-1ไม่เสียไบต์ใด ๆ
Bruno Le Floch


2

R , 73 ไบต์

`!`=as.raw;lapply(0:5,function(i)matrix(c((a=1:60)[(!a&!2^i)>0],-1),5,6))

ฉันไม่แน่ใจทั้งหมดถ้าฉันมีคุณสมบัติตรงตามข้อกำหนดสำหรับการสั่งซื้อเนื่องจาก R โดยค่าเริ่มต้นเติมเมทริกซ์ตามคอลัมน์ดังนั้นลำดับที่ปรากฏบนการ์ดนั้นจะเหมือนกับวิธีการจัดสรรเมทริกซ์ใน R

ลองออนไลน์!


ผลผลิตดูดี และถ้า R เติมเมทริกซ์ตามคอลัมน์ก่อนแถวแทนที่จะเป็นแถวก่อนหน้าคอลัมน์เหมือนกับภาษาอื่นเกือบทั้งหมดมันก็หมายความว่าเป็นภาษาการเขียนโปรแกรมที่ดีที่จะใช้สำหรับความท้าทายนี้ฉันเดา :)
Kevin Cruijssen

2

T-SQL, ( 1,168 1,139 ไบต์)

ฉันแค่อยากจะรู้ว่าฉันสามารถทำได้

รุ่นที่ปรับปรุงแล้ว

 WITH g AS(SELECT 1 AS n UNION ALL SELECT n+1 FROM g WHERE n+1<61),B as(SELECT cast(cast(n&32 as bit)as CHAR(1))+cast(cast(n&16 as bit)as CHAR(1))+cast(cast(n&8 as bit)as CHAR(1))+cast(cast(n&4 as bit)as CHAR(1))+cast(cast(n&2 as bit)as CHAR(1))+cast(cast(n&1 as bit)as CHAR(1))as b FROM g),P as(SELECT * from (values(1), (2), (4), (8), (16), (32)) as Q(p)),S as(select distinct p,p+(substring(b,6,1)*1)*(case when p=1 then 0 else 1 end)+(substring(b,5,1)*2)*(case when p=2 then 0 else 1 end)+(substring(b,4,1)*4)*(case when p=4 then 0 else 1 end)+(substring(b,3,1)*8)*(case when p=8 then 0 else 1 end)+(substring(b,2,1)*16)*(case when p=16 then 0 else 1 end)+(substring(b,1,1)*32)*(case when p=32 then 0 else 1 end)as e from P cross apply B),D as(select * from S where e>=p and e<61),R as(select p,(row_number()over(partition by p order by cast(e as int)))%5 as r,e from D),H as(select k.p,'['+stuff((select','+cast(l.e as varchar)from R l where l.p=k.p and l.r=k.r for xml path('')),1,1,'')+']'as s from R k group by k.p,k.r)select stuff((select','+cast(x.s as varchar)from H x where x.p=z.p for xml path('')),1,1,'')from H z group by z.p

การสาธิตออนไลน์

ลองออนไลน์!

เวอร์ชัน verbose - พร้อมหมายเหตุเป็นข้อคิดเห็น SQL

WITH gen -- numbers 1 to 60
AS (
    SELECT 1 AS num
    UNION ALL
    SELECT num+1 FROM gen WHERE num+1<=60
),
BINARIES -- string representations of binaries 000001 through 111111
as (
SELECT 
    +cast( cast(num & 32 as bit) as CHAR(1))
    +cast( cast(num & 16 as bit)  as CHAR(1))
    +cast( cast(num & 8 as bit)  as CHAR(1))
    +cast( cast(num & 4 as bit)  as CHAR(1))
    +cast( cast(num & 2 as bit)   as CHAR(1))
    +cast(cast(num & 1 as bit)  as CHAR(1)) as binry FROM gen
),
POWERS -- first 6 powers of 2
as (
SELECT * from (values(1), (2), (4), (8), (16), (32)) as Q(powr)
),
SETELEMENTS -- cross apply the six powers of 2 against the binaries
-- returns 2 cols. col 1 = the power of 2 in question.
-- col 2 is calculated as that power of 2 plus the sum of each power of 2 other than the current row's power value, 
-- but only where a given power of 2 is switched "on" in the binary string, 
-- ie. where the first digit in the string represents 32, the second represents 16 and so on. 
-- That is, if the binary is 100100 then the number will be 
-- the sum of (32 x 1) + (16 x 0) + (8 x 0) + (4 x 1) + (2 x 0) + (1 x 0) 
-- but if the current row's power is 32 or 4, then just that number (32 or 4) is excluded from the sum.
-- rows are distinct.
as (
select distinct powr,
powr+
 (substring(binry,6,1) * 1) * (case when powr = 1 then 0 else 1 end)
 +(substring(binry,5,1) * 2) * (case when powr = 2 then 0 else 1 end)
 +(substring(binry,4,1) * 4) * (case when powr = 4 then 0 else 1 end)
 +(substring(binry,3,1) * 8) * (case when powr = 8 then 0 else 1 end)
 +(substring(binry,2,1) * 16) * (case when powr = 16 then 0 else 1 end)
 +(substring(binry,1,1) * 32) * (case when powr = 32 then 0 else 1 end) as elt
from POWERS cross apply BINARIES
),
DISTINCTELEMENTS -- purge calculated numbers smaller than the power of 2 or greater than 60
as (
select * from SETELEMENTS where elt >= powr and elt < 61
)--,
,
ROWNUMBERED -- for each power, number the rows repeatedly from 0 through 5, then back to 0 through 5 again, etc
as (
select powr, (row_number() over (partition by powr order by cast(elt as int)))%5 as r, elt  from DISTINCTELEMENTS
),
GROUPEDSETS -- for each row number, within each power, aggregate the numbers as a comma-delimited list and wrap in square brackets - the inner arrays
as (
select r1.powr, '['+stuff((select ',' + cast(r2.elt as varchar) from ROWNUMBERED r2 where r2.powr = r1.powr and r2.r = r1.r for xml path('')),1,1,'')+']' as s
from ROWNUMBERED r1
group by r1.powr,r1.r
)
select -- now aggregate all the inner arrays per power
stuff((select ',' + cast(g2.s as varchar) from GROUPEDSETS g2 where g2.powr = g1.powr for xml path('')),1,1,'')
from GROUPEDSETS g1
group by g1.powr

Voila!

หมายเหตุ 1: ตรรกะบางอย่างเกี่ยวข้องกับการแสดงผลวงเล็บเหลี่ยมและเครื่องหมายจุลภาค

หมายเหตุ 2: SQLServer เวอร์ชันที่ใหม่กว่ามีแนวทางที่กระชับยิ่งขึ้นในการสร้างรายการที่คั่นด้วยจุลภาค (สิ่งนี้ถูกสร้างขึ้นบน SQL Server 2016)

หมายเหตุ 3: อาร์เรย์สำหรับการ์ดที่ระบุไม่ได้ถูกจัดเรียง (ซึ่งก็โอเคตามข้อกำหนด) หมายเลขภายในอาเรย์จะถูกจัดเรียงอย่างถูกต้อง ในกรณีนี้แต่ละ "การ์ด" ของคำถามแสดงผลอาร์เรย์ของมันในแถวที่แยกต่างหากในผลลัพธ์

สั้นลงไปยังอาร์เรย์ของรหัสยาก?

ใช่.

บายฉัน


Jeez มันจะไม่สั้นกว่านี้หรือไม่ที่จะแค่ถอดรหัสผลลัพธ์
Jo King

ฮ่าฮ่า ไม่ว่าจะสนุกหรือยืดออก
youcantryreachingme

ฉันไม่เข้าใจอย่างเต็มที่ - คุณกำลังบอกว่าโซลูชันของคุณทำงานโดยบังเอิญหรือคุณมั่นใจว่าคุณทำตามข้อกำหนดอย่างถูกต้องหรือไม่
Jonathan Frech

@JonathanFrech - ฉันไม่ได้รหัสอย่างชัดเจนสำหรับการสั่งซื้อของตัวเลขแม้ว่าอาจจะมีเงื่อนไขโดยนัยในภาษาที่เกิดขึ้นในการสั่งซื้อรับประกัน พวกเขาแสดงในลำดับที่ถูกต้อง แยกกันหลังจากการโพสต์ฉันรู้ว่าฉันเข้าใจผิดว่าจะต้องนำเสนอข้อมูลอย่างไร (เป็นลายทางอาร์เรย์ต่อบัตรแทนที่จะเป็นหนึ่งชุดเดียวต่อบัตร) - ดังนั้นยังไม่ได้แก้ปัญหานั้น ดังนั้นผลลัพธ์ในขณะนี้จึงแสดงตัวเลขที่ถูกต้องตามลำดับจากน้อยไปหามากภายในชุดที่คาดหวัง 6 ชุด - ดูซอเชื่อมโยงของ sql ยังคงต้องทำ: แบ่งชุดออกเป็น 5 ชุดย่อยแต่ละชุด
youcantryreachingme

ฉันซาบซึ้งในความพยายามของคุณ แต่หากวิธีการแก้ปัญหาของคุณไม่ถูกต้องโปรดแก้ไขหรือลบโพสต์ของคุณ โดยทั่วไปเราไม่อนุญาตให้มีคำตอบที่ไม่ถูกต้อง
Jonathan Frech




1

MATLAB, 155 ไบต์

cellfun(@disp,cellfun(@(x)x-repmat(62,5,6).*(x>60),cellfun(@(x)reshape(find(x,30),[5 6]),mat2cell(dec2bin(1:62)-48,62,ones(1,6)),'Uniform',0),'Uniform',0))

สิ่งนี้อาจสั้นลงเป็นหลายบรรทัด แต่ฉันต้องการทำในโค้ดหนึ่งบรรทัด


1
คุณสามารถเพิ่มลิงค์ TIOด้วยรหัสทดสอบได้หรือไม่เพื่อให้ฉันสามารถตรวจสอบผลลัพธ์ได้
Kevin Cruijssen

1

05AB1E , 14 ไบต์

žOε60LDNo&ĀÏ5ι

ลองออนไลน์!


1
ทำไมžOแทนที่จะเป็นแค่6L? ฉันรู้ว่าคุณไม่ได้ใช้พวกเขาในแผนที่ของคุณ แต่ฉันอยากรู้ว่าทำไมคุณเคยaeiouyสร้างรายการที่มี 6 ค่า xD คำตอบที่ดี btw!
Kevin Cruijssen

1
@KevinCruijssen ไม่มีเหตุผลใดที่ผมก็คิดว่ามันเป็นตลกกว่า6L, , , หรือ 9!
Grimmy

มันดึงดูดสายตาของฉันอย่างแน่นอน ;)
Kevin Cruijssen

@KevinCruijssen ฉันเพิ่งตระหนักтœ, ₅œ, ₁œนอกจากนี้ยังมีการทำงานเหล่านี้จะสวยเย็นเกินไป (:
Grimmy

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