Этот вызов вдохновлен математикой является фактом. Программирование нет .
Математическая запись факториала или факта - восклицательный знак !
. Восклицательный знак также является общим символом для not
многих языков программирования.
Вызов:
Возьмите строку, содержащую цифры и символы: в + !
качестве ввода и вывода:
Все перед восклицательным знаком следует оценивать как математическое выражение, так 2+2
будет 4
.
Все, что после одного восклицательного знака, должно быть добавлено в качестве аксессуаров к тому, что находится перед ним, а значит: 2+2!5
должно давать 45
, потому что 2+2=4
и 5
является аксессуаром. 2+2!5+5
должен дать 410
.
Поскольку !
также означает not
, что все, что не является аксессуаром после факта, не должно быть добавлено. Итак, 2+2!!5
следует дать 4
, так как 5
это не аксессуар. Теперь not(not(true))==true
так 2+2!!!5
следует дать 45
. 2+2!!5!5+5
должен дать:, 410
потому что 2+2=4
затем следует факториал и !5!5+5
. Первый 5
не факт, но 5+5
после другого восклицательного знака, и поэтому факт, еще раз.
Разъяснения:
- Восклицательные знаки не будут соседствовать с
+
любой из сторон. - Там не будет ведущих
+
для чисел (это5
не так+5
). - При желании вы можете включить ведущий ноль, если это результат выражения перед первым
!
. Оба4
и04
принимаются к выводу:0+0!4
Резюме: оцените каждую сумму (рассматривая !
как разделители). Затем отбросьте все числа, которые появляются после четного числа !
(считая от начала строки). Тогда удали все !
.
Тестовые случаи:
!
<- Empty string
5
5
12!
12
!87
87
!!5
<- Empty string
5+5!2+2
104
5+5!!2+2
10
1!2!3!4!5!6!7!8!9
12468
10+10!!2+2!!3+3!4+4
208
2!!3!5
25
2!!3!5!7
25
10!!!!!!!5
105
Это код-гольф, поэтому выигрывает самый короткий код в байтах (на каждом языке)! Пояснения настоятельно рекомендуется!
25
(см. добавленный контрольный пример). Что еще важнее,2!!3!5!7
все равно даст25
, потому что есть четное число!
слева от7
(так что вы не просто посчитаете пробег прямо перед номером, но все!
слева от него).Row
?Ответы:
Retina ,
353129 байтСохранено 4 байта, вдохновленные ETHproductions .
Спасибо Лео за сохранение еще 2 байтов.
Попробуйте онлайн!
источник
JavaScript (ES6),
5856 байтСохранено два байта благодаря Мартину Эндеру .
Может быть улучшен как-то ...
источник
replace
.1+1!5
. Я думаю, что вы забылиeval
немного до!
.Желе , 16 байт
Попробуйте онлайн!
объяснение
Ключевое наблюдение здесь заключается в том, что мы можем выполнить шаги «не по порядку»; вместо того, чтобы оценивать суммы, а затем игнорировать те, которые нам не нравятся, мы можем игнорировать суммы в недопустимых позициях, а затем оценивать остальные.
Оценивая сумму как,
"10+10"
вы оцените ее как число, например20
, затем преобразуете ее в строку"20"
. Повторение этого процесса не имеет никакого дополнительного эффекта (это идемпотент). Таким образом, мы эффективно оцениваем каждый элемент строки, кроме нулевой строки, которая остается неоцененной, поскольку имеет нулевую длину.источник
µ
куда-то (иµ
не работает внутри цикла, что означает, что вам нужно что-то еще более многословно). Мне все-таки удалось заставить его работать,ṣ”!µḢW;m2$ȧVṾ$$€
но он не короче (и имеет характерную кучу знаков доллара, которые обычно случаются, когда вы толкаете Jelly к краю его способностиЖеле , 18 байт
Попробуйте онлайн!
Как?
источник
0+0
в середине ввода (в месте, где его не отбрасывают); он генерирует пустую строку, хотя должен выдавать цифру 0.CJam , 20 байтов
Попробуйте онлайн! (Набор тестов с разделением строк).
источник
Рубин ,
5856 + 1 =5957 байтИспользует
-p
флаг. -2 байта от Тутлемана .Попробуйте онлайн! (Была добавлена дополнительная строка кода, чтобы она заняла все строки ввода и напечатала вывод в разных строках.)
источник
eval$1
, нет?Пакет,
192184 байтаРаботать с пустыми строками неудобно.
источник
Пип , 18 байт
Я думаю, что это самое короткое время ... хотя я говорил об этом и три итерации назад.
Принимает ввод в качестве аргумента командной строки. Попробуйте онлайн!
объяснение
источник
R, 95 байт
Вероятно, есть место для улучшения, но на данный момент это лучшее, что я могу придумать.
источник