หมุนตัวต้านเส้นทแยงมุม


32

พื้นหลัง

ในภาษาการเขียนโปรแกรมที่เหมาะสมที่สุดมันง่ายมากที่จะหมุนแถวหรือคอลัมน์ของอาร์เรย์ 2D ในการท้าทายนี้งานของคุณคือหมุนตัวต้านเส้นทแยงมุมแทน โปรดจำไว้ว่าการต้านเส้นทแยงมุมของอาเรย์ 2 มิตินั้นเป็น 1D สไลซ์ในทิศทางตะวันออกเฉียงเหนือ↗

อินพุต

อาร์เรย์ 2D สี่เหลี่ยมที่ไม่ว่างเปล่าของตัวเลขหลักเดียวในรูปแบบที่เหมาะสม โปรดทราบว่าอาเรย์อาจจะไม่ใช่รูปสี่เหลี่ยมจัตุรัส

เอาท์พุต

อาเรย์เดียวกัน แต่มีการต่อต้านในแนวทแยงหมุนหนึ่งขั้นตอนไปทางขวา

ตัวอย่าง

พิจารณา3x4อินพุตอาร์เรย์

0 1 2 3
4 5 6 7
8 9 0 1

การต่อต้านแนวทแยงมุมของอาเรย์นี้คือ

0
4 1
8 5 2
9 6 3
0 7
1

เวอร์ชันที่หมุนได้ของพวกเขาคือ

0
1 4
2 8 5
3 9 6
7 0
1

ดังนั้นผลลัพธ์ที่ถูกต้องคือ

0 4 5 6
1 8 9 0
2 3 7 1

กฎและการให้คะแนน

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

ลีดเดอร์บอร์ด

นี่คือตัวอย่างข้อมูลเพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

## Language Name, N bytes

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

กรณีทดสอบเพิ่มเติม

Input:
4
Output:
4

Input:
5 6 1
Output:
5 6 1

Input:
0 1
6 2
Output:
0 6
1 2

Input:
6 3 0 8
4 6 1 4
6 2 3 3
9 3 0 3
Output:
6 4 6 1
3 6 2 3
0 9 3 0
8 4 3 3

Input:
5 8 2
6 7 3
2 6 1
6 0 6
6 4 1
Output:
5 6 7
8 2 6
2 6 0
3 6 4
1 6 1

Input:
9 9 4 0 6 2
2 3 2 6 4 7
1 5 9 3 1 5
0 2 6 0 4 7
Output:
9 2 3 2 6 4
9 1 5 9 3 1
4 0 2 6 0 4
0 6 2 7 5 7 

คำตอบ:


20

CJam, 20

{z_)\zLa+(@+\.+s\,/}

เขียนเป็นบล็อกฟังก์ชัน ลองออนไลน์

คำอธิบาย:

อินพุตสามารถดูได้ดังนี้:

แผนภาพการป้อนข้อมูล

นั่นคือเราแยกแถวบนและคอลัมน์ขวาออกจากเมทริกซ์ที่เหลือและพิจารณาองค์ประกอบเหล่านั้นตามลำดับที่ลูกศรชี้

จากนั้นผลลัพธ์จะเป็นดังนี้:

แผนภาพการส่งออก

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

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

z      zip (transpose) the matrix
_      make a copy
)      take out the last row (right column before transposing)
\      swap with the rest of the matrix
z      transpose back
La+    append an empty row (needed for the single-column case,
        which leaves an empty matrix here)
(      take out the first row (top row without the corner)
@+     bring the right column to the top of the stack and concatenate
        obtaining an array of the edge elements (marked with the blue arrow)
\      swap with the remaining part (big white block in the diagrams)
.+     concatenate element by element
        each edge element is concatenated with a row of the white block
        after the white block runs out, the remaining elements form new rows
s      convert the whole thing to a string (concatenating all rows)
\      swap with the copy of the transposed matrix
,      get its length (number of original columns)
/      split the string into rows of that length

คำตอบของ Pyth ก็มีขนาด 20 ไบต์เช่นกัน แต่คุณเป็นรุ่นก่อนหน้าดังนั้นฉันจึงยอมรับ
Zgarb

9

CJam, 44 43 42 40 ไบต์

qN/:ReeSf.*:sz1fm<{Rz,{(S-(o\}*~]{},No}h

ทดสอบที่นี่

อืมดีกว่าความพยายามครั้งแรกของฉัน แต่ฉันมีความรู้สึกว่าเดนนิสจะแก้ปัญหานี้ได้น้อยกว่ามาก ...

อินพุตและเอาต์พุตเป็นแบบ ASCII กริด:

0123
4567
8901

จะช่วยให้

0456
1890
2371


3
@TimmyD ฉันควรรอจนกว่าจะสิ้นสุดระยะเวลาผ่อนผันเพื่อแก้ไขจาก 47 ลงไปที่ 43: P
Martin Ender

ใช่ มันกลายเป็นมส์
intrepidcoder

1
ในที่สุดฉันก็ไปและเรียนรู้ภาษาการเล่นกอล์ฟเพื่อที่ฉันจะได้เล่นกอล์ฟขนาด 4 ไบต์ถึง 3 และเข้าร่วมลิงค์โซ่ :)
Khuldraeseth na'Barya

6

J, 24 ตัวอักษร

ฟังก์ชั่นรับหนึ่งอาร์กิวเมนต์

$$<@(1&|.)/./:&;</.@i.@$

J มีการดำเนินการ/.ที่เรียกว่าเอียง มันไม่สามารถย้อนกลับได้ดังนั้นการสร้างใหม่จึงไม่สำคัญ แต่คุณสามารถพิจารณาว่า "การระบุรายการแบบเอียง" เป็นการเปลี่ยนแปลงองค์ประกอบของอาร์เรย์ ดังนั้นเราจึงเปลี่ยนการเรียงสับเปลี่ยนด้วย/:( เรียงลำดับ dyadic ) โดยใส่การเรียงสับเปลี่ยนแบบ "รายการเอียง" สำหรับขนาดนั้น ( </.@i.@$) ทางขวาและค่าเอียงใหม่ของเราหมุนอย่างถูกต้องทางซ้าย $$แล้วเราก่อร่างใหม่รายการนี้ลงในอาร์เรย์สี่เหลี่ยมเก่าใช้ดีเก่า

   3 4$i.10
0 1 2 3
4 5 6 7
8 9 0 1
   ($$<@(1&|.)/./:&;</.@i.@$) 3 4$i.10
0 4 5 6
1 8 9 0
2 3 7 1

ลองออนไลน์


นี่คือจุดสูงสุด J ตรงนี้ ทำได้ดี.
โยนาห์

5

J, 38 30 ไบต์

บันทึก 8 ไบต์ด้วย @algorithmshark

{./.((}.~#),~({.~#),.])}:"1@}.   

ฟังก์ชั่นรวบรวมขอบด้านบนและด้านซ้ายลงในรายการตัดรายการให้มีขนาดเพียงพอสองชิ้นและเย็บเข้าที่ด้านขวาและด้านล่างของส่วนแกน

การใช้งาน:

   ]input=.0 1 2 3, 4 5 6 7,: 8 9 0 1
0 1 2 3
4 5 6 7
8 9 0 1
   ({./.((}.~#),~({.~#),.])}:"1@}.) input
0 4 5 6
1 8 9 0
2 3 7 1

ลองออนไลน์ได้ที่นี่


1
ลงไปที่ 30 ตัวอักษร: {./.แทนที่}:@{.,{:"1และคุณสามารถบันทึกตัวหนอนสองตัวได้โดยการพลิกขบวนไปรอบ ๆ : {./.((}.~#),~({.~#),.])}:"1@}..
algorithmshark

4

Julia, 153 149 139 ไบต์

A->(length(A)>1&&((m,n)=size(A);r(X)=for i=1:n X[:,i]=reverse(X[:,i])end;r(A);for i=-m:m A[diagind(A,i)]=circshift(diag(A,i),1)end;r(A));A)

สิ่งนี้จะสร้างฟังก์ชั่นที่ไม่มีชื่อที่ยอมรับอาร์เรย์และส่งกลับอาร์เรย์อินพุตที่ถูกแก้ไข

Ungolfed:

# Create a function to reverse the columns of a matrix
function revcols!(X)
    for = 1:size(X, 2)
        X[:,i] = reverse(X[:,i])
    end
    return X
end

# Our main function
function zgarb!(A)
    # Only perform operations if the array isn't one element
    if length(A) > 1
        # Record the number of rows
        m = size(A, 1)

        # Reverse the columns in place
        revcols!(A)

        # Shift each diagonal
        for i = -m:m
            A[diagind(A, i)] = circshift(diag(A, i), 1)
        end

        # Reverse the columns back
        revcols!(A)
    end
    return A
end

ขอบคุณ Martin Büttnerสำหรับคำแนะนำอัลกอริทึมและการบันทึก 4 ไบต์!


3

ES6, 75 ไบต์

สิ่งนี้ยอมรับอาร์เรย์ของอาร์เรย์เป็นพารามิเตอร์และปรับเปลี่ยนให้เข้าที่

a=>{t=a.shift();a.map(r=>{t.push(r.pop());r.unshift(t.shift())});a.push(t)}

Ungolfed:

function anti_diagonal(array) {
    var temp = array.shift(); // strip off the first row
    array.forEach(row => temp.push(row.pop())); // strip off the last elements of each row
    array.forEach(row => row.unshift(temp.shift())); // distribute the elements to the beginning of each row
    array.push(temp); // the remaining elements become the last row
}

ดูไดอะแกรมของ @ aditsu เพื่อชี้แจงเพิ่มเติม


คุณสามารถบันทึก 2 ไบต์โดยเปลี่ยน{t.push(r.pop());r.unshift(t.shift())}เป็นt.push(r.pop())+r.unshift(t.shift())
user81655

3

Pyth, 20 ไบต์

J+PhQ.)MQ++L.(J0tQ]J

ใช้วิธีการของ Adistu ในการลบแถวบนและคอลัมน์ด้านขวาจากนั้นติดไว้ที่ด้านซ้ายและด้านล่าง แต่ด้วยโครงสร้างข้อมูลที่ไม่แน่นอนไม่ใช่การแปลงสัญญาณ


2

อ็อกเทฟ, 85 ไบต์

@(a)[(b=[a(1,1:end),a(2:end,end)'])(1:(s=size(a)(1)))',[a(2:end,1:end-1);b(s+1:end)]]

ผมหวังว่าผมจะได้รับการกำจัดของends


1

Python 2 , 113 104 94 ไบต์

f=lambda i,b=[]:i and[b and b[:1]+i[0][:-1]]+f(i[1:],b[1:]or i[0][:-1]+[l[-1]for l in i])or[b]

ลองออนไลน์!

นี่เป็นการตีความตามตัวอักษรอย่างเป็นธรรมของวิธีการของ @ aditsu ไวยากรณ์ของ Python สำหรับการจัดการรายการที่ว่างเปล่าเป็น False ช่วยประหยัดเพิ่มอีก 10 ไบต์


บันทึก 8 ไบต์โดยยกเลิกแถวที่ฉันไป
SmileAndNod


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