Bir matristeki her 2x2 bloğu döndürün


11

Meydan okuma

Tamsayılarla bir n x mmatris verilir n > 1ve m > 1tamsayılarla doldurulur

1 2 3
4 5 6

ve 2x2matristeki bloklar kadar tam değerlere sahip tam sayıların bir listesi ( (n-1)*(m-1)tam sayıya ihtiyacınız varsa)

[1, 2]

Verileri 2x2verilen sırayla listedeki geçerli değerle döndürülen her blokla çıktılar. Yukarıdaki örnek

4 6 2
5 3 1

İlk blok bir kez sağa döner ve ikinci blok iki kez sağa döner.

notlar

  • Pozitif bir tam sayı, bu kadar adımda sağa döndüğünüz anlamına gelir.
  • Negatif bir tam sayı, bu kadar çok adım sola döndüğünüz anlamına gelir.
  • Sıfır, döndürmediğiniz anlamına gelir.
  • Blokları satır şeklinde döndürürsünüz. Bu, ilk satırdan başlayıp sağa gittiğiniz anlamına gelir. Bu satırdaki her bloğu döndürdüğünüzde bir sonraki bloğa geçersiniz. Sonunda her blok tam olarak bir kez döndürüldü.
  • Blokların birbiriyle çakıştığını unutmayın. Yukarıdaki ilk matris bloklara sahiptir [[1,2],[4,5]]ve [[2,3],[5,6]]örneğin.
  • Bir bloğun her dönüşü, bitişik bloklardaki dönüşü etkiler. Bu nedenle yukarıda açıklanan desendeki rotasyonları yapmanız gerekir.

kurallar

  • Girişi en uygun biçimde alabilirsiniz. Lütfen yanıtınızda hangisini kullandığınızı belirtin. Bu mu değil sen matris blok-bilgeliğine sahip olmasına rağmen okumak için izin verir.
  • İşlev veya tam programa izin verilir.
  • Giriş / çıkış için varsayılan kurallar .
  • Standart boşluklar geçerlidir.
  • Bu , bu yüzden en düşük bayt sayısı kazanır. Tiebreaker daha erken sunuluyor.

Test senaryoları

Buradaki girdi biçimi, matris için bir liste ve değerler için normal bir listedir.

[[1,2], [3,4]], [-3] -> [[4,1], [3,2]]
[[1,1,1], [1,1,1]], [-333, 666] -> [[1,1,1], [1,1,1]]
[[1,2,3], [4,5,6]], [1,2] -> [[4,6,2], [5,3,1]]
[[1,2,3], [4,5,6], [7,8,9]], [4,0,12, -20] -> [[1,2,3], [4, 5,6], [7,8,9]]
[[1,2,3,4,5], [5,4,3,2,1], [1,2,3,4,5]], [2, -3,4,1,6, 24,21, -5] -> [[4,1,5,2,4], [2,1,3,5,5], [3,2,4,3,1]]

Mutlu Kodlama!

Yanıtlar:


4

CJam ( 42 40 bayt)

{(\@2$,(/.{@a@a+z(\@.{4,={+2/zW%~}*}z~}}

Çevrimiçi demo

Temelde bu, bloğu katlamak için aynı tekniği iki kez uygular

{4,={+2/zW%~}*}

2x2'lik bir matris üzerinde ve birkaç kez döndürmek için çalışır.

[first row] [[second row] [third row] ... [last row]] [value_0 value_1 ... value_n]

ile işlenebilir

.{block}

ve etkisi vardır

[first row]
[second row] value_0 {block}~
[third row] value_1 {block}~
...

çünkü .( %CJam'da olduğu gibi ), bitene kadar sonuçları bir dizi halinde toplamaz.


4,=Doğru modulo için kullanarak bir bayt kaydedebilirsiniz (bloğunuzun en az bir kez çalışması gerekmiyorsa?).
Martin Ender

Ayrıca zW%rotasyon için ne dersiniz ?
Martin Ender

@ MartinBüttner, rotasyonun çok uzun göründüğünü düşündüm, ancak daha kısa olanı hatırlayamadım. Modulo güzel hile.
Peter Taylor

2

CJam, 65 63 60 55 bayt

Bunu yapmanın daha iyi bir yolu olmalı ...

{_e_\z,:N(@/Ta*ee{~4,=,f{;1$,,\[XTN_)]f+_(+er\f=}~}/N/}

Bu, yığındaki talimatları ve matrisi (bu sırayla) bekleyen ve sonuçta ortaya çıkan matrisi yerinde bırakan adsız bir işlevdir.

Burada test edin.

açıklama

Şu anda kodun tam dökümünü yazmak istemiyorum, bu yüzden kaba bir genel bakış:

  • 2D dizi manipülasyonu CJam'da bir acıdır, bu yüzden matrisi açıyorum, her dönüşü belirli konumlardaki öğelerin permütasyonu olarak hesaplıyorum ve sonra diziyi tekrar satırlara ayırıyorum. Matrisin genişliği depolanır N.
  • Pozisyonda bir dönüş kaçılmış dizideki dört endeksleri değiştirir: k <- k+1, k+1 <- k+1+N, k+N <- k, k+1+N <- k+1. kTalimat listesi boyunca her dizin için, buna karşılık gelen bir permütasyon hesaplar ve bunu girilmemiş girdi dizisine uygularım.
  • Bu, lineer dizide bazı rotasyonların sol üst köşesiyle girdinin son sütununda konumlandırılması sorununu bırakır. Bu atlamak için, ben bu geçersiz 2x2 alt bloğu, öyle ki, talimat listesine sıfır riffle edilir ama no-op ile, teknik olarak işlenmiş.

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.