2つの数値の合計、積、差を結合する演算子


28

チャレンジ:

ソーシャルネットワークには、次のような馬鹿げたパズルが流れています。

8 + 2 = 16106
5 + 4 = 2091
9 + 6 = ?

2つの正の整数与えられた場合、その関数又は演算子を実装xし、yそのようなことはx > y > 0、のように正しい答えを与える整数答えの桁の数字である、x * yの数字が続くx + yの数字が続きますx - y。とても簡単です。

ルール:

  • 標準の抜け穴は許可されていません。
  • これはので、バイト単位の最短コードが優先されます。
  • 入力データの検証がされていない必要。このプログラムは、無効な入力が与えられるとクラッシュするか、ゴミを返す可能性があります。
  • 数値関数と演算子(整数と浮動小数点、数学ライブラリ関数、および数値を受け取って返す他の関数を含む)を使用できます。
  • 必要に応じて、数値の桁数を返す関数を使用できます。
  • コード内の任意の場所で文字列または任意の種類の連結を使用することはできません
  • 結果は、言語で適用されるいずれかで返されるか、スタックにプッシュされる場合があります。結果は文字列ではなく整数でなければなりません。

サンプルコード:

Dyalog APL

次のコードは、という名前の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

説明:

  • sxsyスタックから要素をポップxy、それぞれレジスタとに保存します。

  • lxそしてlyレジスタから要素をロードxし、yそれぞれ、スタックにプッシュ。

  • d スタックの最後の要素を複製します。

  • ^ 2つの数値のべき乗を計算します。

  • Z数値をポップし、その桁数を返します。これはdc、対数関数がないためです。

  • [...]saregisterにマクロを保存しますalaそれをロードします。xスタックの最上部でマクロを実行します。

例:

8 2 laxn
16106
5 4 laxn
2091
9 6 laxn
54153

整数から文字列への変換は無効だと思いますか?
アンソニーファム

2
私たちはこのような挑戦をしたことがあると思いますが、どの用語がだまされやすいのかわかりません。
-xnor

2
@AnthonyPham「コード内のどこでも文字列または任意の種類の連結を使用することはできません。」
ASCIIのみ

1
入力として整数のペアを使用できますか?
コナーオブライエン

1
関数の代わりに完全なプログラムを作成できますか?
エリックアウトゴルファー

回答:


10

JavaScript(ES7)、63 61 59バイト

Neilのおかげで4バイト節約できました。

(a,b)=>[a*b,a+b,a-b].reduce((p,c)=>p*10**-~Math.log10(c)+c)

<input id=a type=number oninput="c.innerText=((a,b)=>[a*b,a+b,a-b].reduce((p,c)=>p*10**-~Math.log10(c)+c))(+a.value,+b.value)">
<input id=b type=number oninput="c.innerText=((a,b)=>[a*b,a+b,a-b].reduce((p,c)=>p*10**-!Math.log10(c)+c))(+a.value,+b.value)">
<p id=c>


を使用して数バイトを保存します10**-~Math.log10(c)。(ただしreduce、もちろん+1は使用します。)
ニール

"ES7"ああ、コーディングが大好きだから...別のコードを作っているのですか?
フェザークラウン

@Feathercrownええ、しかし「Java 9」を聞くよりも本当に悪いですか?それに加えて便利なようなものがあるasync/ awaitと指数演算子**
ASCIIのみの

@ASCIIのみ**は本当に便利です、私は同意します。それはES6にあったはずです。
フェザークラウン


6

バッシュ、66

  • @chepnerのおかげで2バイト節約されました。
f()(s=$[$1+$2]
d=$[$1-$2]
echo $[($1*$2*10**${#s}+s)*10**${#d}+d])

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


変数(s、d、および定義していない乗算用の他の変数)を隣り合わせに配置し、算術式として評価する場合、これをほぼ2倍に短縮することができます。
マキシムミハイロフ

3
@MaxLawnboyはい、それは禁止された文字列連結のように思えますが。
デジタル外傷

1
識別子名は、内部に$[...]明示的に使われていないパラメータ展開の対象となっている$(例えば、d代わりに$d2つの文字を保存し、)。
chepner

@chepnerうん-ありがとう-私はそれらを見逃していた。
デジタル外傷

別の2つが見つかりました。((s=$1+$2,d=$1-$2))2つの変数を初期化するために使用します。
-chepner





3

Perl 6の 81の61  58バイト

->\x,\y{($/=($/=x- y)+(x+y)*({10**$++}...*>$/).tail)+x*y*({10**$++}...*>$/).tail}

それを試してみてください

->\x,\y{(x*y,x+y,x- y).reduce:{$^a*10**Int(1+log10($^b))+$b}}

それを試してみてください

->\x,\y{[[&({$^a*10**Int(1+$^b.log10)+$b})]] x*y,x+y,x- y}

それを試してみてください


Perl 6を知らなかったので、それがx-y有効な識別子であることを知って少し驚きました。
ニール

3

ゼリー、27バイト

+,ạ,.1Fl⁵Ḟ‘€Ṛ+\⁵*
ạ,+,×Fæ.ç

で呼び出し可能な二項リンク/関数を定義しçます。2つの整数を入力として受け取り、整数を返します。絶対差を使用してx <yまたはx >y を取ることができるという追加のボーナスがあります。

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

説明:

+,ạ,.1Fl⁵Ḟ‘€Ṛ+\⁵* -- Create link which computes what order of magnitude
                        to multiply the difference, sum, and product by
ạ,+,×Fæ.ç         -- Main link, applies this using dot product

詳細:

+,ạ,.1Fl⁵Ḟ‘€Ṛ+\⁵* -- Create dyadic like which does the following:
       l⁵Ḟ‘       -- Create operation which computes number of digits
                       (log base 10 (⁵ is the literal 10), floored, incremented)
           €      -- Apply this to each element in
+,ạ,.1F           -- ... the list [sum,difference,.1]
            R     -- Reverse the list
             +\   -- Add up first n elements to get list.
               ⁵* -- Raise 10 (⁵ is literal 10) to the power of each element

ạ,+,×Fæ.ç         -- Main link, applies above link
ạ,+,×F            -- The list [difference, sum, product]
      æ.          -- Dot product (multiply corresponding elements) with
        ç         -- The above link.

2

PHP、79 75バイト

2つのバージョン:

[,$a,$b]=$argv;echo(10**strlen($s=$a+$b)*$a*$b+$s)*10**strlen($d=$a-$b)+$d;
[,$a,$b]=$argv;echo(10**strlen($a+$b)*$a*$b+$a+$b)*10**strlen($a-$b)+$a-$b;

コマンドライン引数から入力を受け取ります。と走る-rます。

strlen数字を
文字列として使用しますが、「桁数を返す関数」としての資格があると思います。そうでない場合はお知らせください。


「あなたはあなたのコードのどこでも文字列やどんな種類の連結も使用することを許されていません。」ですので、私strlenは有効だとは思いません。
numbermaniac

@numbermaniac OPに決定させてください。Imoの制限は、3 つの結果を次々に印刷するのではなく、ソリューションが1つの結果を作成するように強制することでした。それを超えるものはすべてピッキングです。
タイタス

2

C(gcc)、70バイト

#define _ for(c=1;a+b>=(c*=10););d=c*d+a-(b=-b);
c,d;f(a,b){d=a*b;_ _}

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

Steadyboxの回答に基づいて、すべてをマクロに入れて、ゴルフをもう少しゴルフします。

(注:予期せず、結果を作品のd代わりに割り当てaます。生成されたアセンブリコードを見て、問題ないようです。)


2

Haskell、54バイト

a%0=a
a%b=10*a%div b 10+mod b 10
a#b=(a*b)%(a+b)%(a-b)

パズルは中置機能によって実装されている#、例えば8#2 = 16106。もう1つの関数は%、10進法の連結を定義します(RHSが0より大きいと仮定)。



1

PHP、87バイト

[,$a,$b]=$argv;echo($s=$a-$b)+($t=$a+$b)*10**($l=strlen($s))+$a*$b*10**($l+strlen($t));

37バイトの無効なソリューション

[,$a,$b]=$argv;echo$a*$b,$a+$b,$a-$b;

1

Ruby、61バイト

->a,b{[a*b,a+b,a-b].reduce{|x,y|z=y;x*=10while(z>z/=10);x+y}}

これは、この Javascriptの答えによく似ていますが、対数を使用していません。


1

Python、92 91文字

def g(x,y):
    l=lambda x,i=0:l(x/10,i+1)if x else 10**i
    a=x-y
    a+=(x+y)*l(a)
    return x*y*l(a)+a

ウィザードの提案に感謝します;)


サイトへようこそ!)との間にスペースは必要ありませんif
小麦ウィザード

1

R(3.3.1)、104バイト

function(x,y)Reduce(function(p,q)p*10^(floor(log10(q)+1))+q,lapply(c(`*`,`+`,`-`),function(z)z(x,y)),0)

無名関数を返します。

これは私の最初のゴルフの試みなので、フィードバックを歓迎します。


1
予約語 'function'を使用して関数を定義することは、可能な限り多くのバイトを使用することを避けたいと思います。計算するだけです。
user11599

0

REXX、70バイト

f:arg a b
c=a-b
c=(a+b)*10**length(c)+c
c=a*b*10**length(c)+c
return c

もちろん、ネイティブの方法ははるかに短くなります。

f:arg a b
return a*b||a+b||a-b

0

PowerShell、88バイト

param($x,$y)$l=2;if(($a=$x+$y)-gt9){$l++};($x*$y)*[math]::Pow(10,$l)+$a*10+$x-$y

PowerShellには、役に立たないパワーオペレーターがありません。また、整数を文字列としてカウントしない限り、整数の長さをカウントすることはできません。文字列としてカウントすることはできません。そのため-gt、長さを知るために9 かどうかを確認します。おそらくもっと簡潔かもしれませんが、仕事に戻らなければなりません。


0

Pythonの2.7、109 96バイト

import math
a=lambda n:10**int(math.log10(10*n))
b,c=input()
d=b-c+(b+c)*a(b-c)
print d+b*c*a(d)

コンテストの規則に従って修正されました。109バイトから96バイトにコードをダウンさせたmbomb007へのクレジット


1
このチャレンジのルールから•You're not allowed to use strings or any kind of concatenation anywhere in your code.
AdmBorkBork

aラムダを作成することで、いくつかのバイトを節約できます。a=lambda n:10**int(...。またb,c=input()、コンマで区切られた2つの入力を与えることもできます。
mbomb007

@ mbomb007 b、c = input()はTypeErrorを返します: 'int'オブジェクトは反復不可能です。試しました。また、ラムダ関数は、コード内で関数を2回呼び出しているため、バイトを節約できません。それも試してみました。:(
コイショアロイ

@KoishoreRoy私はあなたが私が意味するものを得るとは思わない。96バイト
-mbomb007

0

J、25バイト

X=.10#.[:;10#.inv&.>*;+;-
  1. *;+;- 各操作の結果をボックス化します。
  2. 10#.inv&.>各結果を10進数の配列に変換します。(inv^:_1
  3. [:; 配列を開梱して結合します。
  4. 10#. 10進数の配列を整数に変換します。
  5. X=. 上記を演算子として定義する X

結果:

   8 X 2
16106
   5 X 4
2091
   9 X 6
54153

必要ありませんX=.
チョイス

@Cyoce-チャレンジ内のサンプルAPLコードはオペレーターを定義します。このチャレンジのために再利用可能な演算子を定義することになっていると確信しています。
デーン

「3. [:;箱を開けて、配列を結合します。」-「コードのどこでも文字列または任意の種類の連結を使用することはできません。」
-ngn

@ngn-コメントを展開してください。どの時点でも文字列は使用されません。
デーン

私は単に「結合」(「リンク」?)が「連結の種類」を構成する可能性があることを指摘したかったのですが、私はJにあまり精通しておらず、この場合の問題文の解釈方法がわかりません。私自身の解決策も同様の疑問を提起します-私は、Jの「リンク」と同じかもしれないが、それを表すグリフなしの座礁(APLでの名詞の並置)を使用します。
-ngn

0

Mathematica、67バイト

c=Ceiling;l=Log10;#-#2+(#+#2)10^(c@l[#-#2]/. 0->1)+10^c@l[2#]10#2#&

を取得しx-y、次にlog10をx-y取得し、切り上げ、10の累乗を計算し、それをで乗算しx+yます。しかしlog10(x-y)、0であることも考慮する必要があるため、0を1に置き換えます。その後、log10を2x切り上げて1を足し、10のべき乗を求めます。それを乗算しxy、それを追加します。


0

05AB1E23 22 16バイト

-Dg°¹²+*Dg°¹²**O

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

演算を含む文字列をループすることにより、プログラムで文字列を使用することを許可されていた場合(計算ではなく)、数バイトを節約できた可能性があります。 "-+*"各操作に対して実行されるコードは同じであるため。
もちろん、連結の使用が許可されていれば、さらに節約できました。


0

R、64バイト

x=scan();(b=(a=diff(-x))+10^nchar(a)*sum(x))+10^nchar(b)*prod(x)

使用法:

> x=scan();(b=(a=diff(-x))+10^nchar(a)*sum(x))+10^nchar(b)*prod(x)
1: 8 2
3: 
Read 2 items
[1] 16106
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.