Вот простой ASCII арт рубин :
___
/\_/\
/_/ \_\
\ \_/ /
\/_\/
Как ювелир для ASCII Gemstone Corporation, ваша работа заключается в осмотре недавно приобретенных рубинов и оставлении записки о любых найденных вами дефектах.
К счастью, возможны только 12 типов дефектов, и ваш поставщик гарантирует, что ни один рубин не будет иметь более одного дефекта.
В 12 дефектов соответствуют замене одного из 12 внутренних _
, /
или \
персонажей рубина с символом пробела ( ). Внешний периметр рубина никогда не имеет дефектов.
Дефекты нумеруются в соответствии с тем, какой внутренний символ имеет место на своем месте:
Итак, рубин с дефектом 1 выглядит так:
___
/\_/\
/_/ _\
\ \_/ /
\/_\/
Рубин с дефектом 11 выглядит так:
___
/\_/\
/_/ \_\
\ \_/ /
\ _\/
Это та же идея для всех других дефектов.
Вызов
Напишите программу или функцию, которая принимает строку единственного, потенциально дефектного рубина. Номер дефекта должен быть распечатан или возвращен. Номер дефекта равен 0, если дефекта нет.
Возьмите ввод из текстового файла, стандартного ввода или аргумента строковой функции. Верните номер дефекта или распечатайте его на стандартный вывод.
Вы можете предположить, что у рубина есть завершающий символ новой строки. Вы не можете предполагать, что в нем есть завершающие пробелы или начальные символы новой строки.
Самый короткий код в байтах побеждает. ( Удобный счетчик байтов. )
Тестовые случаи
13 точных типов рубинов, за которыми непосредственно следует ожидаемый результат:
___
/\_/\
/_/ \_\
\ \_/ /
\/_\/
0
___
/\_/\
/_/ _\
\ \_/ /
\/_\/
1
___
/\ /\
/_/ \_\
\ \_/ /
\/_\/
2
___
/\_/\
/_ \_\
\ \_/ /
\/_\/
3
___
/\_/\
/_/ \_\
\ _/ /
\/_\/
4
___
/\_/\
/_/ \_\
\ \ / /
\/_\/
5
___
/\_/\
/_/ \_\
\ \_ /
\/_\/
6
___
/\_/\
/_/ \ \
\ \_/ /
\/_\/
7
___
/\_ \
/_/ \_\
\ \_/ /
\/_\/
8
___
/ _/\
/_/ \_\
\ \_/ /
\/_\/
9
___
/\_/\
/ / \_\
\ \_/ /
\/_\/
10
___
/\_/\
/_/ \_\
\ \_/ /
\ _\/
11
___
/\_/\
/_/ \_\
\ \_/ /
\/_ /
12
источник
Ответы:
CJam,
2723 байтаКонвертируйте базу 11, возьмите мод 67, возьмите мод 19 результата, затем найдите индекс того, что у вас есть в массиве
Магия!
Попробуйте онлайн .
источник
Ruby 2.0, 69 байт
Hexdump (для точного отображения двоичных данных в строке):
Объяснение:
-Kn
Вариант читает исходный файл какASCII-8BIT
(двоичный).-0
Опция позволяетgets
читать весь вход (а не только одну строку).-rdigest
Вариант загружаетdigest
модуль, который обеспечиваетDigest::MD5
.источник
Юлия,
9059 байтОпределенно не самая короткая, но прекрасная девушка Юлия очень внимательно следит за осмотром королевских рубинов.
Это создает лямбда-функцию, которая принимает строку
s
и возвращает соответствующий номер дефекта рубина. Чтобы назвать его, дайте ему имя, напримерf=s->...
.Ungolfed + объяснение:
Примеры:
Обратите внимание, что на входе необходимо указывать обратную косую черту. Я подтвердил с @ Calvin'sHobbies, что все в порядке.
Дайте мне знать, если у вас есть какие-либо вопросы или предложения!
Изменить: Сохранено 31 байт с помощью Эндрю Пилизер!
источник
search
и индексации массива.s->(d=reshape([18 10 16 24 25 26 19 11 9 15 32 34],12);search(s[d],' '))
, Мне не нравится изменение формы, но я не мог придумать более короткий способ получить массив 1d.reshape()
использоватьvec()
. :)> <> (Рыба) , 177 байт
Это долгое, но уникальное решение. Программа не содержит арифметических или ветвлений, кроме вставки входных символов в фиксированные места в коде.
Обратите внимание, что все проверенные символы построения ruby (
/ \ _
) могут быть «зеркалами» в коде> <>, которые изменяют направление указателя инструкции (IP).Мы можем использовать эти входные символы, чтобы построить из них лабиринт с помощью инструкции по модификации кода,
p
и при каждом выходе (который создается отсутствующим зеркалом во входных данных) мы можем напечатать соответствующее число.Эти
S B U
письма являются те , изменены , чтобы/ \ _
соответственно. Если вход является полным ruby, окончательный код становится:Вы можете попробовать программу с этим отличным визуальным переводчиком онлайн . Поскольку вы не можете вводить там новые строки, вы должны использовать вместо этого несколько фиктивных символов, чтобы вы могли ввести полный рубин, например
SS___LS/\_/\L/_/S\_\L\S\_/S/LS\/_\/
. (Пробелы также изменились на S из-за уценки.)источник
CJam,
41 31 2928 байтКак обычно, для непечатаемых символов перейдите по этой ссылке .
Попробуйте онлайн здесь
Объяснение скоро
Предыдущий подход:
Уверен, это можно уменьшить, изменив логику цифр / преобразования. Но здесь идет первая попытка:
Как обычно, используйте эту ссылку для непечатных символов.
Логика довольно проста
"Hash for each defect":i
- Это дает мне хэш за дефект в качестве индексаqN-"/\\_ "4,er
- это преобразует символы в числа4b1e3%A/
- это уникальный номер в базовом преобразованном числе#
Тогда я просто нахожу индекс уникального числа в хэшеПопробуйте онлайн здесь
источник
.h
сейчас она бесполезна, потому что она использует встроенные ненадежные и плохие функцииhash()
), до тех пор я не могу добиться большего успеха.Slip ,
123108 + 3 = 111 байтЗапуск с
n
иo
флагами, т.е.Или попробуйте онлайн .
Slip - это язык, похожий на регулярные выражения, который был создан в рамках задачи сопоставления двухмерных шаблонов . Слип может определять местоположение дефекта с помощью
p
флага положения с помощью следующей программы:который ищет один из следующих шаблонов (здесь
S
обозначает, что матч начинается):Попробуйте онлайн - координаты выводятся в виде пары (x, y). Все читается как обычное регулярное выражение, за исключением того, что:
`
используется для побега,<>
поверните указатель совпадения влево / вправо соответственно,^6
устанавливает указатель совпадения влево и\
сдвигает указатель совпадения ортогонально вправо (например, если указатель направлен вправо, то он идет вниз по строке)Но, к сожалению, нам нужно одно число от 0 до 12, указывающее, какой дефект был обнаружен, а не где он был обнаружен. У скольжения есть только один метод вывода одного числа -
n
флаг, который выводит количество найденных совпадений.Таким образом, чтобы сделать это, мы расширяем приведенное выше регулярное выражение, чтобы соответствовать правильному числу раз для каждого дефекта, с помощью
o
перекрывающегося режима соответствия. Разбитые компоненты:Да, это чрезмерное использование,
?
чтобы получить правильные числа: Pисточник
JavaScript (ES6), 67
72Просто ищет пробелы в данных 12 местах
Редактировать Сохранено 5 байт, спасибо @apsillers
Тест в консоли Firefox / FireBug
Выход
источник
C,
9884 байтаОБНОВЛЕНИЕ: Немного умнее со строкой, и исправлена проблема с неискаженными рубинами.
разгадали:
Довольно просто и чуть менее 100 байтов.
Для тестирования:
Вход в STDIN.
Как это работает
Каждый дефект в рубине находится у другого персонажа. Этот список показывает, где каждый дефект встречается во входной строке:
Поскольку создание массива
{17,9,15,23,24,25,18,10,8,14,31,33}
стоит много байтов, мы находим более короткий способ создания этого списка. Заметьте, что добавление 30 к каждому числу приводит к списку целых чисел, которые могут быть представлены как печатные символы ASCII. Этот список выглядит следующим образом :"/'-5670(&,=?"
. Таким образом, мы можем установить массив символов (в кодеc
) для этой строки и просто вычесть 30 из каждого значения, которое мы извлекаем из этого списка, чтобы получить наш исходный массив целых чисел. Мы определяем,a
чтобы быть равнымc
для отслеживания того, как далеко по списку мы получили. Единственное, что осталось в коде - этоfor
цикл. Он проверяет, что мы еще не достигли концаc
, а затем проверяет, является ли символb
в текущем местеc
пробелом (ASCII 32). Если это так, мы устанавливаем первый, неиспользуемый элементb
на номер дефекта и вернуть его.источник
Python 2,
146888671 байтФункция
f
проверяет местоположение каждого сегмента и возвращает индекс дефектного сегмента. Проверка первого байта входной строки гарантирует, что мы вернемся,0
если дефектов не найдено.Теперь мы упаковываем смещения сегментов в компактную строку и используем их
ord()
для восстановления:Тестирование с идеальным рубином:
Тестирование с заменой сегмента 2 пробелом:
РЕДАКТИРОВАТЬ: Спасибо @xnor за хорошую
sum(n*bool for n in...)
технику.EDIT2: Спасибо @ Sp3000 за дополнительные советы по игре в гольф.
источник
sum(n*(s[...]==' ')for ...)
.<'!'
а не==' '
для байта. Вы также можете создать список с помощьюmap(ord, ...)
, но я не уверен, что вы думаете о непечатных :)Pyth,
353128 байтТребуется пропатченный Pyth , в текущей последней версии Pyth есть ошибка,
.z
которая удаляет висячие символы.Эта версия не использует хеш-функцию, она использует базовую функцию преобразования в Pyth для вычисления очень глупого, но работающего хеша. Затем мы конвертируем этот хэш в символ и ищем его индекс в строке.
Ответ содержит непечатаемые символы, используйте этот код Python3 для точной генерации программы на вашем компьютере:
источник
Haskell, 73 байта
Та же стратегия, что и во многих других решениях: поиск мест в указанных местах. Поиск возвращает список индексов, из которых я беру последний элемент, потому что всегда есть совпадение для индекса 0.
источник
05AB1E , 16 байтов
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
Посмотрите этот мой совет 05AB1E (разделы Как сжимать большие целые числа? И Как сжимать целочисленные списки? ), Чтобы понять, почему
•W)Ì3ô;4(•
есть2272064612422082397
и•W)Ì3ô;4(•₆в
есть[17,9,15,23,24,25,18,10,8,14,31,33]
.источник