ฉันจะเขียนฟังก์ชันเพิ่มได้อย่างไร [ปิด]


42

ปัญหา:

ฉันเป็นผู้พัฒนานำสำหรับ บริษัท ขนาดใหญ่เรากำลังทำ Skynet ฉันได้รับมอบหมายให้

เขียนฟังก์ชั่นที่ป้อนเข้าและส่งคืนผลรวม

กฎ: ไม่มีคำตอบเหมือน

function sum(a,b){
    return "their sum";
}

แก้ไข: คำตอบที่ยอมรับจะเป็นคำตอบที่ได้รับการโหวตมากที่สุดในวันที่ 1 มกราคม 2014

หมายเหตุ: นี่เป็นคำถามการกรุณาอย่าใช้คำถามและ / หรือคำตอบอย่างจริงจัง ข้อมูลเพิ่มเติมที่นี่


31
คุณสามารถใช้ปลั๊กอิน jQuery $.sum=function(a,b){return a+b};ของฉันที่มีน้ำหนักเบา:
เครื่องปั่น

5
ฉันรู้ว่าฉันได้รับการอ้างอิง jQuery บางครั้ง
scrblnrd3

5
Brilliant English: p
Martijn Courteaux

5
ข้อเสนอแนะคำถาม (ไม่แน่ใจว่าดีหรือไม่): "GUISE HALP ฉันต้องการอัลกอริทึมที่รวดเร็วในการสร้างบล็อกบิตคอยน์ !!!!!

5
คำตอบเหล่านี้มีส่วนเกี่ยวข้องค่อนข้าง 'SELECT ' + a + ' + ' + b + ';'ผมขอแนะนำให้เปิดการเชื่อมต่อกับฐานข้อมูลของคุณและออก ง่ายและเข้าใจง่าย
Nick Chammas

คำตอบ:


69

นั่นเป็นปัญหาที่ซับซ้อนมาก! นี่คือวิธีที่คุณแก้ปัญหาใน C #:

static int Sum(int a, int b)
{
    var aa = ((a & ~877 - b ^ 133 << 3 / a) & ((a - b) - (a - b))) | a;
    var bb = ((b ^ (a < 0 ? b : a)) & ((b - a) - (b - a))) | b;
    var cc = new List<int>();
    for (int i = 6755 & 1436; i < aa; i -= -1)
    {
        cc.Add((int)Convert.ToInt32(Math.Sqrt(6755 & 1437 >> ((b - a) - (b - a)))));
    }
    for (int i = 6755 & 1436; i < bb; i -= -1)
    {
        cc.Add((int)Convert.ToInt32(Math.Sqrt(6755 & 1437 >> ((a - b) - (a - b)))));
    }
    Func<int,int,int> importantCalculation = null;
    importantCalculation = (x, y) => y != 0 ? importantCalculation(x ^ y | (6755 & 1436) >> (int)(Convert.ToInt32(Math.Sqrt((b - a) - (b - a) - (-1))) - 1), (x & y) << (int)Convert.ToInt32((Math.Log10(1) + 1))) : x;
    return cc.Aggregate(importantCalculation);
}


วิธีการใช้งานรหัสนี้ (ฉันจะไม่เพิ่มคำอธิบายนี้ในคำตอบของฉันไปยัง OP ขี้เกียจที่ต้องหมุนรอบไม่ต้องกังวล): ((a & ~877 - b ^ 133 << 3 / a) & ((a - b) - (a - b))) | aคืนค่ากลับมาaและ((b ^ (a < 0 ? b : a)) & ((b - a) - (b - a))) | bคืนbเท่านั้น

6755 & 1436ผลตอบแทน0ดังนั้นในวงiจริงเริ่มต้นด้วยมูลค่า0และภายในวงคุณเพิ่มมูลค่า1ให้กับรายการ ดังนั้นถ้าaเป็น5และbมี3ค่า1จะถูกเพิ่ม 8 ครั้งในรายการ

importantCalculationฟังก์ชั่นการทำงานที่นานมากที่ไม่ได้ทำอะไรอย่างอื่นมากกว่าการเพิ่มขึ้นสองหมายเลข คุณใช้Aggregateฟังก์ชันLINQ เพื่อเพิ่มตัวเลขทั้งหมด นอกจากนี้ยังไม่จำเป็นที่จะโยนผลจากการConvert.ToInt32ไปยังเพราะมันมีอยู่แล้วintint

รหัสนี้เป็นสิ่งที่ OP ขี้เกียจไม่เข้าใจซึ่งเป็นความตั้งใจจริง :-)


11
i - = -1 สร้างสรรค์มาก ฉันถึงขีด จำกัด การลงคะแนนในวันนี้แล้ว แต่ฉันจะถอนคำตอบของคุณโดยเร็วที่สุด
Victor Stafusa

ตราบใดที่คุณยืนยันว่าสิ่งอื่นนอกจาก6755 & 1436พฤติกรรมที่ไม่ได้กำหนดแม้จะมีการรับรู้ของ OP ว่าตัวเลขส่วนใหญ่ดูเหมือนจะทำงาน ...
Trojan

ความหมายของ '=>' คืออะไร?
Ilya Gazman

2
@Babibu ฉันไม่เคยเขียนบรรทัด C # ในชีวิตของฉัน แต่นี่เป็นการแสดงออกแลมบ์ดาเกือบแน่นอน
thwd

3
อ๊ะโอ้var x = Sum(0, 4)DivideByZeroException
Phillip Scott Givens

60

Bash - 72 ไบต์

บางครั้งเทคนิคการเพิ่มที่กำหนดขึ้นแบบดั้งเดิมนั้นแม่นยำเกินไปและเร็วเกินไปโดยไม่จำเป็นมีหลายครั้งที่คุณต้องการให้ CPU พักสักหน่อย

แนะนำขั้นตอนวิธีการสูญเสีย SleepAdd

#!/bin/bash
(time (sleep $1;sleep $2)) 2>&1|grep re|cut -dm -f2|tr -d s

วิ่งตัวอย่าง:

> ./sleepadd.sh 0.5 1.5
2.001

ฟังก์ชั่นนี้มีวัตถุประสงค์เพื่อเป็นสหายกับดีถือSleepSort มันเป็นเหมือนการออกกำลังกายกับผู้อ่านในการปรับอัลกอริทึมนี้เพื่อทำให้ SleepMax ที่สูญเสียเพื่อให้ได้ตัวเลขสองจำนวนที่มากขึ้น

เคล็ดลับสำหรับมืออาชีพ: อัลกอริทึมนี้สามารถปรับให้เหมาะสมเพิ่มเติมได้ - เพิ่มความเร็ว 2x ได้ถ้าตัวเลขที่กำหนดให้หารด้วย 2 ก่อน


5
การหมุนรอบที่ 1: ใช้งานได้ แต่ช้าลงอย่างน่างงงวยโดยใช้ตัวจับเวลาระบบเพื่อรอเวลาทั้งหมด ดังนั้นจำนวนที่มากขึ้นต้องใช้เวลานานกว่าในการเพิ่ม การหมุนรอบที่ 2: มันใช้งานได้สำหรับจุดลอยตัว แต่คำตอบจะถูกปิดด้วยระยะห่างเล็กน้อย Trolling 3: การใช้ grep, cut และ tr. โดยไม่เสียค่าใช้จ่าย การหมุนรอบ 4: ผลรวมใด ๆ ที่เกิน 60 (วินาที) จะไม่ได้รับการจัดการอย่างถูกต้อง
Riot

4
@Shingetsu: สิ่งที่คุณพูดว่าไม่มีใครเคยได้ยินตัวแปลงสัญญาณ mp3? : P
Riot

7
ฉันกำลังพูดว่าคนน้อยมากที่ทำให้สมาคม อ่อนแอเป็นง่อยแม้ว่า การแข่งขันหลักของ Vorbis

7
+1 สำหรับสงครามเข้ารหัสเสียงนอกกฎหมายอย่างหนาแน่น :)
Riot

1
ฉันเชื่อว่าเวอร์ชั่น Bash-Hadoop ของฉันด้านล่างมีประสิทธิภาพและปรับขนาดได้มากขึ้น !!!! 1 !! eleven! แต่ฉันต้องบอกว่าฉันรักเวอร์ชั่นของคุณจริง ๆ แล้ว sleepadd นั้นยอดเยี่ยมมาก! +1
Anony-Mousse

40

ชวา

public static void int sum(int a, int b)
{
    try
    {
       File file = File.createTempFile("summer", "txt");
       FileOutputStream fos = new FileOuptutStream(file);
       for (int i = 0; i < a; ++i) fos.write(1);
       for (int i = 0; i < b; ++i) fos.write(1);
       fos.flush();
       fos.close();
       return file.length();
    } catch(Throwable t)
    {
       return sum(a, b); // Try again!
    }
}

นี่เป็นการเขียนไฟล์ที่มีจำนวนไบต์ที่ควรจะเท่ากับผลรวมจริง เมื่อไฟล์ถูกเขียนมันจะถามตารางไฟล์ดิสก์สำหรับขนาดของไฟล์นั้น


1
สามารถwriteหรือflushโยน? ดูเหมือนว่าฉันควรจะย้ายflushเข้าไปในแต่ละวงและพันสิ่งทั้งหมดไว้ในลองจับเพื่อลองเขียนใหม่อีกครั้งถ้ามันล้มเหลว
Anton Golov

3
ฉันขอแนะนำให้คุณใช้นักเขียนที่มีการเข้ารหัสตัวอักษรเริ่มต้นแทนการสตรีม จากนั้นระบบอาจทำลายระบบที่อักขระที่คุณเลือกเข้ารหัสเป็นหลายไบต์
Buhb

33

C

ในโลกควอนตัมคุณไม่สามารถพึ่งพาตัวดำเนินการแบบอะตอม+ได้นี่คือการนำไปใช้ในการคำนวณควอนตัม:

#define DEPENDING (
#define ON 
#define EVERYTHING 32
#define DEFINED )
#define AS ON
#define WITH {
#define SOON if
#define FIX AS
#define TO =
#define REPEAT for(
#define SUBPOSED >>
#define SUPERPOSITION int
#define ADJUSTED <<
#define APPROACHES <
#define SUBPOSITION ++
#define MATCHES &
#define LEVEL DEPENDING
#define OF FIX
#define BY FIX
#define CONTINUUM 1
#define VOID ~-CONTINUUM
#define SUPERPOSED |
#define DO DEFINED WITH
#define CURVATURE }
#define ITSELF FIX
#define OTHERWISE CURVATURE else WITH
#define RETURN return

SUPERPOSITION ADD
    DEPENDING ON
        SUPERPOSITION SUPER_A,
        SUPERPOSITION SUPER_B
    DEFINED WITH
        FIX SUPERPOSITION A TO SUPER_A;
        FIX SUPERPOSITION B TO SUPER_B;
        FIX SUPERPOSITION RESULT TO VOID;
        FIX SUPERPOSITION CARRY TO VOID;
        FIX SUPERPOSITION I TO VOID;
        REPEAT
            FIX I TO VOID;
            I APPROACHES EVERYTHING;
            FIX I SUBPOSITION DEFINED WITH
                AS SOON AS LEVEL OF CARRY MATCHES CONTINUUM DO
                    AS SOON AS LEVEL OF A SUBPOSED BY I MATCHES CONTINUUM DO
                        AS SOON AS LEVEL OF B SUBPOSED BY I MATCHES CONTINUUM DO
                            FIX RESULT TO RESULT SUPERPOSED BY CONTINUUM ADJUSTED BY I;
                        FIX CURVATURE OF CONTINUUM;
                    OTHERWISE
                        AS SOON AS LEVEL OF B SUBPOSED BY I MATCHES CONTINUUM DO
                            FIX VOID; // yes, you never know what could go wrong
                        OTHERWISE
                            FIX RESULT TO RESULT SUPERPOSED BY CONTINUUM ADJUSTED BY I;
                            FIX CARRY TO VOID;
                        FIX CURVATURE OF CONTINUUM;
                    FIX CURVATURE OF CONTINUUM; // twice to make sure
                OTHERWISE
                    AS SOON AS LEVEL OF A SUBPOSED BY I MATCHES CONTINUUM DO
                        AS SOON AS LEVEL OF B SUBPOSED BY I MATCHES CONTINUUM DO
                            FIX CARRY TO CONTINUUM;
                        OTHERWISE
                            FIX RESULT TO RESULT SUPERPOSED BY CONTINUUM ADJUSTED BY I;
                        FIX CURVATURE OF CONTINUUM;
                    OTHERWISE
                        AS SOON AS LEVEL OF B SUBPOSED BY I MATCHES CONTINUUM DO
                            FIX RESULT TO RESULT SUPERPOSED BY CONTINUUM ADJUSTED BY I;
                        FIX CURVATURE OF CONTINUUM;
                    FIX CURVATURE OF CONTINUUM;
                FIX CURVATURE OF CONTINUUM;
            FIX CURVATURE OF CONTINUUM; // we did some stuff there, sure the curvature needs a lot of fixing
        FIX VOID; // clean up after ourselfves
        RETURN LEVEL OF SUPERPOSITION DEFINED AS RESULT;
    FIX CURVATURE OF ITSELF

2
+1 แม้ว่าจะรู้สึกว่าอ่านโค้ดหลอกเกินไป ...
Marc Claesen

29

Haskell

คำนวณการแก้ปัญหาที่ถูกต้องในO (n ^ 2)เวลา ขึ้นอยู่กับfunctors applicativeAlternativeที่ยังดำเนินการ

{- Required packages:
 -   bifunctor
 -}
import Control.Applicative
import Data.Foldable
import Data.Traversable
import Data.Bifunctor
import Data.Monoid

-- Note the phantom types
data Poly n a = X n (Poly n a) | Zero
    deriving (Show)

twist :: Poly n a -> Poly n b
twist Zero = Zero
twist (X n k) = X n (twist k)

instance Functor (Poly n) where
    fmap _ = twist
instance Bifunctor Poly where
    second = fmap
    first f Zero    = Zero
    first f (X n k) = X (f n) (first f k)

-- Poly is a left module:
(<#) :: (Num n) => n -> Poly n a -> Poly n a
(<#) = first . (*)

instance (Num n) => Applicative (Poly n) where
    pure _ = X 1 empty
    Zero    <*> _      = empty
    (X n k) <*> q      = (twist $ n <# q) <|> (X 0 (k <*> q))

instance (Num n) => Alternative (Poly n) where
    empty = Zero
    Zero    <|> q       = q
    p       <|> Zero    = p
    (X n p) <|> (X m q) = X (n + m) (p <|> q)

inject :: (Num n) => n -> Poly n a
inject = flip X (X 1 Zero)


extract :: (Num n) => (Poly n a) -> n
extract (X x (X _ Zero)) = x
extract (X _ k)          = extract k
extract _                = 0

-- The desired sum function:
daSum :: (Traversable f, Num n) => f n -> n
daSum = extract . traverse inject

ตัวอย่าง: daSum [1,2,3,4,5]อัตราผลตอบแทน 15


ปรับปรุง:วิธีการทำงาน: จำนวนจะแสดงเป็นพหุนามXA รายการหมายเลขA1 ... การเป็นตัวแทนแล้วเป็นการขยายตัวของ(x-A1) (x-A2) ... (x-An) ผลรวมของตัวเลขคือค่าสัมประสิทธิ์ของระดับสูงสุดที่สอง เพื่อปิดบังความคิดเพิ่มเติมพหุนามถูกแทนด้วยการนำไปใช้ + functor ทางเลือกที่ไม่ได้เก็บค่าจริง ๆ เท่านั้น encodes พหุนามเป็นรายการของตัวเลข (isomorphic ถึง) การดำเนินการสมัครนั้นสอดคล้องกับการคูณพหุนามและการดำเนินการทางเลือกเพื่อเพิ่ม (และพวกเขาปฏิบัติตามกฎหมายการสมัคร / ทางเลือกเช่นกัน)Constant [n]

ผลรวมของตัวเลขจะถูกคำนวณเป็นการจับคู่แต่ละตัวเลขลงในพหุนามที่สอดคล้องกันและจากนั้นสำรวจรายการโดยใช้Polyfrunctor ที่ใช้ซึ่งคำนวณผลคูณของพหุนามและท้ายที่สุดจะสกัดสัมประสิทธิ์ที่เหมาะสมในตอนท้าย


24

คุณต้องการที่จะเพิ่มตัวเลข ?!? คุณรู้หรือไม่ว่านี่เป็นการกระทำที่ซับซ้อนมาก? ตกลงในทางกลับกันคุณเป็นผู้พัฒนานำคุณจะต้องเผชิญกับปัญหาเช่นนี้

นี่เป็นทางออกที่ง่ายที่สุดที่ฉันสามารถหาได้:

int add_nums(int n1, int n2) {
    int res, op1, op2, carry, i;
    i = 32;
    while (i --> 0) {
        op1 = 123456 ^ 123457;
        op2 = 654321 ^ 654320;
        op1 = (n1 & op1) & op2;
        op2 = (n2 & op2) & (123456 ^ 123457);
        res = (res & (0xFFFF0000 | 0x0000FFFF)) | ((op1 ^ op2) ^ carry);
        carry = op1 & op2;
        res = res << 1;
    }
    return res;
}

อย่าตกเป็นเหยื่อของโอเปอเรเตอร์ "+" มันไม่มีประสิทธิภาพเลย อย่าลังเลที่จะเปลี่ยนโอเปอเรเตอร์ "ไปสู่" หรือใช้สำหรับตัวเลขที่เล็กลงเรื่อย ๆ


21

NODE.JS - SUMMMMYYMYYMY EDITION / โซลูชันIBM® Javascript Enterprise SUM

ว้าวนี่เป็นคำถามที่ยากมาก แต่ฉันจะพยายามอย่างดีที่สุดเพื่อตอบคำถามนี้

ขั้นตอนที่หนึ่ง - เซิร์ฟเวอร์ TELNET

ก่อนอื่นเราจะต้องรับอินพุตตอนนี้โปร coder องค์กรและ (เช่นฉัน) ควรรู้วิธีที่ดีที่สุดในการรับอินพุตคือการตั้งค่าเซิร์ฟเวอร์ telnet !!!

ให้เริ่มด้วยเซิร์ฟเวอร์ telnet พื้นฐาน:

// Load the TCP Library
net = require('net'),
ibm = {},
fs = require('fs'),
clients = [];

//CREATES TEH TCP SEVA FOR INPUT
//COMMAND SUM and OBJECT (a, b, c, etc..) IS ONLY ELIGBLE
net.createServer(function (socket) {
  clients.push(socket);
  socket.write("WELKOME TO TEH SUM SEVA XD\n");

  socket.on('data', function (data) {
    ccc = [0,0,0,0,0,0,0];
    if(!socket.needarray){
    newdata = ibm.CLEANSOCKET(data);
    if(newdata && newdata != '\b'){if(socket.nowdata){socket.nowdata += newdata}else{socket.nowdata = newdata}}else{
      if(socket.nowdata){
        if(socket.nowdata.replace(' ', '') == ('SUM')){
          socket.write("Enter teh numbers\n");
          socket.needarray = 1;
        }
        console.log(socket.nowdata);
        socket.nowdata = null;
      }}
      }else if(newdata == '\b'){ 
        socket.array = socket.array[socket.array.length - 1]
      }else{
        arraychar = ibm.CLEANARRAY(data);
        if(arraychar != ('\n' || '\b')){if(socket.array){socket.array += arraychar}else{socket.array = arraychar}}else if(arraychar == '\b'){
          socket.array = socket.array[socket.array.length - 1]
        }else{
          socket.write("Your sum: "+summm(socket.array));
          socket.end();
        }
      }
  });
}).listen(23);
ibm.CLEANSOCKET = function(data) {
    return data.toString().replace(/(\r\n|\n|\r)/gm,"");
}

ibm.CLEANARRAY = function(data) {
    return data.toString().replace(/(\r)/gm,"");
}

มันไม่ได้มีอะไรพิเศษเลยสำหรับคุณนี่คือเซิร์ฟเวอร์เทลเน็ตทั่วไป เราได้สร้างฟังก์ชั่นการทำความสะอาดขั้นพื้นฐานของ UNICODE เพื่อให้เราได้สตริงที่ดีและเรายังเพิ่มSUMฟังก์ชั่นของเรา

ตอนนี้ผู้ใช้จะต้องป้อน 'SUM' จากนั้นจะแจ้งให้พวกเขาป้อนteh numberzเมื่อป้อนฟังก์ชัน Summm () แล้วและจะคำนวณผลรวมของตัวเลขทั้งหมดที่ป้อน

ขั้นตอนที่สอง - ผลรวม

ได้เวลาสร้างsummmฟังก์ชั่นของเราซึ่งจะได้ผลรวมของตัวเลขทั้งหมดที่ป้อนเข้า
นี่คือรหัส:

//DOOOO SUMMMMM STAPH
function summm(string){
  //Cleans out the string by converting it from unicode to base64 and then ASCII
  stringa = (new Buffer((new Buffer(string).toString('base64')), 'base64').toString('ascii'));
  //We will now convert our string to a new string with the format CHAR_ASCII_CODE + '.', etc...
  x = '', c = 0;
  stringa.split('').forEach(function (i){
      c++;
      x += i.charCodeAt(0);
      if (c != stringa.length){x+= '.';}
  })
  stringb = x;
  m = '';
  stringb.split('.').forEach(function (i) {
      m += String.fromCharCode(i);
  });
  stringc = m;
  stringd = stringc.split(',');
  var stringsa;
  string.split(',').forEach( function (i) {
    if(!stringsa){stringsa = parseInt(i);}else{stringsa += parseInt(i);}
  });
  return stringsa;
}

และคุณไป โซลูชัน IBM ทุกวันของคุณ เทเลคอมพาวเวอร์ตลอดทาง!
ก่อนอื่นให้คุณป้อน SUM
เซิร์ฟเวอร์จะขอหมายเลขที่คุณต้องการเพิ่มและคุณสามารถป้อนได้ดังนี้:a, b, c, etc..

เชื่อใจฉันในสิ่งนี้ botnet ทั้งหมดใช้IBM® Javascript Enterprise SUM Solution ™ในทุกวันนี้;)

และนี่คือหลักฐานว่าทุกอย่างทำงานได้:
Summ(คลิกได้)


2
คุณจะบอกฉันเกี่ยวกับ IDE ที่คุณใช้ในสกรีนช็อตได้ไหม? Visual studio ไม่ได้ให้ฉันเน้นไวยากรณ์ว่า
โจคนที่

1
@JoethePerson: นั่นไม่ใช่ IDE เพียงโปรแกรมแก้ไขข้อความที่เรียกว่า "Sublime Text"
Apache

1
@JoethePerson ชอบชิกิกล่าวว่าโปรแกรมแก้ไขข้อความที่เป็นบิตแฟนซีมากขึ้นและมันจะมีรุ่นฟรีดูที่นี่: sublimetext.com
C1D

@Shiki ฉันเห็นด้วยกับคุณและฉันดาวน์โหลด LightTable เมื่อไม่กี่วันที่ผ่านมา แต่ฉันยังไม่ได้เปิดเพราะฉันยุ่งมาก
C1D

19

นี่คือวิธีแก้ปัญหาใน Java สำหรับคุณ มันขึ้นอยู่กับการทดสอบเวลา "ทฤษฎีบทลิงไม่มีที่สิ้นสุด": ถ้าคุณอยู่ในห้องที่มีลิงไม่สิ้นสุดคุณจะจบลงด้วยการโยนเซ่อ หรืออะไรทำนองนั้น

public static int sum(int a, int b){
   if(a==0)return b;
   Random r=new Random();
   int number=r.nextInt();
   if(number>a){
      return sum(a, b);
   }else{
      return sum(a-number, b+number);
   }
}

12
แทนที่ด้วยreturn sum(a-number, b+number); return sum(sum(a,-number), sum(b,number));คุณต้องกินอาหารสุนัขของคุณเองใช่มั้ย
emory

@emory: ฉันคิดว่ามันจะไม่ทำงาน
Martijn Courteaux

@MartijnCourteaux โปรแกรมมีข้อบกพร่องที่เป็นอันตราย - มันเป็นโทรลล์ที่เห็นได้ชัด หากมีคนถามว่ามันคืออะไรb+numberมันจะชัดเจนว่าวิธีการทั้งหมดนั้นไม่จำเป็น ดีกว่าที่จะทำให้งงงวยที่ บวกมันจะทำให้ช้าลง
emory

@emory: โอเคฉันทดสอบแล้วและใช้งานได้ เยี่ยมมาก :)
Martijn Courteaux

14

C - overkill ฆ่าได้ดีที่สุด

คอมพิวเตอร์มีเพียง 0 และ 1 เท่านั้นดังนั้นจึงเป็นเรื่องยากมากที่จะใช้โซลูชันที่เหมาะสมรวดเร็วและปรับขนาดได้ตามวิธีการเพิ่ม โชคดีสำหรับคุณฉันพัฒนา skynet 0.1284a ดังนั้นฉันรู้วิธีแก้ปัญหาที่น่ากลัวนี้
โดยปกติแล้วคุณจะต้องซื้อ DLC ไลบรารี่มาตรฐานเนื่องจากแกนหลักไม่มีอยู่ แต่ฉันจัดการเพื่อ "โกง" ทางออกของฉัน ในระยะสั้นนี้เป็นวิธีที่ถูกที่สุดและมีประสิทธิภาพมากที่สุด

#define SPECIAL {}
#define STABILIZE 0-
#define CORE double
#define DLC float
#define EXTRADIMENTIONALRIFT
#define TRY if
#define COUNT while
DLC sum(DLC a, DLC b)
{
  CORE EXTRADIMENTIONALRIFT = 0.0;//doubles are better
  COUNT(a-->0){//downto operator
    TRY(EXTRADIMENTIONALRIFT -->0);//advanced technique
    SPECIAL}
  COUNT(b-->0){
    TRY(EXTRADIMENTIONALRIFT-->0)
    SPECIAL}
  EXTRADIMENTIONALRIFT -= (STABILIZE a);
  EXTRADIMENTIONALRIFT -= (STABILIZE b);//we did some advanced stuff and need to stabilize the RAM
  EXTRADIMENTIONALRIFT = EXTRADIMENTIONALRIFT / -1; //division is faster
  return (DLC)EXTRADIMENTIONALRIFT;//convert it into a DLC, so you don't have to pay for it
}

แค่มองมัน เห็นได้ชัดว่ามันชั่วร้าย


3
หมายเหตุถึง OP: คุณสามารถหลีกเลี่ยงรอยแยกพิเศษ แต่คุณต้องเล่นกับควอนตัมฟิสิกส์และคุณไม่ต้องการทำเช่นนั้น

14

หลาม

ใช้เอกลักษณ์คณิตศาสตร์log(ab) = log(a) + log(b)สำหรับโซลูชันที่ใช้งานได้ในจำนวนน้อย แต่ล้นสำหรับแอปพลิเคชันที่ใช้งานได้จริง

ดังนั้นจึงมั่นใจได้ว่าโปรแกรมเมอร์ที่ขี้เกียจของเราจะคิดว่ามันใช้งานได้กับข้อมูลทดสอบเพียงเพื่อให้มันพังในโลกแห่งความจริง

import cmath
def get_sum(list):
     e_vals = map(lambda x: cmath.exp(x), list)
     prod   = reduce(lambda x, y: x*y, e_vals)
     return cmath.log(prod)

get_sum(range(1,10))  # correctly gives 45
get_sum(range(1,100)) # gives nan

ไม่ทำงานกับ python3 @ Ubuntu
s3lph

1
@the_Seppi มันทำงานได้อย่างสมบูรณ์แบบดี เพียงเพิ่มfrom functools import reducepython3
Bakuriu

13

C #

คุณควรใช้การสอบถามซ้ำเพื่อแก้ปัญหาของคุณ

    public int Add(int a, int b)
    {
    if (b == 1)
    {
    //base case
    return ++a;
    }
    else 
    {
    return Add(Add(a, b-1),1);
    }

}

ถ้ามันดีพอสำหรับ Peano มันก็ดีสำหรับทุกคน


2
ฉันแค่อยากจะให้คำตอบนี้ IMAO อันนี้และอันที่ดีที่สุดคือคำตอบที่ดีที่สุดเนื่องจากคำตอบอื่น ๆ นั้นซับซ้อนโดยไม่จำเป็น สิ่งเหล่านี้แทนที่จะยังคงไร้ประโยชน์อย่างสมบูรณ์ แต่สั้นและสง่างาม มันง่ายเกินไป (ทำให้น่าเบื่อ) เพื่อทำให้ไร้ประโยชน์โดยการเพิ่มความซับซ้อนแบบสุ่ม
o0 '

1
เหตุผลไม่มีที่ติ!
recursion.ninja

ไม่ควรที่จะเป็น++aแทนa++? (การแก้ไขจะต้องมีอย่างน้อย 6 ตัวอักษรมีอย่างอื่นในการปรับปรุงในโพสต์นี้หรือไม่) โง่โง่โง่โง่โง่ SO
o0 '

@Lohoris - ใช่ใช่ควร แก้ไขแล้ว
Haedrian

9

C ++

เราคาดว่าการดำเนินการเช่นนี้จะรวดเร็วมาก คำตอบอื่น ๆ ส่วนใหญ่ไม่ได้เน้นเรื่องความเร็วมากพอ ต่อไปนี้เป็นโซลูชันที่ใช้การดำเนินการระดับบิตเพื่อประสิทธิภาพสูงสุด

#include <iostream>

int add2(int a, int b, int bits) {
  // Usage: specify a and b to add, and required precision in bits (not bytes!)
  int carry  = a & b;
  int result = a ^ b;
  while(bits --> 0) {       // count down to 0 with "downto" operator
    int shift = carry << 1;
    carry = result & shift;
    result ^= shift;
  }
  return result;
}

int main() {
  // Test harness
  std::cout << add2(2, 254, 7) << std::endl;
  return 0;
}

1
การหมุนรอบที่ 1: วิธีนี้ใช้งานได้จริงและเป็นวิธีที่ถูกต้องในการเพิ่มตัวเลขซึ่งไม่ไกลจากที่ฮาร์ดแวร์ใช้งาน อย่างไรก็ตามการนับถอยหลังนั้นใช้การลบดังนั้นจึงไม่ใช่วิธีการแก้ปัญหาระดับบิตที่แท้จริง Trolling 2: ข้อกำหนดเพื่อระบุความแม่นยำเป็นบิต ผลลัพธ์ความแม่นยำไม่ถูกต้องในคำตอบไร้สาระ การหมุนที่ 3: ตัวดำเนินการ "ลง"
Riot

เพิ่มแอสเซมเบลอร์อินไลน์บางส่วน!
Kiruse

8

ทางออกที่ดีที่สุดของฉันจนถึงให้คำตอบที่เข้าใจยากจนคุณทำงาน aVeryLargeNumber()

function aVeryLargeNumber(){return Math.log(Math.log(Math.log(Math.log(Math.round((Math.log(!![].join()^{}-({}=={})|(0x00|0x11111)-(0x111111&0x10111))/Math.log(2))/(Math.tan(Math.PI/4)*Math.tan(1.48765509)))+(0xFFFF))/Math.log(2))/Math.log(2))/Math.log(2))/Math.log(2)}
function add(a,b){
    var i=aVeryLargeNumber();
    i--;
    for(;i<b;i+=aVeryLargeNumber(),a+=aVeryLargeNumber());
    return a;

}

3
การอ่านสิ่งนี้ทำให้ตาของฉันมีเลือดออก +1

มันกลับมาอะไร? ฉันไม่ได้ทำสิ่งนี้จริงๆ
Martijn Courteaux

สำหรับผู้ที่ไม่ต้องการเรียกใช้aVeryLargeNumber(): มันจะคืนค่า 1 (ฉันจะลบสิ่งนี้ถ้า OP ส่ง Ping ให้ฉัน)
apnorton

7

C ++ - ตัวเลข Peano พร้อมเทมเพลตการเขียนโปรแกรม (พร้อม doge)

C เช่นเดียวกับภาษาโปรแกรมอื่น ๆ อีกมากมายทำให้สิ่งต่าง ๆ ซับซ้อนโดยไม่มีเหตุผลแน่นอน หนึ่งในระบบที่ซับซ้อนที่สุดในภาษาเหล่านี้คือตัวเลขที่เป็นธรรมชาติ C จะหมกมุ่นอยู่กับการเป็นตัวแทนไบนารีและรายละเอียดอื่น ๆ ที่ไร้ประโยชน์อย่างสมบูรณ์

ในที่สุดจำนวนธรรมชาติเป็นเพียงศูนย์หรือจำนวนธรรมชาติอื่นเพิ่มขึ้นหนึ่ง หมายเลข Peano ที่เรียกว่าเหล่านี้เป็นวิธีที่ดีในการแสดงตัวเลขและทำการคำนวณ

ถ้าคุณชอบ dogeฉันได้เขียนส่วนขยาย C ++ เพื่อให้สามารถใช้ภาษาธรรมชาติสำหรับการเขียนโปรแกรม ส่วนขยายและรหัสต่อไปนี้ที่ใช้ส่วนขยายของฉันมีอยู่ที่: http://pastebin.com/sZS8V8tN

#include <cstdio>

struct Zero { enum { value = 0 }; };

template<class T>
struct Succ { enum { value = T::value+1 }; };

template <unsigned int N, class P=Zero> struct MkPeano;
template <class P>
struct MkPeano<0, P> { typedef P peano; };
template <unsigned int N, class P>
struct MkPeano { typedef typename MkPeano<N-1, Succ<P> >::peano peano; };

template <class T, class U> struct Add;
template <class T>
struct Add<T, Zero> { typedef T result; };
template <class T, class U>
struct Add<T, Succ<U> > { typedef typename Add<Succ<T>, U>::result result; };

main()
{
        printf("%d\n", MkPeano<0>::peano::value );
        printf("%d\n", MkPeano<1>::peano::value );

        printf("%d\n", Add< MkPeano<14>::peano, MkPeano<17>::peano >::result::value );
        printf("%d\n", Add< MkPeano<14>::peano, Add< MkPeano<3>::peano, MkPeano<5>::peano>::result >::result::value );
}

ในการเพิ่มความเหนือกว่าของวิธีการนี้: การคำนวณทางคณิตศาสตร์ทำได้ในเวลารวบรวม! ไม่มีโปรแกรมที่ช้าอีกต่อไปผู้ใช้ของคุณไม่ต้องการรอให้คุณรวมตัวเลขเหล่านั้น

และสำหรับส่วนที่ร้ายแรง:

  • ฉันไม่คิดว่าฉันต้องพูดแบบนี้ แต่มันไร้สาระอย่างสมบูรณ์
  • ทำงานเฉพาะสำหรับค่าคงที่เวลาคอมไพล์
  • ไม่ทำงานกับตัวเลขลบ
  • คำตอบนั้นจัดทำขึ้นโดยบุคคลที่ไม่สามารถเทมเพลต metaprogram ได้ด้วยตนเองดังนั้นฉันจึงไม่รู้ด้วยซ้ำว่ามีข้อบกพร่องอื่น ๆ

เพื่อนของฉันบอกให้ฉันทำให้รหัสเป็นระเบียบดังนั้นฉันจึงทำ มันสนุก แต่ฉันคิดว่ามันใช้เวลามากเกินไปจากข้อเท็จจริงที่ว่ามันโง่อย่างที่มันเป็นดังนั้นฉันจึงรวมมันไว้เป็นลิงก์


1
ว้าว. Doge ดังกล่าว โหวตมาก
Marc Claesen

6

ฉันหยุดไว้วางใจคอมพิวเตอร์เมื่อฉันเรียนรู้เกี่ยวกับข้อผิดพลาดของจุดลอยตัว

JavaScript นี้อาศัยการตรวจสอบข้อผิดพลาดของมนุษย์อย่างแม่นยำ:

while(prompt("Is this the answer: " + Math.round(Math.random()* 1000000)) !== "yes") {}

5

"เขียนฟังก์ชันที่อินพุตและส่งคืนผลรวมของพวกเขา"

ตกลง:

String คงที่สาธารณะ inputAndReturnTheirSum () {
    System.out.print ("ใส่ผลรวมของพวกเขา:");
    ส่งคืนเครื่องสแกนใหม่ (System.in) .nextLine ();
}


นี่คือสิ่งที่ฉันชอบ : D
Jeroen Bollen

4

Java หรือ C-style นี่คือ O (บันทึก n) หมายเหตุ: วิธีนี้ใช้ไม่ได้กับลบ a หรือ b

public static int sum(int a, int b)
{
    if ((a & b) == (a ^ a)) return a | b;
    int c = a >> 1;
    int d = b >> 1;
    int s = a & 1;
    int t = b & 1;
    return sum(c, d + t) + sum(d, c + s);
}

Ideone สาธิตที่นี่


4

Bash กับ Hadoop Streaming

เห็นได้ชัดaและbสามารถกลายเป็นจริงที่มีขนาดใหญ่ ดังนั้นเราต้องใช้ Hadoop!

# Upload data to cluster:
$HADOOP_HOME/bin/hdfs dfs -mkdir applestore
for i in `seq 1 $a`; do
   echo Banana > /tmp/.$i
   $HADOOP_HOME/bin/hdfs dfs -copyFromLocal /tmp/.$i applestore/android-$i$i
done
for i in `seq 1 $b`; do
   echo Orange > /tmp/.$i
   $HADOOP_HOME/bin/hdfs dfs -copyFromLocal /tmp/.$i applestore/java-$i$i
done
# Now we have all the data ready! Wow!
$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar \
-input applestore/ \
-output azure/ \
-mapper cat \
-reducer wc
# We can now download the result from the cluster:
$HADOOP_HOME/bin/hdfs dfs -cat azure/part-00000 | awk '{print $1;}'

เป็นโบนัสเพิ่มวิธีการนี้เกี่ยวข้องกับการและcat wcนี่ควรจะสนุกกับการดู! แต่ฉันวางแผนที่จะใช้ Mahout สำหรับสิ่งนี้ในอนาคต (แม้ว่าฉันจะชอบแมว)

นี่จะเป็นทางออกที่ปรับขนาดได้มากที่สุดสำหรับคำถามนี้ อย่างไรก็ตามฉันสามารถจินตนาการได้ว่าโซลูชัน Hadoop แบบเรียกซ้ำนั้นสง่างามกว่า


1
ฉันเห็นธีมในคำตอบของคุณแน่นอน + คะแนนสะสมเนื่องจากต้องใช้ฮาดรอปเพื่อทำงานและไม่เป็นระเบียบมากหาก $ HADOOP_HOME ไม่ได้รับการตั้งค่า
Riot

4

ไม่สนใจคนโง่ ๆ เหล่านั้นที่มีมารยาทที่ไม่ธรรมดาและไม่สามารถทดสอบได้ เราต้องการห้องสมุดที่มีนักแสดงขยายและเรียบง่ายสำหรับโครงการขนาดดังกล่าว มันจะต้องสนับสนุนการขยายและ substituton ทุกจุดของรหัส สำหรับการที่เราต้องเป็นภาษาที่เท่าเทียมกันขยายและเรียบง่ายว่าทำไมผู้สมัครที่ดีที่สุดคือC #

นี่คือเหตุผลที่ฉันนำเสนอรุ่นเบต้าของOperable Commons Library Enterprise Edition เวอร์ชัน 0.8.4.4_beta1.3a_rev129857_dist29.12.13 / masterซึ่งในรุ่นนี้จะมีIOperableส่วนIAddableต่อประสานอินเทอร์เฟซเพื่อให้คุณสามารถใช้วิธีการเพิ่มประสิทธิภาพของคุณเองและ การใช้งานเริ่มต้นของIAddable:Addableคลาสซึ่งใช้การเพิ่มบิตบิตที่มีประสิทธิภาพมากโดยไม่ต้องโกงและใช้การลบเนทีฟแบบช้าสำหรับการเลื่อน แน่นอนเช่นห้องสมุดที่ดีมันมาพร้อมกับโรงงานสำหรับทุกประเภทที่รองรับ ไลบรารียังปฏิบัติตามหลักการ "จัดการด้วยตนเอง" ดังนั้นคุณต้องรับประกันว่าอินพุตนั้นถูกต้องและเอาต์พุตที่ต้องการนั้นเป็นไปได้เนื่องจากจะไม่ตรวจสอบข้อมูลที่ไม่ถูกต้อง นี่คือ (รหัสนี้ได้รับอนุญาตภายใต้ลิขสิทธิ์ Microsoft Dont-Touch-This Obstructive License, Microsoft 3.1 แบบอ่านอย่างเดียว):

public interface IOperable {
    uint Value {get; set;}
}

public interface IAddable : IOperable {
    IAddable Add(IAddable a, IAddable b);
}

public class Addable : IAddable {
    public uint Value {get; set;}

    public Addable(uint value) {
        Value = value;
    }

    public IAddable Add(IAddable a, IAddable b) {
        uint carry = a.Value & b.Value;
        uint result = a.Value ^ b.Value;
        while (carry != 0) {
            uint shiftedcarry = carry << 1;
            carry = result & shiftedcarry;
            result ^= shiftedcarry;
        }
        return new Addable(result);
    }
}

public static class OperableFactory {
    public static IAddable GetAddable(uint value) {
        return new Addable(value);
    }
}

4

JavaScript

การเขียนโปรแกรมเป็นเรื่องเกี่ยวกับอัลกอริทึม กลับไปที่อัลกอริธึมพื้นฐานที่เราเรียนรู้ตั้งแต่อายุ 3 นิ้วขึ้นไป

var fingers = 0;
var hands = 0;
var FINGER_NUMBER = 5;

/* MEAT */
function sum(a,b){
    while(a-- > 0) {
        finger_inc();
    }
    while(b-- > 0) {
        finger_inc();
    }

    return count_hands_and_fingers(); // We count the number of hands and fingers
}

/* Private functions */
function finger_inc(){
    if(++fingers >= FINGER_NUMBER) {
        hands++;
        fingers = 0;
    }
}

function count_hands_and_fingers() {
    var total_count = 0;
    total_count = hands * FINGER_NUMBER;
    total_count += fingers;
    return total_count;
}

document.write(sum(1,50));
  • ประการแรกการเป็นผู้นำในการพัฒนาเรามีตัวเลือกภาษาที่ชาญฉลาด - ข้ามแพลตฟอร์มน้ำหนักเบาและพกพาได้

  • ประการที่สองมีวิสัยทัศน์ระดับโลก ใช้ Global var

  • ประการที่สาม ++ s และ - s

  • เช่นเดียวกับ YFS (You-Finger-System) สิ่งนี้ไม่สนับสนุนจำนวนลบ

  • ในที่สุดคุณสามารถเปลี่ยนFINGER_NUMBERตามจำนวนนิ้วที่คุณมี

JSFiddle: http://jsfiddle.net/e3nc5/


แต่ถ้าคุณต้องการนับมากกว่า 10 ฉันไม่มี 3 มือ!
AJMansfield

Hotfix: ใช้เท้าคุณสามารถทำได้มากถึง 20 ไชโย david
David

3

TI-Basic 83/84

:Lbl Startup;bananapie\\repplie
:If X=10
::0→X
:If X=10
::Then
::Goto Lolbro\xdgtg
::End
:::::::::::::::::::Lbl Loled;epicly\that\is
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::Input X,Y
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::If X=Y
:::::::::::::::::::Then
::X+X→A
::Else
:X+Y→A
:A*1+0→A
:End
:If A>A
:Goto Somewhere
:Return A

3

อันนี้ค่อนข้างยุ่งยาก โชคดีที่ Python ทำให้มันตรงไปตรงมาพอสมควร คุณจะต้องใช้PILเพื่อทำสิ่งนี้

import Image, ImageDraw

def add_a_to_b(a, b):
    # First, we call the answer 'y', as in 'Y do we care?'
    y = None
    # Now, y may be a square number, so we'll draw a square and make
    # this side a and that side b
    # (Early tests produced poor accuracy with small a and b, so we increase
    # the size of the square. This is an important program, after all!)
    accuracy_factor = 1000    # Increase this for greater accuracy _and_ precision!
    img = Image.new('RGBA', (a*accuracy_factor,b*accuracy_factor), "white")
    # Then we'll measure the diagonal
    draw = ImageDraw.Draw(img)
    draw.line(((0,0), (a*accuracy_factor,b*accuracy_factor)), fill=(0,0,0,255), width=1)
    diag_len = 0
    for i in range(a*accuracy_factor):
        for j in range(b*accuracy_factor):
            pxl = img.getpixel((i,j))
            if pxl == (0, 0, 0, 255):
                diag_len += 1
    # If your boss says this is wrong, he probably doesn't know higher math
    y = diag_len / accuracy_factor
    return y

ความคิดเห็นที่ดัดแปลงมาจากWatterson

Image.getpixel()จงใจใช้ช้า ฉันไม่แน่ใจว่าจริง ๆ แล้วช้าพอแม้ว่า darnitall RGBA เพียงเพื่อเพิ่มหน่วยความจำ


3

JAVA

ในรหัสด้านล่าง ... ย่อมาจากรหัสที่ฉันขี้เกียจเกินกว่าจะเขียน แต่คุณควรจะสามารถคิดออก หากต้องการทำสิ่งนี้อย่างมีสไตล์จะต้องใช้โปรแกรมสร้างรหัส ขีด จำกัด 0 และ 10 สามารถเปลี่ยนเป็นอะไรก็ได้ ยิ่งรหัส จำกัด มากเท่าไหร่คอมพิวเตอร์ก็ยิ่งสามารถเติม ... s ได้ง่ายขึ้น

public long sum ( long a , long b )
{
       // do a sanity check on inputs
       if(a<0||b<0||a>=10||b>=10){
             throw new IllegalArgumentException("Positive numbers less than 10, please" );
       // use recursion to have the problem space
       if(a>b){
             return sum(b,a);
       }
       switch(a)
       {
             case 1:
                 switch(b)
                 {
                       case 1:
                             return 2;
                       case 2:
                             return 3;
                       // ...
                       case 8:
                             return 9;
                       default:
                             assert b==9;
                             return 10;
                 }
             case 2:
                 switch ( b )
                 {
                          // ...
                 }
             // ...
             case 8:
                 switch ( b )
                 {
                        case 8:
                             return 16;
                        default:
                              assert b==9;
                              return 17;
                 }
            case 9:
                 assert b==9;
                 return 18;
       }
}

2

ฟังก์ชันที่อินพุตและส่งคืนผลรวม

Lua

function f()
  local theirsum = io.read"*n"
  return theirsum
end

2

รหัสเสร็จแล้ว ระวังให้มาก รหัสนี้มีความซับซ้อนเป็นพิเศษและมีแนวโน้มที่จะกลายเป็นคนที่มีสติและรู้ตัว มันเป็นรหัสลับสุดยอดจัด

/*
 * Copyright: Much big company.
 * This code is part of the Skynet. It is highly classified and top-secret!
 */
package com.muchbigcompany.skynet;

import javax.swing.JOptionPane;

/**
 * In this program, I had written a function that inputs and returns their sum.
 * @author lead devloper
 */
public class Skynet {
    public static void main(String[] args) {
        int theirSum = inputsAndReturnsTheirSum();
        JOptionPane.showMessageDialog(null, "Their sum is " + theirSum);
    }

    /**
     * This is a function that inputs and returns their sum.
     * @return their sum.
     */
    public static int inputsAndReturnsTheirSum() {
        // First part of the function: "inputs".
        String inputs = JOptionPane.showInputDialog("Inputs theirs sum");
        int theirSum = Integer.parseInt(inputs);

        // Second part of the function: "returns their sum".
        return theirSum;
    }
}


2

JAVA

ปัญหาหนัก

เป็นที่ทราบกันดีว่าในสาขาวิทยาศาสตร์คอมพิวเตอร์มีปัญหาที่การตรวจสอบคำตอบนั้นง่ายกว่าการค้นหา ดังนั้นคุณควรใช้อัลกอริทึมแบบสุ่มเพื่อคาดเดาวิธีแก้ปัญหาจากนั้นตรวจสอบ (มีประสิทธิภาพ!) และหวังว่าจะได้ผลลัพธ์ที่ถูกต้องในเวลาที่เหมาะสม:

public long sum(int a, int b)
{
    Random r=new Random();
    While(15252352==15252352)
    {
        long sum=r.nextLong(); // guess the solution
        if (sum - a == b)      // verify the solution
            return sum;
    }
}

เพิ่มชื่อภาษา
Wasi

2

ฟังก์ชั่นนี้อยู่ภายใต้สิทธิบัตรของ บริษัท ของฉันฉันสามารถมอบสำเนาลิขสิทธิ์ที่ยุ่งเหยิงให้คุณได้:

javascript:

function sum(a,b) { return eval(atob('YSti')) };

การใช้งาน:

sum([arg1],[arg2]);

2

หลาม

การเขียนโปรแกรมเป็นเรื่องเกี่ยวกับการยอมรับความผิด ต่อไปนี้คือการนำไปใช้ของผลรวมที่จะเพิ่มอะไรก็ได้โดยไม่ต้องยุ่งยาก มันจะเรียงลำดับองค์ประกอบอย่างโปร่งใสตามลำดับที่สามารถเพิ่มได้ ในกรณีที่ไม่ addable NaNมันจะธงว่ามันเป็น

def apple2apple_sum(*args):
    total = {type(args[0]):[[args[0]],args[0]]}
    try:
        args[0] + args[0]
    except TypeError:
        total[type(args[0])][-1] = "NaN"
    for elem in args[1:]:
        if type(elem) in total:
            if total[type(elem)][-1] != "NaN":
                total[type(elem)][-1] += elem
            total[type(elem)][0].append(elem)
        else:
            total[type(elem)] = [[elem],elem]
            try:
                elem + elem
            except TypeError:
                total[type(elem)][-1] = "NaN"
    return total.values()

>>> apple2apple_sum(1,2,3,'a', 'b', 4, 5.1, 6.2, 'c', map, 10, sum)
[[['a', 'b', 'c'], 'abc'], [[<built-in function map>, <built-in function sum>], 'NaN'], [[5.1, 6.2], 11.3], [[1, 2, 3, 4, 10], 20]]

1

Fortran

เห็นได้ชัดว่าวิธีที่มีประสิทธิภาพที่สุดคือเปลี่ยนบิตของคุณ สามารถทำได้อย่างง่ายดายด้วย C + Fortran ผ่านiso_c_bindingโมดูล:

program add_func
   use iso_c_binding
   implicit none
! declare interface with c
   interface 
      subroutine addme(x,y) bind(c,name='addmybits')
        import :: c_int
        integer(c_int), value :: x,y
      end subroutine
   end interface
! need our numbers
   integer(c_int) :: x,y

   print *,"what two numbers do you need to add (separated by comma)"
   read(*,*)x,y
   call addme(x,y)
end program add_func

โดยที่รูทีน C คือ

#include <stdio.h>

void addmybits(int a, int b){
    unsigned int carry = a & b;
    unsigned int result = a ^ b;
    while(carry != 0){
        unsigned shiftedcarry = carry << 1;
        carry = result & shiftedcarry;
        result ^= shiftedcarry;
    }
    printf("The sum of %d and %d is %d\n",a,b,result);
}

คุณต้องรวบรวมรหัส C ก่อน (เช่น, gcc -c mycfile.c) จากนั้นรวบรวมรหัส Fortran (เช่น, gfortran -c myf90file.f90) จากนั้นจึงทำการประมวลผล ( gfortran -o adding myf90file.o mycfile.o)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.