Напишите программу, которая принимает строку из одной строки, которая, как вы можете предположить, будет содержать только символы /\_‾
. (Это прямая и обратная косая черта, подчеркивание и наложение . Вы можете использовать ~
вместо наложения, если это необходимо, поскольку наложение не является удобным ASCII.)
Например, один из возможных входных данных:
__/‾‾\/\_/‾
Ваша программа должна вывести истинное или ложное значение в зависимости от того, связан ли левый край строки, так сказать, с правым краем строки через строки символов. Таким образом, если бы кернинг был немного меньше, то была бы сплошная черная (хотя и странная) линия от левого края до правого, как непрерывный кусок нити или шпагата.
Вывод для приведенного выше примера будет верным, потому что края связаны:
Чтобы быть ясно на связи:
/
соединяется внизу слева и сверху справа\
соединяется в его верхнем левом и нижнем правом_
соединяется внизу слева и справа внизу‾
(или~
) соединяется сверху слева и справа сверху
Также:
Не имеет значения, начинаются ли края строки сверху или снизу, важно только то, что они соединяются горизонтально по всей длине строки.
Вы можете предположить, что входная строка не пуста, и, конечно, только одна строка.
Вот еще несколько примеров, за которыми следует 1 (правда), если они связаны, или 0 (ложь), если нет:
__/‾‾\/\_/‾
1
_
1
\
1
/
1
‾
1
___
1
\/
1
/\/
1
/\/\
1
‾‾‾
1
\\
0
‾‾
1
_‾
0
‾_
0
\_____/
1
\/\\/\\___
0
\/\__/‾‾\
1
______/\_____
1
‾‾‾‾‾‾\\_____
0
‾‾‾‾‾‾\______
1
_____/‾‾‾‾‾
1
\___/‾‾‾\___/‾‾‾
1
\_/_\_
0
\_/\_
1
/\/\/\/\/\/\/\/\/\/\/\/
1
____________________
1
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
1
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾/
0
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\
1
/\‾/\‾___/\_\/__\/\‾‾
0
Самый короткий код - победитель.
источник
Ответы:
Желе , 9 байт
-1 байт благодаря @EriktheOutgolfer
Ожидайте0 или 1 .
~
вместо‾
. ВозвращаетПопробуйте онлайн! , Набор тестов Truthy , набор тестов Falsy
Используя эту формулу (но в остальном похож на 11-байтовую версию ниже):
Переход действителен, еслиn нечетно, или недействителен, если n четно.
комментарии
Желе ,
14 1211 байтПоддерживает (и ожидает)0 или 1 .
‾
символ во входной строке. ВозвращаетПопробуйте онлайн! , Набор тестов Truthy , набор тестов Falsy
Как?
Учитывая два последовательных символа кодов ASCIIx и y , мы хотим функцию, которая проверяет, формируют ли они допустимый переход.
Нам нужна некоммутативная операция, потому что результат может измениться, когда символы поменялись местами. Например,
_/
действует, но/_
нет.Используя возведение в степень, возможная формула 1 :
Переход действителен, еслиn≤1 , или недействителен, если n>1 .
1. Найден с помощью перебора в Node.js (с помощью BigInts).
комментарии
источник
⁽"O
же, как9580
.Ruby -n , 30 байтов
Попробуйте онлайн!
Сокращает все последовательности, прерывающие строки, до двух случаев, используя классы символов Regex.
источник
~
вместо‾
. Я не уверен, имеет ли это значение для этого испытания, так как количество символов одинаково./
s, даже если они находятся в квадратных скобках?JavaScript (ES6), 45 байт
Наивный путь.
Попробуйте онлайн!
источник
s=>!/[~\/][\/_]|[_\\][\\~]/.test(s)
. Он проверяет, если\/
или в~
конце\/
или_
. И затем, он проверяет, если\\
или_
конец\\
или~
.R ,
89 87 8178 байт-2 байта благодаря @Giuseppe
-6 байт благодаря @ Ник Кеннеди
-3 байта с заменой
1:length(y)
наseq(a=y)
, гдеa
короткоalong.with
использует
\ / _ ~
. Это, вероятно, не так коротко, как решение на основе регулярных выражений, но мне хотелось сделать что-то немного другое для всех остальных.Символы меньше 93 переключают состояние сверху вниз (или наоборот) и, таким образом, ведут себя так,
-1
как другие ничего не делают, и ведут себя как1
, cumprod отслеживает состояние относительно начала. Чётные числа находятся в северной части штата (представлены с помощью-1
), нечетные числа находятся в нерабочем состоянии (1
). Если строка не сломана, отслеживаемое состояние, умноженное на положение вверх / вниз, не должно изменяться, оно всегда будет начальным условием (-1
или1
)Попробуйте онлайн
источник
()
округление,y%%2
чтобы сэкономить 2 байта, поскольку специальные операторы%(any)%
имеют довольно высокий приоритет.!
Python , 46 байт
Попробуйте онлайн!
__/~~\/\_
Я пробовал другие, менее смешные методы, чтобы проверить пары символов, но все они были дольше, чем жестко кодировать все допустимые пары, подобные этой.
источник
C (gcc) , 93 байта
Попробуйте онлайн!
источник
w,o,r;k
.Чип
-z
, 17 байтПопробуйте онлайн! (TIO включает,
-v
чтобы облегчить понимание результатов.)Ожидает
_/~\
множество. Возвращает либо\x00
(ложь), либо\x01
(правда).Стратегия для моего ответа использует следующую информацию:
A
: Эта битовая позиция бывает,1
когда левая сторона символа низкая, и0
когда она высокаяF
: эта битовая позиция бывает,0
когда правая сторона символа низкая, и1
когда она высокаяC
: эта битовая позиция всегда быть1
Используя эту информацию, мне просто нужно проверить, соответствует ли
F
каждый символnot A
следующему.xor
Затвора является удобным способом для достижения этой цели .Следующий код делает это, но выдает выходные данные для каждой пары (плюс дополнительный
1
в начале) (7 байт):Мы хотим остановить при первом сбое, а также распечатать, остановились ли мы в пределах строки или в нулевом терминаторе (мы также добавляем,
-z
чтобы дать нам нулевой терминатор). Мы можем использовать,not C
чтобы указать, где мы остановились, и это дает нам эту программу (13 байт):Но у нас все еще есть «ведущие нули» (например,
\_/\
дает00 00 00 00 01
), так что это преобразуется в ответ, данный в верхней части.источник
05AB1E ,
29149 байтPort of @Arnauld 's Jelly ответ , так что не забудьте также поддержать его!
Ввод с
‾
.Попробуйте онлайн или проверьте все контрольные примеры .
Оригинальный 29- байтовый ответ:
Ввод с
~
вместо‾
.Это звучало короче в моей голове ..
Попробую сыграть в гольф отсюда.Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение: "
См. Этот мой совет 05AB1E (разделы Как понять большие целые числа? И Как сжать списки целых чисел? ), Чтобы понять, почему
•6_üê{↕
есть1781179816800959
,ƵΔ
есть180
и•6_üê{↕ƵΔв
есть[52,66,69,100,103,131,179]
.Дополнительное объяснение:
["/_", 52]
["\~", 66]
["_~", 69]
["//", 100]
["\\", 100]
["_\", 103]
["~_", 131]
["~/", 179]
__
~~
//
\\
0
100
~
и_
во входной строке, перед вычислением и проверкой парных различий.источник
Python 3 ,
797063 байтаСпасено 16 байтов благодаря Арно и Джо Кингу, спасибо!
Попробуйте онлайн!
Python 3 ,
6760 байт с ~ вместо ‾Попробуйте онлайн!
источник
Python 3, 126 байт
источник
Haskell , 70 байт
Этот вариант использует
~
вместо подчеркивания. Он принимает все восемь допустимых пар и проверяет, содержит ли строка только те:Попробуйте онлайн!
Ungolfed:
источник
Perl 6 , 32 байта
Попробуйте онлайн!
Решение регулярного выражения, которое просто проверяет, что строка не содержит недопустимых последовательностей.
Объяснение:
источник
R , 43 символа, 47 байтов
Это то же выражение, которое используют другие ответы, но адаптированное для R.
Попробуйте онлайн!
И обязательно xkcd .
источник
~
вместо,‾
чтобы получить до 43 байтов, 43 символа.Далее ,
10098 байтовПопробуйте онлайн!
объяснение
Просмотрите строку и определите, начинается ли каждый символ с той же позиции (сверху или снизу), что и предыдущий. Вычтите 1 из счетчика, если они не совпадают. В конце концов, если счетчик изменился, то строка не является строкой.
Конечная позиция высока, если символ
/
(47) или~
(126). В противном случае это низкоСтартовая позиция высока, если символ
\
(92) или~
(126). В противном случае это низкоКод Объяснение
источник
Python 3 ,
8078 байтЯ не очень много играю в гольф с кодом Python, но я подумал, что могу попробовать
Попробуйте онлайн!
Python 3.8 (предварительная версия) , 71 байт
Я хотел попробовать новое
:=
назначение выраженияПопробуйте онлайн!
источник
Желе ,
13 1211 байтМонадическая ссылка, принимающая список символов, использует
~
вместо‾
опции.Попробуйте онлайн! Или посмотрите тестовый набор (... где я переупорядочил, чтобы поместить 8 ложных в конце)
Эта формула была найдена путем возни с рукой: p (как и те, что ниже)
Для этого я тоже все 16 пар ординалов персонажа рассматривал как возведение в степень и искал большое по модулю, которое уместится в три байта, за которыми следует однобайтовое по модулю (1,2,3,4,5,6,7,8). , 9,10,16,256), который разделил 16 так, что все приемлемые результаты были либо 1, либо 0 («незначительный»), поскольку я знаю, что
Ị
он короче, чем<5
в моем предыдущем решении, где все приемлемые результаты были меньше все недопустимые.Возможные соседние персонажи и их внутренние оценки:
Предыдущая @ 12:
Попробуйте онлайн!
Предыдущая @ 13:
Попробуйте онлайн!
источник
Ị
это тестирование,abs(x)<1
а неabs(x)≤1
. Это предлагает довольно много дополнительных возможностей. :) (хотя я пока застрял на 11 байтах.)Ị
очень полезным.Perl 5,
2625 байтиспользуя в
;
качестве разделителя, конечный разделитель может быть удаленTIO
26 байт
источник
Excel, 150 байт
Удаляет все недопустимые пары, а затем возвращает,
true
если это приводит к исходной строке.источник
Haskell, 42 байта
это решение использует
~
, и функция для вызова является ч (т. е.h string
дает ответ)Решение использует функцию g, которая дает список, возвращает все кортежи смежных значений в списке.
Затем мы используем g, чтобы сгенерировать список разрешенных соседей (in
g"__/~~\\/\\_"
), а также список всех соседних пар во входном списке. Затем мы проверяем, что каждая соседняя пара является разрешенной парой.источник
C (gcc) ,
4136 байтПопробуйте онлайн!
-5 исключен
&1
старт с идеи от Питера Кордеса ; изменены операторы (приоритет) для удаления скобокИспользует
~
. Проверяет первый и шестой бит двоичных представлений первых двух символов:и обходит строку рекурсивно.
(*_ / 32) & 1
верно только для символов с*_ & 1
низким уровнем.(x&1) ^ (y&1) == (x+y)&1
, XOR является надстройкой без переноса, и перенос не нарушает младший бит.1
Происходит отf(_)
возвращаемого значения, если остальная часть строки была тягучей.источник
c&32
Это верно для символов, которые заканчиваются высокими, в то времяc&1
как справедливо только для символов, начинающихся с низких.)*_ ^ *++_
это неопределенное поведение:^
это не точка последовательности, поэтому нет никаких последовательных отношений перед тем, чтобы гарантировать получение разных символов. Конечно, он также пропускает areturn
, поэтому он работает толькоgcc -O0
там, где тело функции является выражением-оператором.&1
дважды излишне.(x^y)&1 == (x&1) ^ (y&1)
, Но учитывая приоритет оператора C, где&
приоритет выше, чем^
(в отличие от арифметических операторов, где + и - имеют одинаковый приоритет), нам нужно добавить()
2 байта, чтобы удалить&1
2 байта, потому что(x&1) ^ y
это не эквивалентно. Но, возможно, использование паренов открывает возможности для какой-то другой экономии. К счастью, это не проблема для машинного кода x86, где битовая манипуляция очень компактна ...Баш, 30 байт
Ввод STDIN. Код выхода равен 1, если он действителен, и 0, если он недействителен.
источник
SNOBOL4 (CSNOBOL4) , 58 байт
Попробуйте онлайн!
Ничего не выводит для истины и положительное целое число (указывающее на позицию первого разрыва в строке) для фальсификации.
источник
Древесный уголь ,
3218 байтПопробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
источник
машинный код x86, 13 байт.
(Или 11 байтов без обработки односимвольных строк, которые являются тривиальными.)
Использует проверку битовой позиции из ответа @ attinat's C
Тот же машинный код работает в 16, 32 и 64-битных режимах. Источник - NASM для 64-битного режима.
Вызывается из C, как
unsigned char string_connected(int dummy_rdi, const char *s, int dummy_rdx, size_t transitions);
в соглашении о вызовах System V. Неbool
потому, что в случае переходов = 0 возвращается код ASCII, а не 1.RCX = len = strlen(s) - 1
, т.е. число символьных границ = переходов для проверки в строке с явной длиной.For
transitions > 0
возвращает 0 (несоответствие) или 1 (подключено) и оставляет ZF установленным соответствующим образом. Fortransitions == 0
, возвращает единственный байт строки (который не равен нулю и, следовательно, также истинен). Если бы не этот особый случай, мы могли бы отказаться от JRCXZ с ранним выходом. Он внутри цикла только потому, что там AL ненулевой.Логика битовой позиции основана на наблюдении, что бит 0 кода ASCII сообщает вам начальную высоту, а бит 5 сообщает вам конечную высоту.
Испытательный жгут (изменен из ссылки TIO от attinat, остерегайтесь UB точки последовательности C в этой эталонной функции C). Попробуйте онлайн! , Эта функция верна для всех 30 случаев. (Включая односимвольные случаи, когда возвращаемое значение не совпадает: оба являются достоверными с разными ненулевыми значениями в этом случае.)
источник
Excel, 79 байт
Ячейка
A1
как входисточник
Дротик , 94 байта
Попробуйте онлайн!
источник
C ++,
132110 байт-22 байта благодаря ASCII-только
Использует битовую маску, чтобы знать, когда начало и конец вверх или вниз
источник
Сетчатка , 26 байт
Попробуйте онлайн!
Использует
~
скорее, чем‾
, потому что это облегчило печатать.источник
Регулярное выражение, 34 байта
Я не мог найти правила использования Regex в качестве языка. Пожалуйста, дайте мне знать, если мне нужно настроить это.
Попробуйте это здесь: https://regex101.com/r/s9kyPm/1/tests
источник
‾
на~
APL + WIN, 58 байт
m ← 2 2⊤ '_ / \ ~' ⍳s ←, ⎕⋄ (1 + ⍴s) = + / ((↑ m [0;]), m [1;]) = m [0;], ¯ 1 ↑ м [1];
Запрашивает ввод строки, происхождение индекса 0 и использует ~ для верхнего символа
Попробуйте онлайн! Предоставлено Dyalog Classic
источник