表題のとおりです。
通常、1+1=2
です。これはどのプログラミング言語でも共通で、1+1
とすれば、結果として2
が出力されるでしょう。
が、1+1
を5000
にしたいと思いまして、あれこれ調べてみましたが、なかなかできそうな方法が見当たらす...
言語はどのようなものでもいいので、失礼ですが、1+1
を5000
にしていただけませんか?
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答14件
0
Ruby
1class Integer 2 def +(other) 3 5000 4 end 5end 6puts 1 + 1
※ Ruby 2.4以上で実行してください。バージョンが低いとうまくいきません。
上記では全ての足し算が5000
になってしまいますが、もし、1+1
以外は普通に足し算にしたいという場合は次のようにすることで可能です。
Ruby
1class Integer 2 alias add + 3 def +(other) 4 if self == 1 && other == 1 5 5000 6 else 7 self.add(other) 8 end 9 end 10end 11puts 1 + 1 12puts 1 + 2 13puts 2 + 1 14puts 2 + 2
投稿2017/08/27 04:37
編集2017/08/27 11:09総合スコア21735
0
swift
1import UIKit 2 3func + (left: Int, right: Int) -> Int { 4 let a = Double(left) 5 let b = Double(right) 6 return Int(pow(a + 1, a + 2) * pow(b + 4, b + 3)) 7} 8print(1 + 1)
追記
Xcode
のplayground
で実行できます。
Mac 環境がなかったらごめんなさい。
5000が素因数分解すると2^3 * 5^4 となることに着目して
2 に a + 1
, 3 に a + 2
, 5 に b + 4
, 4 に b + 3
を対応させたものです。
Int
型の2項演算子+
が上書きできるとは、やった自分が驚いています。
返り値が固定でない演算子なので非演算子(1 + 2
とか)を変えると色々楽しめます。
特に2番目の非演算子を-4
にするとエラーが出るところなどは
一瞬考えさせられて納得するかもです。
趣旨とは違うかもしれませんが。
投稿2017/08/29 12:55
編集2017/08/29 14:42総合スコア207
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
C#ならこんな感じかと。。。
csharp
1using System; 2 3namespace TestBench 4{ 5 struct MyInteger 6 { 7 public int Value; 8 9 public static MyInteger operator +(MyInteger x, MyInteger y) 10 { 11 if (x.Value == 1 && y.Value == 1) return new MyInteger {Value = 5000}; 12 return new MyInteger {Value = x.Value + y.Value}; 13 } 14 15 public static implicit operator MyInteger(int x) 16 { 17 return new MyInteger {Value = x}; 18 } 19 20 public override string ToString() => Value.ToString(); 21 } 22 23 internal static class Program 24 { 25 private static void Main() 26 { 27 MyInteger x = 1; 28 MyInteger y = 1; 29 30 Console.WriteLine(x + y); 31 32 } 33 } 34} 35 36
投稿2017/08/30 00:12
総合スコア260
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
少し前に、計算式となる文字列をparseして計算結果を出力する関数を書きました。
JavaScript
1evalCalculation('1+1'); // 2
evalCalculation()
の内部処理では「左辺」「右辺」「演算子」を分解し、四則演算する処理が走ります。
従って、計算処理のコードを書き換えてやれば、「左辺 === 1
」「右辺 === 1
」「演算子 === +
」の場合に 5000
を出力する処理も原理上は可能なわけです。
文字列を parse して計算結果を出力する事はどの言語でも出来ると思われる為、この方法ならば、言語を問わず可能だと思います。
Re: nmi-ci-hchaai-c さん
投稿2017/08/27 14:34
編集2017/08/27 14:38総合スコア18162
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
もう少し情報があると、1+1=5000という式になんらかの法則を見出せると思われますが、この式だけの場合、以下の法則が推測されるかと思われます。
(1) 1が通常の整数でいう2500を意味する
(2) +が通常の数式の結果に対して2500倍することを意味する
(3) =(代入)が通常の数式でいう右辺を2500倍した結果を出力することを意味する
(4) 5000が通常の整数でいう2を意味する
(5) 「+数値」が左側の数値に対して、右側の数値回5000を掛ける
あるいは「数値+」が右側の数値に、左側の数値回5000を掛けた数値を加える
(6) この世界にはどのような加算式の答えも5000となる
上記以外にも細かなバリエーション、組み合わせがあるかとは思いますが。。
さて、世の中の全ての言語に精通しているわけではないので、私の知っている限りという条件はつきますが、(1)、(3)、(4)はちょっと表現できないと思われます。
(補足) 式をリテラル(文字列)にして解釈した場合においては、解釈時に(1)、(3)、(4)とすることは可能ですが、質問内容から類推し、それを期待していないのではないかと思った次第です。
(6)はすでにraccyさんなどが回答を提示されています。
(2)、(5)も他の人のコードを修正するだけにはなりますが、以下のような感じでしょう。
swift
1(2) 2func + (left: Int, right: Int) -> Int { 3 let l = Double(left) 4 let r = Double(right) 5 return Int(l + r)*2500 6} 7 8print(1 + 1)
swift
1(5) 2func + (left: Int, right: Int) -> Int { 3 let l = Double(left) 4 let r = Double(right) 5 return Int(l * r*5000) // 前者 6 return Int(l*4999 + r) // 後者 7} 8 9print(1 + 1)
投稿2017/08/31 10:23
総合スコア5488
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
プリミティブな値に対してオペレータを仕込む事は出来ませんが。
cpp
1#include <iostream> 2#include <string> 3 4class Number { 5 int i; 6public: 7 Number(int i) : i(i) {} 8}; 9 10inline int operator+(int i, const Number& n) { 11 return 5000; 12} 13 14int 15main(int argc, char* argv[]) { 16 Number i = 1; 17 std::cout << 1 + i << std::endl; 18 return 0; 19}
投稿2017/08/27 05:24
総合スコア5030
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
いろいろ皆さん答えておられるので、あえてひねくれた回答をしてみます。
そもそも 1+1=2 というのは、数学では「公理」です。
公理とは、「それが存在することを仮定して論理を展開するもの」なので、1+1=2 というのは証明を行いません。「そういうものである」と定義している、のです。
※実際に 1+1=2 というのを証明しようとすると、数百ページに達するという話もあります
ところがコンピュータの世界では、1+1=2 ではなく、1+1=10 となるものが存在します。2進数です。
これをもう少しひねると、3進法で、「0, 1, 5000」となるような数学体系を考えます。
これなら 1 + 1 = 5000 になりますね。ちなみに 1+1+1 は 50001 になりますが。
え、5000 というのが「一桁」の数を表すのがおかしいですか? でもそう決めてしまえばそれまでですよ(w
投稿2017/08/31 10:32
総合スコア13703
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ちょっと反則ですが。
java
1Integer a = 1; 2Integer b = a; 3 4System.out.println("a + b = " + (a+b)); // 2 5 6Field valField = a.getClass().getDeclaredField("value"); 7valField.setAccessible(true); 8valField.setInt(a, 2500); 9 10System.out.println("a + b = " + (a+b)); // 5000
投稿2017/08/31 09:39
総合スコア4820
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Haskellだと、つぎのようにできます。
haskell
1data Number = One | FiveThousand 2 3instance Num Number where 4 _ + _ = FiveThousand 5 _ * _ = FiveThousand 6 abs = id 7 signum _ = One 8 _ - _ = FiveThousand 9 fromInteger 1 = One 10 fromInteger _ = FiveThousand 11 12instance Show Number where 13 show One = "1" 14 show FiveThousand = "5000"
GHCi(対話環境)で
haskell
1> default(Number) 2> 1 + 1 35000 4> 1 - 1 55000 6> 1 * 1 75000 8> 1 91 10> 42 115000
Haskellでは数値リテラルが多相性を持つので、こういうことができます。
投稿2017/08/30 05:34
総合スコア33
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
演算の上書き定義ができる言語ならば1+1=5000という式も実現可能です。
もっとも、これを要すニーズの存在、背景について疑問が残ります。
投稿2017/08/29 14:56
総合スコア4830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
理解してなかったらすいません。
代入して見たらどうでしょうか?
phpの例
1+1 == 5000
投稿2017/08/29 14:55
編集2017/08/29 14:56総合スコア54
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
2 を画面に表示するときに 5000 と表記するようにしてみました。
x.rb
ruby
1class Integer 2 def to_s_x 3 return '5000' if self == 2 4 to_s_org 5 end 6 7 alias to_s_org to_s 8 alias to_s to_s_x 9end 10 11puts 1 + 1 12puts 2 13puts 0 14puts 1 15puts 1 + 1 + 1 16puts "#{1 + 1}"
実行結果
$ ruby x.rb 5000 5000 0 1 3 5000
投稿2017/08/27 09:28
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/27 12:52
2017/08/27 14:06
2017/08/29 16:26