Розгорнути експоненцію


31

З урахуванням двох цілих чисел, більших за одне, A і B, виведіть чотири математичні вирази в цьому порядку:

  1. Простий вираз A ^ B (A до сили B). наприклад, якщо A = 2 і B = 3 2^3,.

  2. Розширення A ^ B з точки зору багаторазового множення А. напр 2*2*2.

  3. Розширення A ^ B з точки зору повторних доповнень А. напр 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 байт завдяки Ервану (використовуйте 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-string". Вони дозволяють будувати рядки з оцінкою часу виконання. Провідний 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як рядки, всі з яких отримує зчеплених разом.

The aІ bобчислення виразів уявлень aі bвідповідно.

f'*{a}'І , f'+{a}'в свою чергу, також діафрагменні рядки всередині цих виразів, які оцінюють в aс провідним '*'і провідним '+'відповідно

Щоб створити необхідну кількість as та операцій для *та +порцій, зауважте, що їх буде b aпомножено та a**(b-1) as додано разом. Тоді в кожному випадку потрібен один знак менше оператора, ніж число 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 так, я планував використовувати 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\

Розширено:

          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 ...

Впровадження

Ось знову куб, з невідповідними частинами вилучені. ІС починається з 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 немає енергооператора, тому нам потрібна ще одна петля. Однак нам потрібно спочатку очистити стек, який зараз міститься[B, A, *, +, -1] .

Очищення

Ось знову куб. Як завжди, IP починається з S (вказує на північ) і закінчується на E, вказуючи на захід.

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

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

Обчислення A ^ (B-1)

Ще один цикл, який працює приблизно так само, як і цикл друку, але трохи компактніший. IP починається з S, вказуючи на захід, з стека [B, A, *]. ІС виходить у 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
Та будь ласка, пояснення, по крайней мере , зробити ungolfed куб чисту версію
Destructible Лимонний

Я завершив пояснення
Лука

Хто створив цю мову ... Це як шістнадцяткова агонія, але куба-агонія. Хтось робить 3D-шістнадцяткову агонію.
Чарівний восьминога Урна

1
@carusocomputing А який багатогранник був би шестигранним 3D, гм?
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 байт

Здійснює введення в синтаксис currying (a)(b). Виводить рядок.

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

Тестові справи


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

Спробуйте в Інтернеті!


¹²'^ý ¹'*¹«²<׫¹²m¹÷¹s×S'+ý 1¹²m×S'+ý», чому ти побив мене на 5 байт :(?
Чарівний восьминога Урна

1
Тому що я є. : P
Okx

Чомусь я побачив вашу відповідь і прочитав "80 байт" і подумав собі: "легко перемогти", потім створив міну з метою 80 на увазі ... Потім я знову думаю, що міни у деяких речах коротше, і так твій ха-ха.
Чарівний восьминога Урна

¹²«¹²×¹¹²m©¹÷×1®×)vySN"^*++"èý,ближче;). Ви виграєте лише 1;
Чарівний восьминога Урна


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;}

Безголовки:

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список (тут список, що містить aі b), і Jдодайте його^
  • aRLbJ'*: використовуйте Repeat List для створення списку з bкопіями a, а потім Jувімкніть його*
  • aRLy/aJ'+: використовувати RLдля створення списку з y/a(тобто a**(b-1)) копіями a, а потім Jувімкнути його+
  • 1XyJ'+: 1, рядок, помножений на y, Jзмащений на+

Список друкується новим рядком як роздільник завдяки -nпрапору.


1

Javascript 115 113 104 байт

Дякуємо @Neil та @TuukkaX за те, що вони займаються гольфом по одному байту та @ETHproductions та Luke за гольф на 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)]

Спробуйте в Інтернеті


Ви можете використовувати каррінг синтаксис: 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

Використання відбиття зберігає 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(скорочення "плетіння"), яка приймає акумулятор _, число N, символ Sта кількість #. Ми будемо використовувати цю функцію для створення більшості наших виразів: наприклад, (W () 2 (q +) 3)це призведе до(2 + 2 + 2) .

Якщо кількість дорівнює 1 (e # 1), то підрахуйте число до передньої частини акумулятора (c N _)і поверніть його. В іншому випадку повторіть:

  • Новий акумулятор є (c S(c N _)) : символ і число, що передаються на передню частину попереднього акумулятора;
  • Nі Sоднакові;
  • Новий підрахунок (s # 1): кількість - 1.

Ідіома акумулятора потрібна для досягнення належної рекурсії хвоста , запобігаючи помилці глибини рекурсії. (Ця зміна несе відповідальність за кількість байтів +8. 13^2Випадок не працював у попередній версії.)

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

На жаль, бібліотека наразі не має функції експоненції, тому ми повинні визначити її. ^бере xі y. Якщо yє truthy (ненульовий), ми повторюємо з 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, переплетених з буквальним +.

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,...
)                                     #

Спробуйте тут.



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" ).

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

cat, для закінчення, об'єднання та друку об'єктів, з роздільником, який можна вибрати sep =аргументом. Секундаcat функція тут для розриву рядків.

Безголовки:

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 разів


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.