べき乗を展開


31

1よりも大きい2つの整数AおよびBが与えられた場合、次の順序で4つの数式を出力します。

  1. 単純な表現A ^ B(Aの累乗B)。たとえば、A = 2およびB = 3の場合2^3

  2. Aの繰り返しの乗算に関するA ^ Bの展開2*2*2

  3. Aの繰り返しの追加に関するA ^ Bの展開2+2+2+2

  4. 1の繰り返しの追加に関するA ^ Bの展開1+1+1+1+1+1+1+1

4つの式は、順序が明確で明確である限り、任意の合理的な方法で出力できます。たとえば、リストに追加したり、別の行に印刷したりできます

2^3
2*2*2
2+2+2+2
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

A = 2およびB = 3の場合、同等に有効な出力になります。

あなたがの代替記号を使用することができ^*および+、しかし、場合にのみ、新しいシンボルが(例えば、あなたの言語のためのより多くの慣用されている**のではなく、^Pythonで)。

A ^ Bが言語のデフォルトの整数型をオーバーフローさせないように、AとBが十分に小さいと仮定することができます(その型が少なくとも255の合理的な最大値を持っている場合)。

バイト単位の最短コードが優先されます。

テストケース

1行に1つの出力。最初の式は常に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ええ、あなたは私が見たすべてのタイプミスを手に入れました。良くやった!何も得られません。
R.カップ

2
@JonathanAllanに感謝します。R. Kapは私の3つすべてについて心配していました
Calvin's Hobbies

まあ、(幸いなことに)=の左側にの位置が間違っていませんでした3
R.カップ

5
次回「表記Knuthのアップ矢印を展開する」行わないでください
マシュー盧

1
STDINからの入力を単一の文字列として読み取る場合2^3、有効な入力形式はありますか?または、スペース/コンマ/改行で区切られている必要がありますか?
マーティンエンダー

回答:


11

Pythonの3.688の 74バイト

Dadaのおかげで-2バイト(使用~
エルワンのおかげで-5バイト(Python 3.6のf-stringsを使用)

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

オンラインで誰でもいいですか?

どうやって?

これは、2つの整数の入力取る無名関数であるabよりそれぞれ大きいが0(仕様のみよりも大きいもののためであっても1)。

Python 3.6では、新しい機能、つまりフォーマットされた文字列リテラルまたは「f-strings」を使用できます。これらは、実行時に評価された文字列の構築を可能にします。リードf(またはF)例えば、A構造体を作成しますf"blah"f'blah'。f-stringの中にある{...}、中括弧の間にあるものは、評価される式です。

このようにf"{a}^{b}={a}{f'*{a}'*~-b}={a}{f'+{a}'*~-a**~-b}=1"評価するの各々abaf'*{a}'*~-ba、及びf'+{a}'*~-a**~-b}維持表現として^==、と=1一緒に連結されますすべてが文字列として。

表現は、の表現に評価し、それぞれ。abab

順番にF-文字列に評価し、これらの式の内部、また、ある大手で、先頭にそれぞれf'*{a}'f'+{a}'a'*''+'

との部分に必要な数のasと操作を作成するには、sが乗算され、sが加算されることに注意してください。各ケースには、s の数より1つ少ない演算子記号が必要です。そのため、fストリングを(を使用して)演算子の数だけ繰り返し、それぞれの前に単一の。であり、です。*+b aa**(b-1) aaf'*{a}f'+{a}'*a(b-1)~-b(a**(b-1))-1~-a**~-b

同じことがのために行われる1よ使用して(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
あなたのpython 3.6からFの文字列を使用する場合は、5バイトを獲得することができます: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バイト

ETHProductionsのおかげで14バイト節約

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

オンラインでお試しください!

ここで試してみてください

説明

コードは2つのループを持つ8つのステップで構成されます。コードを部分ごとに説明します。

ステップ1(A ^ B)

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

これは、最初のステップに関係のない部分が削除されたキューブです。疑問符は、そのパスをより明確にするために、IPがアクセスするno-opを示しています。

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要素)かかり:PQおよびRPは繰り返しの量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は疑問符の前にループを離れることができないため、最初の4つの命令は常に実行されることに注意してください。

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はループに入る前に4つの命令に遭遇します。文字コードが再び削除されるため、この部分に入ったときとまったく同じスタックでループに到達します。

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

ループ内では、上記の説明が当てはまります。

ステップ4(IPの区別)

上記のループを複数回使用し、それらすべてがIPを同じスポットで終了させるため、複数の実行を区別する必要があります。最初に、セパレーターを区別できます(最初の実行にはがあり*、2 番目と3 番目の実行には+セパレーターがあります)。繰り返される数値の値を確認することで、実行2と実行3を区別できます。それが1つの場合、プログラムは終了するはずです。

最初の比較

キューブ上では次のようになります。IPはSから始まり、北を指します。スタックにはが含まれます[..., * or +, A or 1, 0]。番号1は、これが最初のループ(北を指す)の場合にIPが終わる場所を示し、番号2は、これが2番目(または3番目)のループ(東を指す)の場合に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]です。ご覧のとおり、2番目のケースのスタックにはまだ不明なものがあるため、別の比較を行う必要があります。

2回目の比較

IPは手順5を経ているため、スタックは次のようになります[A^(B-1) or nothing, A or 1, +, +, 0]。最初の要素がのnothing場合、2番目の要素は1であり、逆も同様です。キューブは次のようになります。IPはSから始まり、東を指します。これが2番目のループである場合、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で始まり、西を指し、stackで始まります[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
はい、説明をしてください。少なくとも、無料のキューブネットバージョンを作成してください
Destructible Lemon

説明を完了しました
ルーク

誰がこの言語を作ったか...それは六角形だが立方体のようなものだ。誰かが3Dの六角形を作ります。
魔法のタコUr

1
@carusocomputingそして、どの多面体が3Dヘックスになるのでしょうか?
mbomb007

1
多分、テッセレーションされた四面体の3D構造で実行される言語を作成できます。
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

2番目の式:

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

3番目の式:

&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

4番目の式:

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

テストケース


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バイト倒した:(?
マジックタコUr

1
なぜなら私は。:P
Okx

なんらかの理由であなたの答えを見て「80バイト」を読んで「勝ちやすい」と思ったので、80を目標に鉱山を作成しました。あなたの母です。
魔法のタコUr

¹²«¹²×¹¹²m©¹÷×1®×)vySN"^*++"èý,近いです;)。あなたは今1勝っているだけです;)。
魔法のタコUr


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バイトのコード、-nフラグの場合は+1 。

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

コマンドライン引数としてAとBを取ります。1行に1つの式を出力します。オンラインでお試しください!

説明

Ya**bセットアップコードです。変数にヤンクa**byます。その後[]、4つの式を含むリスト()があります。

  • gJ'^:完全なar gリスト(ここではaand を含むリストb)をJ取得し、それをoinします^
  • aRLbJ'*Repeat Listを使用して、のbコピーを含むリストを作成しa、次にそれをJoinします*
  • aRLy/aJ'+:使用RLしてリストを作成するy/a(すなわちa**(b-1)の)コピーa、その後、Jその上にOIN+
  • 1XyJ'+1、文字列乗算yJoined+

リストは、-nフラグのおかげで区切り文字として改行で印刷されます。


1

Javascriptを115 113 104バイト

1バイトずつゴルフをする@Neilと@ TuukkaX、9バイトをゴルフする@ETHproductionsとLukeに感謝

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
ニール

あなたがさらにバイトを保存することができます.joina=>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

「4つの式は、順序が明確で明確である限り、合理的な方法で出力される可能性があります」と解釈した場合 また、四つの異なる要素を持つ配列を返す含めるには、あなたも必要ありません.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

tinylisp repl、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バイトを節約できます。X2つの数値を受け取り、式のリストを返す関数を定義します。各式は括弧で囲まれ、演算子の周りにスペースがあります(実際には、数字と演算子記号のリストです)。

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

この出力形式が受け入れられることを願っています。オンラインでお試しください!(いくつかのテストケース付き)。

説明

(load library)

標準ライブラリの2つの関数:listとが必要*です。

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

Waccumulator _、number N、symbol S、およびcount を取る関数(「weave」の略)を定義します#。この関数を使用して、ほとんどの式を生成(W () 2 (q +) 3)(2 + 2 + 2)ます。たとえば、結果はになります。

カウントが1の場合、(e # 1)アキュムレータの前に番号を付けて(c N _)それを返します。それ以外の場合、再帰:

  • 新しいアキュムレータは(c S(c N _))次のとおりです。前のアキュムレータの前にある記号と数字。
  • NS同じです。
  • 新しいカウントは(s # 1)次のとおりです:count-1。

アキュムレータのイディオムは、適切なテール再帰を達成し、再帰深度エラーを防ぐために必要です。(この変更により、バイトカウントが+8になります。13^2以前のバージョンでは機能しませんでした。)

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

残念ながら、現時点ではライブラリにはべき乗関数がありませんので、定義する必要があります。^取りxyyが真(非ゼロ)の場合、y-1(s y 1))で再帰し、結果にを掛けxます。それ以外の場合yはゼロであり、を返し1ます。

(注:この関数は適切な末尾再帰を使用しませ。指数は問題にならないほど小さいと仮定します。TIOでの実験では最大指数325を示しましたが、この質問には十分であると主張します。 OPが同意しない場合、変更します。)

(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取りAB、リターンを4つの項目のリストを:

  • (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. 2つの入力は、をA**B超えないように選択する必要があります255。これは、brainfuckが1バイトの値しか保存できないためです。
  2. 1つの入力が9より大きい場合、次のASCII文字を使用します。10となり:11となり;Brainfuckは1バイトのみの入力を取ることができるので、これがあるなど。

説明

ここに私のコメント付きのコードがあります。これについては後で説明します。

,.                      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"outputs "PPCG")。

rep関数反復(反復、実際には)最初の引数回数は、二番目の引数で示さ。

cat、オブジェクトを終了、連結、および印刷するには、sep =引数で選択できるセパレータを使用します。2番目の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

Cardinal 202バイト

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

Cardinalのポインターで保持できる値の制限により、計算値が256未満の数値でのみ機能します

オンラインで試す

説明:

ステップ1

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

2つの数値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
#?"="  
/ {   <
>     ^ 

a ^(b-1)の値を持つポインターを受け取り、「= a」+( "+ a")repeated(a ^(b-1)-1)times + "="
値a ^ bのポインターを渡します次の部分へ

ステップ4

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

値a ^ bのポインターを受け取り、a ^ b-1回繰り返される「1」+(「+ 1」)を出力します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.