В математике восклицательный знак !
часто означает факториал, и он идет после аргумента.
В программировании восклицательный знак !
часто означает отрицание, и он стоит перед аргументом.
Для этой задачи мы применим только эти операции к нулю и единице.
Factorial
0! = 1
1! = 1
Negation
!0 = 1
!1 = 0
Возьмите строку с нулем или более !
, с последующим 0
или или 1
, после которого следует ноль или более !
( /!*[01]!*/
).
Например, ввод может быть !!!0!!!!
или !!!1
или !0!!
или 0!
или или 1
.
« !
До» 0
или « 1
отрицания» и !
«после» являются факториалами.
Факториал имеет более высокий приоритет, чем отрицание, поэтому факториалы всегда применяются первыми.
Например, !!!0!!!!
действительно означает !!!(0!!!!)
, или еще лучше !(!(!((((0!)!)!)!)))
.
Выведите результирующее применение всех факториалов и отрицаний. Выход всегда будет 0
или 1
.
Тестовые случаи
0 -> 0
1 -> 1
0! -> 1
1! -> 1
!0 -> 1
!1 -> 0
!0! -> 0
!1! -> 0
0!! -> 1
1!! -> 1
!!0 -> 0
!!1 -> 1
!0!! -> 0
!!!1 -> 0
!!!0!!!! -> 0
!!!1!!!! -> 0
Самый короткий код в байтах побеждает.
Ответы:
Mathematica,
2517 байтПринимает ввод из пользовательской подсказки. Предполагается, что среда Mathematica предназначена для неявной печати. Чтобы сделать его сценарием командной строки, оберните его
Print[...]
или сделайте его функцией без аргументов (которая затем принимает входные данные из приглашения), добавьте&
.Mathematica имеет оба обязательных оператора (с требуемым приоритетом), поэтому мы можем просто «оценить» ввод (который выполняется автоматически
Input[]
), но оператор логического отрицания не работает с целыми числами (поэтому он останется без оценки). Если в результате!x
осталось значение, мы заменим его на1-x
.Пара забавных фактов об оценке:
!!
, который вычисляетn*(n-2)*(n-4)*...
, но применяется0
или1
все еще дает1
, так что не имеет значения, что0!!!!!
будет фактически проанализировано как((0!!)!!)!
.!0
и не!1
оценивается, он знает, что!
является самообращенным, поэтому он автоматически отменит все пары ведущих!
. После того , какToExpression
мы всегда остается одним из0
,1
,!0
,!1
.источник
x=${x/[01]!*/1};echo $(($x))
- не разрешено[Bash] + утилиты Unix,
2117 байтЭто должно быть сохранено в файле и запущено как программа. Если вы попытаетесь ввести команду непосредственно из командной строки, она не будет работать, потому что !! расширен за счет включения подстановки истории в интерактивном режиме bash. (В качестве альтернативы вы можете отключить подстановку истории с помощью
set +H
.)Тестовый пример запускается:
источник
mkdir -p 's/.!!'{bunch,of,different,directories}\$/1
? Тогда вы получите Pathname Expansion, и Sed будет пытаться читать каталоги, как если бы они были файлами, вместо чтения стандартного ввода, и он ничего не выведет! :)Сетчатка ,
201514 байтСпасибо Лео за сохранение 1 байта.
Попробуйте онлайн!
объяснение
Превратись
0!
в1
. Нам не нужны никакие другие трейлинг-!
ы, итоговое число такое же, как если бы мы применили все факториалы.Отмена пар отрицаний. Это также может отменить некоторые факториалы, но это не имеет значения.
Посчитайте количество совпадений этого регулярного выражения, которое либо
1
или,0
и дает желаемый результат.источник
\d.+
...^
до!0
Грязь ,
14 129 байтПопробуйте онлайн!
объяснение
Это сопоставляет ввод с шаблоном, печать
1
на совпадение и0
на отсутствие совпадения.Идея заключается в следующем. Если ввод начинается с цифры, то рекурсивная часть
\!_
всегда дает сбой и\0!
завершается успешно, если у нас нет единственного числа0
. Их xor успешен, если вход не является единственным0
. Если ввод начинается с a!
, то\0!
всегда успешно и\!_
успешно, если рекурсивное совпадение успешно. Их xor преуспевает именно тогда, когда рекурсивное совпадение не удается, тем самым сводя его на нет.источник
Brainfuck,
8572 (84) байтавернуть численно или
для текста ASCII. > также может иметь префикс, чтобы избежать переноса памяти.
Попробуйте онлайн!
Или для текстового ответа замените последнюю строку на
источник
Brainfuck - путь ко многим байтам (232 байта)
Явно не тот язык для победы в коде гольф. В основном я заметил отсутствие кого-либо, кто использует этот esolang. Есть хороший онлайн переводчик bf interpeter, или вы действительно можете посмотреть, что программа делает, используя этот bf визуализатор .
источник
Python,
-44-42 байтаСохранено 2 байта благодаря Zgarb!
Шаг за шагом:
x[-1]!='0'
если
x
заканчивается на1
или!
⇔x
не заканчивается0
, факторная часть должна иметь значение1
, иначе0
^len(x.rstrip('!'))%2
эксплуатировать свойство xor как «условное не». Условие в этом случае, если длина начального
!
s нечетна. Однако,.rstrip
не удаляет число из строки, поэтому вычисленная длина смещается на 1, поэтому условие инвертируется.!=
на==
шаг 1. Згарб предложил использовать оператор сравнения различий, а не применять другую инверсию, экономя 2 байта.Попробуйте онлайн!
источник
!!0
; это в настоящее время возвращается1
.lambda x:(x[-1]=='0')^len(x.rstrip('!'))%2
избегает дополнительной инверсии.JavaScript (ES6),
434129 байтМетод без регулярных выражений (
4131 байт)Ниже мой первоначальный подход. Это немного интереснее, но
значительно дольшеи немного дольше даже после значительной оптимизации Нилом (сохранено 10 байт) .Контрольные примеры
Показать фрагмент кода
источник
f=([c,...s])=>1/c?c|s>'':1-f(s)
.Желе , 5 байт
Попробуйте онлайн!
Монадическая функция, ожидающая строку. Входы с начальным
!
s приводят1
к тому, что по пути печатается на STDOUT, поэтому ссылка TIO, которую я даю, является тестовым жгутом, который печатает пары ввода-вывода под первой строкой вывода.Как?
источник
05AB1E , 9 байтов
Код:
Использует кодировку CP-1252 . Попробуйте онлайн! или проверьте все контрольные примеры!
Объяснение:
источник
Сетчатка , 13 байт
Несколько странный подход, но он короткий и работает.
В первых двух строках мы заменяем окончание
0
на!1
: с помощью этой замены мы теперь знаем, что часть нашей строки, начиная с цифры, равна 1.Следующие две строки удаляют пары
!
: двойное отрицание стирает само себя, и мы уже учли факториал с предыдущего шага.Последняя строка, соответствует цифре в начале строки и возвращает количество совпадений: если все отрицания были устранены, мы найдем совпадение (и, как мы уже говорили, мы знаем, что оно равно 1), если еще есть отрицание это не будет соответствовать.
Попробуйте онлайн!
источник
1
а не\d
.0!
останется неизменным до последней строкиРубин, 12 + 1 =
39241513 байтИспользует
-n
флаг. Спасибо @GB за -9 байт!источник
0
или конца строки!*$
на два короче!Perl , 20 байт
19 байт кода +
-p
флаг.Попробуйте онлайн!
Отрицание Perl возвращает
undef
или1
, поэтому я использую,0+
чтобы оцифровать0+undef
возвращаемые результаты0
. Кроме того, не так много, чтобы сказать о коде.источник
C
68626153 байтаВыжал еще несколько байтов с некоторым злоупотреблением
Попробуйте онлайн!
источник
int
из функции , и вы можете изменить*a==33
к*a<34
.*a%2
, короче*a-48
for(;*a<34;a++)
можно сократить доfor(;*a++<34;)
1 байтаPerl 6 ,
322823 байтаКак это устроено
источник
Haskell , 39 байт
Определяет функцию
f
, которая принимает строку и возвращает символ. Попробуйте онлайн!объяснение
Есть три случая: ввод начинается с
!
, длина ввода равна 1, и все остальное.источник
f('!':b)=[1,0]!!f b;f"0"=0;f _=1
.Befunge, 24 байта
Попробуйте онлайн!
Это начинается с подсчета количества
!
символов, прочитанных со стандартного ввода. Первый символ, который не является!
либо, будет либо,0
либо1
, но в процессе тестирования!
мы вычтем 33, сделав его либо 15, либо 16. Затем мы прочитаем еще один символ, который будет либо!
EOF, либо сравните, если это меньше 0 (т.е. EOF).Взяв эти три точки данных - восклицательный знак ( c ), цифровое значение ( d ) и условие конца файла ( e ) - мы можем рассчитать результат следующим образом:
Умножение значения цифры на условие конца файла означает, что оно будет преобразовано в ноль, если за цифрой следует символ «а»
!
, что дает ему то же значение по модулю 2, что и1
(который запоминается, был преобразован в 16). Но перед применением модуля 2 мы добавляем начальное количество восклицательных знаков, которое эффективно переключает результат по модулю 2 столько раз, сколько их!
префиксов было. И, наконец, мы не результат, так как наши базовые значения для0
и1
являются противоположностью того, что нам нужно.Рассмотрим код более подробно:
источник
Haskell , 27 байт
Попробуйте онлайн!
Каждое
!
ведение дополняет вывод для остальной части выражения, сделанного как1-
. Мы продолжаем переключаться, пока не наберем цифру. Если остальное просто"0"
, результат равен 0. В противном случае, это1
или или сопровождается одним или несколькими!
, так что результат равен 1.источник
Рубин,
22 2120 байтОбъяснение:
(Кража -1 байт, идея @Value Ink)
источник
Желе , 8 байт
Попробуйте онлайн!
Это функция (монадическая ссылка), которая принимает один аргумент и возвращает его возвращаемое значение. (Он также часто записывает ненужные файлы в стандартный вывод как побочный эффект, но нас это не волнует.)
объяснение
Во-первых, обратите внимание, что поскольку входные данные всегда состоят из некоторого числа
!
, за которым следует цифра, а затем еще больше!
, что, если мы удалим трейлинг!
и возьмем длину, мы получим один плюс номер ведущего!
в программе. Взятие четности вернет 0, если было нечетное число!
, или 1, если было четное число!
. Сравнение с 0 - это функция «не», тогда как сравнение с 1 - это функция тождества; таким образом,œr”!LḂ=
эффективно реализуется!
часть вопроса «рассматривайте ведущие как НЕ операторы».Что касается второй половины, обработка факториалов
!
- это факториальная операция в Jelly, поэтому, если у программы нет ведущего!
, мы можем решить проблему напрямую с помощью простогоeval
(V
). Если у программы действительно есть ведущие!
, они будут интерпретироваться как принятие факториала 0 (возможно, многократно), производящего возвращаемое значение 1, которое будет напечатано в стандартный вывод и отброшено, как только будет замечена цифра; таким образом, они не влияют на возвращаемое значение функции, которую я представляю на вопрос.источник
Python, 38 байт
TryItOnline!
Безымянная функция, принимающая входную строку
s
и возвращающая целое число0
или1
.s[1::2]
это фрагмент входной строки, который начинается с индекса 1 и имеет размер шага два:'Like this' -> 'ieti'
s[::2]
аналогично, но начинается с индекса по умолчанию 0:'Like this' -> 'Lk hs'
Тест
(s[1::2]>s[::2])
проверяет, является ли индекс на основе 0 нечетным'0'
или то'1'
есть, то есть, если мы должны дополнить.Это работает, потому что порядок строк проверяется лексикографически с любой непустой строкой, превышающей пустую строку, и с упорядочением ASCII, так
'1'>'0'>'!'
. Это байт короче, чем простойs.index(max(s))%2
.В
ord(s[-1])%2
проверяет , чтобы увидеть , если последний символ не является'0'
(для действительного входа), и результатов в целом числе ( в то время как такая же длина(s[-1]!='0')
будет возвращать логическое значение).Это работает потому , что последний символ ввода,
s[-1]
будет представлять собой'0'
,'1'
или'!'
которые имеют ASCII - код указывает 48, 49, и 33 соответственно, которые равны 0, 1 и 1 по модулю 2.^
Затем выполняет побитовое исключающее или операции на двух указанных выше значений, возвращая целое число , так как один вход, правый, представляет собой целое число. Если значение «Истина» соответствует значению «слева», возвращается правое дополнение, а значение «Лево» соответствует значению «Ложь», при необходимости возвращается право.источник
Java 7,
1058281 байтПопробуйте онлайн!
Старое регулярное выражение
источник
c^=1
супер умный Это неиспользованный оператор, если я когда-либо видел.CJam ,
1211 байтовПопробуйте онлайн! Набор тестов (выводится
1
для каждого правильного теста).источник
Haskell ,
6765 байтПопробуйте онлайн! Использование:
f "!!!0!!!!"
Сохранено два байта благодаря @nimi.
источник
Brainfuck, 115 байт
Попробуйте онлайн!
Ungolfed:
источник
Пакетная, 62 байта
Принимает участие в STDIN. Batch действительно
!
правильно понимает ведущие s для этой задачи, но с трейлингом!
нужно разобраться , что занимает три шага:0!
на1
!!
(это безопасно для!!
s перед цифрой тоже)!
(который теперь может быть только после a1
)источник
sed,
363331 байтЧистый сед, без утилит bc / shell. Работает на GNU sed <4.3; 33 байта на BSD и GNU 4.3+.
Достаточно просто, если вы знакомы с
sed
; прокомментировал для тех, кто не:Контрольная работа:
источник
sed
позволяют использовать пустую строку в качестве имени метки. Если вы сможете заставить это работать здесь, это сэкономит вам два байта. На самом деле, я не уверен, что лейбл даже нужен; если я что-то пропустил, первая строка идемпотентна, так что вы можете вернуться к началу программы, а не к метке.:
(больше ошибки воспринимается как особенность), в этом случае и the,t
иb
! Команды переходят в положение метки. Кроме того, код sed должен работать как минимум для одной версии sed, аналогично другим языкам, поэтому вам не нужно создавать код, который также работает для BSD.PHP 7.1,
5855543735 байтПримечание: используется кодировка IBM-850
Запустите так:
объяснение
Tweaks
-R
(что делает$argn
доступным)источник
IBM / Lotus Notes Formula - 77 байтов
Там нет TIO для Формула Notes, поэтому скриншот всех тестовых случаев показан ниже:
Как это устроено
@Eval()
оценивает строку как выражениеСначала мы проверяем,
a
содержит ли входная строка в поле (input)1
или,0
и принимаем все символы слева от того, какой это будет строка!
символов. Нам все равно, сколько.@Eval()
позаботится об этом.Далее мы посмотрим, есть ли
!
в конце строки. Если есть, мы добавляем1
к!
строке (0!
и1!
оба равны 1 - не имеет значения, сколько!
символов в конце), в противном случае мы добавляем последний символ без изменений, потому что это не a!
и может быть либо a,1
либо a0
.Теперь у нас есть строка, содержащая начальные инверсии плюс число, определяемое тем, есть ли какие-либо факторные символы, чтобы мы могли передать это
@Eval()
и получить результаты выше.источник
Бин , 24 байта
HexDump:
Эквивалентный JavaScript:
Извините, что наступил вам на ноги, Арно .
Объяснение:
Принимает первую строку ввода как неформатированные строки в
a
, и заменяет любую цифру , за которой следует один или более!
с1
, так , что остальные могут бытьeval
«D с помощью JavaScript.Попробуйте демо или набор тестов
источник