เอาท์พุทเกลียวด้านในทวนเข็มนาฬิกาของอาร์เรย์ 2D


15

จากคำถาม stackoverflow นี้

กำหนดขนาดอาร์เรย์ 2 มิติส่งออกค่าในลักษณะทวนเข็มนาฬิกา เอาต์พุตจะต้องเริ่มจากด้านนอกสู่ด้านในและจุดเริ่มต้นจะเป็นเสมอM×N(0,0)

ตัวอย่างที่ได้รับ:

[12345678910111213141516]

ค่าขอบในการทวนเข็มนาฬิกาเป็นแล้ว1,5,9,13,14,15,16,12,8,4,3,21,5,9,13,14,15,16,12,8,4,3,2

ตอนนี้เราทำกระบวนการซ้ำสำหรับค่าภายใน นี่จะจบลงด้วยเมทริกซ์ดังต่อไปนี้

[671011]

และค่าภายในคือ6,10,11,7

ผลลัพธ์สุดท้ายจะเป็น1,5,9,13,14,15,16,12,8,4,3,2,6,10,11,7


กฎระเบียบ

  • สมมติว่าอินพุตไม่ว่างเปล่า
  • สมมติว่าค่าเมทริกซ์เป็นจำนวนเต็มบวก
  • มาตรฐานฉัน O / วิธีใช้
  • กฎกติกามาตรฐานและเกณฑ์การชนะ

บางกรณีทดสอบ

Input
[
  [1, 2, 3, 4, 5, 6, 7],
  [8, 9, 10,11,12,13,14],
  [15,16,17,18,19,20,21]
]
Output
1,8,15,16,17,18,19,20,21,14,7,6,5,4,3,2,9,10,11,12,13

--------------------------------------------------------

Input
[
    [1,2,3],
    [3,2,1],
    [4,5,6],
    [6,5,4],
    [7,8,9],
    [9,8,7]
]
Output
1,3,4,6,7,9,8,7,9,4,6,1,3,2,2,5,5,8

-----------------------------------------------------
Input
[
    [1]
]
Output
1
-----------------------------------
Input
[
    [1, 2],
    [2, 1]
]
Output
1,2,1,2
-----------------------------------------------------
Input
[
    [1,2,3,6,7],
    [2,4,3,2,1],
    [3,2,4,5,6],
    [6,5,6,5,4],
    [10,4,7,8,9],
    [12,4,9,8,7]
]
Output
1,2,3,6,10,12,4,9,8,7,9,4,6,1,7,6,3,2,4,2,5,4,7,8,5,5,2,3,4,6

ดังนั้นเราจะไปตามเข็มนาฬิกาหรือทวนเข็มนาฬิกา?
LegionMammal978

@ LegionMammal978 ทวนเข็มนาฬิกา (ฉันเรียกว่าทวนเข็มนาฬิกา)
Luis felipe De jesus Munoz

7
ทั้งต่อต้านและทวนเข็มนาฬิกามีความถูกต้องโดยทั่วไปใน BrEng และ AmEng ตามลำดับ หากคุณต้องการสับสนคุณสามารถใช้widdershins ได้เช่นกัน
Digital Trauma

คำตอบ:


12

R , 54 ไบต์

หลายไบต์ถูกบันทึกโดย @Giuseppe และ @ J.Doe

f=function(m)if(ncol(m))c(m[,1],f(t(m[nrow(m):1,-1])))

ลองออนไลน์!

ดึงแถบออกซ้ำ ๆ ในคอลัมน์แรกและย้อนกลับ / เปลี่ยนเส้นทาง (ทำให้แถวล่างเป็นคอลัมน์แรกใหม่) ส่วนที่เหลือของเมทริกซ์จนกว่าคุณจะจบลงด้วยคอลัมน์เดียวเท่านั้น Ungolfed รุ่น "ดั้งเดิม":

f <- function(m) {
 if(ncol(m) == 1) {
    m
  } else {
    c(m[,1], f(t(m[nrow(m):1,-1])))
  }
}

มันชี้ให้เห็นว่าncol(m)สามารถ golfed เพื่อsum(m)บันทึกไบต์อื่นเพราะเราได้รับอนุญาตให้ถือว่าค่าเมทริกซ์จำนวนเต็มบวก แต่ฉันจะปล่อยให้มันเป็นอย่างนี้เพราะมันใช้ได้กับเมทริกซ์ทั้งหมด (แม้แต่เมทริกซ์ของสตริง!)


ว้าว! ฉันชอบวิธีการใช้งานที่t()ป้องกันไม่ให้drop=TRUEค่าเริ่มต้นสำหรับการ`[`กวดขันifเงื่อนไข!
Giuseppe

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

@Giuseppe กลับไปที่ 59 ไบต์! ฉันรู้สึกประหลาดใจโดยt()ไม่ต้องใช้การis.nullทดสอบที่เป็นความพยายามดั้งเดิมของฉัน
ngm

นี่ไม่ใช่ครั้งสุดท้ายที่mจะเป็นโมฆะดังนั้นคุณสามารถเปลี่ยนคำสั่ง if- 54 ไบต์ได้ ดูเหมือนว่าจะทำงานสำหรับกรณีทดสอบ
J.Doe


7

Pyth , 9 ไบต์

shMM.utC_

ลองที่นี่!

อย่างไร?

shMM.utC_     Full program. Takes a 2D array (matrix) from STDIN.
    .u        Until a result that has occurred before is found, loop and collect...
        _     Reverse the matrix (reverse the order of its rows).
       C      Transpose.
      t       Remove first element.
 hMM          For each element in the resulting 3D array, get the heads of its elements.
s             Flatten.

ก็เท่ห์ ในฐานะผู้เริ่มต้น Pyth ฉันรู้ว่าฉันมีอะไรให้เรียนรู้มากมาย
ElPedro

5

Stax , 7 ไบต์

ôQÖG·í<

เรียกใช้และแก้ไขข้อบกพร่อง

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

คลายกล่อง ungolfed และแสดงความคิดเห็นมันมีลักษณะเช่นนี้

W       repeat the rest of the program until cancelled explicitly
  rM    rotate matrix *clock-wise* (yes, this is the opposite of the challenge)
  |c    assert matrix is truthy. (has rows) cancel otherwise.
  B     remove the top row of the matrix, and push separately to main stack
  rm    reverse the top row (this fixes the rotation direction), and print each value

เรียกใช้อันนี้


4

Pyth, 20 ไบต์

J.TQWJ=+YhJ=J_.TtJ)Y

ลองที่นี่

คำอธิบาย

J.TQWJ=+YhJ=J_.TtJ)Y
J.TQ                    Call the transposed input J.
    WJ            )     While J is not empty...
      =+YhJ             ... put the top row into Y (initially [])...
           =J   tJ      ... remove the top row...
             _.T        ... reverse and transpose (rotate clockwise).
                   Y    Output the result.

4

oK , 12 ไบต์

*+,/(1_+|:)\

ลองออนไลน์!

สิ่งนี้เป็นการละเมิดความจริงที่ว่า oK ดูเหมือนจะไม่สนใจรูปร่างของการขนย้ายมากเกินไป ใน k นี้จะเป็น13 ไบต์*:',/(1_+|:)\ :

       +|:   /reverse, then transpose (rotate right)
     1_      /remove first line
    (     )\ /fixpoint of the above, keeping intermediate results (scan)
  ,/         /concatenate all the rows
*+           /get the first element of each row

3

ทำความสะอาด , 69 ไบต์

import StdEnv,StdLib
? =transpose
@[h:t]=h++ @(reverse(?t))
@_=[]

@o?

ลองออนไลน์!

ย้ายแถว / คอลัมน์ถัดไปไปยังส่วนหัวของรายการเพื่อให้สามารถจับคู่รูปแบบในการโต้แย้ง

สำหรับตัวอย่างแรกในการท้าทายนี่เป็นดังนี้:

@o? [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]
@ h=:[1, 5, 9, 13] t=:[[2, 6, 10, 14], [3, 7, 11, 15], [4, 8, 12, 16]]
[1, 5, 9, 13] ++ @ h=:[14, 15, 16] t=:[[10, 11, 12], [6, 7, 8], [2, 3, 4]]
[1, 6, 9, 13, 14, 15, 16] ++ @ h=:[12, 8, 4] t=:[[11, 7, 3], [10, 6, 2]]
[1, 6, 9, 13, 14, 15, 16, 12, 8, 4] ++ @ h=:[3, 2] t=:[[7, 6], [11, 10]]
[1, 6, 9, 13, 14, 15, 16, 12, 8, 4, 3, 2] ++ @ h=:[6, 10] t=:[[7, 11]]
[1, 6, 9, 13, 14, 15, 16, 12, 8, 4, 3, 2, 6, 10] ++ @ h=:[11, 7] t=:[]
[1, 6, 9, 13, 14, 15, 16, 12, 8, 4, 3, 2, 6, 10, 11, 7] ++ @ []

3

Julia 0.7 , 47 ไบต์

f(m)=[m[:,1];sum(m)<1?[]:f(rotr90(m[:,2:end]))]

ลองออนไลน์!

จูเลียมีการติดตั้งในตัวที่สะดวกในการหมุนเมทริกซ์ 90 องศาทำให้ไม่ต้องใช้การดำเนินการสลับขั้วกลับ

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

ผิดปกติพอในสถานการณ์นี้วิธีที่สั้นที่สุดที่ฉันพบว่าการแยกจากการสอบถามซ้ำคือการใช้บล็อกลองจับ:

Julia 1.0 , 50 ไบต์

f(m)=[m[:,1];try f(rotr90(m[:,2:end]))catch;[]end]

ลองออนไลน์!


2

JavaScript (Node.js) , 89 ไบต์

f=a=>a>[]?[...a.map(x=>x[0]),...f(a[0].map((_,i)=>a.map(y=>y[i]).reverse()).slice(1))]:[]

ลองออนไลน์!

นำคอลัมน์แรกย้ายส่วนที่เหลือแล้วย้อนกลับแต่ละแถว (= หมุนเมทริกซ์ 90 องศา CW) จากนั้นทำซ้ำจนกระทั่งอาร์เรย์ไม่มีรายการอีกต่อไป


2

APL (Dyalog) , 24 22 ไบต์

{×≢⍵:⍵[;1],∇⍉⊖0 1↓⍵⋄⍬}

ลองออนไลน์!

อย่างไร?

{×≢⍵:⍵[;1],∇⍉⊖0 1↓⍵⋄⍬}
{                    } - a function
 ×≢⍵:                  - if non-empty:
     ⍵[;1]             - the left column
          ,∇⍉⊖0 1↓⍵    - repeat this function without the left column, rotated counter clockwise
                   ⋄⍬  - otherwise, return an empty vector

คำอธิบายของผู้ประกอบการจะดี
Arc676

1
@ Arc676 เพิ่มแล้ว!
Zacharý

2

05AB1E , 13 11 10 ไบต์

ΔRøćRˆ}¯˜þ

-2 ไบต์ขอบคุณที่@Emigna

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

Δ         # Loop until the stack no longer changes:
 R        #  Reverse the order of the rows
          #   i.e. [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
          #    → [[13,14,15,16],[9,10,11,12],[5,6,7,8],[1,2,3,4]]
  ø       #  Zip, swapping rows and column
          #   → [[13,9,5,1],[14,10,6,2],[15,11,7,3],[16,12,8,4]]
   ć      #  Head extracted
          #   → [[14,10,6,2],[15,11,7,3],[16,12,8,4]] and [13,9,5,1]
    R     #  Reverse this row
          #   → [1,5,9,13]
     ˆ    #  Pop and push it to the global array
}         # After the loop:
 ¯        #  Push the global array
          #   i.e. [[1,5,9,13],[14,15,16],[12,8,4],[3,2],[6,10],[11],[7],"",""]
  ˜       #  Flatten it
          #   → [1,5,9,13,14,15,16,12,8,4,3,2,6,10,11,7,"",""]
   þ      #  Remove all empty string by only leaving all digits
          #   → ["1","5","9","13","14","15","16","12","8","4","3","2","6","10","11","7"]
          # (and output it implicitly)


1

ถ่าน 25 ไบต์

≔⮌EA⮌ιθWθ«≔E§θ⁰⮌Eθ§μλθI⊟θ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

≔⮌EA⮌ιθ

หมุนอินพุต 180 ° นี่คือเหตุผลสองประการ: ก) แถวสุดท้ายเป็นวิธีที่ง่ายที่สุดในการลบและ b) ง่ายต่อการวนรอบหากแถวถูกลบออกที่ส่วนท้ายของลูป (ฉันลองไตร่ตรองและเอาท์พุทตามเข็มนาฬิกา แต่มันใช้ไบต์พิเศษ)

Wθ«

ทำซ้ำจนกว่าอาร์เรย์จะว่างเปล่า

≔E§θ⁰⮌Eθ§μλθ

หมุนอาร์เรย์ 90 °

I⊟θ

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



1

PowerShellขนาด 266 ไบต์

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

Filter F{$a=$_-replace"],|]|\s",''-split'\['|?{$_-ne''};$b=@();while($a-ne $null){$N=($a[0]-split',').Count-1;$a=0..$N|%{$i=$_;($a|%{($_-split',')[$i]})-join','};if($d){[array]::Reverse($a)}if($N-gt0){$b+=$a[0];$a=$a[1..$N]}else{$b+=$a;$a=$null};$d=$true}$b-join','}

ลองออนไลน์!

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