Faire correspondre les coordonnées avec leurs valeurs

10

Étant donné 3 éléments d'entrée, une liste de paires de coordonnées, une chaîne 2D et une chaîne à un seul caractère, affichez si le caractère à chaque coordonnée de la chaîne 2D est égal au caractère unique. Vous pouvez prendre l'entrée dans n'importe quel ordre et les coordonnées peuvent être indexées à 1.

Vous pouvez prendre la chaîne 2D comme une liste 2D, une liste de lignes ou une chaîne 2D.

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

La chaîne est

#_
__

Le caractère aux coordonnées (0,0)(en haut à gauche) est #. Ceci est égal au troisième élément d'entrée #, donc vous Truesortez (ou toute valeur vraie)

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

La chaîne est

#_
_#

Les caractères aux coordonnées de (0,0)et (1,1)sont les deux #, donc la sortie est vraie.

La sortie n'est vraie que si chaque coordonnée correspond à un hachage. Cependant, chaque hachage ne doit pas nécessairement avoir une coordonnée correspondante. S'il n'y a pas d'occurrences du caractère unique ( #dans certains des cas de test) dans la chaîne 2D, la sortie est toujours juste fausse.

Vous pouvez supposer que les coordonnées seront toujours dans les limites de la chaîne 2D.

Plus de cas de test: (je mets le caractère unique en second pour plus de lisibilité)

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

Notez que le dernier scénario de test utilise des espaces comme chaîne de caractères unique et hache les espaces.

En relation. (inverse de ce défi)

Rɪᴋᴇʀ
la source
Pouvons-nous supposer que l'entrée est un tableau 2D au lieu d'utiliser "\ n"?
rahnema1
@ rahnema1 pas un tableau 2D, mais un tableau / liste de lignes oui.
Rɪᴋᴇʀ
@EasterlyIrk Je crois que cela tombe dans la catégorie Formats d'E / S encombrants
JungHwan Min
Dans votre premier exemple, les coordonnées sont au format (row, column) mais dans le dernier exemple, les coordonnées sont au format (column, row).
rahnema1
1
Les coordonnées peuvent-elles être indexées 1?
user41805

Réponses:

1

Dyalog APL , 8 octets

Demande la liste des paires de coordonnées (ligne, colonne), puis le tableau 2D, puis le caractère.

∧/⎕=⎕[⎕]

[⎕] demander des coordonnées et les utiliser pour disperser le choix

entrée avec invite (tableau 2D)

= comparer les éléments sélectionnés à

entrée (le caractère)

∧/ vérifier si tout est vrai (réduction ET)

Cas de test ( ⎕IO←0pour correspondre à des exemples, mais ce n'est pas nécessaire):

Premier exemple

Deuxième exemple

Troisième exemple

Quatrième exemple

Cinquième exemple

Adam
la source
6

Python, 39 octets

Prend les entrées:

  1. aliste des (x, y)coordonnées entières
  2. b liste de chaînes
  3. c chaîne de caractères unique

lambda a,b,c:{b[y][x]for x,y in a}=={c}
ovs
la source
2
Sur ce site, vous n'avez pas besoin de nommer vos fonctions. Vous pouvez supprimer le fichier f=. Bienvenue chez PPCG!
Rɪᴋᴇʀ
Bienvenue chez PPCG, belle première réponse!
FlipTack
4

JavaScript (ES6), 37 octets

Prend les entrées:

  1. atableau de [x, y]coordonnées entières
  2. s tableau de chaînes
  3. c chaîne de caractères unique

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

Octave, 45 38 29 octets

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

Une fonction qui prend un tableau 2D de caractères comme Aet les coordonnées (basé sur 0) Bcomme une matrice à deux colonnes de [col row]et le caractère correspondant comme C. Les deux coordonnées des éléments (en utilisant la multiplication matricielle) converties en index linéaire.

Remarque: La réponse précédente qui utilisait une matrice clairsemée était incorrecte.

Autres contributeurs:

Stewie Griffin pour avoir économisé 5 octets en notant que [0 1 0] peut être considéré comme une fausse valeur !!

Luis Mendo pour avoir sauvé 2 octets ~0 == trueet une notification sur la matrice clairsemée.

Essayez-le en ligne

rahnema1
la source
2
Nice :) Vous pouvez ignorer allet enregistrer trois octets. 1 1 1est vrai et 1 0 1faux dans Octave, donc ça devrait être OK. :)
Stewie Griffin
1
Super approche! J'aime la façon dont cela exploite le fait que les indices logiques n'ont pas besoin d'avoir la même taille que le tableau indexé
Luis Mendo
1
En plus de la suggestion de Stewie, vous pouvez remplacer truepar ~0pour économiser 2 octets
Luis Mendo
@StewieGriffin Merci, c'est vraiment OK :)
rahnema1
@LuisMendo Good point
rahnema1
3

Mathematica, 28 octets

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

1 indexé. En raison de la structure des tableaux dans Mathematica, les coordonnées d'entrée doivent être inversées (c.-à-d. (row, column))

Usage

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

True

JungHwan Min
la source
2

Haskell, 27 octets

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

Exemple d'utilisation: ( ["#_##","#_##"] ! '#' ) [(0,0), (2,1), (3,0)]-> True.

nimi
la source
2

Gelée , 10 octets

ịṪ⁸ịḢð€Q⁼⁵

Cela ne fonctionne que comme un programme complet. L'ordre d'entrée est les indices, le tableau de chaînes et la chaîne singleton.

Essayez-le en ligne!

Comment ça fonctionne

ịṪ⁸ịḢð€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
la source
2

Perl 6 , 41 40 octets

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

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

Attend la chaîne 2D comme une liste 2D.

Merci à b2gills pour -1 octet.

smls
la source
Si vous avez utilisé $_au lieu de \cvous pouvez utiliser l' .map:{…}enregistrement d'un octet
Brad Gilbert b2gills
@ BradGilbertb2gills: Oh, je ne savais pas que l'espace était optionnel .map: {…}. C'est utile de savoir. De plus, c'est dommage que le préfixe ||ne soit pas encore implémenté, cela pourrait rendre la lambda intérieure simplement n eq h[||$_]...
smls
2

C #, 80 77 octets

Enregistré 3 octets, grâce à pinkfloydx33

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

a est les paires de coordonnées, b est la liste des lignes et c est la chaîne à un seul caractère.

Horváth Dávid
la source
Vous pouvez remplacer falsepar 1<0et trueavec 1>0et enregistrer 3 octets.
pinkfloydx33
1

Haskell, 72 63 octets

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

Entrée de c [(0,0), (1,0), (3,0)] "#_##\n#_##" '#' sorties False

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

Production 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
la source
Il reste encore des espaces inutiles:c[]_ _=1<2;c((f,s):t)m n|n/=lines m!!s!!f=1>2|1>0=c t m n
Laikoni
De plus, comme vous faites de la logique booléenne, le conditionnel implicite if n/=lines m!!s!!f then False else c t m npeut être remplacé par n/=lines m!!s!!f&&c t m n.
Laikoni
Enfin, comme le dit l'OP, You may take the 2D string as a 2D list, a list of lines, or a 2D string.vous pouvez supprimer le lineset prendre directement une liste de lignes en entrée.
Laikoni
1

Scala, 68 octets

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

Clojure, 39 octets

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

Exemple (la chaîne entrée est une vec de vec de caractères):

(def f #(apply = %3(map(fn[[x y]]((%2 y)x))%)))
(f [[0 0] [1 1] [3 0]] (mapv vec ["#_##" "#_##"]) \#)
NikoNyrh
la source