เปลี่ยนอาร์เรย์นี้เป็นเมทริกซ์


13

ใช้อาร์เรย์ที่ไม่ซ้อนกันเป็นอินพุต เปลี่ยนเป็นเมทริกซ์โดยใช้วิธีการต่อไปนี้:

สมมติว่าอาร์เรย์ของฉันคือ [1, 2, 3, 4, 5]

ครั้งแรกฉันทำซ้ำอาร์เรย์นั้น 5 ครั้ง: (ความยาว)

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

จากนั้นฉันอ่านมันตามแนวเส้นทแยงมุม:

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

ฉันแผ่ชุดนี้และแบ่งออกเป็นห้าส่วน (ความยาว):

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

นี่คือรหัสกอล์ฟ ไบต์ที่น้อยที่สุดจะเป็นผู้ชนะ


ครั้งต่อไปโปรดทำสิ่งที่เป็นตัวพิมพ์ใหญ่
Oliver Ni

มันทำงานอย่างไรถ้าอาร์เรย์ดั้งเดิมมีความยาวอื่นที่ไม่ใช่ 5?

@ ais523 ฉันคิดว่ามันเหมือนเดิมคุณแค่แทนที่ 'ห้า' ด้วยความยาว
Oliver Ni

เราสามารถสมมติว่าตัวเลขเป็นจำนวนเต็มบวกเสมอได้หรือไม่
Luis Mendo เมื่อ

7
@JohnCena คุณไม่ควรยอมรับคำตอบแรกคุณต้องให้เวลาโพสต์เพื่อรับแรงฉุดและคำตอบเพิ่มเติม
Kade

คำตอบ:


2

05AB1E, 13 ไบต์

.p¹.sR¦«í˜¹gä

ลองออนไลน์!

คำอธิบาย:

                # Implicit input
 .p             # Get prefixes
   ¹            # Get first input
    .s          # Get suffixes
      R         # Reverse
       ¦        # Remove first element
        «       # Concatenate
         í      # Reverse every one
          ˜     # Flatten
           ¹gä  # Split into pieces of the length
                # Implicit print

คุณไม่จำเป็นต้องพิมพ์

และคุณขออินพุตได้อย่างไร

1
ภาษากอล์ฟเหล่านี้หลายภาษาเช่น 05AB1E ได้สร้างกฎเริ่มต้นสำหรับการขออินพุตและสร้างเอาต์พุตเพื่อให้โปรแกรมเมอร์ไม่ต้องเสียไบต์

1
เอาต์พุตไม่ตรงกับเอาต์พุตที่ต้องการจริงๆ มันไม่มีเมทริกซ์และตัวเลขไม่ตรงกัน
Karl Napf

1
ดีก็เป็นเมทริกซ์ แต่ตัวเลขไม่ถูกต้อง (หรือ tryitonline.net คำนวณผิด)
คาร์ล Napf

6

เยลลี่ 11 ไบต์

WẋLŒDUṙLFsL

ลองออนไลน์!

คำอธิบาย

               Input: array z
WẋL            length(z) copies of z
   ŒD          Diagonals (starting with main diagonal)
     U         Reverse each
      ṙL       Rotate left length(z) places
               (now the top-left diagonal is in front)
        F      Flatten
         sL    Split into chunks of size length(z)

อืมเมื่อฉันลองมันด้วยLมันทำสิ่งแปลก ๆ ดังนั้นฉันจึงใช้ register: / ฉันลองอีกครั้งและมันก็ใช้งานได้ ... โดยทั่วไปเหมือนกันดังนั้นฉันเดาว่าฉันจะลบของฉันออก
Jonathan Allan

1
แน่นอนวุ้นมี "เส้นทแยงมุม" สร้างขึ้นใน .... :)
เกร็กมาร์ติน

3

Python 2, 105 96 ไบต์

-1 และ -4 และ -4 ไบต์ขอบคุณ Flp.Tkc

a=input()
n=len(a)
L,M=[],[]
for i in range(n):L+=a[i::-1];M+=a[:i:-1]
print zip(*[iter(L+M)]*n)

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


ขออภัยสำหรับสแปม แต่ตอนนี้ R ใช้เพียงครั้งเดียวคุณสามารถนำไปไว้ที่นั่นได้โดยตรง: P
FlipTack

@ Flp.Tkc ไม่มีปัญหาฉันมีความสุข :)
Karl Napf

3

JavaScript (ES6) 100 101 105

a=>eval("for(u=r=[],i=l=a.length;i+l;i--)for(j=l;j--;v&&((u%=l)||r.push(s=[]),s[u++]=v))v=a[j-i];r")

น้อย golfed

a => {
  u = 0
  for(r=[], i=l=a.length; i+l>0; i--)
    for(j=l; j--; )
    {
      v = a[j-i]
      if (v) 
      {
        u %= l
        if (u==0) r.push(s=[])
        s[u++] = v
      }
    }
  return r
}

ทดสอบ

F=
a=>eval("for(u=r=[],i=l=a.length;i+l;i--)for(j=l;j--;v&&((u%=l)||r.push(s=[]),s[u++]=v))v=a[j-i];r")

function update() {
  var a=I.value.match(/\d+/g)
  if (a) {
    var r=F(a)
    O.textContent = r.join`\n`
  }
}

update()
<input id=I value='1 2 3 4 5' oninput='update()'>
<pre id=O></pre>


1
returnว้าวที่เป็นวิธีที่ฉลาดมากที่จะหลีกเลี่ยง คุณควรโพสต์เคล็ดลับเกี่ยวกับสิ่งนั้นในเธรดทิป ES6
ETHproductions

@ ETHproductions มันมีขอบเขตที่แคบมาก ส่วนใหญ่เวลา eval ดีกว่า
edc65

@ETHproductions แน่นอนevalดีกว่าแม้ในเวลานี้ : (
edc65

@ETHproductions ฉันโพสต์เคล็ดลับแม้ว่าจะไม่ค่อยมีประโยชน์ในกรณี
edc65

2

MATL , 17 ไบต์

!Gg*tRwZRhPXzGne!

ลองออนไลน์!

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

คำอธิบายต่อไปนี้ใช้อินพุต[1 2 3 4 5]เป็นตัวอย่าง หากต้องการเห็นภาพผลลัพธ์ระดับกลางให้แทรก%(สัญลักษณ์ความคิดเห็น) หลังจากข้อความใด ๆ

โปรดสังเกตว่า;เป็นตัวคั่นแถวสำหรับเมทริกซ์ ดังนั้น[1 2]เวกเตอร์แถว[1; 2]คือเวกเตอร์คอลัมน์และ[1 0; 0 1]เมทริกซ์เอกลักษณ์ 2 × 2

!     % Implicitly input a row vector. Transpose. Gives a column vector
      % STACK: [1; 2; 3; 4; 5]
Gg    % Push input with all (nonzero) values replaced by ones
      % STACK: [1; 2; 3; 4; 5], [1 1 1 1 1]
*     % Multiply, with broadcast. Gives a square matrix
      % STACK: [1 1 1 1 1;
                2 2 2 2 2;
                3 3 3 3 3;
                4 4 4 4 4;
                5 5 5 5 5]
tR    % Duplicate. Upper triangular part
      % STACK: [1 1 1 1 1;
                2 2 2 2 2;
                3 3 3 3 3;
                4 4 4 4 4;
                5 5 5 5 5],
               [1 1 1 1 1
                0 2 2 2 2;
                0 0 3 3 3;
                0 0 0 4 4;
                0 0 0 0 5]
wZR   % Swap. Lower triangular part, below main diagonal 
      % STACK: [1 1 1 1 1;
                0 2 2 2 2;
                0 0 3 3 3;
                0 0 0 4 4;
                0 0 0 0 5],
               [0 0 0 0 0;
                2 0 0 0 0;
                3 3 0 0 0;
                4 4 4 0 0;
                5 5 5 5 0]
h     % Concatenate horizontally
      % STACK: [1 1 1 1 1 0 0 0 0 0;
                0 2 2 2 2 2 0 0 0 0;
                0 0 3 3 3 3 3 0 0 0;
                0 0 0 4 4 4 4 4 0 0;
                0 0 0 0 5 5 5 5 5 0]
P     % Flip vertically
      % STACK: [0 0 0 0 5 5 5 5 5 0;
                0 0 0 4 4 4 4 4 0 0;
                0 0 3 3 3 3 3 0 0 0;
                0 2 2 2 2 2 0 0 0 0;
                1 1 1 1 1 0 0 0 0 0]
Xz    % Column vector of nonzeros, taken in column-major order
      % STACK: [1;2;1;3;2;1;4;3;2;1;5;4;3;2;1;5;4;3;2;5;4;3;5;4;5]
Gne   % Reshape into a matrix with as many rows as input size
      % STACK: [1 1 5 5 4;
                2 4 4 4 3;
                1 3 3 3 5;
                3 2 2 2 4;
                2 1 1 5 5]
 !    % Transpose. Implicitly display
      % STACK: [1 2 1 3 2;
                1 4 3 2 1;
                5 4 3 2 1;
                5 4 3 2 5;
                4 3 5 4 5]

1

JavaScript (ES6), 116 ไบต์

a=>a.map(_=>b.splice(0,a.length),b=[].concat(...a.map((_,i)=>a.slice(~i)),...a.map((_,i)=>a.slice(0,~i))).reverse())

มันเป็นการเริ่มต้น ...


1

R, 84 ไบต์

t(matrix(unlist(split(m<-t(matrix(rev(x<-scan()),l<-sum(1|x),l)),row(m)-col(m))),l))

อ่านอินพุตจาก stdin และเอาต์พุต / ส่งคืน R-matrix

reversed_x <- rev(x<-scan())                # Read input from stdin and reverse
m <- t(matrix(reversed_x,l<-sum(1|x),l))    # Repeat and fit into matrix
diag_list <- split(m,row(m)-col(m))         # Split into ragged list of diagonals
t(matrix(unlist(diag_list),l))              # Flatten and transform back to matrix

อธิบาย

สิ่งที่น่าสนใจที่สุดเกี่ยวกับคำตอบนี้คือวิธีเรียกเส้นทแยงมุมออกมา โดยทั่วไปแล้ววัตถุสามารถแยกออกได้โดยใช้splitฟังก์ชั่นหากระบุวัตถุที่มีปัจจัยตามที่วัตถุถูกแบ่งออกเป็น ในการสร้างปัจจัยเหล่านี้เราสามารถใช้colและrowส่งคืนเมทริกซ์ที่มีดัชนีคอลัมน์และแถวตามลำดับ โดยรับความแตกต่าง: row(m)-col(m)เราได้เมทริกซ์ที่ชอบ:

     [,1] [,2] [,3] [,4] [,5]
[1,]    0   -1   -2   -3   -4
[2,]    1    0   -1   -2   -3
[3,]    2    1    0   -1   -2
[4,]    3    2    1    0   -1
[5,]    4    3    2    1    0

ซึ่งแต่ละเส้นทแยงมุมมีการระบุที่ไม่ซ้ำกัน ตอนนี้เราสามารถแบ่งตามเมทริกซ์นี้และเปลี่ยนเป็นรายการที่มีการขาดโดยใช้split:

$`-4`
[1] 1
$`-3`
[1] 2 1 
$`-2`
[1] 3 2 1
$`-1`
[1] 4 3 2 1
$`0`
[1] 5 4 3 2 1
$`1`
[1] 5 4 3 2
$`2`
[1] 5 4 3
$`3`
[1] 5 4
$`4`
[1] 5

(โปรดสังเกตว่าชื่อของเวกเตอร์แต่ละตัวนั้นสอดคล้องกับค่าในแนวทแยงในเมทริกซ์ด้านบนอย่างไร)

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

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

0

Mathematica 93 Bytes

Partition[Flatten[Table[If[i>n,#[[n;;(i-n+1);;-1]],#[[i;;1;;-1]]],{i,1,2(n=Length@#)-1}]],n]&

นี่คือวิธีที่ฉันมักจะเขียนรหัสนี้ (109 ไบต์):

Partition[Reverse@Flatten[Table[Reverse@Diagonal[ConstantArray[Reverse@#,n],k],{k,-(n=Length@#)+1,n-1}]],n]&

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

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

นี่คือพล็อตเมทริกซ์ที่มีเวกเตอร์อินพุตสุ่ม เห็นได้ชัดว่าโครงสร้างบางอย่างยังคงมีอยู่

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


0

Mathematica, 92 ไบต์

n=NestList[#2,(r=Reverse)@#,(l=Length@#)-1]&;{Most@r[#~n~Rest],#~n~Most}~ArrayReshape~{l,l}&

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

ส่วนแรกn=NestList[#2,(r=Reverse)@#,(l=Length@#)-1]&กำหนดฟังก์ชันnของสองอาร์กิวเมนต์: ส่วนแรกคือรายการความยาวlและส่วนที่สองเป็นฟังก์ชันที่ใช้กับรายการ nใช้ฟังก์ชันนั้นl-1กับรายการอาร์กิวเมนต์ที่กลับรายการและบันทึกผลลัพธ์ทั้งหมดในรายการผลลัพธ์ (การกำหนดrและlตามทางเป็นเพียงการเล่นกอล์ฟ)

nเรียกว่าสองครั้งในรายการต้นฉบับหนึ่งครั้งกับการทำงานRest(วางองค์ประกอบแรกของรายการ) และอีกครั้งกับฟังก์ชั่นเป็นMost(วางองค์ประกอบสุดท้าย) นี้ผลิตรายการย่อยทั้งหมดที่ต้องการ แต่รายชื่อทั้งหมดจะมีครั้งที่สอง (เพราะฉะนั้นพิเศษMost) และช่วงครึ่งปีแรกที่มีในการสั่งซื้อย้อนหลัง (จึงr[...]) สุดท้าย~ArrayReshape~{l,l}ลืมโครงสร้างรายการปัจจุบันและบังคับให้เป็นอาร์เรย์lxl


0

Mathematica, 85 ไบต์

แนะนำให้ทำตามขั้นตอนอย่างแท้จริง:

(l=Length@#;Partition[Flatten@Table[Reverse@Diagonal[Table[#,l],i],{i,-l+1,l-1}],l])&

ลำไส้ของฉันบอกว่าควรมีวิธีที่ชาญฉลาดในการPartทำสิ่งนี้ให้สั้นลง แต่ความพยายามทุกอย่างที่ฉันทำมีความยาวมากกว่า 85 ไบต์


0

ทับทิม (110 ไบต์)

n=a.size
b=[*(0...n)]
b.product(b).group_by{|i,j|i+j}.flat_map{|_,f|f.sort.map{|i,j|a[i][j]}}.each_slice(n).to_a
  #=> [[1, 2, 1, 3, 2],
  #    [1, 4, 3, 2, 1],
  #    [5, 4, 3, 2, 1],
  #    [5, 4, 3, 2, 5],
  #    [4, 3, 5, 4, 5]]

การsortดำเนินการอาจไม่จำเป็น แต่ doc สำหรับ Enumerable # group_by ไม่รับประกันการเรียงลำดับของค่าในค่าแฮช (ซึ่งคืออาร์เรย์) แต่ Ruby รุ่นปัจจุบันให้การสั่งซื้อที่คาดหวังและการสั่งซื้อที่ฉันต้องการถ้าsortเป็น ลบออกจากรหัสของฉัน

ขั้นตอนมีดังนี้

n=a.size 
  #=> 5 
b=[*(0...n)]
  #=> [0, 1, 2, 3, 4] 
c = b.product(b)
  #=> [[0, 0], [0, 1], [0, 2], [0, 3], [0, 4], [1, 0], [1, 1], [1, 2], [1, 3],
  #    [1, 4], [2, 0], [2, 1], [2, 2], [2, 3], [2, 4], [3, 0], [3, 1], [3, 2],
  #    [3, 3], [3, 4], [4, 0], [4, 1], [4, 2], [4, 3], [4, 4]] 
d=c.group_by{|i,j|i+j}
  #=> {0=>[[0, 0]],
  #    1=>[[0, 1], [1, 0]],
  #    2=>[[0, 2], [1, 1], [2, 0]],
  #    3=>[[0, 3], [1, 2], [2, 1], [3, 0]],
  #    4=>[[0, 4], [1, 3], [2, 2], [3, 1], [4, 0]],
  #    5=>[[1, 4], [2, 3], [3, 2], [4, 1]],
  #    6=>[[2, 4], [3, 3], [4, 2]],
  #    7=>[[3, 4], [4, 3]],
  #    8=>[[4, 4]]} 
e=d.flat_map{|_,f|f.sort.map{|i,j|a[i][j]}}
  #=> [1, 2, 1, 3, 2, 1, 4, 3, 2, 1, 5, 4, 3, 2, 1, 5, 4, 3, 2, 5, 4, 3, 5, 4, 5] 
f=e.each_slice(n)
  #=> #<Enumerator: [1, 2, 1, 3, 2, 1, 4, 3, 2, 1, 5, 4, 3, 2, 1, 5, 4, 3, 2,
  #                  5, 4, 3, 5, 4, 5]:each_slice(5)>

สุดท้ายf.to_aส่งกลับอาร์เรย์ที่แสดงก่อนหน้านี้

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