質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

14回答

323閲覧

1+1=5000にしたい

nmi-ci-hchaai-c

総合スコア79

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

10グッド

9クリップ

投稿2017/08/27 04:33

表題のとおりです。
通常、1+1=2です。これはどのプログラミング言語でも共通で、1+1とすれば、結果として2が出力されるでしょう。
が、1+15000にしたいと思いまして、あれこれ調べてみましたが、なかなかできそうな方法が見当たらす...
言語はどのようなものでもいいので、失礼ですが、1+15000にしていただけませんか?
よろしくお願いします。

ShoheiTai, Tokeiya3, mosa, kopio, CreatorQsF, Fujisaki_prpr, s8_chu, LouiS0616, shinpo👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答14

0

Ruby

1class Integer 2 def +(other) 3 5000 4 end 5end 6puts 1 + 1

※ Ruby 2.4以上で実行してください。バージョンが低いとうまくいきません。

paiza.ioでの実行した様子


上記では全ての足し算が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
raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2017/08/27 12:52

1に対して特異メソッドは定義できないんですね。 Int=1.class class Int だと、低いバージョンでも大丈夫だと思います。
raccy

2017/08/27 14:06

1などは変更不可のオブジェクト扱い(freezeされているようなもの)なので、昔から特異メソッド等の変更は一切できなかったと思います。1.8系あたりまでならそこら辺がまだ整理できて無くて、できそうな気はしますけど。今、手元に古いバージョンのRubyが無いので、試して見ないとわからないですけどね。
oskbt

2017/08/29 16:26

2.3だと class Fixnum def +(other) if self == 1 && other == 1 return 5000 else return self --other end end end でいけました。
guest

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)

追記

Xcodeplaygroundで実行できます。
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
taro_nii_chan

総合スコア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

Tokeiya3

総合スコア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
think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

lisp

1(shadow '+) 2(defmethod + (x y) 5000) 3(print (+ 1 1))

投稿2017/08/29 16:06

mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

t_obara

総合スコア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

mattn

総合スコア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

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Print "1+1=5000"

でいいかな

投稿2017/08/31 09:52

SugarMan

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

momon-ga

総合スコア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

YoshikuniJujo

総合スコア33

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

演算の上書き定義ができる言語ならば1+1=5000という式も実現可能です。

もっとも、これを要すニーズの存在、背景について疑問が残ります。

投稿2017/08/29 14:56

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

理解してなかったらすいません。

代入して見たらどうでしょうか?

phpの例
1+1 == 5000

投稿2017/08/29 14:55

編集2017/08/29 14:56
hiziki

総合スコア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

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問