Kimin komşuları düşmanca?


10

Giriş

Bu zorluğun amaçları doğrultusunda, bir elemanının komşularını bir kare matris ( ) hemen çapraz, yatay veya dikey olarak bitişik olan tüm girişleri olarak tanımlayacağız. (yani , etrafını sarmadan " kuşatırlar).A E = A i , j A EEbirE=birben,jbirE E

Pedallar için, matix için nin komşularının resmi bir tanımı (0 dizinli): n×nA N i ,birben,jnxnbirE i ,

N-ben,j={birbir,b|(bir,b)Eben,j([0,n)Z)2}
Eben,j={ben-1,ben,ben+1}x{j-1,j,j+1} \ {ben,j}

Diyelim ki endeksinde eleman olduğunu o aralarında asal istiyorsa düşmanlık hayatlarını tüm (komşuları olduğunu, ). Ne yazık ki, bu kötü giriş yakındaki sakinlerinden bir bardak şeker bile ödünç alamaz ...ben,jgcd(birben,j,n)=1nN-ben,j

Görev

Yeterli hikaye: Pozitif tamsayıların kare matrisi M verildiğinde M, aşağıdakilerden birini çıkarın:

  • Bazı endeksleri kalan tüm girişleri gösteren elemanların bir düz listesi (yinelemesi ya da değil) ben,j içinde M komşu olacak şekilde N-ben,j düşman.
  • Komşuların düşman olduğu ve 0 olduğu durumlarda 1 s'lik bir boole matrisi (aksi takdirde 0 ve 1 yerine başka tutarlı değerler seçebilirsiniz ).001
  • Düşman mahalleleri temsil eden i, \: j indeks çiftlerinin listesi ben,j.

Physica'da Referans Uygulaması - I / O için de Python sözdizimini destekler . Bu boşlukların varsayılan olarak yasak olduğunu dikkate alırken, herhangi bir standart yöntemle ve makul bir formatta girdi alabilir ve çıktı sağlayabilirsiniz . Bu kod golf, bu yüzden bayt (her dilde) en kısa kod kazanır!

Ayrıca, matris boyutunu giriş olarak da alabilir ve ayrıca her zaman kare olacağından matrisi düz bir liste olarak alabilirsiniz.

Misal

Aşağıdaki matrisi düşünün:

(641014272232535836)

Her bir öğenin karşılık gelen komşuları:

i j – E  -> Neighbours                          | All coprime to E?
                                                |
0 0 – 64 -> {10; 27; 22}                        | False
0 1 – 10 -> {64; 14; 27; 22; 32}                | False
0 2 – 14 -> {10; 22; 32}                        | False
1 0 – 27 -> {64; 10; 22; 53; 58}                | True
1 1 – 22 -> {64; 10; 14; 27; 32; 53; 58; 36}    | False
1 2 – 32 -> {10; 14; 22; 58; 36}                | False
2 0 – 53 -> {27; 22; 58}                        | True
2 1 – 58 -> {27; 22; 32; 53; 36}                | False
2 2 – 36 -> {22; 32; 58}                        | False

Ve böylece çıktı aşağıdakilerden biri olmalıdır:

  • {27; 53}
  • {{0; 0; 0}; {1; 0; 0}; {1; 0; 0}}
  • {(1; 0); (2; 0)}

Test senaryoları

Input –> Version 1 | Version 2 | Version 3

[[36, 94], [24, 69]] ->
    []
    [[0, 0], [0, 0]]
    []
[[38, 77, 11], [17, 51, 32], [66, 78, 19]] –>
    [38, 19]
    [[1, 0, 0], [0, 0, 0], [0, 0, 1]]
    [(0, 0), (2, 2)]
[[64, 10, 14], [27, 22, 32], [53, 58, 36]] ->
    [27, 53]
    [[0, 0, 0], [1, 0, 0], [1, 0, 0]]
    [(1, 0), (2, 0)]
[[9, 9, 9], [9, 3, 9], [9, 9, 9]] ->
    []
    [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
    []
[[1, 1, 1], [1, 1, 1], [1, 1, 1]] ->
    [1, 1, 1, 1, 1, 1, 1, 1, 1] or [1]
    [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
    [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
[[35, 85, 30, 71], [10, 54, 55, 73], [80, 78, 47, 2], [33, 68, 62, 29]] ->
    [71, 73, 47, 29]
    [[0, 0, 0, 1], [0, 0, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]]
    [(0, 3), (1, 3), (2, 2), (3, 3)]

Düşman komşularından borç almak mı? Nedense, bu bana Jeff Minter'ın Hover Bovver oyununu hatırlatıyor ...
Arnauld

Matris boyutunu girdi olarak alabilir miyiz?
Delfad0r

@ Delfad0r Her zaman bundan bahsetmeyi unuturum. Evet, matris boyutunu girdi olarak alabilirsiniz.
Bay Xcoder

Yanıtlar:


3

APL (Dyalog) , 17 bayt

1=⊢∨(×/∘,↓)⌺3 3÷⊢

Çevrimiçi deneyin! (test senaryolarının APL'ye çevrilmesi için ngn'e verilen krediler)

Kısa açıklama

(×/∘,↓)⌺3 3 komşularıyla her elementin ürününü alır.

Sonra argümana bölerim ÷⊢, böylece matristeki her giriş komşularının ürünüyle eşleştirilir.

Sonunda bu matris ile argümanın gcd'sini alıyorum ve ⊢∨1 ile eşitliği kontrol ediyorum ,1=

Not, ngn cevabında olduğu gibi , yorumlayıcıdaki bir hata nedeniyle bazı girişler için başarısız olur.


2

JavaScript (ES6), 121 bayt

False ifadesinin düşmanca anlamına geldiği Boolean değerleri matrisini döndürür .

m=>m.map((r,y)=>r.map((v,x)=>[...'12221000'].some((k,j,a)=>(g=(a,b)=>b?g(b,a%b):a>1)(v,(m[y+~-k]||0)[x+~-a[j+2&7]]||1))))

Çevrimiçi deneyin!

Nasıl?

Her hücrenin 8 komşusunu izole etmek için kullanılan yöntem , burada tarif ettiğim yöntemle benzerdir .

Yorumlananlar

m =>                            // m[] = input matrix
  m.map((r, y) =>               // for each row r[] at position y in m[]:
    r.map((v, x) =>             //   for each value v at position x in r[]:
      [...'12221000']           //     we consider all 8 neighbors
      .some((k, j, a) =>        //     for each k at position j in this array a[]:
        ( g = (a, b) =>         //       g is a function which takes 2 integers a and b
            b ?                 //       and recursively determines whether they are
              g(b, a % b)       //       coprime to each other
            :                   //       (returns false if they are, true if they're not)
              a > 1             //
        )(                      //       initial call to g() with:
          v,                    //         the value of the current cell
          (m[y + ~-k] || 0)     //         and the value of the current neighbor
          [x + ~-a[j + 2 & 7]]  //
          || 1                  //         or 1 if this neighbor is undefined
  ))))                          //         (to make sure it's coprime with v)

2

MATL , 22 bayt

tTT1&Ya3thYC5&Y)Zd1=A)

Giriş bir matristir. Çıktı, düşman komşuları olan tüm rakamlardır.

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

Çalışılan örnekle açıklama

Girişi [38, 77, 11; 17, 51, 32; 66, 78, 19]örnek olarak ele alalım. Yığın içeriği aşağıdan yukarıya gösterilir.

t         % Implicit input. Duplicate
          % STACK: [38, 77, 11;
                    17, 51, 32;
                    66, 78, 19]
                   [38, 77, 11;
                    17, 51, 32;
                    66, 78, 19]
TT1&Ya    % Pad in the two dimensions with value 1 and width 1
          % STACK: [38, 77, 11;
                    17, 51, 32;
                    66, 78, 19]
                   [1,  1,  1,  1,  1;
                    1,  38, 77, 11, 1;
                    1,  17, 51, 32, 1;
                    1,  66, 78, 19, 1
                    1,  1,  1,  1,  1]
3thYC     % Convert each sliding 3×3 block into a column (in column-major order)
          % STACK: [38, 77, 11;
                    17, 51, 32;
                    66, 78, 19]
                   [ 1,  1,  1,  1, 38, 17,  1, 77, 51;
                     1,  1,  1, 38, 17, 66, 77, 51, 78;
                     1,  1,  1, 17, 66,  1, 51, 78,  1;
                     1, 38, 17,  1, 77, 51,  1, 11, 32;
                    38, 17, 66, 77, 51, 78, 11, 32, 19;
                    17, 66,  1, 51, 78,  1, 32, 19,  1;
                     1, 77, 51,  1, 11, 32,  1,  1,  1;
                    77, 51, 78, 11, 32, 19,  1,  1,  1;
                    51, 78,  1, 32, 19,  1,  1,  1,  1]
5&Y)      % Push 5th row (centers of the 3×3 blocks) and then the rest of the matrix
          % STACK: [38, 77, 11;
                    17, 51, 32;
                    66, 78, 19]
                   [38, 17, 66, 77, 51, 78, 11, 32, 19]
                   [ 1,  1,  1,  1, 38, 17,  1, 77, 51;
                     1,  1,  1, 38, 17, 66, 77, 51, 78;
                     1,  1,  1, 17, 66,  1, 51, 78,  1;
                     1, 38, 17,  1, 77, 51,  1, 11, 32;
                    17, 66,  1, 51, 78,  1, 32, 19,  1;
                     1, 77, 51,  1, 11, 32,  1,  1,  1;
                    77, 51, 78, 11, 32, 19,  1,  1,  1;
                    51, 78,  1, 32, 19,  1,  1,  1,  1]
Zd        % Greatest common divisor, element-wise with broadcast
          % STACK: [38, 77, 11;
                    17, 51, 32;
                    66, 78, 19]
                   [1,  1,  1,  1,  1,  1,  1,  1,  1;
                    1,  1,  1,  1, 17,  6, 11,  1,  1;
                    1,  1,  1,  1,  3,  1,  1,  2,  1;
                    1,  1,  1,  1,  1,  3,  1,  1,  1;
                    1,  1,  1,  1,  3,  1,  1,  1,  1;
                    1,  1,  3,  1,  1,  2,  1,  1,  1;
                    1, 17,  6, 11,  1,  1,  1,  1,  1;
                    1,  1,  1,  1,  1,  1,  1,  1,  1]
1=        % Compare with 1, element-wise. Gives true (1) or false (0)
          % STACK: [38, 77, 11;
                    17, 51, 32;
                    66, 78, 19]
                   [1, 1, 1, 1, 1, 1, 1, 1, 1;
                    1, 1, 1, 1, 0, 0, 0, 1, 1;
                    1, 1, 1, 1, 0, 1, 1, 0, 1;
                    1, 1, 1, 1, 1, 0, 1, 1, 1;
                    1, 1, 1, 1, 0, 1, 1, 1, 1;
                    1, 1, 0, 1, 1, 0, 1, 1, 1;
                    1, 0, 0, 0, 1, 1, 1, 1, 1;
                    1, 1, 1, 1, 1, 1, 1, 1, 1]
A         % All: true (1) for columns that do not contain 0
          % STACK: [38, 77, 11;
                    17, 51, 32;
                    66, 78, 19]
                   [1, 0, 0, 0, 0, 0, 0, 0, 1]
)         % Index (the matrix is read in column-major order). Implicit display
          % [38, 19]

Matris 3x3'ten büyükse bu işe yarar mı?
Robert Fraser

@RobertFraser Evet, prosedür matris boyutuna bağlı değildir. Örneğin son test
Luis Mendo

1

APL (Dyalog Klasik) , 23 22 bayt

@ H.PWiz sayesinde -1 bayt

{∧/1=1↓∨∘⊃⍨14⌽,⍵}⌺3 3

Çevrimiçi deneyin!

nedeniyle 3x3 daha küçük matrisler desteklemeyen bir hata yorumlayıcı


@ H.PWiz bu çok akıllı, kendi olarak göndermek ister misin?
ngn

Tabii, ayrıca kullanabilirsiniz (⊃∨⊢)-> ∨∘⊂⍨Bence
H.PWiz

1

Jöle , 24 bayt

Hmm, uzun görünüyor.

ỊẠ€T
ŒJ_€`Ç€ḟ"J$ịFg"FÇịF

Düşmanca mahallelerde bulunan değerlerin her birinin bir listesini döndüren pozitif tamsayıların listesini kabul eden monadik bir Bağlantı (çoğaltma olmadan sürüm 1).

Çevrimiçi deneyin! Veya bir test takımına bakın .

Nasıl?

ỊẠ€T - Link 1: indices of items which only contain "insignificant" values: list of lists
Ị    - insignificant (vectorises) -- 1 if (-1<=value<=1) else 0 
  €  - for €ach:
 Ạ   -   all?
   T - truthy indices

ŒJ_€`Ç€ḟ"J$ịFg"FÇịF - Main Link: list of lists of positive integers, M
ŒJ                  - multi-dimensional indices
    `               - use as right argument as well as left...
   €                -   for €ach:
  _                 -     subtract (vectorises)
      €             - for €ach:
     Ç              -   call last Link (1) as a monad
          $         - last two links as a monad:
         J          -   range of length -> [1,2,3,...,n(elements)]
        "           -   zip with:
       ḟ            -     filter discard (remove the index of the item itself)
            F       - flatten M
           ị        - index into (vectorises) -- getting a list of lists of neighbours
               F    - flatten M
              "     - zip with:
             g      -   greatest common divisor
                Ç   - call last Link (1) as a monad
                  F - flatten M
                 ị  - index into

1

Python 2 , 182 177 166 bayt

lambda a:[[all(gcd(t,a[i+v][j+h])<2for h in[-1,0,1]for v in[-1,0,1]if(h|v)*(i+v>-1<j+h<len(a)>i+v))for j,t in E(s)]for i,s in E(a)]
from fractions import*
E=enumerate

Çevrimiçi deneyin!

Doğru / Yanlış girişleri olan listelerin bir listesini çıkarır.


1

Haskell , 95 bayt

m?n|l<-[0..n-1]=[a|i<-l,j<-l,a<-[m!!i!!j],2>sum[1|u<-l,v<-l,(i-u)^2+(j-v)^2<4,gcd(m!!u!!v)a>1]]

Çevrimiçi deneyin!

İşlev ?, matrisi mbir liste listesi ve matris boyutu olarak alır n; düşmanlık içindeki girişlerin listesini döndürür .

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.