Развернуть Экспонирование

31

Если даны два целых числа больше единицы, A и B, выведите четыре математических выражения в следующем порядке:

  1. Простое выражение A ^ B (от A до степени B). например, если A = 2 и B = 3 2^3,.

  2. Разложение A ^ B в терминах повторных умножений A. например 2*2*2.

  3. Разложение A ^ B в терминах многократных добавлений A. например 2+2+2+2.

  4. Разложение 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
Кальвин Хобби
источник
@JonathanAllan Да, вы получили все опечатки, которые я видел. Хорошая работа! Вы ничего не получите.
Р. Кап
2
Вы получаете спасибо от меня @JonathanAllan. Р. Кап заставил меня волноваться обо всех моих 3-х
Хобби Кэлвина
Ну, (к счастью) =слева не было неуместных 3.
Р. Кап
5
Пожалуйста, не делайте «расшифровать обозначение стрелок Кнута» в следующий раз
Мэтью Ро
1
Если мы читаем входные данные из STDIN как одну строку, является 2^3ли допустимый формат ввода? Или это должен быть пробел / запятая / перевод строки или что-то еще?
Мартин Эндер,

Ответы:

11

Python 3.6 , 88 74 байта

-2 байта благодаря Dada (используйте ~)
-5 байтов благодаря Erwan (используйте f-строки из Python 3.6)

lambda a,b:f"{a}^{b}={a}{f'*{a}'*~-b}={a}{f'+{a}'*~-a**~-b}=1"+"+1"*~-a**b

кто-нибудь в сети?

Как?

Это безымянная функция, принимающая два целочисленных ввода 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с ведущим '*'и ведущим '+'соответственно

Для того, чтобы создать необходимое количество as- и операции для *и +частей , обратите внимание , что там будет b aс перемножать и a**(b-1) aы суммируется. Тогда в каждом случае требуется на один знак оператора меньше, чем число as. Таким образом, мы можем повторять f-строки f'*{a}и f'+{a}'(используя *) столько раз, сколько есть операторов, и добавлять каждый из них к одному a. (b-1)есть ~-bи (a**(b-1))-1есть ~-a**~-b.

То же самое делается для 1s, использующих (a**b)-1бытие ~-**b, но нам не нужны служебные данные f-строк, поскольку они 1постоянны, поэтому повторяемая стандартная строка объединяется с +.


Предыдущие версии Python, 81:

lambda a,b:'%s^%s=%s=%s=1'%(a,b,('*%s'%a*b)[1:],('+%s'%a*a**~-b)[1:])+'+1'*~-a**b

Попробуйте онлайн!

Джонатан Аллан
источник
Вы не можете заменить (b-1)на ~-b?
Дада
Да, вы правы, я пропустил это.
Джонатан Аллан
1
Вы можете выиграть 5 байт, если вы используете f-строку из python 3.6:lambda a,b:f"{a}^{b}={(f'*{a}'*b)[1:]}={(f'+{a}'*a**~-b)[1:]}=1"+'+1'*~-a**b
Erwan
@ Erwan да, я планировал использовать f строк, когда вернусь (сейчас). Я могу спасти еще пару тоже.
Джонатан Аллан
1
Всегда приятно видеть головастиков.
Джек Броунштайн
11

Cubix, 238 234 217 151 110 100 байт

Сохранено 14 байтов благодаря ETHProductions

u'^.:s+.;;;\-?W?rsos\(rrOIO:ur>'=o;^u.;;.>$.vUo^'rsu1;;@!\q?s*su;;IOu*+qU../;(*\(s.;<..r:''uq....qu\

Expanded:

          u ' ^ . :
          s + . ; ;
          ; \ - ? W
          ? r s o s
          \ ( r r O
I O : u r > ' = o ; ^ u . ; ; . > $ . v
U o ^ ' r s u 1 ; ; @ ! \ q ? s * s u ;
; I O u * + q U . . / ; ( * \ ( s . ; <
. . r : ' ' u q . . . . q u \ . . . . .
. . . . . . . . . . . . . . . . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .

Попробуйте онлайн!

Попробуй здесь

объяснение

Код состоит из 8 шагов, с двумя циклами. Я перейду код по частям.

Шаг 1 (A ^ B)

          . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .
I O : u . . . . . . . . . . . . . . . .
U o ^ ' . . . . . . . . . . . . . . . .
; I O u . . . . . . / ; ( * \ . . . . .
? ? r : . . . . . . ? . . . \ ? ? ? ? ?
. . . . ? . . . . . ? . . . . . . . . .
          ? ? ? ? ?
          . . . . .
          . . . . .
          . . . . .
          . . . . .

Это куб с удаленными частями, которые не имеют отношения к первому шагу. На вопросительном знаке показаны запреты, которые посетит IP, чтобы сделать его путь более понятным.

IO:'^o;IO:r*(; # Explanation
I              # Push the first input (A)
 O             #   output that
  :            #   duplicate it
   '^          # Push the character "^"
     o         #   output that
      ;        #   pop it from the stack
       I       # Push the second input (B)
        O      #   output that 
         :     #   duplicate
          r    #   rotate top 3 elements
           *   # Push the product of the top two elements
            (  #   decrease it by one
             ; #   pop it from the stack (making the last
               #   two operations useless, but doing it
               #   this way saves 10B)

Теперь стек выглядит так: A, B, A, B

Шаг 2 (подготовка к печати цикла)

Цикл печати принимает 3 аргумента (верхние 3 элементов на стеке): P, Qи R. Pколичество повторений, Qразделитель (код символа) и Rчисло повторений. К счастью, цикл также заботится о том, что результирующая строка должна заканчиваться R, а не Q.

Мы хотим повторить A*точное Bвремя, поэтому разделитель есть *. Обратите внимание, что стек начинается как A, B, A, B. Я снова удалил все ненужные инструкции. IP начинаются с Sуказывающего на север.

          . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .
. . . . r . . . . . . . . . . . . . . .
. . . . r . . . . . . . . . . . . . . .
. . . . * . . . . . . . . . . . . . . .
. . . . ' . . . . . . . . . . . . . . .
. . . . S . . . . . . . . . . . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .

'*rr # Explanation
'*   # Push * (Stack: A, B, A, B, *)
  rr # Rotate top three elements twice

Стек сейчас A, B, B, *, A.

Шаг 3/6/8 (цикл печати)

концепция

E . . . . .
? r s o s u 
\ ( r r O <
. . . . . S

IP входит в петлю S, указывая на север, и выходит из петли в E, снова указывая на север. Для этого объяснения стек установлен в [..., A, B, C]. Следующие инструкции выполняются. Обратите внимание, что IP не может выйти из цикла до знака вопроса, поэтому первые четыре инструкции всегда будут выполнены.

Orr(?rsos # Explanation
O         # Output `C`
 rr       # Rotate top three elements twice (Stack: [..., B, C, A])
   (      # Decrease A by one (Stack: [..., B, C, A-1])
    ?     # If top of stack (A) > 0:
     r    #    Rotate top of stack (Stack: [..., A-1, B, C])
      s   #    Swap top elements (Stack: [..., A-1, C, B])
       o  #    Output top of stack (B) as character code
        s #    Swap top elements (Stack: [..., A-1, B, C]
          #
          # ... and repeat ...

Реализация

Вот снова куб, с удаленными ненужными частями. IP начинается с S, указывая на восток.

          . . . . .
          . . . . .
          . . . . .
          ? r s o s
          \ ( r r O
. . . . . S ' = o ; ^ u . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .

Как видите, IP попадает в четыре инструкции, прежде чем он входит в цикл. Так как символьный код снова удаляется, мы достигаем цикла с тем же стеком, как мы вошли в эту часть.

'=o; # Explanation
'=   # Push =
  o  #     Output
   ; #     Pop from stack

Внутри цикла, объяснение выше имеет место.

Шаг 4 (дифференциация IP-адресов)

Поскольку мы используем вышеупомянутый цикл несколько раз, и все они приводят к тому, что IP-адрес заканчивается в одном и том же месте, мы должны различать несколько прогонов. Во-первых, мы можем различить разделитель (первый прогон имеет a *, тогда как два и три прогона имеют +разделитель a ). Мы можем различать прогоны 2 и 3, проверяя значение числа, которое повторяется. Если это так, программа должна завершиться.

Первое сравнение

Вот как это выглядит на кубе. IP начинается в S и указывает на север. Стек содержит [..., * or +, A or 1, 0]. Число 1 показывает, где IP будет заканчиваться, если это первый цикл (указывает на север), а число 2 показывает, где IP будет заканчиваться, если это второй (или третий) цикл (указывает на восток).

          u ' . . .
          s + . 1 .
          ; \ - ? 2
          S . . . .
          . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .

;s'+-? # Explanation
;      # Delete top element (0)
 s     # Swap the top two elements (Stack: 1/A, */+)
  '+   # Push the character code of + 
    -  # Subtract the top two elements and push
       #  that to the stack (Stack: 1/A, */+, +, (*/+)-+)
     ? # Changes the direction based on the top
       # item on the stack. If it's 0 (if (*/+) == +)
       # the IP continues going right, otherwise, it
       # turns and continues going north.

Если 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направлении на запад. В противном случае программа нажимает @и завершает работу.

          . . . . .
          . . . . ;
          . . . S W
          . . . . .
          . . . . .
. . . . . . . . . . . . . ; . . . . . .
. . . . . . . . . E @ ! \ q . . . . . .
. . . . . . . . . . . . ( * . . . . . .
. . . . . . . . . . . . q u . . . . . .
. . . . . . . . . . . . . . . . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .

Выполненные инструкции, которые ничего не делают с потоком управления, перечислены ниже.

;;q*q(!@
;;       # Delete top two elements (Stack [A^(B-1)/null, A/1, +])
  q      # Send top element to the bottom (Stack [+, A^(B-1)/0, A/1])
   *     # Push product of top two elements 
         #    (Stack [+, A^(B-1)/0, A/1, A^B/0])
    q    # Send top element to the bottom 
         #    (Stack [A^B/0, +, A^(B-1)/0, A/1])
     (   # Decrease the top element by 1 
         #    (Stack [A^B/0, +, A^(B-1)/0, (A-1)/0])
      !  # If (top element == 0):
       @ #  Stop program

Стек теперь [A^B, +, A^(B-1), A-1], при условии, что программа не завершилась.

Шаг 5 (подготовка к «A +» (повторите A ^ (B-1)))

К сожалению, у Cubix нет оператора power, поэтому нам нужен еще один цикл. Однако сначала нам нужно очистить стек, который теперь содержит [B, A, *, +, -1].

Убираться

Вот снова куб. Как обычно, IP начинается в S (указывает на север) и заканчивается в E, указывая на запад.

          . . . ? .
          . . . ; .
          . . . S .
          . . . . .
          . . . . .
. . . . . . . . . . . . . . . . > $ . v
. . . . . . . . . . . . . . . . . . . ;
. . . . . . . . . . . . . . . . . . E <
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .

;; # Explanation
;; # Remove top 2 elements (Stack: [B, A, *])

Вычисление A ^ (B-1)

Еще один цикл, который работает примерно так же, как цикл печати, но он немного компактнее. IP начинается Sсо стека, указывая на запад [B, A, *]. IP выходит, Eуказывая на север.

          . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .
. . . . . . . . . . . . . . E . . . . .
. . . . . . . . . . . . . . ? s * s u .
. . . . . . . . . . . . . . \ ( s . ; S
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .

Тело цикла следующее.

;s(?s*s # Explanation
;       # Pop top element.
 s      # Shift top elements.
  (     # Decrease top element by one
   ?    # If not 0:
    s   #    Shift top elements again
     *  #    Multiply
      s #    Shift back
        #
        # ... and repeat ...

В результате стек [A, A^(B-1), 0].

Очистка стека (снова)

Теперь нам нужно снова попасть в цикл печати, содержащий верхнюю часть стека [..., A^(B-1), +, A]. Для этого мы выполняем следующее. Вот снова куб,

          . . ^ ? :
          . . . . .
          . . . . .
          . . . . .
          E . . . .
. . . . . s . . . . . . . . ; . . $ . .
. . . . . + q U . . . . . . S . . s . .
. . . . . ' u q . . . . . . . . . ? . .
. . . . . . . ? . . . . . . . . . ? . .
. . . . . . . ? . . . . . . . . . ? . .
          . . ? . .
          . . ? . .
          . . ? . .
          . . ? . .
          . . ? . .

;:$sqq'+s # Explanation
;         # Delete top element (Stack: [A, A^(B-1)])
 :        # Copy top element
  $s      # No-op
    qq    # Send top two elements to the bottom
          #   (Stack: [A^(B-1), A^(B-1), A])
      '+  # Push +
          #   (Stack: [A^(B-1), A^(B-1), A, +])
        s # Swap top two elements
          #   (Stack: [A^(B-1), A^(B-1), +, A])

Шаг 7 (подготовка к последнему циклу)

Стек теперь [A^B, +, A^(B-1), A-1], IP начинается в S, идет на запад и заканчивается в E, идет направо.

          . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .
. . . . . E . . . . . . . . . . . . . .
. . . . . . u 1 ; ; S . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .
          . . . . .

Выполненные инструкции:

;;1 # Explanation
;;  # Delete top two elements
  1 # Push 1

Стек теперь выглядит так [A^B, +, 1], и IP собирается войти в цикл печати, так что мы закончили.

Люк
источник
2
Да, пожалуйста, сделайте объяснение, по крайней мере, сделайте версию чистого куба без сети
Разрушаемый Лимон
Я завершил объяснение
Лука
Кто создал этот язык ... Это похоже на шестигранную агонию, но на кубическую агонию. Кто-то сделает 3D гексагонию.
Волшебный Осьминог Урна
1
@carusocomputing А какой многогранник будет трехмерным гексом, а?
mbomb007
1
Вы могли бы, вероятно, создать язык, который работает на трехмерной структуре тесселлированных тетраэдров.
mbomb007
7

MATL , 46 байт

XH'^'i'='XJ2G:"H'*']xJ&Gq^:"H'+']xJ&G^:"1'+']x

Попробуйте онлайн!

Растягивая границы «разумного пути» здесь, но выражения разделяются.

объяснение

Первое выражение:

XH'^'i'='XJ

XH         % implicitly take input A, save it to clipboard H
'^'        % push literal '^'
i          % take input B
'='        % push literal '='
XJ         % copy '=' to clipboard J, we'll use this twice more so it's worth it

Второе выражение:

2G:"H'*']xJ

2G         % paste the second input (B) again
:"         % do the following B times
  H        % paste A from clipboard H
  '*'      % push literal '*'
]          % end loop
x          % delete the final element (at the moment we have a trailing *)
J          % paste '=' from clipboard J

Третье выражение:

&Gq^:"H'+']xJ

&G         % paste all of the input, ie push A and B
q          % decrement B
^          % power, giving A^(B-1)
:"         % do the following A^(B-1) times 
  H        % paste A from clipboard H
  '+'      % push literal '+'
]          % end loop
x          % delete the final element (at the moment we have a trailing +)
J          % paste '=' from clipboard J

Четвертое выражение:

&G^:"1'+']x

&G         % paste all of the input, ie push A and B
^          % power, giving A^B
:"         % do the following A^B times 
  1        % push 1
  '+'      % push '+'
]          % end loop
x          % delete the final element (at the moment we have a trailing +)
           % (implicit) convert all to string and display
Б. Мехта
источник
6

JavaScript (ES7), 78 байт

Принимает ввод в синтаксисе карри (a)(b). Выводит строку.

a=>b=>a+'^'+b+(g=o=>'='+a+('+*'[+!o]+a).repeat(b-1))()+g(b=a**~-b)+g(b*=a,a=1)

Контрольные примеры

Arnauld
источник
3

Рубин, 52 байта

->a,b{[[a,b]*?^,[a]*b*?*,[a]*a**~-b*?+,[1]*a**b*?+]}
гигабайт
источник
3

05AB1E , 30 байтов

mUð¹'^²J'*¹«²×'+¹«X¹÷ׄ+1X×)€¦

Объяснение:

mU                               # Store a^b in variable X
  ð                              # Push a space character to the stack (will be deleted at the end, but this is needed to keep the character count low)
   ¹'^²J                         # Push the string "a^b" to the stack
        '*¹«                     # Push the string "*a" to the stack
            ²×                   # Repeat b times
              '+¹«               # Push the string "+a" to the stack
                  «X¹÷×          # Repeat a^b / a times
                       „+1       # Push the string "+1" to the stack
                          X×     # Repeat a^b times
                            )    # Wrap stack to array
                             €¦  # Remove the first character from each element in the array

Попробуйте онлайн!

Okx
источник
¹²'^ý ¹'*¹«²<׫¹²m¹÷¹s×S'+ý 1¹²m×S'+ý»почему ты побил меня на 5 байт :(?
Волшебный осьминог Урна
1
Потому что я. : P
Okx
По какой-то причине я увидел ваш ответ и прочитал «80 байт» и подумал про себя «легко победить», затем я создал свой с целью 80… Впрочем, я опять думаю, что мины короче в некоторых вещах и так это твое хаха.
Волшебный Осьминог Урна
¹²«¹²×¹¹²m©¹÷×1®×)vySN"^*++"èý,ближе;). Вы выигрываете только на 1 сейчас;).
Волшебный Осьминог Урна
2

C (gcc) , 156 149 байт

#define q for(x=0;x
x,y;p(a,b,c){printf("%c%d",x?b:61,c),x+=a;}e(n,i){x=1;p(0,0,n);p(0,94,i);y=!!i;q<i;y*=n)p(1,42,n);q<y;)p(n,43,n);q<y;)p(1,43,1);}

-2 байта, если мы можем игнорировать 0 степеней; y=!!iможет статьy=1

Попробуйте онлайн!

Ahemone
источник
2

Java 7, 170 байт

String c(int a,int b){String s="=",r=a+"^"+b+s+a;double i=0,x=Math.pow(a,b);for(;++i<b;r+="*"+a);r+=s+a;for(i=0;++i<x/a;r+="+"+a);r+=s+1;for(i=0;++i<x;r+="+1");return r;}

Ungolfed:

String c(int a, int b){
  String s = "=",
         r = a+"^"+b+s+a;
  double i = 0,
         x = Math.pow(a,b);
  for(; ++i < b; r += "*"+a);
  r += s+a;
  for(i = 0; ++i < x/a; r += "+"+a);
  r += s+1;
  for(i = 0; ++i < x; r += "+1");
  return r;
}

Тестовый код:

Попробуй это здесь.

class M{
  static String c(int a,int b){String s="=",r=a+"^"+b+s+a;double i=0,x=Math.pow(a,b);for(;++i<b;r+="*"+a);r+=s+a;for(i=0;++i<x/a;r+="+"+a);r+=s+1;for(i=0;++i<x;r+="+1");return r;}

  public static void main(String[] a){
    System.out.println(c(2,2));
    System.out.println(c(2,3));
    System.out.println(c(2,4));
    System.out.println(c(2,5));
    System.out.println(c(3,2));
    System.out.println(c(3,3));
    System.out.println(c(3,4));
    System.out.println(c(3,5));
    System.out.println(c(4,2));
    System.out.println(c(4,3));
    System.out.println(c(10,2));
    System.out.println(c(13,2));
  }
}

Выход:

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
Кевин Круйссен
источник
1

Пип , 38 35 34 байта

33 байта кода, +1 для -nфлага.

Ya**b[gJ'^aRLbJ'*aRLy/aJ'+1XyJ'+]

Принимает A и B в качестве аргументов командной строки; печатает одно выражение в строке. Попробуйте онлайн!

объяснение

Ya**bэто код установки: вставьте a**bв yпеременную. После этого у нас есть список (в []), содержащий наши четыре выражения:

  • gJ'^: возьмите полный gсписок ar (здесь список, содержащий aи b) и Jдобавьте его^
  • aRLbJ'*: используйте Repeat List для создания списка с bкопиями a, а затем Jвключите его*
  • aRLy/aJ'+: используйте RLдля создания списка с y/a(то есть a**(b-1)) копиями a, а затем Jвключите его+
  • 1XyJ'+: 1, умноженный на строку y, Joined on+

Список печатается с новой строкой в ​​качестве разделителя благодаря -nфлагу.

DLosc
источник
1

Javascript 115 113 104 байтов

Спасибо @Neil и @TuukkaX за игру в гольф по одному байту каждый, а @ETHproductions и Люку за игру в гольф по 9 байтов.

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)]

Попробуйте онлайн

fənɛtɪk
источник
Вы можете использовать Карринг синтаксис: a=>b=>.
Yytsi
Почему нет '=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`=`
ETHproductions
Если вы интерпретируете «Четыре выражения могут быть выведены любым разумным способом, если они в порядке и четко различимы». чтобы также включить возврат массива с четырьмя различными элементами, вам даже не нужно .join()...
Лука
1

Желе , 29 байт

*⁹’,¤;@
,`;1ẋ"ç
,W;çj"“^*++”Y

Попробуйте онлайн!

Как?

*⁹’,¤;@ - Link 1, get list lengths: a, b
    ¤   - nilad followed by link(s) as a nilad
 ⁹      - right: b
  ’     - decrement: b-1
   ,    - pair with right: [b-1, b]
*       - exponentiate: [a^(b-1), a^b]
     ;@ - concatenate with reversed arguments: [b, a^(b-1), a^b]

,`;1ẋ"ç - Link 2, create lists: a, b
 `      - monad from dyad by repeating argument
,       - pair: [a, a]
  ;1    - concatenate 1: [a, a, 1]
      ç - last link (1) as a dyad: [b, a^(b-1), a^b]
     "  - zip with the dyad...
    ẋ   -     repeat list:  [[a, a, ..., a], [a, a, ..., a], [1, 1, ..., 1]]
                                <- b ->       <- a^(b-1) ->     <- a^b ->

,W;çj"“^*++”Y - Main link: a, b
,             - pair: [a, b]
 W            - wrap: [[a, b]]
   ç          - last link (2) as a dyad: [[a, a, ..., a], [a, a, ..., a], [1, 1, ..., 1]]
  ;           - concatenate [[a, b], [a, a, ..., a], [a, a, ..., a], [1, 1, ..., 1]]
      “^*++”  - list of characters: ['^', '*', '+', '+']
     "        - zip with the dyad...
    j         -     join: ["a^b", "a*a*...*a", "a+a+...+a", "1+1+...+1"]
            Y - join with line feeds
              - implicit print
Джонатан Аллан
источник
1

тинилисп репл , 178 186 байт

(load library
(d W(q((_ N S #)(i(e # 1)(c N _)(W(c S(c N _))N S(s # 1
(d ^(q((x y)(i y(*(^ x(s y 1))x)1
(d X(q((A B)(list(list A(q ^)B)(W()A(q *)B)(W()A(q +)(^ A(s B 1)))(W()1(q +)(^ A B

Использование repl сохраняет 8 байтов в подразумеваемых закрывающих скобках на концах строк. Определяет функцию, Xкоторая принимает два числа и возвращает список выражений. Каждое выражение заключено в скобки с пробелами вокруг операторов (фактически, это список чисел и символов операторов):

((2 ^ 3) (2 * 2 * 2) (2 + 2 + 2 + 2) (1 + 1 + 1 + 1 + 1 + 1 + 1 + 1))

Надеюсь, этот формат вывода является приемлемым. Попробуйте онлайн! (с несколькими тестами).

объяснение

(load library)

Нам нужны две функции из стандартной библиотеки: listи *.

(d W(q((_ N S #)(i(e # 1)(c N _)(W(c S(c N _))N S(s # 1))))))

Определите функцию 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Случай не работал в предыдущей версии.)

(d ^(q((x y)(i y(*(^ x(s y 1))x)1))))

К сожалению, библиотека не имеет функции возведения в степень в настоящее время, поэтому мы должны определить ее. ^берет xи y. Если yэто правда (ненулевой), мы рекурсивно с y-1( (s y 1)) и умножаем результат на x. В противном случае yноль и мы вернемся 1.

(Примечание: эта функция не использует правильную рекурсию хвоста. Я предполагаю, что показатели будут достаточно малы, чтобы это не имело значения. Некоторые эксперименты с TIO показали максимальный показатель 325, который, я бы сказал, должен быть достаточным для этого вопроса. Если ФП не согласен, я его поменяю.)

(d X(q((A B)(list(list A(q ^)B)(W()A(q *)B)(W()A(q +)(^ A(s B 1)))(W()1(q +)(^ A B))))))

Наконец, функция мы заинтересованы в, 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, переплетающихся с буквальным +.
DLosc
источник
1

Brainfuck , 372 байта

,.>++++++++[>++++++++++++>++++++++>+++++<<<-]>--.<,.>>---.>++>++++++++[<<<<------>>>>-]<<<<-[<.>>>>.>>+<<<<<-]<.>>>.<<++++++++[<------>-]<[>+>>>>+<<<<<-]>>>>>>>+<[->[-<<[->>>+>+<<<<]>>>>[-<<<<+>>>>]<<]>[-<+>]<<]>[<+>>+<-]>[<+>-]<<<<<<<<++++++++[>++++++<-]>>>>+>>-[<<<<<.>>>.>>-]<<<<<.>>.>>>>[<+>-]<<[->[->+>+<<]>>[-<<+>>]<<<]>>>++++++++[<<<++++++>>>-]<<<+>>-[<<.<.>>>-]<<.

Попробуйте онлайн!

Заметки

  1. Два входа должны быть выбраны таким образом, чтобы A**Bне превышать 255. Это потому, что brainfuck может хранить значения только одного байта.
  2. Если один вход больше 9, используйте следующий символ ASCII. 10становится :, 11становится ;и т. д. Это потому, что Brainfuck может принимать входные данные только одного байта.

объяснение

Вот мой несколько прокомментированный код. Я расскажу об этом позже.

,.                      print A
> +++++ +++
[
    > +++++ +++++ ++    set up 96 (for ^ sign)
    > +++++ +++         set up 64 (for = sign)
    > +++++             set up 40 (for plus and * sign)
    <<< -
]
> --.                   print ^
< ,.                    print B
>
> ---.                  print =
> ++                    prepare *

> +++++ +++             convert B from char code
[
    <<<< ----- -
    >>>> -
]

<<<< -                  print loop "A*"
[
    < .
    >>>> .
    >> +
    <<<<< -
]
< .                     print final A
>>> .                   print =


<< +++++ +++            convert A from char code
[
    < ----- -
    > -
]

<
[                       duplicate A
    > +
    >>>> +
    <<<<< -
]

>>>>>                   exponentiation (A**(B minus 1))
>>+<[->[-<<[->>>+>+<<<<]>>>>[-<<<<+>>>>]<<]>[-<+>]<<]<

>>
[                       duplicate
    < +
    >> +
    < -
]

>[<+>-]                 move

<<<<< <<< +++++ +++     convert A to char code
[
    > +++++ +
    < -
]

>>>> +                  convert * to plus sign
>> -                    print loop "A plus"
[
    <<<< < .
    >>> .
    >> -
]
<<<<< .                 print final A
>> .                    print =

>>>>                    move
[
    < +
    > -
]

                        multiply A**(B minus 1) by A
<<[->[->+>+<<]>>[-<<+>>]<<<]        

>>> +++++ +++           generate the char code for 1 (49)
[                           generate 8*6 = 48
    <<< +++++ +
    >>> -
]
<<< +                       add one

>> -                    print loop "1 plus"
[
    << .
    < .
    >>> -
]
<< .                    print final 1
Люк
источник
0

Pyth, 32 31 байт

AQjMC,"^*++"[Q*]GH*^GtH]G*]1^GH

Принимает вход как [2,10], выводит как["2^10", "2*2*2*2*2*2*2*2*2*2", "2+2+...

Объяснение:

Q = eval(input())                     #  
G, H = Q                              #  AQ
operators = "^*++"                    #        "^*++"
operands = [Q,                        #              [Q
  [G]*H,                              #                *]GH
  G**(H-1)*[G]                        #                    *^GtH]G
  [1]*G**H                            #                           *]1^GH
]                                     #
map( lambda d: join(*d),              #    jM
     zip(operators, operands)         #      C,...
)                                     #

Попробуй это здесь.

busukxuan
источник
0

Perl , 81 байт

78 байт кода + -nфлаг (считается как 3 байта, поскольку код содержит $').

$,=$/;print s/ /^/r,map{/\D/;join$&,($`)x$'}"$`*$'","$`+".$`**~-$',"1+".$`**$'

Попробуйте онлайн!

папа
источник
0

R, 147 байт

w=switch;function(A,B)for(s in letters[1:4]){cat(rep(w(s,d=1,a=c(A,B),b=,c=A),w(s,a=1,b=B,c=A^B/A,d=A^B)),sep=w(s,a="^",b="*",d=,c="+"));cat("\n")}

Анонимная функция, которая выводит требуемые, ну, выходы, построчно. Это решение широко использует switchфункцию.

switchФункция принимает выражение (здесь s) , который принимает значение числа или строки символов (см ?switch), за которым следует alernatives , соответствующее s. Если альтернатива отсутствует (например switch(s, a=, b= "PPCG"), оценивается следующая не пропущенная альтернатива (в примере, s="a"выходные данные "PPCG").

Эти repфункции повторы (повторность), на самом деле его первый аргумент число раз указаны во втором аргументе.

cat, для завершения, объединения и печати объектов с разделителем, который можно выбрать с помощью sep =аргумента. Вторая catфункция здесь для перевода строки.

Ungolfed:

f=function(A,B)
    for(s in letters[1:4]){
        cat(
            rep(switch(s, d = 1, a = c(A,B), b =, c = A),
            switch(s, a = 1, b = B, c = A^B/A, d = A^B)),
        sep=switch(s,a = "^", b = "*", d =, c = "+"))
    cat("\n")
}
Фредерик
источник
0

Кардинал 202 байта

%:.~:#"^"."=">v
x            "~
             *.
     >~=088v "~
     v88+88< ?
     8       -
     8      x#<
     v     < 0
     >   t / <
v~.~ <#"="?<
-
#?"+"^t
0
V
#?"="  >"1"-v
/ {   <^"+"?<
>     ^

Будет работать только для чисел, где вычисленное значение <256 из-за ограничений в значениях, которые могут храниться указателями в Cardinal

Попробуйте онлайн

Объяснение:

Шаг 1

%:.~:#"^"."="

Получает два числа a и b в качестве входных данных и выводит как «a ^ b =»
Передает указатель с активным значением a и неактивным значением b

Шаг 2

        >v
        "~
        *.
>~=088v "~
v88+88< ?
8       -
8      x#<
v     < 0
>   t / <

Получает указатель с активным значением a и неактивным значением b, печатая "a" + ("* a") (b-1) раз
Передает указатель с активным значением a ^ (b-1) на следующую часть

Шаг 3

v~.~ <#"="?<
-
#?"+"^t
0
V
#?"="  
/ {   <
>     ^ 

Получает указатель со значением ^ (b-1) и выводит "= a" + ("+ a"), повторяется (a ^ (b-1) -1) раза + "="
Передает указатель со значением a ^ b к следующей части

Шаг 4

>"1"-v
^"+"?<

Получает указатель со значением a ^ b и печатает "1" + ("+ 1"), повторенные a ^ b-1 раз

fənɛtɪk
источник
0

Сетчатка, 89 88 байт

*`,
^
+`(1+),1
$1*$1,
:`.1+.$

{`^[1+]+
a$&z
+`a(.+)z.1
$1+a$1z*
)`.a.+z.

:`a

+`11
1+1

Ввод - разделенные запятыми унарные числа.

Попробуйте онлайн!

CalculatorFeline
источник