Вызов:
В социальных сетях циркулирует глупая головоломка:
8 + 2 = 16106
5 + 4 = 2091
9 + 6 = ?
Реализуйте функцию или оператор, который, когда ему дано два положительных целых числа x
и так y
, что x > y > 0
дает правильный ответ в виде целого числа , где цифры ответа - это цифры, за x * y
которыми следуют цифры, за x + y
которыми следуют цифры x - y
. Очень просто.
Правила:
- Стандартные лазейки запрещены.
- Это код-гольф, поэтому выигрывает самый короткий код в байтах.
- Проверка входных данных не требуется. Эта программа может аварийно завершить работу или вернуть мусор при неправильном вводе.
- Вы можете использовать числовые функции и операторы (включая целочисленные и с плавающей точкой, функции математической библиотеки и другие функции, которые принимают и возвращают числа).
- Вам разрешено использовать функцию, которая возвращает количество цифр числа, если это применимо.
- Вы не можете использовать строки или любые виды конкатенации в любом месте вашего кода.
- Результат может быть возвращен или помещен в стек, в зависимости от языка. Результатом должно быть целое число, а не строка.
Образец кода:
Следующий код создает двоичный оператор с именем X
.
Х ← {(⍺-⍵) + ((⍺ + ⍵) × 10 * 1 + ⌊10⍟⍺-⍵) + ⍺ × ⍵ × 10 * (2 + ⌊10⍟⍺ + ⍵) + ⌊10⍟⍺- ⍵}
Объяснение:
В APL вы оцениваете справа налево.
⍺ and ⍵
левый и правый операнд соответственно⌊10⍟⍺-⍵
гласит:floor of log10(⍺-⍵)
. Сначала выполняется вычитание, затем логарифм, затем пол. Справа налево log10 делается для того, чтобы посчитать цифры⍺-⍵
(потом вы должны сложить 1).⍺×⍵×10*(...)
гласит:10 to the (...)th power, multiplied by ⍵, multiplied by ⍺
Следовательно,
⍺×⍵×10*(2+⌊10⍟⍺+⍵)+⌊10⍟⍺-⍵
это произведение, смещенное влево на сумму количества цифр суммы и разности. Умножение на степень 10 сместит целое число влево.((⍺+⍵)×10*1+⌊10⍟⍺-⍵)
сумма, сдвинутая влево на количество цифр разницы.(⍺-⍵)
это разница. Сдвиг не требуется здесь.X←{...}
как вы определяете оператор в APL.
Примеры:
8 X 2
16106
5 X 4
2091
9 X 6
54153
GNU dc:
Следующий код создает макрос с именем a
:
[sysx10lxly-dseZdsclxly+dsd+Z1+^lxly**10lc^ld*+le+]sa
Объяснение:
sx
иsy
вытолкнуть элемент из стека и сохранить его в регистрахx
иy
, соответственно.lx
иly
загрузить элемент из регистровx
иy
соответственно и поместить его в стек.d
дублирует последний элемент в стеке.^
вычисляет силу двух чисел.Z
выскакивает число и возвращает его количество цифр. Это сделано потому, чтоdc
не имеет функции логарифма.[...]sa
хранит макрос в реестреa
.la
загружает это.x
выполняет макрос в верхней части стека.
Примеры:
8 2 laxn
16106
5 4 laxn
2091
9 6 laxn
54153
источник
Ответы:
JavaScript (ES7),
636159 байтСохранено 4 байта благодаря Нейлу .
источник
10**-~Math.log10(c)
. (Но +1 за использованиеreduce
, конечно.)async
/await
и оператор возведения в степень**
**
действительно полезно, я согласен. Это должно было быть в ES6.C,
7975 байтовСпасибо @GB за сохранение 4 байта!
Попробуйте онлайн!
источник
Баш, 66
Попробуйте онлайн .
источник
$[...]
могут быть расширены без явного$
(например,d
вместо$d
), за исключением двух символов((s=$1+$2,d=$1-$2))
для инициализации двух переменных.EXCEL, 61 байт
Excel, 18 байт недействительно
источник
С накоплением , 36 байт
Попробуйте онлайн!
Ранее:
,@A$(-+*){!A...n!}"!:inits$#'"!$summap:pop@.10\^1\,\*sum
Я собираюсь попытаться выжать один или два байта, прежде чем писать объяснение. (
#'
= размер, и"
это «делать на каждом», здесь нет никаких строк.)Неконкурирующих по 26 байт:
$(*+-)#!!:{%y#'10\^x*y+}#\
.источник
TI-Basic,
3433 байтаисточник
Prompt A,B
также должно работатьGNU dc, 36
Определяет макрос,
m
который принимает два верхних элемента стека, применяет макрос и оставляет результат в стеке (согласно примеру в вопросе):Попробуйте онлайн .
источник
Perl 6 ,
81 6158 байтПопытайся
Попытайся
Попытайся
источник
x-y
это правильный идентификатор.Желе , 27 байт
Определяет двоичную ссылку / функцию, вызываемую с помощью
ç
. Принимает два целых числа в качестве входных данных и возвращает целое число. Он имеет дополнительный бонус в виде возможности взять х<
у или х>
y, используя абсолютную разницу.Попробуйте онлайн!
Объяснение:
Детали:
источник
PHP,
7975 байтдве версии:
принимает входные данные из аргументов командной строки; беги с
-r
.Я думаю,
strlen
квалифицируется как «функция, которая возвращает количество цифр»,хотя она использует число в виде строки. Дайте мне знать, если нет.
источник
strlen
это правильно.C (gcc) , 70 байт
Попробуйте онлайн!
основанный на ответе Steadybox , помещая все в макрос для игры в гольф немного больше.
(Примечание: назначение результата
d
вместоa
работ неожиданно. Я посмотрел на сгенерированный ассемблерный код, и, похоже, все в порядке.)источник
Haskell, 54 байта
Головоломка реализована через инфиксную функцию
#
, например8#2 = 16106
. Другая функция%
определяет конкатенацию base-10 (при условии, что RHS больше 0).источник
Дьялог АПЛ, 31 байт
{a⊥⍨10*1+⌊10⍟a←(⍺×⍵)(⍺+⍵)(⍺-⍵)}
на основе примера кода APL из постановки задачи
источник
PHP, 87 байт
и неверное решение для 37 байт
источник
Рубин, 61 байт
Что подозрительно похоже на этот ответ Javascript, но без логарифма.
источник
Питон,
9291 символБлагодаря предложению Wizards;)
источник
)
иif
.R (3.3.1), 104 байта
возвращает анонимную функцию.
Это моя первая попытка игры в гольф, поэтому любые отзывы приветствуются.
источник
REXX, 70 байт
Конечно, родной путь был бы намного короче
источник
PowerShell, 88 байт
PowerShell не имеет оператора питания, который не помогает. Также нельзя посчитать длину целого числа, если вы не посчитаете его как строку, что мы не можем сделать, поэтому я проверяю, является ли оно
-gt
9, чтобы узнать длину. Вероятно, может быть более кратким, но я должен вернуться к работе.источник
Python 2.7,
10996 байтИсправлено после следующих правил конкурса. Кредиты mbomb007 для уменьшения кода со 109 до 96 байтов
источник
•You're not allowed to use strings or any kind of concatenation anywhere in your code.
a
лямбду.a=lambda n:10**int(...
, Вы также можете сделать этоb,c=input()
, указав два ввода через запятую.J , 25 байт
*;+;-
Вставьте результаты каждой операции.10#.inv&.>
Преобразуйте каждый результат в массив из 10 цифр. (inv
есть^:_1
)[:;
Распаковать и присоединиться к массивам.10#.
Преобразуйте массив из 10 цифр в целое число.X=.
определите выше как операторX
.Полученные результаты:
источник
X=.
Mathematica, 67 байт
Принимает
x-y
, затем берет log10x-y
, округляет его, вычисляет 10 до степени, а затем умножает наx+y
. Но мы также должны рассмотреть вопрос оlog10(x-y)
том, чтобы быть 0, поэтому мы заменяем 0 на 1. Затем мы берем log102x
, округлил плюс 1 и находим 10 в степени этого. Умножьте это наxy
и добавьте это.источник
05AB1E ,
232216 байтовПопробуйте онлайн!
Мы могли бы сэкономить несколько байтов, если бы нам было разрешено использовать строки в программе (но не в вычислениях), зацикливаясь на строке, содержащей операции
"-+*"
, поскольку код, выполняемый для каждой операции, одинаков.Конечно, если бы нам было разрешено использовать конкатенацию, мы бы сэкономили гораздо больше.
источник
R, 64 байта
Использование:
источник