การหมุนแบบอินเตอร์เลซ


25

ท้าทาย

กำหนดเมทริกซ์จตุรัสของอักขระ (อักขระ ASCII ที่พิมพ์ได้ไบต์เดียว) หมุน "วงแหวน" ของเมทริกซ์แต่ละทิศทางในทิศทางตรงกันข้าม

ลองมาตัวอย่าง:

1 2 3 4 5
6 7 8 9 A
B C D E F
G H I J K
L M N O P

จากนั้นวงแหวนรอบนอกสุดหมุนตามเข็มนาฬิกา 90 องศาดังนี้:

1 2 3 4 5    L G B 6 1
6       A    M       2
B       F => N       3
G       K    O       4
L M N O P    P K F A 5

วงแหวนรอบที่สองหมุนทวนเข็มนาฬิกา 90 องศา:

7 8 9    9 E J
C   E => 8   I
H I J    7 C H

วงแหวนสุดท้ายหมุนตามเข็มนาฬิกา 90 องศา แต่เนื่องจากเป็นตัวเลขเดียว (ตัวอักษรในตัวอย่างของเรา) ดังนั้นจึงไม่ได้รับผลกระทบจริงๆ

ผลลัพธ์สุดท้ายคือ:

L G B 6 1
M 9 E J 2
N 8 D I 3
O 7 C H 4
P K F A 5

หากเมทริกซ์มีความยาวด้านเท่ากันวงแหวนด้านในสุดจะเป็น 2x2 สแควร์และควรจะหมุน

อินพุต

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

เอาท์พุต

รายการของรายการในรูปแบบมาตรฐานที่สมเหตุสมผล กฎเช่นเดียวกับอินพุต

กรณีทดสอบ

1 2 3    7 4 1
4 5 6 => 8 5 2
7 8 9    9 6 3

1 2 3 4 5 6    Y S M G A 1
A B C D E F    Z E K Q W 2
G H I J K L => ! D O I V 3
M N O P Q R    @ C P J U 4
S T U V W X    # B H N T 5
Y Z ! @ # $    $ X R L F 6

เครดิต

แรงบันดาลใจอย่างมากจากความท้าทายที่เกี่ยวข้องที่หมุนแต่ละองค์ประกอบทวนเข็มนาฬิกาหนึ่งตำแหน่ง (ไม่ใช่ 90 องศา)



@ rahnema1 ใช่ฉันจำโพสต์นั้นได้ โพสต์นี้ส่วนใหญ่ได้รับแรงบันดาลใจจากหนึ่ง; ฉันจะให้เครดิต ขอบคุณ!
HyperNeutrino

@ Mr.Xcoder อ๊ะ คุณพูดถูกต้องขอบคุณ
HyperNeutrino

@HyperNeutrino เราสามารถใช้มิติของเมทริกซ์เป็นส่วนหนึ่งของอินพุตได้หรือไม่
Uriel

อักขระทั้งหมดในตัวอย่างของคุณไม่ซ้ำกัน จะเป็นเช่นนี้เสมอหรือไม่
Dennis

คำตอบ:


9

Haskell , 94 ไบต์

ฟังก์ชั่นที่ไม่ระบุชื่อการรับและส่งคืนรายการStrings

(cycle[t.r,r.t,r.t,r.t]?)["123", "456", "789"]ใช้เป็น

(cycle[t.r,r.t,r.t,r.t]?)
(g:h)?(a:b)=g$a:h?t(r b)
_?a=a
r=reverse;t=zipWith(:)`foldr`repeat[]

ลองออนไลน์!

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

  • rreverseเป็น เป็นหนึ่งไบต์สั้นกว่าที่นำเข้าt หมุนรายการตามเข็มนาฬิกา 90 องศาและหมุนทวนเข็มนาฬิกาData.List.transposet.rr.t
  • โอเปอเรเตอร์?รับสองอาร์กิวเมนต์รายการฟังก์ชันและเมทริกซ์เป็นรายการสตริง
    • เมทริกซ์ที่ว่างเปล่าจะถูกส่งคืน
    • มิฉะนั้น?ดึงแถบฟังก์ชันแรกfออกจากรายการฟังก์ชันและบรรทัดแรกaปิดเมทริกซ์
    • จากนั้นมันจะหมุนส่วนที่เหลือbของเมทริกซ์ตามเข็มนาฬิกาแล้ววนซ้ำกับฟังก์ชันนั้นและฟังก์ชันที่เหลือ นี่จะค่อยๆดึงเมทริกซ์จากด้านนอกเข้ามาหนึ่งวงในแต่ละสี่ขั้นตอน
    • จากนั้นมันจะเพิ่มบรรทัดเดิมaให้กับผลลัพธ์และใช้ฟังก์ชันfกับมันเพื่อปรับการวางแนวของเมทริกซ์
  • ฟังก์ชั่นที่ไม่ระบุชื่อเรียกใช้?กับเมทริกซ์การป้อนข้อมูลเป็นรายการของสตริงและรายการที่ไม่มีที่สิ้นสุดของฟังก์ชั่นซึ่งจะวนซ้ำทุกสี่ขั้นตอน
    • สำหรับขั้นตอนส่วนใหญ่นั้นฟังก์ชั่นการหมุนทวนเข็มนาฬิกาซึ่งจะเป็นการยกเลิกการหมุนตามเข็มนาฬิกาโดยปริยายที่กระทำโดย?เมื่อเรียกซ้ำ
    • อย่างไรก็ตามขั้นตอนแรกและทุก ๆ สี่ขั้นตอนหลังจากนั้นจะเป็นการหมุนตามเข็มนาฬิกาแทน
      • ฟังก์ชั่นนี้จะใช้เมื่อวงแหวนของเมทริกซ์เสร็จสมบูรณ์ทำให้แต่ละวงแหวนหมุน 180 องศาเมื่อเทียบกับวงแหวนถัดไป
      • โชคดีนี่คือการแปลงที่ถูกต้องเพื่อนำไปใช้กับเมทริกซ์สุดท้ายที่เสร็จสมบูรณ์เพื่อให้ได้ผลลัพธ์สุดท้าย

6

Python 2 , 104 ไบต์

def f(x):l=len(x)-1;r=range(l+1);return[[[x[l-i][j],x[i][l-j]][min(i,j,l-i,l-j)%2]for i in r]for j in r]

ลองออนไลน์!

x[l-i][j]คือ coordenates ของการหมุนตามเข็มนาฬิกาx[i][l-j]สำหรับการหมุนทวน min(i,j,l-i,l-j)%2ใช้เพื่อเลือกทิศทางที่ถูกต้อง


การหมุนกลับแบบวนซ้ำ
tuskiomi

@tuskiomi อืม ??
ร็อด

@tuskiomi ฉันลองใช้วิธีเรียกซ้ำใน ES6 มันเป็นเรื่องยาวเป็นสองเท่าเป็นพอร์ตที่เรียบง่ายของคำตอบนี้ ...
นีล

4

Mathematica, 113 ไบต์

r=Reverse;(l=Length[s=#];Table[s[[i+1;;l-i,i+1;;l-i]]=r/@r@s[[i+1;;l-i,i+1;;l-i]],{i,⌊l/2⌋}];r/@Transpose@s)&


มันจะดีกว่าที่จะใส่เป็นสตริงอักขระเช่น "E" สำหรับตัวอักษรพิเศษเช่น E, I ...

อินพุต

[{{1, 2, 3, 4, 5, 6}, {A, B, C, D, "E", F}, {G, H, "ฉัน", J, K, L}, {M , N, O, P, Q, R}, {S, T, U, V, W, X}, {Y, Z, "!", "@", "#", "&"}}]

เอาท์พุต

{{Y, S, M, G, A, 1}, {Z, "E", K, Q, W, 2}, {"!", D, O, "I", V, 3}, { "@", C, P, J, U, 4}, {"#", B, H, N, T, 5}, {"&", X, R, L, F, 6}}


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