追加せずに追加(または4つの基本算術演算子のいずれか)


40

問題:

目標は、次の数学演算子を使用せずに2つの入力数値を追加することです+,-,*,/

また、これらの数学演算子を置き換えるように設計された組み込み関数は使用できません。

得点:

最小のコード(バイト数)が優先されます。

更新

私が見たプログラムのほとんどは、番号を含む2つの配列を連結するかfirst number、文字で構成し、文字を追加second numberしてからすべてをカウントします。

最短配列カウンター:8文字のAPL、Tobia著

最短配列連結:Doorknobによる4文字のGolfscript

最短対数ソリューション:Quincunxによる19文字のTI-89 Basic

統合ソリューション:45文字のMathematica、マイケル・スターン

クールな、私の意見では:javascriptのビット演算子、デイブ


フロートはありますか?
イスマエルミゲル14

7
負の数になりますか?(現在、すべての答えは数値が正であると仮定しているため、おそらく変更しないでください)
Doorknob

4
数学的な解決策はどうですか?それらをリストするのを忘れました!これは統合され、これは対数で再生されます
ジャスティン14

3
なぜ長いソリューションの1つを受け入れたのですか?最短の解決策(thisthis)は受け入れないが、負の数を受け入れるからですか?もしそうなら、私の答えは負数をサポートし(浮動小数点もサポートします)、これよりも短くなります。この質問にcode-golfというタグを付けたため、最短の解決策を受け入れる必要があります。
ジャスティン14

2
「番号」を定義します。整数?非負の整数?10進数でなければなりませんか?
SuperJedi224

回答:


2

Smalltalk、21 13

以下のすべては、正の整数でのみ機能します。深刻な問題については、他のSmalltalkの回答を参照してください。

バージョン1

大きな整数にシフトして、その高ビットインデックスを要求します(悪い、STインデックスは1ベースなので、追加の右シフトが必要です)。

(((1<<a)<<b)>>1)highBit

バージョン2

同様であり、少し短くなっています(Smalltalkの優先ルールのため、右シフトは不要です)。

1<<a<<b log:2 

バージョン3

「コレクション連結要求サイズ」テーマの別のバリエーション
。2つの数字aとbが与えられ、

((Array new:a),(Array new:b)) size

Intervalsをコレクションとして使用すると、21文字でよりメモリに優しいバージョンが得られます;-):

((1to:a),(1to:b))size

ただし、大量の演算処理にはお勧めしません。

バージョン4

あなたの娯楽のために、時間と記憶を交換したいなら、試してください:

Time secondsToRun:[
   Delay waitForSeconds:a.
   Delay waitForSeconds:b.
]

通常は十分に正確です(ただし、保証はありません;-)))

バージョン5

ファイルに書き込み、そのサイズを尋ねる

(
    [
        't' asFilename 
            writingFileDo:[:s |
                a timesRepeat:[ 'x' printOn:s ].
                b timesRepeat:[ 'x' printOn:s ]];
            fileSize 
    ] ensure:[
        't' asFilename delete
    ]
) print

45

Javascript(25)

while(y)x^=y,y=(y&x^y)<<1

これは、ビット演算のみを使用して2つの変数xとyを追加し、結果をxに格納します。

これは負の数でも機能します。


1
@dave、しばらく切り替えている場合、さらに2つの文字を保存できますwhile(y)x^=y,y=(y&x^y)<<1
ドムヘイスティングス14


3
@ user3125280、問題は「加算を行わずに加算を行う」(これは少し無意味です)ではなく、「基本的な数学演算子なしで加算を行う」
ブライアンS 14

8
@ user3125280、すみませんが、あなたが私のコメントから解釈した無礼は意図されていません。ただし、「基本的な算術演算」のカテゴリでXORをPLUSとグループ化することに同意する非常に多くの人々を見つけるのに苦労すると思います。同意する人を見つけるだけでなく、OPは許可されていない演算子を明示的に呼び出し、XORはそれらの1つではありません。エルゴ、これは有効な答えです。
ブライアンS 14

3
for(;y;y=(y&x^y)<<1)x^=y1バイト短い:)
ウィリアムバルボサ14年

22

C-38バイト

main(){return printf("%*c%*c",3,0,4);}

私はここで少しカンニングします、OPは数学演算子を使用しないと言いました。

*printf()文字を印刷するために使用されるフィールド幅を引数から取られることをフォーマット手段printf()、この場合、3および4戻り値が、printf()印刷された文字の数です。したがって' '、3のフィールド幅を持つものと4のフィールド幅を持つものを印刷すると、合計で3 + 4文字になります。

戻り値は、printf()呼び出しで追加された数値です。


3
3つと4つのパラメーターを作成する必要があり、関数はである必要はありませんmain。また、印刷する内容を気にしない場合は、1つ' 'を置き換え0て2つ目を省略することができます。
ウゴレン14

17

Python-49バイト

変数xとに配置することで入力を想定していますy

from math import*
print log(log((e**e**x)**e**y))

この61バイトのソリューションは完全なプログラムです。

from math import*
print log(log((e**e**input())**e**input()))

あなたがべき乗を禁止しなかったことを考慮して、私はこれを投稿しなければなりませんでした。対数のプロパティを使用して式を単純化すると、単にが得られprint input() + input()ます。

これは、負の数と浮動小数点数の両方をサポートしています。

注:ニブラーのアドバイスに従い、この答えを3つに分割しました。これがMathematicaソリューションであり、これがTI-89 Basicソリューションです。


私はjavascriptでそれと似たようなことをしようとしていましたが、最後にそれを見てから数年後、それを見つけるためにインターネットを検索していたので、式が何であるかを忘れていました。
ビクターStafusa 14

4
@Victor私は自分で数式を作成しました。私は数学を非常にはっきりと覚えています。
ジャスティン14

1
Mathematicaは非常に近いので、組み込みシンボルを大文字にするだけです。Log [Log [(E ^ E ^ x)^(E ^ y)]]は機能します(23文字、または外側の関数のラッピングに@表記を使用する場合は22文字)。
マイケルスターン14

「変数xとyに配置することで入力を引き受けることが許されている場合..」できると思います-他の人も同様です。
blabla999 14

@MichaelStern:括弧を省略してスキップすることにより、さらに2文字を保存できますE^y。使用Log[Log[(E^E^x)^E^y]]はうまくいくようです。
alexwlchan 14

14

JavaScript [25バイト]

~eval([1,~x,~y].join(''))

1
あなたの答えは悪いように見えますが(そして投票権を引き付けます)、それは実際には良い答えです。この1つを削除して、ダウン票を取り除き、それを説明するテキストを付けて再投稿してください。あなたの新しい答えに賛成します。
ビクターStafusa 14

1
今、それは本当によさそうだ、私はそれが好きです。確かに、より多くの賛成票の価値があります。
VisioN 14

13

Mathematica、21バイト

Mathematicaでこれを行うには多くの方法があります。1つは、Accumulate関数を使用して、出力の最終番号以外のすべてをトスします。以下の他のソリューションと同様に、入力番号は変数aとにあると仮定しますb。21バイト。

Last@Accumulate@{a, b}

さらに楽しいのは、45文字ですが、数字を使用して行を定義し、その下に統合します。

Integrate[Fit[{{0, a}, {2, b}}, {x, 1}, x], {x, 0, 2}]

ボーナスとして、両方のソリューションは、ここでの他のソリューションの場合のように正の整数だけでなく、すべての複素数に対して機能します。


2
統合が大好きです!(ただし、厳密に言えば、これは何かを追加します)。+1
blabla999 14

最初の解決策は無効です。チャレンジの著者を引用して:「さらに、これらの数学演算子を置き換えるために設計された組み込み関数使用できません。」私はこの解決策を与えました:function _(){return array_sum(func_get_args());}。それを「修正」する短い方法を見つけることができなかったので、私はそれを降ろさなければなりませんでした。
イスマエルミゲル14

@Ismael Miguel Accumulate []は、Plusを置き換えるようには設計されていません。たまたまその出力の中に数字のリストの合計が表示されるので、それを利用します。
マイケルスターン14

しかし、それはそのリスト内のすべての要素の合計を作りますよね?もしそうなら、私の意見では、array_sum()PHPで使用するのと同じくらい無効であり、まったく同じことをします。
イスマエルミゲル14

3
@Ismael Miguel Total []と呼ばれる配列を合計するMathematica関数が存在します。その機能を使用するために指定された規則に反することに同意しますが、そうしませんでした。Accumulate [{a、b}]の出力はa + bではありません。
マイケルスターン14

12

GolfScript、6 4文字/バイト

10, 5(=> 15)の形式で入力します。

~,+,

+配列の連結ではなく、またあります。

仕組みは,、数字が(0,1,...,n-2,n-1)である長さの配列を作成するために使用されることです。これは両方の数値に対して行われ、配列は連結されます。,結果の配列の長さを見つけるために、別の目的で再び使用されます。

さて、ここにトリックがあります。これは、入力形式を乱用するため、本当に気に入っています。配列を入力しているように見えますが、実際には、入力はGolfScriptコードとして実行され,ているため、最初の操作は既に完了しています。(古い6文字バージョンは~,\,+,input format 10 5で、\,(swap-array)を削除することで2文字を削除しました)。

古いバージョン(12)

関数を作成しますf

{n*\n*+,}:f;

*そして+、それぞれの算術関数、文字列の繰り返しと連結されません。

説明:n1文字のストリング(改行)を作成します。その後、これが何a度も繰り返され、同じことがで行われbます。文字列は連結,され、文字列の長さに使用されます。


負の数でも機能しますか?
マイケルスターン14

@MichaelSternいいえ、しかしそれは質問で言及されたことはありません。うーん、コメントを追加しました。他の回答のほとんど(実際には、すべて)も肯定的であると仮定しています。
ドアノブ

Mathematicaソリューションをご覧ください。適切な言語では、負の数のソリューションが可能です。
マイケルスターン14

@MichaelStern LOL @このサイトのすべての場所の「正しい言語」…
トビア14

10

C、29 27バイト

ポインター演算の使用:

f(x,y)char*x;{return&x[y];}

x はポインタとして定義されますが、呼び出し元は整数を渡す必要があります。

匿名ユーザーは次のように提案しました-27バイトですが、パラメーターは整数です:

f(x,y){return&x[(char*)y];}

32ビットでポインターが64ビットintである現在一般的なシステムで2を渡すと、最初の形式はおそらくひどく壊れintます。2番目はその問題を回避します。
hvd 14

@hvd、両方とも、少なくともLinux 64ビットで動作します。とにかく、整数パラメータはマシンレジスタサイズに拡張されます。
ウゴレン14

ああ、まあまあですが、それはよくあることだと同意しました。しかし、うまくいかない具体的な例を見つけることができれば、再びコメントします。:)
hvd 14

8

Brainf * ck、9 36

,>,[-<+>]

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

これは単純な追加を使用せずに機能します。通過して1の証跡を作成し、それらをカウントアップします

注:+-は単に1つの増分であり、brainf * ckでそれらがなければ何もできません。それらは実際には加算/減算ではないので、これはまだ重要だと思います。


-1。これは簡単な追加です。加算、乗算などではないことを行った場合、それはカウントされますが、そのままではカウントされません。
ジャスティン14

@Quincunx修正しました。私は通過goignと1の証跡を残し、その後を掃引すると「拾う」ということでそれをやったトレイル
ASKASK

3
逆転。良くやった。
ジャスティン14

6

J(6)

succ関数を使用できないとは言わなかった:

>:@[&0

使用法:

   9>:@[&0(8)
17

>:on 8を9回繰り返します。

リスト連結アプローチも機能します#@,&(#&0)。そして-私はそれが規則に反していることを知っています-私はほとんどのJっぽい解決策なしではこの答えを手放すことはできません:(*&.^べき乗の下での乗算)。


5

追記、41

次のように、41バイト長の式で関数を定義します。

/a{0 moveto 0 rmoveto currentpoint pop}def

次に、たとえば次のように呼び出します。

gs -q -dBATCH -c '/a{0 moveto 0 rmoveto currentpoint pop}def' -c '10 15 a ='

それは与える

25.0

ほとんどの競合他社とは異なり、ネガとフロートを簡単に処理できます:-)



4

Smalltalk(現在深刻)、123 118 105(*)

2回答えてすみませんが、これは真剣な答えで、もう1つはユーモアに近いものでした。以下は、すべてのマシンで(ハードウェアで)この瞬間に実際に実行されます。奇妙なことに、他の誰にも思いつかなかった...

2つの半加算器を組み合わせて、単語のすべてのビットを並列に実行することで、(入力a、b、sの出力)読み取り可能なバージョンを取得します。

  s := a bitXor: b.            
  c := (a & b)<<1.             

  [c ~= 0] whileTrue:[        
     cn := s & c.
     s := s bitXor: c.
     c := cn<<1.
     c := c & 16rFFFFFFFF.
     s := s & 16rFFFFFFFF.
  ].
  s           

ループはキャリー伝播用です。マスクは、符号付き整数が処理されるようにします(マスクなしでは、符号なしの数値のみが可能です)。これらは、語長も定義します。上記は32ビット操作の場合です。68ビットの追加を希望する場合は、16rFFFFFFFFFFFFFFFFFに変更します。

ゴルフバージョン(123文字)(mで再利用することで長いマスクを回避):

[:a :b||s c n m|s:=a bitXor:b.c:=(a&b)<<1.[c~=0]whileTrue:[n:=s&c.s:=s bitXor:c.c:=n<<1.c:=c&m:=16rFFFFFFFF.s:=s&m].s]

(*)16rFFFFFFFFの代わりに-1を使用することで、ゴルフをより良くすることができますが、コードは任意の精度の数値では機能せず、機械語サイズのsmallIntegerのみで機能します(largeIntegerの表現はAnsi標準では定義されていません):

[:a :b||s c n|s:=a bitXor:b.c:=(a&b)<<1.[c~=0]whileTrue:[n:=s&c.s:=s bitXor:c.c:=n<<1.c:=c&-1.s:=s&-1].s]

これにより、コードサイズが105文字になります。


これはコードゴルフですので、ゴルフに答えてください。
ビクターStafusa 14

1
勝つチャンスはありませんが、私はあなたのためにそれをやります
;

Smalltalkの回答を見てうれしいです!
歯ブラシ14

4

APL、8および12

ここでは新しいことはありません。配列カウントバージョン:

{≢∊⍳¨⍺⍵}

およびログ○ログバージョン:

{⍟⍟(**⍺)**⍵}

APLではかっこいいと思っただけです!

{≢     }       count
  ∊            all the elements in
   ⍳¨          the (two) sequences of naturals from 1 up to
     ⍺⍵        both arguments

 

{⍟⍟        }   the double logarithm of
   (**⍺)       the double exponential of ⍺
        *      raised to
         *⍵    the exponential of ⍵

2
公平を期すために、APLではすべてがクールに見えます。
マイケルスターン14

最初のものを5の暗黙の接頭辞関数にすることができます。≢∘∊⍳¨
AdámJul

@Adámはい、しかし、私は暗黙の関数が好きではなく、読みにくいと感じています。
トビア

@Tobia 読むのが難しいと思うので気に入らないかもしれません。私はその上でワークショップを運営しています... 私のレッスンを見ましたか?
アダム

@Adámクール、ありがとう!それをチェックアウトします。
トビア

4

sed、359バイト(派手なフォーマットなし)

回答が遅れて申し訳ありませんが、おそらくここで最も長い回答です。しかし、私はこれがsedで可能かどうかを見たかったです:

                       s/([^ ]+) ([^ ]+)/\1:0::\2:/
                       :d /^([^:]+):\1::([^:]+):/tx
                       s/(:[^:]*)9([_:])/\1_\2/g;td
s/(:[^:]*)8(_*:)/\19\2/g;s/(:[^:]*)7(_*:)/\18\2/g;s/(:[^:]*)6(_*:)/\17\2/g
s/(:[^:]*)5(_*:)/\16\2/g;s/(:[^:]*)4(_*:)/\15\2/g;s/(:[^:]*)3(_*:)/\14\2/g
s/(:[^:]*)2(_*:)/\13\2/g;s/(:[^:]*)1(_*:)/\12\2/g;s/(:[^:]*)0(_*:)/\11\2/g
                       s/:(_+:)/:1\1/g; y/_/0/; # #
                       bd;  :x  s/.*::([^:]+):/\1/;
                       # # # # # # #  # # # # # # #

これはhttps://codegolf.stackexchange.com/a/38087/11259に似ており、単に文字列の数字をインクリメントします。しかし、代わりにループでインクリメント操作を行います。

入力は、STDINから「x y」の形式で取得されます。最初に「x:0 :: y:」に変換されます。次に、「:」文字の後に続くすべての数字を「x:x::( x + y):」になるまでインクリメントします。その後、最終的に(x + y)を返します。

出力

$ printf "%s\n" "0 0" "0 1" "1 0" "9 999" "999 9" "12345 67890" "123 1000000000000000000000"  | sed -rf add.sed
0
1
1
1008
1008
80235
1000000000000000000123
$

これは自然数に対してのみ機能することに注意してください。ただし、(少なくとも理論的には)任意の大きな整数に対して機能します。yに対してxの増分演算を行っているため、順序付けによって速度に大きな違いが生じる可能性があります。x<yはx> yよりも高速です。


4

ダッシュ、18バイト

time -f%e sleep $@

GNU time 1.7以降が必要です。出力はSTDERRになります。

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

組み込みのtimeコマンドはGNU timeとは異なるため、これはB ashでは機能しないことに注意してください。

1バイトの追加コストで、Bashに外部コマンドを使用させる\time代わりに使用できますtime


入力の1つが負の場合はどうなりますか?
マイケルスターン14

4
失敗します。他のすべての答えと同じように。
デニス14

5
ドラット!質問がされる前に結果が出ることを望んでいました。
トビア14

3
うん。また、ランダムsleep -3を挿入することでプログラムを高速化できることを強く期待していました。なんて失望した。
アルフェ14

1
@userunknown \timeはBashでも機能するはずです。
デニス

3

Javascript(67)

おそらくはるかに優れている

a=Array;p=Number;r=prompt;alert(a(p(r())).concat(a(p(r()))).length)

あなたはそれがフロートを必要とするかどうかを知らずに決定的な答えを与えるべきではありません。そして、NaNを処理しません。しかし、それは非常に素晴らしいコードです!
イスマエルミゲル14

すべてjoinsは不要だと思います。Arrayコンストラクタは、アレイなるundefineds:カウントすることができ、a=Array;p=parseInt;r=prompt;alert(a(p(r())).concat(a(p(r()))).length)
ベンライヒ

@BenReich、あなたは正しい、ありがとう
マイケルM. 14

@Michaelはまた、Numberコンストラクタは上2つの文字が保存されますparseInt
ベン・ライヒ

@Michaelまた、を削除してalertも、出力はコンソールに送られますが、答えは少し面白くなくなります。promptalertの代わりに変数を再利用することもできます(コンストラクターはプロンプトで引数に警告します)。とにかく、いい答えです!
ベン・ライヒ

3

ルビー、18文字

a.times{b=b.next}

さらに2つの冗長なバリアント、29文字

[*1..a].concat([*1..b]).size

別のバージョン、32文字

(''.rjust(a)<<''.rjust(b)).size

3

C#-オンザフライのコード生成

ええ、実際にはそこに追加がありますが、+演算子はなく、追加を行うフレームワーク関数もありません。代わりに、追加を行うメソッドをその場で生成します。

public static int Add(int i1, int i2)
{
    var dm = new DynamicMethod("add", typeof(int), new[] { typeof(int), typeof(int) });
    var ilg = dm.GetILGenerator();
    ilg.Emit(OpCodes.Ldarg_0);
    ilg.Emit(OpCodes.Ldarg_1);
    ilg.Emit(OpCodes.Add);
    ilg.Emit(OpCodes.Ret);
    var del = (Func<int, int, int>)dm.CreateDelegate(typeof(Func<int, int, int>));
    return del(i1, i2);
}


2

R 36

function(x,y)length(rep(1:2,c(x,y)))

ここでrepx1の後にy2が続くベクトルを作成します。


2
同じことを少し短くするプログラムを作成できますlength(rep(1:2,scan()))
。– Masclins

2

TI Basic 89-19バイト

TI-89(ホーム画面またはプログラミングアプリ)でこれを実行します。

ln(ln((e^e^x)^e^y))

これはx+yこのソリューションのように、ログルールを使用して計算します。おまけとして、10進数と整数で機能します。すべての実数で機能します。対数ルールがまだ複素指数で有効な場合、これは複素数でも機能します。ただし、複雑な指数を挿入しようとすると、計算機がジャンクを吐き出します。


3
lnTI Basic では1バイトではありませんか?また、閉じ括弧を削除して、これを15バイトにすることもできます。
ɐɔıʇǝɥʇuʎs

2

Mathematica表記法を教えてくれたMichael Sternに感謝します。

Mathematica- 21 20バイト

Log@Log[(E^E^x)^E^y]

これはこのソリューションと同じアプローチを使用しますが、Mathematicaで短くすることです。これは、xおよびの整数と同様に、負および浮動小数点数に対して機能しますy

ログルールを使用して式を簡略化するx+yとが得られますが、4つの基本演算子の1つではなく、べき乗を使用するため、これは有効です。


複素数でも機能しますか?
マイケルスターン14

2

C#-文字列演算

両方の数値を文字列に変換し、文字列の切断(キャリーとすべて、ご存じのとおり)を追加してから、解析して整数に戻します。0..200のi1、i2でテストされ、魅力のように動作します。これで追加を見つけてください!

public static int Add(int i1, int i2)
{
    var s1 = new string(i1.ToString().Reverse().ToArray());
    var s2 = new string(i2.ToString().Reverse().ToArray());
    var nums = "01234567890123456789";
    var c = '0';
    var ret = new StringBuilder();
    while (s1.Length > 0 || s2.Length > 0 || c != '0')
    {
        var c1 = s1.Length > 0 ? s1[0] : '0';
        var c2 = s2.Length > 0 ? s2[0] : '0';
        var s = nums;
        s = s.Substring(int.Parse(c1.ToString()));
        s = s.Substring(int.Parse(c2.ToString()));
        s = s.Substring(int.Parse(c.ToString()));
        ret.Append(s[0]);
        if (s1.Length > 0)
            s1 = s1.Substring(1);
        if (s2.Length > 0)
            s2 = s2.Substring(1);
        c = s.Length <= 10 ? '1' : '0';
    }
    return int.Parse(new string(ret.ToString().ToCharArray().Reverse().ToArray()));
}


2

Python-22文字

len(range(x)+range(y))

1
それは追加としてカウントされると思いますか?
TheDoctor

1
それの連結
pydud


2

TI-BASIC、10

追加しXY

ln(ln(e^(e^(X))^e^(Y

1
あなたは確かにソリューションをコピーする方法を知っています:codegolf.stackexchange.com/a/21033/9498
ジャスティン

。。それは、ログを使用しているため、まず、これは動作しません(代わりにLNの(第二に、それは実際には10のフォームLNで書かれている場合バイト(LN(E ^(E ^(X))^ E ^(Yです
lirtosiast

2

K、2バイト

#&

使用例:

  #&7 212
219

「where」演算子(単項式&)を入力リスト内の数値に適用します(入力フォーマットで自由度を取ります)。これにより、最初の数のゼロとそれに続く2番目の数の1を含むリストが生成されます。

  &3 2
0 0 0 1 1

通常、この演算子は、ブールリストの非ゼロ要素のインデックスのリストを作成するための「収集」として使用されますが、一般化された形式がときどき役立ちます。

次に、そのリストのカウント(単項#)を取得します。

入力要件の解釈が受け入れられない場合、次のわずかに長い解決策でも同じトリックを行います。

{#&x,y}

2

Pyth、29バイト

AQW!qG0=k.&GH=HxGH=k.<k1=Gk)H

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

ここに私の最初の提出!

これは次のようにコンパイルされます。

assign('Q',eval_input())     # Q
assign('[G,H]',Q)            #A
while Pnot(equal(G,0)):      #  W!qG0
  assign('k',bitand(G,H))    #       =k.&GH
  assign('H',index(G,H))     #             =HxGH  (index in this case is XOR)
  assign('k',leftshift(k,1)) #                  =k.<k1
  assign('G',k)              #                        =Gk)
imp_print(H)                 #                            H

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