Relacionar coordenadas con sus valores

10

Dados 3 elementos de entrada, una lista de pares de coordenadas, una cadena 2D y una cadena de un solo carácter, muestran si el carácter en cada coordenada de la cadena 2D es igual al carácter único. Puede tomar la entrada en cualquier orden y las coordenadas pueden estar indexadas en 1.

Puede tomar la cadena 2D como una lista 2D, una lista de líneas o una cadena 2D.

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

La cadena es

#_
__

El carácter en la coordenada (0,0)(desde la parte superior izquierda) es #. Esto es igual al tercer elemento de entrada #, por lo que la salida True(o cualquier valor verdadero)

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

La cadena es

#_
_#

Los caracteres en las coordenadas de (0,0)y (1,1)son ambos #, por lo que la salida es verdadera.

El resultado solo es verdadero si cada coordenada coincide con un hash. Sin embargo, no todos los hash deben tener una coordenada coincidente. Si no hay ocurrencias del carácter único ( #en algunos de los casos de prueba) en la cadena 2D, la salida sigue siendo falsa.

Puede suponer que las coordenadas siempre estarán dentro de los límites de la cadena 2D.

Más casos de prueba: (pongo el único carácter en segundo lugar para facilitar la lectura)

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

Tenga en cuenta que el último caso de prueba utiliza espacios como la cadena de caracteres única y hash alrededor de los espacios.

Relacionado. (inverso de este desafío)

Rɪᴋᴇʀ
fuente
¿Podemos suponer que la entrada es una matriz 2d en lugar de usar "\ n"?
rahnema1
@ rahnema1 no es una matriz 2D, sino una matriz / lista de líneas sí.
Rɪᴋᴇʀ
@EasterlyIrk Creo que esto entra en la categoría de formatos de E / S
engorrosos
En su primer ejemplo, las coordenadas están en el formato, (row, column) pero en el último ejemplo, las coordenadas están en el formato (column, row).
rahnema1
1
¿Se pueden indexar las coordenadas 1?
user41805

Respuestas:

1

Dyalog APL , 8 bytes

Solicita una lista de pares de coordenadas (fila, columna), luego matriz 2D, luego carácter.

∧/⎕=⎕[⎕]

[⎕] solicitar coordenadas y usarlas para dispersar la selección de

entrada solicitada (matriz 2D)

= comparar los elementos seleccionados con

entrada (el personaje)

∧/ comprobar si todo es verdad (reducción Y)

Casos de prueba ( ⎕IO←0para encontrar ejemplos, pero esto no es necesario):

Primer ejemplo

Segundo ejemplo

Tercer ejemplo

Cuarto ejemplo

Quinto ejemplo

Adán
fuente
6

Python, 39 bytes

Toma las entradas:

  1. alista de (x, y)coordenadas enteras
  2. b lista de cadenas
  3. c cadena de un solo carácter

lambda a,b,c:{b[y][x]for x,y in a}=={c}
ovs
fuente
2
En este sitio, no necesita nombrar sus funciones. Puedes eliminar el f=. Bienvenido a PPCG!
Rɪᴋᴇʀ
Bienvenido a PPCG, buena primera respuesta!
FlipTack
4

JavaScript (ES6), 37 bytes

Toma las entradas:

  1. amatriz de [x, y]coordenadas enteras
  2. s conjunto de cuerdas
  3. c cadena de un solo carácter

(a,s,c)=>a.every(([x,y])=>s[y][x]==c)
George Reith
fuente
4

Octava, 45 38 29 bytes

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

Una función que toma una matriz 2D de caracteres como Ay coordenadas (basadas en 0) Bcomo una matriz de dos columnas [col row]y el carácter correspondiente como C. Las coordenadas de dos elementos (usando la multiplicación de matrices) se convierten en índice lineal.

Nota: La respuesta anterior que utilizaba una matriz dispersa era incorrecta.

Otros contribuyentes:

¡Stewie Griffin por guardar 5 bytes y señaló que [0 1 0] puede considerarse como un valor falso!

Luis Mendo por guardar 2 bytes ~0 == truey notificaciones sobre matriz dispersa.

Pruébalo en línea

rahnema1
fuente
2
Niza :) Puedes omitir ally guardar tres bytes. 1 1 1es verdadero y 1 0 1es falso en Octave, por lo que debería estar bien. :)
Stewie Griffin
1
Gran enfoque! Me gusta cómo explota el hecho de que los índices lógicos no necesitan tener el mismo tamaño que la matriz indexada
Luis Mendo
1
Además de la sugerencia de Stewie, puede reemplazar truepor ~0para guardar 2 bytes
Luis Mendo
@StewieGriffin Gracias, está realmente bien :)
rahnema1
@LuisMendo Buen punto
rahnema1
3

Mathematica, 28 bytes

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

1 indexado. Debido a cómo se estructuran las matrices en Mathematica, las coordenadas de entrada deben invertirse (es decir (row, column))

Uso

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

True

JungHwan Min
fuente
2

Haskell, 27 bytes

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

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

nimi
fuente
2

Jalea , 10 bytes

ịṪ⁸ịḢð€Q⁼⁵

Esto solo funciona como un programa completo. El orden de entrada es índices, matriz de cadenas, cadena singleton.

Pruébalo en línea!

Cómo 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.
Dennis
fuente
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 la cadena 2D como una lista 2D.

Gracias a b2gills por -1 byte.

smls
fuente
Si usó en $_lugar de \cpodría usar .map:{…}guardar un byte
Brad Gilbert b2gills
@ BradGilbertb2gills: Oh, no me di cuenta de que el espacio era opcional .map: {…}. Es útil saberlo. Además, es una pena que el prefijo ||aún no esté implementado, podría hacer que el lambda interno simplemente n eq h[||$_]...
sonríe el
2

C #, 80 77 bytes

Guardado 3 bytes, gracias a pinkfloydx33

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

a son los pares de coordenadas, b es la lista de líneas y c es la cadena de un solo carácter.

Horváth Dávid
fuente
Puede reemplazar falsecon 1<0y truecon 1>0y guardar 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#_##" '#' salidas 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 # " ' '

Salida True

Sin golf

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
fuente
Todavía hay espacios en blanco innecesarios izquierda:c[]_ _=1<2;c((f,s):t)m n|n/=lines m!!s!!f=1>2|1>0=c t m n
Laikoni
Además, como está haciendo lógica booleana, el condicional implícito if n/=lines m!!s!!f then False else c t m nse puede reemplazar por n/=lines m!!s!!f&&c t m n.
Laikoni
Finalmente, como dice el OP, You may take the 2D string as a 2D list, a list of lines, or a 2D string.puede soltar linesy tomar directamente una lista de líneas como entrada.
Laikoni
1

Scala, 68 bytes

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

Clojure, 39 bytes

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

Ejemplo (la entrada de cadena es un 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 ["#_##" "#_##"]) \#)
NikoNyrh
fuente