Сопоставить координаты с их значениями

10

Имея 3 входных элемента, список пар координат, 2D-строку и односимвольную строку, выведите, равен ли символ в каждой координате 2D-строки одному символу. Вы можете принимать входные данные в любом порядке, а координаты могут быть проиндексированы на 1.

Вы можете взять 2D-строку как 2D-список, список строк или 2D-строку.

Пример: (0,0), "#_\n__", "#" -> True

Строка

#_
__

Символ в координате (0,0)(слева вверху) есть #. Это равно третьему элементу ввода #, поэтому вы Trueвыводите (или любое истинное значение)

Пример: [(0,0), (1,1)], "#_\n_#", "#" -> True

Строка

#_
_#

Символы в координатах (0,0)и (1,1)оба являются одинаковыми #, поэтому вывод соответствует действительности.

Выходные данные верны только тогда, когда каждая координата соответствует хешу. Не каждый хеш должен иметь совпадающую координату. Если #в двумерной строке нет вхождений одного символа ( в некоторых тестовых случаях), результат все равно будет ложным.

Вы можете предположить, что координаты всегда будут в пределах 2D-строки.

Больше тестов: (я помещаю один символ в секунду для удобства чтения)

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

Обратите внимание, что в последнем тесте в качестве единственной строки символов используются пробелы и хэшируются вокруг пробелов.

Связанные с. (обратная задача)

Rɪᴋᴇʀ
источник
Можем ли мы предположить, что ввод - это двумерный массив вместо использования \ n?
rahnema1
@ rahnema1 не двумерный массив, а массив / список строк да.
Rɪᴋᴇʀ
@EasterlyIrk Я полагаю, что это относится к категории громоздких форматов ввода / вывода
JungHwan Мин.
В вашем первом примере координаты в формате, (row, column) но в последнем примере координаты в формате (column, row).
rahnema1
1
Могут ли координаты быть 1-индексированными?
user41805

Ответы:

1

Дьялог АПЛ , 8 байт

Запрашивает список пар координат (строка, столбец), затем двумерный массив, затем символ.

∧/⎕=⎕[⎕]

[⎕] запрашивать координаты и использовать их для выбора

подсказанный ввод (2D массив)

= сравнить выбранные элементы с

ввод (символ)

∧/ проверить, все ли верно (И-сокращение)

Контрольные примеры ( ⎕IO←0чтобы соответствовать примерам, но это не обязательно):

Первый пример

Второй пример

Третий пример

Четвертый пример

Пятый пример

Адам
источник
6

Python, 39 байт

Принимает входные данные:

  1. aсписок (x, y)целочисленных координат
  2. b список строк
  3. c одиночная строка символов

lambda a,b,c:{b[y][x]for x,y in a}=={c}
овс
источник
2
На этом сайте вам не нужно называть свои функции. Вы можете удалить f=. Добро пожаловать в PPCG!
Rɪᴋᴇʀ
Добро пожаловать в PPCG, хороший первый ответ!
FlipTack
4

JavaScript (ES6), 37 байт

Принимает входные данные:

  1. aмассив [x, y]целочисленных координат
  2. s массив строк
  3. c одиночная строка символов

(a,s,c)=>a.every(([x,y])=>s[y][x]==c)
Джордж Райт
источник
4

Октава, 45 38 29 байт

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

Функция, которая принимает двумерный массив символов Aи координаты (на основе 0) Bкак матрицу из двух столбцов [col row]и совпадающий символ как C. Координаты двух элементов (с использованием умножения матриц) преобразуются в линейный индекс.

Примечание. Предыдущий ответ, в котором использовалась разреженная матрица, был неверным.

Другие участники:

Стьюи Гриффин за сохранение 5 байтов, отметив, что [0 1 0] может рассматриваться как ложное значение !!

Луис Мендо за сохранение 2 байта, что ~0 == trueи уведомление о разреженной матрице.

Попробуйте онлайн

rahnema1
источник
2
Приятно :) Вы можете пропустить allи сохранить три байта. 1 1 1верно и 1 0 1ложно в октаве, так что все должно быть в порядке. :)
Стьюи Гриффин
1
Отличный подход! Мне нравится, как это использует тот факт, что логические индексы не обязательно должны иметь такой же размер, как индексированный массив
Луис Мендо
1
В дополнение к предложению Стьюи, вы можете заменить trueна , ~0чтобы сохранить 2 байта
Луис Mendo
@StewieGriffin Спасибо, это действительно нормально :)
rahnema1
@LuisMendo Хороший вопрос
rahnema1
3

Mathematica, 28 байт

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

1-индексироваться. Из-за того, как массивы структурированы в Mathematica, входные координаты должны быть обращены (то есть (row, column))

Применение

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

True

Юнг Хван Мин
источник
2

Haskell, 27 байт

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

Пример использования: ( ["#_##","#_##"] ! '#' ) [(0,0), (2,1), (3,0)]-> True.

Ними
источник
2

Желе , 10 байт

ịṪ⁸ịḢð€Q⁼⁵

Это работает только как полная программа. Порядок ввода: индексы, строковый массив, одиночная строка.

Попробуйте онлайн!

Как это работает

ịṪ⁸ịḢð€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 байт

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

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

Ожидает 2D-строку в виде 2D-списка.

Спасибо b2gills за -1 байт.

SMLS
источник
Если бы вы использовали $_вместо этого, \cвы могли бы использовать .map:{…}сохранение одного байта
Брэд Гилберт b2gills
@ BradGilbertb2gills: О, я не понимал, что пространство было необязательным в .map: {…}. Это полезно знать. Кроме того, обидно, что префикс ||еще не реализован, это может сделать внутреннюю лямбду просто n eq h[||$_]...
смс
2

C #, 80 77 байтов

Сохранено 3 байта, благодаря pinkfloydx33

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

a - пары координат, b - список строк, а c - односимвольная строка.

Хорват Давид
источник
Вы можете заменить falseна 1<0и trueс 1>0и сохранить 3 байта.
pinkfloydx33
1

Haskell, 72 63 байта

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#_##" '#' выходов False

вход 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 # " ' '

Вывод 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
брендер
источник
Остались лишние пробелы:c[]_ _=1<2;c((f,s):t)m n|n/=lines m!!s!!f=1>2|1>0=c t m n
Лайкони
Также, когда вы выполняете булеву логику, неявное условное if n/=lines m!!s!!f then False else c t m nвыражение может быть заменено на n/=lines m!!s!!f&&c t m n.
Лайкони
Наконец, как говорит ОП, You may take the 2D string as a 2D list, a list of lines, or a 2D string.вы можете удалить linesи непосредственно взять список строк в качестве входных данных.
Лайкони
1

Скала, 68 байт

def f(l:(Int,Int)*)(s:String*)(c:Char)=l forall{x=>s(x._2)(x._1)==c}
jaxad0127
источник
1

Clojure, 39 байт

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

Пример (строковый ввод является вектором символов):

(def f #(apply = %3(map(fn[[x y]]((%2 y)x))%)))
(f [[0 0] [1 1] [3 0]] (mapv vec ["#_##" "#_##"]) \#)
NikoNyrh
источник