Koordinatları değerleriyle eşleştirme


10

3 giriş öğesi, bir koordinat çifti listesi, bir 2B dizesi ve tek karakterli bir dize verildiğinde, 2B dizenin her bir koordinatındaki karakterin tek karaktere eşit olup olmadığını gösterir. Girdiyi istediğiniz sırada alabilirsiniz ve koordinatlar 1 dizinli olabilir.

2B dizeyi 2B liste, çizgi listesi veya 2B dize olarak alabilirsiniz.

Misal: (0,0), "#_\n__", "#" -> True

Dize

#_
__

Koordinattaki karakter (0,0)(sol üst köşeden) #. Bu, üçüncü giriş öğesine eşit olduğundan #çıktı Truealırsınız (veya herhangi bir doğruluk değeri)

Misal: [(0,0), (1,1)], "#_\n_#", "#" -> True

Dize

#_
_#

Koordinatlarında karakterler (0,0)ve (1,1)hem de #çıkış doğrudur yüzden.

Çıktı yalnızca her koordinat bir karma ile eşleştiğinde doğrudur. Yine de her karmanın eşleşen bir koordinatı olması gerekmez. #2B dizede tek karakter ( bazı test durumlarında) görülmüyorsa, çıktı yine de yanlıştır.

Koordinatların her zaman 2B dizenin sınırları içinde olacağını varsayabilirsiniz.

Daha fazla test örneği: (Okunabilirliği kolaylaştırmak için tek karakteri ikinci sıraya koydum)

[(0,0), (2,1), (3,0)], #

#_##
#_##

True


[(0,0), (1,1), (3,0)], #

#_##
#_##

False (1,1 is not a hash)



[(1,1)], a

#a##
#a##

True


[(4, 0), (3, 0), (2, 0), (1, 0), (0, 0), (0, 1), (0, 2), (0, 3), (1, 3), (2, 3), (2, 2), (3, 2), (4, 2), (4, 3)], ' '


 ####
 #   
   # 

True

Son test senaryosunun tek karakter dizesi olarak boşluk kullandığını ve boşluk çevresindeki karmaları not edin.

İlişkili. (bu zorluğun tersi)


Girdinin "\ n" yerine 2d dizisi olduğunu varsayabilir miyiz?
rahnema1

@ rahnema1 bir 2D dizi değil, bir dizi / satır listesi evet.
Rɪᴋᴇʀ


İlk örnekte koordinatlar biçimdedir, (row, column) ancak son örnekte koordinatlar biçimdedir (column, row).
rahnema1

1
Koordinatlar 1 dizinli olabilir mi?
user41805

Yanıtlar:


1

Dyalog APL , 8 bayt

Koordinat çiftlerinin (satır, sütun), ardından 2B dizinin, ardından karakterin sorulmasını ister.

∧/⎕=⎕[⎕]

[⎕] koordinat istemi seçin ve bunları

istenen giriş (2D dizi)

= seçili öğeleri karşılaştır

girdi (karakter)

∧/ hepsinin doğru olup olmadığını kontrol et (AND azaltma)

Test senaryoları ( ⎕IO←0örnekleri eşleştirmek, ancak bu gerekli değildir):

İlk örnek

İkinci örnek

Üçüncü örnek

Dördüncü örnek

Beşinci örnek


6

Python, 39 bayt

Girdileri alır:

  1. a(x, y)tamsayı koordinatları listesi
  2. b dizi listesi
  3. c tek karakter dizesi

lambda a,b,c:{b[y][x]for x,y in a}=={c}

2
Bu sitede, işlevlerinizi adlandırmanıza gerek yoktur. Öğesini kaldırabilirsiniz f=. PPCG'ye Hoşgeldiniz!
Rɪᴋᴇʀ

PPCG'ye hoş geldiniz, güzel ilk cevap!
FlipTack

4

JavaScript (ES6), 37 bayt

Girdileri alır:

  1. a[x, y]tamsayı koordinatları dizisi
  2. s dizeler dizisi
  3. c tek karakter dizesi

(a,s,c)=>a.every(([x,y])=>s[y][x]==c)

4

Oktav, 45 38 29 bayt

@(A,B,C)A(1+B*[rows(A);1])==C

2B karakter dizisi olarak alan Ave Biki sütun matrisi [col row]ve eşleşen karakter olarak koordinat (0 tabanlı) işlevi C. İki eleman koordinatı (matris çarpımı kullanılarak) doğrusal dizine dönüştürülür.

Not: Seyrek matris kullanılan önceki cevap yanlıştı.

Diğer Katkıda Bulunanlar:

[0 1 0] 'ın yanlış değer olarak kabul edilebileceğini kaydeden 5 bayt tasarruf eden Stewie Griffin !!

Luis Mendo 2 bayt tasarruf ~0 == trueve seyrek matris hakkında bildirim için.

Çevrimiçi Deneyin


2
Güzel :) Atlayabilir allve üç bayt kaydedebilirsiniz. 1 1 1doğru ve 1 0 1Octave'de yanlış, bu yüzden iyi olmalı. :)
Stewie Griffin

1
Harika bir yaklaşım! Bunun, mantıksal indekslerin dizinlenmiş dizi ile aynı boyuta sahip olması gerekmemesini nasıl kullandığımı seviyorum
Luis Mendo

1
Stewie'nin önerisine ek olarak, yerine truegöre ~0kaydet 2 byte
Luis Mendo

@StewieGriffin Teşekkürler gerçekten sorun değil :)
rahnema1

@LuisMendo İyi bir nokta
rahnema1

3

Mathematica, 28 bayt

#3~Extract~#~MatchQ~{#2...}&

1 endeksli. Mathematica'da dizilerin nasıl yapılandırıldığından, giriş koordinatları ters çevrilmelidir (yani (row, column))

kullanım

#3~Extract~#~MatchQ~{#2...}&[{{1, 1}, {2, 3}, {1, 4}}, "#", {{"#", "_", "#", "#"}, {"#", "_", "#", "#"}}]

True


2

Haskell, 27 bayt

s!c=all(\(x,y)->s!!y!!x==c)

Kullanım örneği: ( ["#_##","#_##"] ! '#' ) [(0,0), (2,1), (3,0)]-> True.


2

Jöle , 10 bayt

ịṪ⁸ịḢð€Q⁼⁵

Bu sadece tam bir program olarak çalışır. Giriş sırası endeksler, dize dizisi, tekli dizedir.

Çevrimiçi deneyin!

Nasıl çalışır

ịṪ⁸ịḢð€Q⁼⁵  Main link.
            Left argument:  P (array of coordinate pairs)
            Right argument: S (array of strings)
            Third argument: C (singleton string)

     ð€     Combine the links to the left into a dyadic chain and call it with each
            p = (x, y) in P as left argument and S as the right one.
ị             Unindex; retrieve the strings of S at indices x and y.
 Ṫ            Tail; yield s, the string of S at index y.
  ⁸ị          Unindex; retrieve the characters of s at indices x and y.
    Ḣ         Head; yield the character of s at index x.
       Q    Unique; deduplicate the resulting string/array of characters.
        ⁼⁵  Compare the result with the third argument.

2

Perl 6 , 41 40 bayt

->\c,\h,\n{all map {n eq h[.[0];.[1]]},c}

->$_,\h,\n{all .map:{n eq h[.[0];.[1]]}}

2B dizeyi 2B liste olarak bekler.

-1 baytlık b2gills sayesinde.


Eğer kullandıysanız $_yerine \ckullanabilirsiniz size .map:{…}bir bayt tasarrufu
Brad Gilbert b2gills

@ BradGilbertb2gills: Ah, alanın isteğe bağlı olduğunu fark etmedim .map: {…}. Bunu bilmek faydalı. Ayrıca, önek ||henüz uygulanmadığı için bir utanç , iç lambda basitçe yapabilir n eq h[||$_]...
smls

2

C #, 80 77 bayt

Pinkfloydx33 sayesinde 3 bayt tasarruf edildi

a=>b=>c=>{foreach(var i in a){if(b[i[0]][i[1]]!=c){return 1<0;}}return 1>0;};

a koordinat çiftleri, b satır listesidir ve c tek karakterli dizedir.


Sen yerini alabilir falseile 1<0ve trueile 1>0ve 3 bayt kaydedin.
pinkfloydx33

1

Haskell, 72 63 bayt

c [] _ _ =1<2;c ((f,s):t) m n |n/=lines m!!s!!f=1>2|1>0=c t m n

c [(0,0), (1,0), (3,0)] "#_##\n#_##" '#' Çıkış Girişi False

Giriş c [(4, 0), (3, 0), (2, 0), (1, 0), (0, 0), (0, 1), (0, 2), (0, 3), (1, 3), (2, 3), (2, 2), (3, 2), (4, 2), (4, 3)] " \n ####\n # \n # " ' '

Çıktı True

UnGolfed

checkfunc :: [(Int,Int)] -> String -> Char -> Bool
checkfunc [] _ _ = True
checkfunc (x:xs) string char | char /= ((lines string)!!(snd x))!!(fst x)= False  -- Checks first coordinates and returns False if no match
                             | otherwise = checkfunc xs string char --Otherwise iterate over remaining coordinate pairs

Hala gereksiz boşluk c[]_ _=1<2;c((f,s):t)m n|n/=lines m!!s!!f=1>2|1>0=c t m n
kalıyor

Ayrıca, mantıksal mantık yaparken, örtük koşullu if n/=lines m!!s!!f then False else c t m nile değiştirilebilir n/=lines m!!s!!f&&c t m n.
Laikoni

Son olarak, OP'nin dediği You may take the 2D string as a 2D list, a list of lines, or a 2D string.gibi düşebilir linesve doğrudan bir satır listesini girdi olarak alabilirsiniz.
Laikoni

1

Scala, 68 bayt

def f(l:(Int,Int)*)(s:String*)(c:Char)=l forall{x=>s(x._2)(x._1)==c}

1

Clojure, 39 bayt

#(apply = %3(map(fn[[x y]]((%2 y)x))%))

Örnek (dize girişi karakterlerin bir vecidir):

(def f #(apply = %3(map(fn[[x y]]((%2 y)x))%)))
(f [[0 0] [1 1] [3 0]] (mapv vec ["#_##" "#_##"]) \#)
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.