Если даны два целых числа больше единицы, A и B, выведите четыре математических выражения в следующем порядке:
Простое выражение A ^ B (от A до степени B). например, если A = 2 и B = 3
2^3
,.Разложение A ^ B в терминах повторных умножений A. например
2*2*2
.Разложение A ^ B в терминах многократных добавлений A. например
2+2+2+2
.Разложение A ^ B в терминах повторных сложений 1. например
1+1+1+1+1+1+1+1
.
Четыре выражения могут быть выведены любым разумным способом, если они в порядке и четко различаются. Например, вы можете поместить их в список или напечатать их в отдельных строках
2^3
2*2*2
2+2+2+2
1+1+1+1+1+1+1+1
или, возможно, на одной строке, разделенной знаком равенства:
2^3=2*2*2=2+2+2+2=1+1+1+1+1+1+1+1
Пробелы могут быть вставлены рядом с математическими операторами, так
2^3 = 2 * 2 * 2 = 2 + 2 + 2 + 2 = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
будет одинаково действительным выходным сигналом, когда A = 2 и B = 3.
Вы можете использовать символы альтернативы ^
, *
и +
, но только если новые символы более идиоматические для вашего языка (например , **
вместо того , чтобы ^
в Python).
Вы можете предположить, что A и B достаточно малы, чтобы A ^ B не переполнял целочисленный тип вашего языка по умолчанию (учитывая, что этот тип имеет разумный максимум, по крайней мере, 255).
Самый короткий код в байтах побеждает.
Тестовые случаи
Один вывод на строку. Входные данные могут быть выведены, так как первое выражение всегда A ^ B.
2^2 = 2*2 = 2+2 = 1+1+1+1
2^3 = 2*2*2 = 2+2+2+2 = 1+1+1+1+1+1+1+1
2^4 = 2*2*2*2 = 2+2+2+2+2+2+2+2 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
2^5 = 2*2*2*2*2 = 2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
3^2 = 3*3 = 3+3+3 = 1+1+1+1+1+1+1+1+1
3^3 = 3*3*3 = 3+3+3+3+3+3+3+3+3 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
3^4 = 3*3*3*3 = 3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
3^5 = 3*3*3*3*3 = 3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
4^2 = 4*4 = 4+4+4+4 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
4^3 = 4*4*4 = 4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
10^2 = 10*10 = 10+10+10+10+10+10+10+10+10+10 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
13^2 = 13*13 = 13+13+13+13+13+13+13+13+13+13+13+13+13 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
источник
=
слева не было неуместных3
.2^3
ли допустимый формат ввода? Или это должен быть пробел / запятая / перевод строки или что-то еще?Ответы:
Python 3.6 ,
8874 байта-2 байта благодаря Dada (используйте
~
)-5 байтов благодаря Erwan (используйте f-строки из Python 3.6)
кто-нибудь в сети?
Как?
Это безымянная функция, принимающая два целочисленных ввода
a
иb
каждый из которых больше, чем0
(хотя спецификация предназначена только для тех, которые больше1
).В Python 3.6 доступна новая функция, а именно отформатированные строковые литералы или «f-строки». Они позволяют выполнять построение строки во время выполнения. Ведущий
f
(илиF
) создает такую конструкцию, например,f"blah"
илиf'blah'
. Внутри f-строки что-либо между парой скобок{...}
, находится выражение для оценки.В качестве таких
f"{a}^{b}={a}{f'*{a}'*~-b}={a}{f'+{a}'*~-a**~-b}=1"
оценивает каждый изa
,b
,a
,f'*{a}'*~-b
,a
, иf'+{a}'*~-a**~-b}
как выражения, сохраняя^
,=
,=
и=1
как строки, все из которых получает сцепленных вместе.a
Иb
вычисление выражений представленийa
иb
соответственно.f'*{a}'
И ,f'+{a}'
в свою очередь, также диафрагменные строки внутри этих выражений, которые оценивают вa
с ведущим'*'
и ведущим'+'
соответственноДля того, чтобы создать необходимое количество
a
s- и операции для*
и+
частей , обратите внимание , что там будетb
a
с перемножать иa**(b-1)
a
ы суммируется. Тогда в каждом случае требуется на один знак оператора меньше, чем числоa
s. Таким образом, мы можем повторять f-строкиf'*{a}
иf'+{a}'
(используя*
) столько раз, сколько есть операторов, и добавлять каждый из них к одномуa
.(b-1)
есть~-b
и(a**(b-1))-1
есть~-a**~-b
.То же самое делается для
1
s, использующих(a**b)-1
бытие~-**b
, но нам не нужны служебные данные f-строк, поскольку они1
постоянны, поэтому повторяемая стандартная строка объединяется с+
.Предыдущие версии Python, 81:
Попробуйте онлайн!
источник
(b-1)
на~-b
?lambda a,b:f"{a}^{b}={(f'*{a}'*b)[1:]}={(f'+{a}'*a**~-b)[1:]}=1"+'+1'*~-a**b
Cubix,
238 234 217 151 110100 байтСохранено 14 байтов благодаря ETHProductions
Expanded:
Попробуйте онлайн!
Попробуй здесь
объяснение
Код состоит из 8 шагов, с двумя циклами. Я перейду код по частям.
Шаг 1 (A ^ B)
Это куб с удаленными частями, которые не имеют отношения к первому шагу. На вопросительном знаке показаны запреты, которые посетит IP, чтобы сделать его путь более понятным.
Теперь стек выглядит так:
A, B, A, B
Шаг 2 (подготовка к печати цикла)
Цикл печати принимает 3 аргумента (верхние 3 элементов на стеке):
P
,Q
иR
.P
количество повторений,Q
разделитель (код символа) иR
число повторений. К счастью, цикл также заботится о том, что результирующая строка должна заканчиватьсяR
, а неQ
.Мы хотим повторить
A*
точноеB
время, поэтому разделитель есть*
. Обратите внимание, что стек начинается какA, B, A, B
. Я снова удалил все ненужные инструкции. IP начинаются сS
указывающего на север.Стек сейчас
A, B, B, *, A
.Шаг 3/6/8 (цикл печати)
концепция
IP входит в петлю
S
, указывая на север, и выходит из петли вE
, снова указывая на север. Для этого объяснения стек установлен в[..., A, B, C]
. Следующие инструкции выполняются. Обратите внимание, что IP не может выйти из цикла до знака вопроса, поэтому первые четыре инструкции всегда будут выполнены.Реализация
Вот снова куб, с удаленными ненужными частями. IP начинается с
S
, указывая на восток.Как видите, IP попадает в четыре инструкции, прежде чем он входит в цикл. Так как символьный код снова удаляется, мы достигаем цикла с тем же стеком, как мы вошли в эту часть.
Внутри цикла, объяснение выше имеет место.
Шаг 4 (дифференциация IP-адресов)
Поскольку мы используем вышеупомянутый цикл несколько раз, и все они приводят к тому, что IP-адрес заканчивается в одном и том же месте, мы должны различать несколько прогонов. Во-первых, мы можем различить разделитель (первый прогон имеет a
*
, тогда как два и три прогона имеют+
разделитель a ). Мы можем различать прогоны 2 и 3, проверяя значение числа, которое повторяется. Если это так, программа должна завершиться.Первое сравнение
Вот как это выглядит на кубе. IP начинается в S и указывает на север. Стек содержит
[..., * or +, A or 1, 0]
. Число 1 показывает, где IP будет заканчиваться, если это первый цикл (указывает на север), а число 2 показывает, где IP будет заканчиваться, если это второй (или третий) цикл (указывает на восток).Если IP в настоящее время в
1
, стек[A, *, +, -1]
. В противном случае стек есть[A or 1, +, +, 0]
. Как вы можете видеть, в стеке второго случая все еще остается неизвестное, поэтому мы должны сделать еще одно сравнение.Второе сравнение
Поскольку IP прошел шаг 5, стек выглядит следующим образом :
[A^(B-1) or nothing, A or 1, +, +, 0]
. Если первый элементnothing
, второй элемент1
, и обратное тоже верно. Куб выглядит следующим образом: IP начинается с S и указывает на восток. Если это второй цикл, IP заканчивается вE
направлении на запад. В противном случае программа нажимает@
и завершает работу.Выполненные инструкции, которые ничего не делают с потоком управления, перечислены ниже.
Стек теперь
[A^B, +, A^(B-1), A-1]
, при условии, что программа не завершилась.Шаг 5 (подготовка к «A +» (повторите A ^ (B-1)))
К сожалению, у Cubix нет оператора power, поэтому нам нужен еще один цикл. Однако сначала нам нужно очистить стек, который теперь содержит
[B, A, *, +, -1]
.Убираться
Вот снова куб. Как обычно, IP начинается в S (указывает на север) и заканчивается в E, указывая на запад.
Вычисление A ^ (B-1)
Еще один цикл, который работает примерно так же, как цикл печати, но он немного компактнее. IP начинается
S
со стека, указывая на запад[B, A, *]
. IP выходит,E
указывая на север.Тело цикла следующее.
В результате стек
[A, A^(B-1), 0]
.Очистка стека (снова)
Теперь нам нужно снова попасть в цикл печати, содержащий верхнюю часть стека
[..., A^(B-1), +, A]
. Для этого мы выполняем следующее. Вот снова куб,Шаг 7 (подготовка к последнему циклу)
Стек теперь
[A^B, +, A^(B-1), A-1]
, IP начинается вS
, идет на запад и заканчивается вE
, идет направо.Выполненные инструкции:
Стек теперь выглядит так
[A^B, +, 1]
, и IP собирается войти в цикл печати, так что мы закончили.источник
MATL , 46 байт
Попробуйте онлайн!
Растягивая границы «разумного пути» здесь, но выражения разделяются.
объяснение
Первое выражение:
Второе выражение:
Третье выражение:
Четвертое выражение:
источник
JavaScript (ES7), 78 байт
Принимает ввод в синтаксисе карри
(a)(b)
. Выводит строку.Контрольные примеры
Показать фрагмент кода
источник
Рубин, 52 байта
источник
05AB1E , 30 байтов
Объяснение:
Попробуйте онлайн!
источник
¹²'^ý ¹'*¹«²<׫¹²m¹÷¹s×S'+ý 1¹²m×S'+ý»
почему ты побил меня на 5 байт :(?¹²«¹²×¹¹²m©¹÷×1®×)vySN"^*++"èý,
ближе;). Вы выигрываете только на 1 сейчас;).C (gcc) ,
156149 байт-2 байта, если мы можем игнорировать 0 степеней;
y=!!i
может статьy=1
Попробуйте онлайн!
источник
Java 7, 170 байт
Ungolfed:
Тестовый код:
Попробуй это здесь.
Выход:
источник
Пип ,
383534 байта33 байта кода, +1 для
-n
флага.Принимает A и B в качестве аргументов командной строки; печатает одно выражение в строке. Попробуйте онлайн!
объяснение
Ya**b
это код установки: вставьтеa**b
вy
переменную. После этого у нас есть список (в[]
), содержащий наши четыре выражения:gJ'^
: возьмите полныйg
список ar (здесь список, содержащийa
иb
) иJ
добавьте его^
aRLbJ'*
: используйтеR
epeatL
ist для создания списка сb
копиямиa
, а затемJ
включите его*
aRLy/aJ'+
: используйтеRL
для создания списка сy/a
(то естьa**(b-1)
) копиямиa
, а затемJ
включите его+
1XyJ'+
:1
, умноженный на строкуy
,J
oined on+
Список печатается с новой строкой в качестве разделителя благодаря
-n
флагу.источник
Javascript
115113104 байтовСпасибо @Neil и @TuukkaX за игру в гольф по одному байту каждый, а @ETHproductions и Люку за игру в гольф по 9 байтов.
Попробуйте онлайн
источник
a=>b=>
.'=1'+'+1'.repeat
?.join
:a=>b=>[a+'^'+b,(a+'*').repeat(b-1)+a,(a+'+').repeat(Math.pow(a,b-1)-1)+a,1+'+1'.repeat(Math.pow(a,b)-1)].join`=`
.join()
...Желе , 29 байт
Попробуйте онлайн!
Как?
источник
тинилисп репл ,
178186 байтИспользование repl сохраняет 8 байтов в подразумеваемых закрывающих скобках на концах строк. Определяет функцию,
X
которая принимает два числа и возвращает список выражений. Каждое выражение заключено в скобки с пробелами вокруг операторов (фактически, это список чисел и символов операторов):Надеюсь, этот формат вывода является приемлемым. Попробуйте онлайн! (с несколькими тестами).
объяснение
Нам нужны две функции из стандартной библиотеки:
list
и*
.Определите функцию
W
(сокращение от «weave»), которая берет аккумулятор_
, числоN
, символS
и счет#
. Мы будем использовать эту функцию для генерации большинства наших выражений: например,(W () 2 (q +) 3)
приведет к(2 + 2 + 2)
.Если счетчик равен 1
(e # 1)
, то выведите число на лицевую сторону аккумулятора(c N _)
и верните его. В противном случае, рекурсивно:(c S(c N _))
: символ и номер cons'd перед предыдущим аккумулятором;N
иS
одинаковы;(s # 1)
: количество - 1.Аккумуляторная идиома необходима для достижения правильной рекурсии хвоста , предотвращая ошибку глубины рекурсии. (Это изменение отвечает за +8 к количеству байтов.
13^2
Случай не работал в предыдущей версии.)К сожалению, библиотека не имеет функции возведения в степень в настоящее время, поэтому мы должны определить ее.
^
беретx
иy
. Еслиy
это правда (ненулевой), мы рекурсивно сy-1
((s y 1)
) и умножаем результат наx
. В противном случаеy
ноль и мы вернемся1
.(Примечание: эта функция не использует правильную рекурсию хвоста. Я предполагаю, что показатели будут достаточно малы, чтобы это не имело значения. Некоторые эксперименты с TIO показали максимальный показатель 325, который, я бы сказал, должен быть достаточным для этого вопроса. Если ФП не согласен, я его поменяю.)
Наконец, функция мы заинтересованы в,
X
, принимаетA
иB
и возвращает список из четырех элементов:(list A(q ^)B)
: список, содержащийA
литерал^
иB
;(W()A(q *)B)
: позвоните,W
чтобы получить списокB
копийA
, переплетающихся с буквальным*
;(W()A(q +)(^ A(s B 1)))
: позвоните,W
чтобы получить списокA^(B-1)
копийA
, переплетающихся с буквальным+
;(W()1(q +)(^ A B))
: позвоните,W
чтобы получить списокA^B
копий1
, переплетающихся с буквальным+
.источник
Brainfuck , 372 байта
Попробуйте онлайн!
Заметки
A**B
не превышать255
. Это потому, что brainfuck может хранить значения только одного байта.10
становится:
,11
становится;
и т. д. Это потому, что Brainfuck может принимать входные данные только одного байта.объяснение
Вот мой несколько прокомментированный код. Я расскажу об этом позже.
источник
Pyth,
3231 байтПринимает вход как
[2,10]
, выводит как["2^10", "2*2*2*2*2*2*2*2*2*2", "2+2+...
Объяснение:
Попробуй это здесь.
источник
Perl , 81 байт
78 байт кода +
-n
флаг (считается как 3 байта, поскольку код содержит$'
).Попробуйте онлайн!
источник
R, 147 байт
Анонимная функция, которая выводит требуемые, ну, выходы, построчно. Это решение широко использует
switch
функцию.switch
Функция принимает выражение (здесьs
) , который принимает значение числа или строки символов (см?switch
), за которым следует alernatives , соответствующееs
. Если альтернатива отсутствует (напримерswitch(s, a=, b= "PPCG")
, оценивается следующая не пропущенная альтернатива (в примере,s="a"
выходные данные"PPCG"
).Эти
rep
функции повторы (повторность), на самом деле его первый аргумент число раз указаны во втором аргументе.cat
, для завершения, объединения и печати объектов с разделителем, который можно выбрать с помощьюsep =
аргумента. Втораяcat
функция здесь для перевода строки.Ungolfed:
источник
CJam , 42 байта
Попробуйте онлайн!
источник
к, 44 байта
Тестовые случаи.
источник
Кардинал 202 байта
Будет работать только для чисел, где вычисленное значение <256 из-за ограничений в значениях, которые могут храниться указателями в Cardinal
Попробуйте онлайн
Объяснение:
Шаг 1
Получает два числа a и b в качестве входных данных и выводит как «a ^ b =»
Передает указатель с активным значением a и неактивным значением b
Шаг 2
Получает указатель с активным значением a и неактивным значением b, печатая "a" + ("* a") (b-1) раз
Передает указатель с активным значением a ^ (b-1) на следующую часть
Шаг 3
Получает указатель со значением ^ (b-1) и выводит "= a" + ("+ a"), повторяется (a ^ (b-1) -1) раза + "="
Передает указатель со значением a ^ b к следующей части
Шаг 4
Получает указатель со значением a ^ b и печатает "1" + ("+ 1"), повторенные a ^ b-1 раз
источник
Сетчатка,
8988 байтВвод - разделенные запятыми унарные числа.
Попробуйте онлайн!
источник