Corresponder coordenadas com seus valores


10

Dados três itens de entrada, uma lista de pares de coordenadas, uma sequência 2D e uma sequência de caracteres únicos, indica se o caractere em cada coordenada da sequência 2D é igual ao caractere único. Você pode receber a entrada em qualquer ordem e as coordenadas podem ser indexadas 1.

Você pode considerar a sequência 2D como uma lista 2D, uma lista de linhas ou uma sequência 2D.

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

A string é

#_
__

O caractere na coordenada (0,0)(do canto superior esquerdo) é #. Isso é igual ao terceiro item de entrada #; portanto, você produz True(ou qualquer valor verdadeiro)

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

A string é

#_
_#

Os caracteres nas coordenadas de (0,0)e (1,1)são ambos #, portanto a saída é verdadeira.

A saída é verdadeira apenas se todas as coordenadas corresponderem a um hash. Porém, nem todo hash precisa ter uma coordenada correspondente. Se não houver ocorrências do caractere único ( #em alguns casos de teste) na sequência 2D, a saída ainda será apenas falsa.

Você pode assumir que as coordenadas estarão sempre dentro dos limites da sequência 2D.

Mais casos de teste: (coloquei o único caractere em segundo para facilitar a legibilidade)

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

Observe que o último caso de teste usa espaços como a única cadeia de caracteres e faz um hash ao redor dos espaços.

Relacionado. (inverso deste desafio)


Podemos assumir que a entrada é uma matriz 2d em vez de usar "\ n"?
rahnema1

@ rahnema1 não é uma matriz 2D, mas sim uma matriz / lista de linhas.
Rɪᴋᴇʀ

@EasterlyIrk Eu acredito que isso se enquadra na categoria Formatos de E / S
complicados

No seu primeiro exemplo, as coordenadas estão no formato, (row, column) mas no último exemplo, as coordenadas estão no formato (column, row).
precisa saber é o seguinte

11
As coordenadas podem ser indexadas 1?
precisa saber é o seguinte

Respostas:


1

Dyalog APL , 8 bytes

Solicita a lista de pares de coordenadas (linha, coluna), matriz 2D e caractere.

∧/⎕=⎕[⎕]

[⎕] solicitar coordenadas e usá-las para dispersar as

entrada solicitada (matriz 2D)

= compare os elementos selecionados com

entrada (o caractere)

∧/ verifique se tudo é verdadeiro (redução AND)

Casos de teste ( ⎕IO←0para combinar exemplos, mas isso não é necessário):

Primeiro exemplo

Segundo exemplo

Terceiro exemplo

Quarto exemplo

Quinto exemplo


6

Python, 39 bytes

Toma as entradas:

  1. alista de (x, y)coordenadas inteiras
  2. b lista de strings
  3. c cadeia de caracteres únicos

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

2
Neste site, você não precisa nomear suas funções. Você pode remover o f=. Bem-vindo ao PPCG!
Rɪᴋᴇʀ

Bem-vindo ao PPCG, boa primeira resposta!
FlipTack

4

JavaScript (ES6), 37 bytes

Toma as entradas:

  1. amatriz de [x, y]coordenadas inteiras
  2. s matriz de cordas
  3. c cadeia de caracteres únicos

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

4

Oitava, 45 38 29 bytes

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

Uma função que recebe uma matriz 2D de caracteres como Ae coordenadas (com base em 0) Bcomo uma matriz de duas colunas [col row]e o caractere correspondente como C. As duas coordenadas do elemento (usando a multiplicação de matrizes) convertidas em índice linear.

Nota: A resposta anterior que fez uso da matriz esparsa estava errada.

Outros colaboradores:

Stewie Griffin, por salvar 5 bytes, observando que [0 1 0] pode ser considerado como valor falso !!

Luis Mendo por salvar 2 bytes ~0 == truee notificação sobre matriz esparsa.

Experimente Online


2
Bom :) Você pode pular alle salvar três bytes. 1 1 1é verdadeiro e 1 0 1falso no Octave, portanto deve estar OK. :)
Stewie Griffin

11
Ótima abordagem! Eu gosto de como este explora o fato de que os índices de lógicas não precisa ter o mesmo tamanho que a matriz indexada
Luis Mendo

11
Além da sugestão de Stewie, você pode substituir truepor ~0para salvar 2 bytes
Luis Mendo

@StewieGriffin Graças é realmente OK :)
rahnema1

@LuisMendo Good point
rahnema1 15/01

3

Mathematica, 28 bytes

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

1 indexado. Devido à forma como as matrizes são estruturadas no Mathematica, as coordenadas de entrada devem ser revertidas (ie (row, column))

Uso

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

True


2

Haskell, 27 bytes

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

Exemplo de uso: ( ["#_##","#_##"] ! '#' ) [(0,0), (2,1), (3,0)]-> True.


2

Gelatina , 10 bytes

ịṪ⁸ịḢð€Q⁼⁵

Isso funciona apenas como um programa completo. A ordem de entrada é índices, matriz de strings, string singleton.

Experimente online!

Como funciona

ịṪ⁸ịḢð€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 bytes

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

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

Espera a sequência 2D como uma lista 2D.

Graças a b2gills por -1 byte.


Se você usou em $_vez de \cvocê poderia .map:{…}salvar um byte
Brad Gilbert b2gills

@ BradGilbertb2gills: Ah, eu não sabia que o espaço era opcional .map: {…}. Isso é útil saber. Além disso, é uma pena que prefixo ||ainda não está implementada, poderia fazer o lambda interna simplesmente n eq h[||$_]...
SMLS

2

C #, 80 77 bytes

Guardado 3 bytes, graças a pinkfloydx33

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

a são os pares de coordenadas, b é a lista de linhas ec é a cadeia de caracteres únicos.


Você pode substituir falsepor 1<0e truecom 1>0e salvar 3 bytes.
pinkfloydx33

1

Haskell, 72 63 bytes

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

Entrada de c [(0,0), (1,0), (3,0)] "#_##\n#_##" '#' saídas False

Entrada 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 # " ' '

Resultado 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

Ainda há espaço em branco desnecessário:c[]_ _=1<2;c((f,s):t)m n|n/=lines m!!s!!f=1>2|1>0=c t m n
Laikoni 15/01

Além disso, enquanto você faz lógica booleana, o condicional implícito if n/=lines m!!s!!f then False else c t m npode ser substituído por n/=lines m!!s!!f&&c t m n.
Laikoni 15/01

Finalmente, como o OP diz, You may take the 2D string as a 2D list, a list of lines, or a 2D string.você pode soltar linese pegar diretamente uma lista de linhas como entrada.
Laikoni 15/01/19

1

Scala, 68 bytes

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

1

Clojure, 39 bytes

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

Exemplo (a entrada de sequência é um vec de vec de caracteres):

(def f #(apply = %3(map(fn[[x y]]((%2 y)x))%)))
(f [[0 0] [1 1] [3 0]] (mapv vec ["#_##" "#_##"]) \#)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.