Bir 2D dizinin saat yönünün tersine içe doğru spiral çıkışı


15

Gönderen bu stackoverflow soru

boyutunda bir 2D dizi verildiğinde , değerleri saat yönünün tersine döndürün. Çıktı dışarıdan içeri doğru başlamalı ve başlangıç ​​noktası daima .MxN-(0,0)

Verilen Örnek :

[12345678910111213141516]

Saat yönünün tersine kenar değerleri .1,5,9,13,14,15,16,12,8,4,3,2

Şimdi iç değerler için işlemi tekrarlıyoruz. Bu, aşağıdaki gibi bir matrisle sonuçlanacaktır

[671011]

Ve iç değerler o zaman6,10,11,7

Nihai sonuç o zaman olacaktır.1,5,9,13,14,15,16,12,8,4,3,2,6,10,11,7


kurallar

  • Boş olmayan girdiyi varsayalım
  • Matris değerlerini pozitif tamsayı olarak kabul etme
  • Standart I / O Yöntemleri geçerlidir
  • Standart kuralları ve kazanma kriterleri geçerlidir

Bazı test senaryoları

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

Saat yönünde mi yoksa saatin tersi yönünde mi gidiyoruz?
LegionMammal978

@ LegionMammal978 saat yönünün tersine (Saat yönünün tersine çağrılmış olmama rağmen)
Luis felipe De jesus Munoz

7
Saat yönünün tersine ve saat yönünün tersine doğrudur, her biri sırasıyla BrEng ve AmEng'de daha yaygındır. Eğer gerçekten kafa karıştırmak istiyorsanız, widdershins'i de kullanabilirsiniz .
Dijital Travma

Yanıtlar:


12

R , 54 bayt

@Giuseppe ve @ J.Doe tarafından kaydedilen birkaç bayt.

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

Çevrimiçi deneyin!

İlk sütunu ve satır tersine / transpoze (alt satırı yeni ilk sütunu yaparak) özyineli olarak tek bir sütunla bitene kadar matrisin geri kalanını çıkarın. Ungolfed "geleneksel" sürüm:

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

O sivri dışarı ncol(m)etmek golfed olabilir sum(m)biz pozitif tamsayı matris değerler alabilir çünkü başka byte kaydedin. Ama tüm matrisler (hatta dizelerin matrisleri!) İçin çalıştığı için böyle bırakacağım.


Vaov! Ben kullanımı varsayılan durumu berbat için nasıl t()önler seviyorum ! drop=TRUE`[`if
Giuseppe

ve tam açıklama, ben bile işe yaramadı yaklaşık 200 baytlık bir çözüm vardı, bu yüzden size kudos! Soru bir ödül için uygun olduğunda, muhtemelen size bunun için bir ödül vereceğim.
Giuseppe

@Giuseppe 59 bayta geri döndü! Orijinal denemelerimde olan t()bir is.nulltesti kullanmak zorunda kalmama hoş bir sürpriz oldu.
ngm

Bu son molarak null olmayacak, bu nedenle if-deyimini 54 bayt olarak değiştirebilirsiniz . Test senaryoları için çalışıyor gibi görünüyor.
J.Doe


7

Pyth , 9 bayt

shMM.utC_

Burada deneyin!

Nasıl?

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.

Çok havalı. Bir Pyth acemi olarak artık öğrenecek çok şeyim olduğunu biliyorum,
ElPedro

5

Stax , 7 bayt

ôQÖG·í<

Çalıştır ve hata ayıkla

Bir satırda bir dizi satır alır ve yeni satırla ayrılmış çıktı üretir.

Ambalajından çıkarılmış, golf edilmemiş ve yorum yapılmış gibi görünüyor.

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

Bunu çalıştır


4

Pyth, 20 bayt

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

Burada deneyin

açıklama

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

Tamam , 12 bayt

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

Çevrimiçi deneyin!

Bu, OK'nin transpozisyon şekli hakkında çok fazla umursamadığı gerçeğini kötüye kullanır. K bu olurdu 13 bayt : *:',/(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

Temiz , 69 bayt

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

@o?

Çevrimiçi deneyin!

Bir sonraki satırı / sütunu listenin başına taşır, böylece bağımsız değişkende eşleşebilir.

Meydan okumadaki ilk örnek için, bu şöyle görünür:

@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 bayt

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

Çevrimiçi deneyin!

Julia, devrik-ters işlem ihtiyacını ortadan kaldırarak matrisi 90 derece döndürmek için uygun bir yerleşiktir.

Derleyici uyarılarından da görebileceğiniz gibi, üçlü koşulun tüm bileşenlerinin boşluklarla ayrılması gerektiği konusunda ısrar ediyor ve v. 1.0'da bu gerçekten zorlanmıştı.

Garip bir şekilde, bu durumda özyinelemeden kurtulmanın en kısa yolu bir try-catch bloğu kullanmaktı:

Julia 1.0 , 50 bayt

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

Çevrimiçi deneyin!


2

JavaScript (Node.js) , 89 bayt

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

Çevrimiçi deneyin!

İlk sütunu alır, kalan sütunu alır, sonra her satırı tersine çevirir (= matrisi 90 derece CW döndürür) ve sonra dizi daha fazla giriş kalmayıncaya kadar tekrar eder.


2

APL (Dyalog) , 24 22 bayt

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

Çevrimiçi deneyin!

Nasıl?

{×≢⍵:⍵[;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

Operatörlerin açıklaması iyi olurdu.
Arc676

1
@ Arc676, eklendi!
Zacharý

2

05AB1E , 13 11 10 bayt

ΔRøćRˆ}¯˜þ

@Emigna sayesinde -2 bayt .

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

Δ         # 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

Kömür , 25 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

≔⮌EA⮌ιθ

Girişi 180 ° döndürün. Bunun iki nedeni vardır: a) son satır, çıkarılması en kolay olanıdır ve b) satır, döngünün sonunda kaldırılırsa, döngü daha kolaydır. (Saat yönünde yansıtma ve çıkış yapmayı denedim ama bu fazladan bir bayt aldı.)

Wθ«

Dizi boşalana kadar tekrarlayın.

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

Diziyi 90 ° döndürün.

I⊟θ

Dizinin son satırını kaldırın ve öğeyi ayrı satırlara dize olarak yazdırın.



1

PowerShell , 266 bayt

Evet .. PowerShell matrisleri işlemek için en iyisi değil. Ancak, algoritma temel olarak yukarıdakilerle aynıdır. Her satır virgülle ayrılmış bir dize olarak temsil edilir ve temel olarak her katman için bir döndürme ve transpozisyon yaparız. Belki de ... daha traş, ancak ben değilim pijamalarımla zaten ...

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','}

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.