En küçük ortalamanın alt matrisini bulun


21

Bir n-m- tamsayı matrisi verildi , burada n, m> 3 . Göreviniz bulmaktır , en düşük ortalamaya sahip 3'e 3 alt matrisi ve bu değeri elde etmektir.

Kurallar ve açıklamalar:

  • Tamsayılar negatif olmayacak
  • İsteğe bağlı giriş ve çıkış formatı
  • Çıktı en az 2 ondalık noktaya kadar doğru olmalıdır (tam sayı değilse)
  • Alt malzemeler ardışık satır ve sütunlardan oluşmalıdır

Test durumları:

35    1    6   26   19   24
 3   32    7   21   23   25
31    9    2   22   27   20
 8   28   33   17   10   15
30    5   34   12   14   16
 4   36   29   13   18   11 

Minimum mean: 14

100    65     2    93
  3    11    31    89
 93    15    95    65
 77    96    72    34

Minimum mean: 46.111

1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   1

Minimum mean: 1

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

Minimum mean: 2.2222

Bu olduğundan her dilde en kısa kod kazanır. İnsanları, ilkinden daha kısa olmasa bile, halihazırda kullanılan dillerde cevaplar vermeye teşvik ediyorum.


Ayrıca mutlaka bitişik olmayan satırlar ve sütunlarla zorlukla karşılaşmanız ilginç olurdu
Luis Mendo

Hayır, devam et :-)
Luis Mendo

Matematiksel veya veri tipi anlamında tamsayılar mı , yani bir integral değişkenler matrisi alabilir miyiz?
Dennis,

Matematiksel anlamda Burada öğrendiğim bir şey var mı, çeşitli dillerde veri türleri hakkında varsayımlarda bulunabilirsiniz ...
Stewie Griffin

Tatlı, bu bir bayt kazandırır. Aydınlattığın için teşekkürler.
Dennis,

Yanıtlar:



11

Jöle , 11 9 bayt

+3\⁺€F÷9Ṃ

@ Dennis sayesinde 2 bayt kaydedildi .

Çevrimiçi deneyin!

açıklama

+3\⁺€F÷9Ṃ  Main link. Input: 2d matrix
+3\        Reduce overlapping sublists of size 3 by addition
   ⁺€      Repeat previous except over each row
     F     Flatten
      ÷9   Divide by 9
        Ṃ  Minimum

1
Oh,> _ <tabii ki: D
Jonathan Allan

Yararlı bir jöle sürümüyle ilgilenirim, çünkü çok faydalı fonksiyonları var.
J Atkin

1
+3\⁺€F÷9Ṃbirkaç bayttan tasarruf eder.
Dennis,

@Dennis Vay, bu gerçekten +3\ilk işlem ve kopya olarak işliyor +3\€mu? Bunun olmasını beklemiyordum
miller

1
Ayrıştırıcı temelde yığın tabanlıdır; \babalar 3ve +ve QuickLink iter +3\, sonra QuickLink çıkar ve iki kopya iter üstteki kopyasını çıkar ve bir eşleme versiyonunu iter.
Dennis,


8

MATL , 13 9 bayt

3thYCYmX<

Port @ rahnema1 cevabı .

Çevrimiçi deneyin!

Nasıl çalışır

Girişi düşünün

[100 65  2 93;
   3 11 31 89;
  93 15 95 65;
  77 96 72 34]

Örnek olarak.

3th   % Push [3 3]
      % STACK: [3 3]
YC    % Input matrix implicitly. Convert 3x3 sliding blocks into columns
      % STACK: [100   3  65  11;
                  3  93  11  15;
                 93  77  15  96;
                 65  11   2  31;
                 11  15  31  95;
                 15  96  95  72;
                  2  31  93  89;
                 31  95  89  65;
                 95  72  65  34]
Ym    % Mean of each column
      % STACK: [46.1111 54.7778 51.7778 56.4444]
X<    % Minimum of vector. Display implicitly
      % STACK: [46.1111]

7

Mathematica, 37 35 bayt

2 bayt için @ Martininder teşekkürler!

Min@BlockMap[Mean@*Mean,#,{3,3},1]&

açıklama

Min@BlockMap[Mean@*Mean,#,{3,3},1]&
    BlockMap[                    ]&  (* BlockMap function *)
                        #            (* Divide the input *)
                          {3,3}      (* Into 3x3 matrices *)
                                1    (* With offset 1 *)
             Mean@*Mean              (* And apply the Mean function twice to
                                        each submatrix *)
Min                                  (* Find the minimum value *)

Çok çok kaygan!
Greg Martin,

5

Python 2 , 93 81 80 79 bayt

f=lambda M:M[2:]and min(sum(sum(zip(*M[:3])[:3],()))/9,f(M[1:]),f(zip(*M)[1:]))

Çevrimiçi deneyin!

Nasıl çalışır

f dizilerini bir listesini alır yinelemeli bir (veya bir matris gösteren başka kesme 2D iterable olan M ) ve özyinelemeli ortalama minimum hesaplar 3 x 3 sol üst köşeye submatrix ve f yinelemeli uygulanan M olmadan ilk sütunu olmadan ilk satırı ve M.

f(M) aşağıdakileri yapar.

  • Eğer M üçten az satır var, M[2:]boş bir liste, hangi f döner.

    N> 3’den beriİlk çalıştırmada , ilk işlemin boş bir liste döndüremediğini unutmayın.

  • M'nin üç veya daha fazla satırı varsa , M[2:]boş değildir ve bu nedenle doğrudur, bu nedenle sağdaki kod andyürütülür ve aşağıdaki üç değerin minimumunu döndürür.

    min(sum(sum(zip(*M[:3])[:3],()))/9

    M[:3] ilk üç sırasını verir M , zip(*...)uyumlaştıran satır ve sütun (tüp listeleriniz veren), sum(...,())(çünkü bu eserler tüm demetlerin birleştirir +birleşimidir) ve sum(...)/9dokuz tamsayılar çıkan listenin ortalama hesaplar.

    f(M[1:])

    yinelemeli geçerlidir f için M çıkarıldı ilk sıra ile.

    f(zip(*M)[1:])

    satırları ve sütunları aktarır, sonucun ilk satırını kaldırır (bu nedenle M'nin ilk sütunu ve öznitelikle f sonucuna uygulanır .

Özyinelemeli bir aramada önceden kaldırılan katmanın her zaman bir satır olacağını, bu nedenle M'nin yeterli satırları varsa test etmek her zaman yeterli olacaktır.

Son olarak, cevap veren bazı özyinelemeli aramaların []bir sorun olacağını bekleyebilirsiniz . Bununla birlikte, Python 2'de , n bir sayı ve A yinelenebilir olduğunda, karşılaştırma Truen < A döndürür , bu nedenle en az bir veya daha fazla sayı hesaplanır ve bir veya daha fazla yinelenen sayı her zaman en düşük sayıyı döndürür.


3

J , 21 bayt

[:<./@,9%~3+/\3+/\"1]

Çevrimiçi deneyin!

J'deki alt dizilerde çalışmanın uygun yolu, üçüncü ( _3) kesim biçimini kullanmaktır; ;.burada x (u;._3) yfiili u, dizinin her bir tam alt xdizisine fiil uygulamak için kullanılır y. Bunu kullanan bir çözüm yalnızca 1 bayt daha gerektirir, ancak daha büyük dizilerde çok daha etkili olacaktır.

[:<./@,9%~3 3+/@,;._3]

Çevrimiçi deneyin!

açıklama

[:<./@,9%~3+/\3+/\"1]  Input: 2d array M
                    ]  Identity. Get M
                  "1   For each row
              3  \       For each overlapping sublist of size 3
               +/          Reduce by addition
          3  \         For each overlapping 2d array of height 3
           +/            Reduce by addition
       9%~             Divide by 9
[:    ,                Flatten it
  <./@                 Reduce by minimum

1
Nasıl []göründüklerine benziyorum, ama gerçekten değiller.
Lynn,

1
@Lynn Bir saniye bekleyin, bu doğru değil. J'nin izleyicileri birden fazla dengesiz parantezle dağıtması gerekiyordu. Kullanmalı mıydı [ya da |:)
miles

2

Jöle , 18 bayt

Onların mil tarafından kullanıldığı gibi, hile Kaçırılan cevap Bütün ilk satırı ile değiştirilebilir - bir n-bilge ilavenin azaltmak birikimli kullanmak yerine, +3\11 için.

ẆµL=3µÐfS€
ÇÇ€FṂ÷9

Çevrimiçi deneyin!

Tüm bitişik listeleri listeler, yalnızca 3 uzunluğundakileri ve toplamları (vektörleyenleri) tutmak için filtreler, ardından sonuçta elde edilen her liste için tekrar eder, 3'e 3 alt matrisin toplamlarının elde edilmesi ve nihayetinde bunların bir listeye düzlenmesi, 9'a bölünür (bu minimum toplamı yapan elemanların sayısı).


Filtrelenen alt liste fikrini seviyorum. Bu alt liste boyutu hesaplanan bir değere bağlıysa kullanışlıdır.
miller

2

Pyth, 19 bayt

chSsMsMs.:R3C.:R3Q9

Listeler listesinin girişini alan ve sonucu basan bir program.

Test odası

Nasıl çalışır

[Açıklama daha sonra gelecek]



1

Python 2, 96 bayt

h=lambda a:[map(sum,zip(*s))for s in zip(a,a[1:],a[2:])]
lambda a:min(map(min,h(zip(*h(a)))))/9.

Repl.it'teki test durumları

Listelerin bir listesini alarak adlandırılmamış bir fonksiyon, a- matrisin satırları.

Yardımcı işlev h, bitişik üç dilimi sıkıştırır ve toplama işlevini transpoze boyunca eşler,zip(*s) her birinin . Bu, tüm yüksekliği üç dilim olan tek bir sütunun toplamıyla sonuçlanır.

Adsız işlev, yardımcı işlevi çağırır, sonucu tekrar yardımcı işlevini dönüştürür ve çağırır, ardından sonucun her birinin minimumunu ve sonucun minimumunu bulur, daha sonra 9.ortalamayı elde etmek için bölüştürür .


1

JavaScript (ES6), 107 98 96 bayt

Satırlar üzerindeki üçüzlerin toplamını hesaplayan ve daha sonra da aynı değeri sütunlar üzerinde yapmak için çağırır ve minimum değeri izler M.

f=m=>m.map((r,y)=>r.map((v,x)=>M=(z[x<<9|y]=v+=r[x+1]+r[x+2])<M?v:M),z=[M=1/0])&&m[1]?f([z]):M/9

JS bu tür şeyler için biraz ayrıntılı ve yerli yoksundur zip() yöntemden . Daha saf bir yaklaşımla sadece bir düzine bayttan tasarruf etmek çok zamanımı aldı. (Yine de, muhtemelen daha kısa bir yöntem var.)

Özyinelemeli olmayan sürüm, 103 bayt

Neil yardımı ile 2 byte kurtarıldı

m=>m.map((r,y)=>y>1?r.map((v,x)=>[..."12345678"].map(i=>v+=m[y-i%3][x+i/3|0])&&(M=v<M?v:M)):M=1/0)&&M/9

Test durumları


Naif yaklaşımınızla biraz ilgileniyorum, çünkü makul derecede saf bir yaklaşımla yapabileceğimin en iyisi 113 byte idi:(a,b=a.map(g=a=>a.slice(2).map((e,i)=>a[i]+a[i+1]+e)))=>eval(`Math.min(${b[0].map((_,i)=>g(b.map(a=>a[i])))})`)/9
Neil

@ Ne kadar yakın bir şey m=>m.map((r,y)=>r.map((v,x)=>[..."12345678"].map(i=>v+=(m[y+i/3|0]||[])[x+i%3])&&(M=v<M?v:M)),M=1/0)&&M/9olduğunu düşünüyorum, ilk denememin aslında bundan daha büyük olduğunu düşünmeme rağmen.
Arnauld,

Güzel, her ne kadar ben bir bayt traş başardı: m=>m.map((r,y)=>y>1&&r.map((v,x)=>[..."12345678"].map(i=>v+=m[y-i%3][x+i/3|0])&&(M=v<M?v:M)),M=1/0)&&M/9.
Neil,

@Neil Cool. Bu, bir bayt daha kaydetmenizi sağlarm=>m.map((r,y)=>y>1?r.map((v,x)=>[..."12345678"].map(i=>v+=m[y-i%3][x+i/3|0])&&(M=v<M?v:M)):M=1/0)&&M/9
Arnauld

1

05AB1E , 21 16 bayt

2FvyŒ3ùO})ø}˜9/W

Çevrimiçi deneyin!

açıklama

2F         }       # 2 times do:
  v     }          # for each row in the matrix
   yŒ3ù            # get all sublists of size 3
       O           # reduce by addition
         )ø        # transpose matrix
            ˜      # flatten the matrix to a list
             9/    # divide each by 9
               W   # get the minimum

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.