チャレンジ:
ソーシャルネットワークには、次のような馬鹿げたパズルが流れています。
8 + 2 = 16106
5 + 4 = 2091
9 + 6 = ?
2つの正の整数与えられた場合、その関数又は演算子を実装x
し、y
そのようなことはx > y > 0
、のように正しい答えを与える整数答えの桁の数字である、x * y
の数字が続くx + y
の数字が続きますx - y
。とても簡単です。
ルール:
- 標準の抜け穴は許可されていません。
- これはコードゴルフなので、バイト単位の最短コードが優先されます。
- 入力データの検証がされていない必要。このプログラムは、無効な入力が与えられるとクラッシュするか、ゴミを返す可能性があります。
- 数値関数と演算子(整数と浮動小数点、数学ライブラリ関数、および数値を受け取って返す他の関数を含む)を使用できます。
- 必要に応じて、数値の桁数を返す関数を使用できます。
- コード内の任意の場所で文字列または任意の種類の連結を使用することはできません。
- 結果は、言語で適用されるいずれかで返されるか、スタックにプッシュされる場合があります。結果は文字列ではなく整数でなければなりません。
サンプルコード:
次のコードは、という名前の2項演算子を作成しますX
。
X←{(⍺-⍵)+((⍺+⍵)×10 * 1 +⌊10⍟⍺-⍵)+⍺×⍵×10 *(2 +⌊10⍟⍺+⍵)+⌊10⍟⍺- ⍵}
説明:
APLでは、右から左に評価します。
⍺ and ⍵
それぞれ左オペランドと右オペランドです⌊10⍟⍺-⍵
読み取り:floor of log10(⍺-⍵)
。最初に減算を実行してから対数を実行し、次にフロアを実行します。右から左へ。log10は、桁数をカウントするために実行され⍺-⍵
ます(その後、1を合計する必要があります)。⍺×⍵×10*(...)
読み取り:10 to the (...)th power, multiplied by ⍵, multiplied by ⍺
したがって、
⍺×⍵×10*(2+⌊10⍟⍺+⍵)+⌊10⍟⍺-⍵
積は、合計の桁数と差の合計だけ左にシフトされます。10の累乗で乗算すると、整数が左にシフトします。((⍺+⍵)×10*1+⌊10⍟⍺-⍵)
は、差の桁数だけ左にシフトした合計です。(⍺-⍵)
違いです。ここではシフトは必要ありません。X←{...}
APLで演算子を定義する方法です。
例:
8 X 2
16106
5 X 4
2091
9 X 6
54153
GNU dc:
次のコードは、という名前のマクロを作成しますa
。
[sysx10lxly-dseZdsclxly+dsd+Z1+^lxly**10lc^ld*+le+]sa
説明:
sx
sy
スタックから要素をポップx
しy
、それぞれレジスタとに保存します。lx
そしてly
レジスタから要素をロードx
し、y
それぞれ、スタックにプッシュ。d
スタックの最後の要素を複製します。^
2つの数値のべき乗を計算します。Z
数値をポップし、その桁数を返します。これはdc
、対数関数がないためです。[...]sa
registerにマクロを保存しますa
。la
それをロードします。x
スタックの最上部でマクロを実行します。
例:
8 2 laxn
16106
5 4 laxn
2091
9 6 laxn
54153