Devrikler ve Köşegenler


21

Bu zorluk için, belirli bir kare matrisin köşegenlerini çıkaran bir program veya işlev yazmalısınız. Bununla birlikte, çözümünüzün kaynak kodunun satırlarını ve sütunlarını aktarırsanız, bunun yerine matrisin karşıtlarını döndüren bir program veya işlev haline gelmelidir. Özellikler için okumaya devam edin ...

kurallar

  • Çözümünüzün kaynak kodu, seçtiğiniz standart bir yeni satırla ayrılmış (satır besleme, satır başı veya her ikisinin bir kombinasyonu) 2B karakter ızgarası olarak kabul edilir.
  • Kaynak kodunuzdaki hiçbir satır öncekinden daha uzun olamaz. Geçerli düzenlerin bazı örnekleri:

    ###
    ###
    ###
    

    ########
    #######
    ###
    ###
    #
    

    Ve burada geçersiz bir düzen örneği: (üçüncü satır ikinciden uzun olduğu için):

    ######
    ####
    #####
    ###
    
  • İki çözümünüz birbirlerinin aleyhinde olmalı, yani satırları ve sütunları değiştirerek birbirlerinden bir tane elde etmelisiniz. İşte iki geçerli çift:

    abc
    def
    ghi
    

    adg
    beh
    cfi
    

    Ve

    print 10
    (~^_^)~
    foo
    bar
    !
    

    p(fb!
    r~oa
    i^or
    n_
    t^
     )
    1~
    0
    

    Boşlukların diğer karakterler gibi işlendiğini unutmayın. Özellikle, takip eden alanlar, transpozisyondaki takip eden boşluklar olamayacağından önemlidir.

  • Her çözüm, giriş olarak tek basamaklı tam sayıların boş olmayan kare matrisini alan bir program veya işlev olmalıdır. Bir çözüm, matrisin tüm köşegenlerinin bir listesini çıkarmalı, diğeri tüm antidiagonalların bir listesini çıkarmalıdır. Herhangi bir makul, belirgin giriş ve çıkış formatı kullanabilirsiniz, ancak iki çözüm arasında aynı olmaları gerekir (bu, aynı zamanda hem fonksiyon hem de her iki program olması gerektiği anlamına gelir).

  • Her diyagonal soldan aşağı doğru sağa doğru uzanır ve yukarıdan aşağıya doğru sıralanmaları gerekir.
  • Her bir antidiagonal sol alttan sağ üste doğru uzanır ve yukarıdan aşağıya doğru sıralanmaları gerekir.

puanlama

Mümkün olduğunca "kare" olan çözümleri teşvik etmek için birincil puan, hangisinin daha büyük olduğu satır sayısı veya çözümünüzün sütun sayısıdır . Daha az iyidir. Bağlar , yeni satırları saymaz, çözümdeki karakter sayısıyla bozulur . Yine, daha az iyidir. Örnek:

abcd
efg
h

Bu ve devrik bir primer puan olurdu 4 (4 sütun bulunmaktadır gibi) ve bir bağlama-puan ise 8 (8 olmayan satır karakter gibi). Lütfen cevabınızın başlığında her iki değeri de belirtin.

Test Kılıfları

İki çözümün yerine getirdiği asıl görev, buradaki birincil zorluk olmamalı, ancak çözümlerinizi test etmenize yardımcı olacak iki örnek:

Input:
1 2 3
4 5 6
7 8 9
Diagonals:
3
2 6
1 5 9
4 8
7
Antidiagonals:
1
4 2
7 5 3
8 6
9

Input:
1 0 1 0
0 1 0 1
1 0 1 0
0 1 0 1
Diagonals:
0
1 1
0 0 0 
1 1 1 1
0 0 0
1 1
0
Antidiagonals:
1
0 0
1 1 1
0 0 0 0
1 1 1
0 0
1


Sandbox yazısının yarıda kalmadan önce yanınızda olduğunu fark ettiğimde, bu sabah SE'ye binmeden önce bunu zaten gönderdiğinizi fark ettim ... bu noktada psişik olmam gerektiğini düşünmeye başladım: P
ETHproductions

Yanıtlar:


19

Javascript, puan 20 14, ( 258 176 yeni satır olmayan karakter)

///mmm()mu[=+r
///=.av=a,pr"=
///> p,>px=[ [
m=>//(yv()xp"]
m. ////.(=+]+)
map((////>y?u&
v,y)=>v//r]r:&
.map((u,x//[ur
)=>r[p=m.//p)
length-1-//],
x+y]=r[p]////
?r[p]+" "+u//
:u),r=[])&&r

ve

///mmmv.)lx?:
///=.a,m=e+ru
///> pya>ny[)
m=>//()prg]p,
m. //(=([t=]r
map(//>(phr+=
(v,y//vu=-["[
)=>v.//,m1p ]
map((//x.-]")
u,x)=>r////+&
[p=x+y]////u&
=r[p]?r[p]//r
+" "+u:u),//
r=[])&&r

Örnek kod pasajı:

f=

///mmm()mu[=+r
///=.av=a,pr"=
///> p,>px=[ [
m=>//(yv()xp"]
m. ////.(=+]+)
map((////>y?u&
v,y)=>v//r]r:&
.map((u,x//[ur
)=>r[p=m.//p)
length-1-//],
x+y]=r[p]////
?r[p]+" "+u//
:u),r=[])&&r

console.log(f([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]))

ve

f=

///mmmv.)lx?:
///=.a,m=e+ru
///> pya>ny[)
m=>//()prg]p,
m. //(=([t=]r
map(//>(phr+=
(v,y//vu=-["[
)=>v.//,m1p ]
map((//x.-]")
u,x)=>r////+&
[p=x+y]////u&
=r[p]?r[p]//r
+" "+u:u),//
r=[])&&r

console.log(f([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]))


Sözdizimi vurgulamayı etkinleştirebilir misiniz? Yeri <!-- language-all: lang-javascript -->ilk kod bloğundan önce.
CalculatorFeline

8

MATL , 10 puan (100 yeni satır dışı karakter)

%P!       
  Q&%     
  TXd!    
  %d      
     P!   
      "@% 
       Xz 
      %z  
         q
         !

10 karakterden 10 satır vardır (sondaki boşluklara dikkat edin).

Yukarıdaki kod köşegenleri üretir. Çevrimiçi deneyin!

Transpoze edilmiş versiyon, köşegenleri üretir. Çevrimiçi deneyin!

açıklama

Bunu not et

  • % çizginin geri kalanının yok sayılmasına neden olan bir yorum sembolüdür.

  • İki karakterli fonksiyonlar ardışık çizgilerde a ve a'ya Xdbölünemezler .Xd

Orijinal kod

Doğrusallaştırılmış ve yorumlanmış kısmı olmayan orijinal kod

Q&TXd!P!"@Xzq!

aşağıdaki gibi çalışır:

Q      % Implicit input. Add 1 to each entry to make them positive
&      % This modifes default inputs/ouputs of next function, which is Xd
       % Specifically, it specifies 2 inputs and 1 ouput
T      % Push true
Xd     % Diagonals of matrix. With second input true, it gives all diagonals,
       % starting from below. The columns are arranged as columns of a matrix,
       % padding with zeros
!P!    % Flip horizontally. This is to produce the correct display order
"      % For each column
  @    %   Push current column
  Xz   %   Remove zeros
  q    %   Subtract 1
  !    %   Transpose into a row
       % Implicit end. Implicit display of stack contents

Devredilen kod

Transpoze edilen kod, doğrusallaştırılmış

P!QT&Xd!P!"@Xzq!

orijinal kodla karşılaştırıldığında aşağıdaki iki farklılığa sahiptir:

  • Tve &değiştirildi. Bunun bir etkisi yoktur, çünkü Tdeğişmezdir, işlev değildir, bu nedenle &belirtime müdahale etmez .
  • P! başlangıçta eklenir.

Eklenen kod giriş matrisini değiştirir, böylece değiştirilmiş matrisin köşegenleri girişin köşegenleri olur:

P      % Implicit input. Flip vertically
!      % Transpose


6

Jöle , puan 4 (12 karakter)

önceki puanlar: 5 (16 karakter), 4 (16 karakter)

orijinal

ŒDṙṚ
D  ñ
ṙLñL

Çevrimiçi deneyin!

Transpoze

ŒDṙ
D L
ṙ ñ
ṚñL

Çevrimiçi deneyin!

Arka fon

diyagonallar

Bir kare matrisin köşegenlerini (en yukarıdan en alta) elde etmenin basit yolu aşağıdaki gibidir.

ŒDṙLṚ

Bir giriş matrisi için M , ana köşegen başlayıp yukarı doğru hareket ederek M 'nin köşegenlerini ŒDlisteler .

Giriş için

1 2 3
4 5 6
7 8 9

bu verim

1 5 9
2 6
3
7
4 8

ṙLsonra M uzunluğunu hesaplar Lve sonuç uzunluğu (M) birimlerini sola döndürür .

Örneğimize göre uzunluk 3 ve

7
4 8
1 5 9
2 6
3

Sonunda, köşegenlerin sırasını ters çevirir, geri döner

3
2 6
1 5 9
4 8
7

bizim örnek girdi için.

Anti-diyagonallar

Aynı yapı taşları bir kare matrisin çapraz köşegenlerini (yine en üst-en alttan) elde etmek için kullanılabilir.

ṚŒDṙL

Bir giriş matrisi için M , ilk önce satırların sırasını tersine çevirir.

Giriş için

1 2 3
4 5 6
7 8 9

bu verim

7 8 9
4 5 6
1 2 3

Daha önce olduğu gibi ŒDṙL, sonucun köşegenlerini (en alttan en üste) oluşturur.

Örneğimiz için bu geri döner

1
4 2
7 5 3
8 6
9

istediğiniz gibi.

Nasıl çalışır

Jelly'te, her satır bir bağlantı (işlev) tanımlar . Özellikle, son satır program başladığında yürütülen ana bağlantıyı tanımlar .

Diğer bağlantılar aranmalıdır. Bu cevap ñ, aşağıdaki bağlantıyı ikili olarak yürüten kullanır . ñEtrafını sayar, bu yüzden ana linkten çağrıldığında, ilk satırdaki linki çalıştırır.

orijinal

Ana bağlantı

ṙLñL

bir giriş matrisi alır M ile uzunluğunu hesaplar L, daha sonra, giriş döner uzunluğu (M) için birim sol (bu, alter yapar not M , ve son olarak sonuç (ilk bağlantı çağrısı) M ) ve uzunluğu ( M) bağımsız değişken olarak.

İlk bağlantı

ŒDṙṚ

köşegenleri hesaplar M ile ŒD(bir önceki bölümde de görüldüğü gibi), sonuç döner uzunluğu (M) ile sola birimleri daha sonra sonuç sırasını tersine, .

İkinci bağlantı asla çağrılmaz.

Transpoze

Ana bağlantı

 ṚñL

M giriş matrisini alır ve tersini ile hesaplar . Daha sonra uzunluğunu hesaplar M ile Lve ilk argümanları ile bağlantı çağrısı ters (M) ve uzunluğu (M) .

İlk bağlantı

ŒDṙ

Daha sonra köşegenleri hesaplar ters (M) ile ŒD(bir önceki bölümde de görüldüğü gibi), ve son olarak sonuç döner uzunluğu (M) ile sola birimleri .

Kalan bağlantılar asla aranmaz.


5

R, skor 14 13 11 ( 99 95 yeni satır olmayan karakterler)

Skoru 1 arttırdığı için @Giuseppe'e teşekkürler. Transpozisyonlarda fazlalıklar kullanarak birkaç karakterden yararlanın. Şu anda golf oynamayan bir dil için en iyi skor!

######`,scr
`::`(#:fpoo
pryr,#:)llw
f)(###`(i((
split (#tmm
p,col(p#())
)+row#r#m-)
(p)))#y#,#)
######r

Ve devredilen:

#`pfsp)(#
#:r)p,+p#
#:y(lcr)#
#`r#ioo)#
#(,#tlw)#
#### (###
`::`(pryr
,f)(####
split(m,
col(m)-#
row(m)))

Çevrimiçi deneyin!


1
row(m)+col(m)köşegenlere karşı daha kısa.
Giuseppe

@Giuseppe Elbette, teşekkürler! Şimdi düzenlendi.
rturnbull

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.