Dopasuj współrzędne do ich wartości

10

Biorąc pod uwagę 3 elementy wejściowe, listę par współrzędnych, ciąg 2D i ciąg jednoznakowy, określ, czy znak na każdej współrzędnej ciągu 2D jest równy jednemu znakowi. Dane wejściowe można przyjmować w dowolnej kolejności, a współrzędne mogą być indeksowane 1.

Możesz wziąć ciąg 2D jako listę 2D, listę linii lub ciąg 2D.

Przykład: (0,0), "#_\n__", "#" -> True

Ciąg jest

#_
__

Znak na współrzędnej (0,0)(od lewego górnego rogu) to #. Jest to równe trzeciemu elementowi wejściowemu #, więc wyprowadzasz True(lub dowolną prawdziwą wartość)

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

Ciąg jest

#_
_#

Znaki na współrzędnych (0,0)i (1,1)są oba #, więc wynik jest prawdziwy.

Dane wyjściowe są prawdziwe tylko wtedy, gdy każda współrzędna pasuje do skrótu. Jednak nie każdy skrót musi mieć pasującą współrzędną. Jeśli nie ma żadnych wystąpień pojedynczego znaku ( #w niektórych przypadkach testowych) w ciągu 2D, wynik jest nadal po prostu fałszem.

Możesz założyć, że współrzędne zawsze będą się mieścić w granicach ciągu 2D.

Więcej przypadków testowych: (Dla większej czytelności umieszczam jeden znak na drugim miejscu)

[(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

Zwróć uwagę, że ostatni przypadek testowy używa spacji jako łańcucha pojedynczego znaku i hasha wokół spacji.

Związane z. (odwrotność tego wyzwania)

Rɪᴋᴇʀ
źródło
Czy możemy założyć, że wejściem jest tablica 2d zamiast używania „\ n”?
rahnema1
@ rahnema1 nie tablica 2D, ale tablica / lista linii tak.
Rɪᴋᴇʀ
@EasterlyIrk Wierzę, że należy to do kategorii Uciążliwe formaty We / Wy
JungHwan Min
W pierwszym przykładzie współrzędne są w formacie, (row, column) ale w ostatnim przykładzie współrzędne są w formacie (column, row).
rahnema1
1
Czy współrzędne mogą być indeksowane 1?
user41805

Odpowiedzi:

1

Dyalog APL , 8 bajtów

Monity o listę par współrzędnych (wiersz, kolumna), następnie tablicę 2D, a następnie znak.

∧/⎕=⎕[⎕]

[⎕] monituj o współrzędne i użyj ich do rozproszenia wybierania

monit o wprowadzenie (tablica 2D)

= porównaj wybrane elementy z

wejście (znak)

∧/ sprawdź, czy wszystkie są prawdziwe (redukcja AND)

Przypadki testowe ( ⎕IO←0aby dopasować przykłady, ale nie jest to konieczne):

Pierwszy przykład

Drugi przykład

Trzeci przykład

Czwarty przykład

Piąty przykład

Adám
źródło
6

Python, 39 bajtów

Pobiera dane wejściowe:

  1. alista (x, y)współrzędnych całkowitych
  2. b lista ciągów
  3. c ciąg jednoznakowy

lambda a,b,c:{b[y][x]for x,y in a}=={c}
ovs
źródło
2
Na tej stronie nie musisz nazywać swoich funkcji. Możesz usunąć f=. Witamy w PPCG!
Rɪᴋᴇʀ
Witamy w PPCG, fajna pierwsza odpowiedź!
FlipTack,
4

JavaScript (ES6), 37 bajtów

Pobiera dane wejściowe:

  1. atablica [x, y]współrzędnych całkowitych
  2. s tablica ciągów
  3. c ciąg jednoznakowy

(a,s,c)=>a.every(([x,y])=>s[y][x]==c)
George Reith
źródło
4

Oktawa, 45 38 29 bajtów

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

Funkcja, która przyjmuje tablicę 2D znaków jako Ai współrzędne (w oparciu o 0) Bjako macierz dwukolumnową [col row]i pasujący znak jako C. Współrzędne dwóch elementów (z wykorzystaniem mnożenia macierzy) przeliczone na indeks liniowy.

Uwaga: poprzednia odpowiedź, w której użyto rzadkiej macierzy, była błędna.

Inni współautorzy:

Stewie Griffin za zapisanie 5 bajtów, zauważając, że [0 1 0] można uznać za fałszywą wartość !!

Luis Mendo za zapisanie 2 bajtów ~0 == truei powiadomienie o rzadkiej matrycy.

Wypróbuj online

rahnema1
źródło
2
Fajnie :) Możesz pominąć alli zapisać trzy bajty. 1 1 1jest prawdą i 1 0 1fałszem w Octave, więc powinno być OK. :)
Stewie Griffin
1
Świetne podejście! Podoba mi się, w jaki sposób wykorzystuje to fakt, że indeksy logiczne nie muszą mieć takiego samego rozmiaru jak indeksowana tablica
Luis Mendo
1
Oprócz sugestii Stewie możesz zastąpić trueprzez, ~0aby zapisać 2 bajty
Luis Mendo
@StewieGriffin Dzięki, to naprawdę OK :)
rahnema1
@LuisMendo Good point
rahnema1
3

Mathematica, 28 bajtów

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

1-indeksowany. Ze względu na strukturę tablic w Mathematica współrzędne wejściowe muszą zostać odwrócone (tj. (row, column))

Stosowanie

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

True

JungHwan Min
źródło
2

Haskell, 27 bajtów

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

Przykład użycia: ( ["#_##","#_##"] ! '#' ) [(0,0), (2,1), (3,0)]-> True.

nimi
źródło
2

Galaretka , 10 bajtów

ịṪ⁸ịḢð€Q⁼⁵

Działa to tylko jako pełny program. Kolejność wprowadzania to indeksy, tablica łańcuchów, łańcuch singletonów.

Wypróbuj online!

Jak to działa

ịṪ⁸ịḢð€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.
Dennis
źródło
2

Perl 6 , 41 40 bajtów

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

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

Oczekuje, że ciąg 2D jako lista 2D.

Dzięki b2gills za -1 bajt.

smls
źródło
Jeśli użyjesz $_zamiast tego, \cmożesz .map:{…}zaoszczędzić jeden bajt
Brad Gilbert b2gills
@ BradGilbertb2gills: Och, nie zdawałem sobie sprawy, że przestrzeń jest opcjonalna .map: {…}. Warto wiedzieć. Szkoda, że ​​prefiks ||jeszcze nie został zaimplementowany, może sprawić, że wewnętrzna lambda po prostu n eq h[||$_]...
sml
2

C #, 80 77 bajtów

Zaoszczędź 3 bajty dzięki pinkfloydx33

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

a jest parą współrzędnych, b jest listą linii, a c jest łańcuchem jednoznakowym.

Horváth Dávid
źródło
Można wymienić falseze 1<0i trueze 1>0i zapisać 3 bajty.
pinkfloydx33
1

Haskell, 72 63 bajty

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

Wejście c [(0,0), (1,0), (3,0)] "#_##\n#_##" '#' Wyjścia False

Wejście 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 # " ' '

Wynik 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
brander
źródło
Pozostało niepotrzebne białe miejsce:c[]_ _=1<2;c((f,s):t)m n|n/=lines m!!s!!f=1>2|1>0=c t m n
Laikoni
Również podczas wykonywania logiki boolowskiej domyślny warunek if n/=lines m!!s!!f then False else c t m nmoże zostać zastąpiony przez n/=lines m!!s!!f&&c t m n.
Laikoni
Wreszcie, jak mówi PO You may take the 2D string as a 2D list, a list of lines, or a 2D string., możesz upuścić linesi bezpośrednio wziąć listę linii jako dane wejściowe.
Laikoni
1

Scala, 68 bajtów

def f(l:(Int,Int)*)(s:String*)(c:Char)=l forall{x=>s(x._2)(x._1)==c}
jaxad0127
źródło
1

Clojure, 39 bajtów

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

Przykład (ciąg wejściowy to vec vec znaków):

(def f #(apply = %3(map(fn[[x y]]((%2 y)x))%)))
(f [[0 0] [1 1] [3 0]] (mapv vec ["#_##" "#_##"]) \#)
NikoNyrh
źródło