Thêm hai số


44

Đầu vào: Hai số nguyên. Tốt nhất là số nguyên thập phân, nhưng các dạng số khác có thể được sử dụng. Chúng có thể được cung cấp cho mã trong đầu vào tiêu chuẩn, làm đối số cho chương trình hoặc chức năng hoặc dưới dạng danh sách.

Đầu ra: Tổng của họ. Sử dụng định dạng tương tự cho số nguyên đầu ra như số nguyên đầu vào. Ví dụ, đầu vào 5 16sẽ dẫn đến đầu ra 21.

Hạn chế: Không có sơ hở tiêu chuẩn xin vui lòng. Đây là , trả lời với số lượng byte thắng thấp nhất.

Lưu ý: Điều này khá tầm thường, tuy nhiên tôi quan tâm để xem làm thế nào nó có thể được thực hiện. Câu trả lời có thể là một chương trình hoàn chỉnh hoặc một chức năng, nhưng vui lòng xác định đó là chương trình nào.

Các trường hợp thử nghiệm:

1 2 -> 3
14 15 -> 29
7 9 -> 16
-1 8 -> 7
8 -9 -> -1
-8 -9 -> -17

Hoặc dưới dạng CSV:

a,b,c
1,2,3
14,15,29
7,9,16
-1,8,7
8,-9,-1
-8,-9,-17

Bảng xếp hạng


26
Điều này khá tầm thường, nhưng không thực sự đơn giản hơn, ví dụ, danh mục Hello World. Cho rằng khả năng thêm số nguyên là một trong hai yêu cầu của chúng tôi đối với ngôn ngữ lập trình, tôi muốn nói rằng nó đáng để có nếu được chỉ định đúng.
Dennis

1
Câu trả lời có thể lấy đầu vào với các số 0 trước làm mặc định không? ví dụ: 5 16được nhập vào là005 016
FinW

@FinW Chắc chắn rồi. Miễn là họ không được hiểu là bát phân.
dkudriavtsev

Câu trả lời:



66

Minecraft 1.10, 221 ký tự (không cạnh tranh)

Hãy xem, đây là những gì chúng ta phải đối phó khi chúng ta tạo bản đồ Minecraft.

Ngoài ra: Không có cách nào để nhận đầu vào chuỗi trong Minecraft, vì vậy tôi gian lận một chút bằng cách bắt bạn nhập số vào chính chương trình. (Điều này hơi hợp lý vì có khá nhiều bản đồ, như Minecraft Bingo của Lorgon111, yêu cầu bạn sao chép và dán các lệnh vào trò chuyện để nhập số.)

Cảm ơn bạn abrightmoore cho bộ lọc MCEdit Khối Nhãn .

một

scoreboard objectives add a dummy
scoreboard players set m a 6
scoreboard players set n a 8
scoreboard players operation r a += m a
scoreboard players operation r a += n a
tellraw @a {"score":{"name":"r","objective":"a"}}

Không cạnh tranh do khó khăn trong đầu vào và tôi không biết làm thế nào để đếm byte trong điều này (hệ thống blytes bị thiếu sót cho các khối lệnh).


4
Đây là một trong những tốt nhất. Kinh ngạc.
dkudriavtsev

Tôi không nghĩ rằng mã hóa đầu vào là hợp lệ, nhưng tôi không biết đủ về các khối lệnh trong Minecraft để có thể phán đoán nếu có cách nào để lấy đầu vào ngoài mã hóa. Có lẽ một trong những chuyên gia Minecraft thường trú của chúng tôi có thể cân nhắc.
Mego

3
Vâng, không có đầu vào văn bản nào trong MC, ngoài "vui lòng sao chép và dán lệnh này". Một bàn phím số có thể sử dụng với / Tellraw, nhưng hầu như không thể sử dụng được tất cả các môn đánh gôn, chưa kể 500kb nhờ cú pháp rất khó hiểu của Tellraw. Tôi đoán một giải pháp thay thế sẽ là để nó đếm thứ gì đó trong thế giới, như lợn + bò, hoặc len đỏ + len xanh.
quat

1
@quat Vì chúng ta thường sử dụng phễu để đếm mọi thứ trong minecraft, tôi đoán rằng đó sẽ là con đường để đi. Một cách khác để đối phó với điều này cũng có thể thực hiện được trong đá đỏ thuần túy bằng cách sử dụng đòn bẩy. Vì chúng tôi không có bất kỳ hạn chế nào và bit là giá trị tự nhiên lớn nhất có thể đạt được trong minecraft, điều đó sẽ dẫn đến việc chỉ cần thêm hai bit với đầu ra là hai bit (khả năng : 0,1,2. Một giải pháp khác sẽ là lấy 2 byte và đầu ra trên 9 dây, nhưng sẽ ít chơi gôn hơn.
Katenkyo


39

Phép tính lambda nhị phân , 4.125 byte

Đầu vào và đầu ra là số nhà thờ .

00000000 01011111 01100101 11101101 0

Trong phép tính lambda , nó là λ m . λ n . λ f . λ x . m f ( n f x ).

Chỉ số De Bruijn : λ λ λ 4 2 (3 2 1)


Phép tính Lambda là một cách ngắn gọn để mô tả một ánh xạ (hàm).

Ví dụ, tác vụ này có thể được viết là λ x . λ y . x + y

Điều cần lưu ý là, đây không phải là lambda (hàm) có hai đối số. Đây thực sự là một lambda lồng nhau. Tuy nhiên, nó hoạt động giống như một lambda có hai đối số, vì vậy nó có thể được mô tả không chính thức như vậy. Mỗi lambda chính thức chỉ mất một đối số.

Ví dụ: nếu chúng tôi áp dụng lambda này cho 3 và 4:

x . λ y . X + y ) 3 4 (λ y . 3 + y ) 4 ≡ 3 + 4 = 7

Vì vậy, lambda đầu tiên thực sự trả lại một lambda khác.


Chữ số nhà thờ là một cách để loại bỏ các dấu hiệu phụ, chỉ còn lại các biểu tượng và biến lambda.

Mỗi số trong hệ thống Giáo hội thực sự là một lambda chỉ định số lần chức năng được áp dụng cho một mục.

Đặt hàm là f và mục là x .

Vì vậy, số 1 sẽ tương ứng với λ f . λ x . f x , có nghĩa là áp dụng f cho x chính xác một lần.

Số 3, ví dụ, sẽ là λ f . λ x . f ( f ( f x )), có nghĩa là áp dụng f cho x chính xác ba lần.


Do đó, để cộng hai chữ số Church (giả sử mn ) với nhau, nó giống như áp dụng f cho x , m + n lần.

Chúng ta có thể quan sát rằng điều này giống như lần đầu tiên áp dụng f cho x , n lần, và sau đó áp dụng f cho mục kết quả m lần.

Ví dụ: 2 có nghĩa là f(f(x))3 có nghĩa là f(f(f(x))), vì vậy 2 + 3 sẽ là f(f(f(f(f(x))))).

Để áp dụng f cho x , n lần, ta có n f x .

Bạn có thể xem mn là các hàm lấy hai đối số, không chính thức.

Sau đó, chúng tôi áp dụng lại f cho mục kết quả này, m lần: m f ( n f x ).

Sau đó, chúng tôi thêm lại bản tóm tắt để thu được λ m . λ n . λ f . λ x . m f ( n f x ).


Bây giờ, chúng ta phải chuyển đổi nó thành chỉ số De Bruijn .

Đầu tiên, chúng tôi đếm "khoảng cách tương đối" giữa mỗi biến với khai báo lambda. Ví dụ: m sẽ có khoảng cách là 4, vì nó được khai báo là 4 lambdas "trước đây". Tương tự, n sẽ có khoảng cách là 3, f sẽ có khoảng cách là 2 và x sẽ có khoảng cách là 1.

Vì vậy, chúng tôi viết nó dưới dạng trung gian này: λ m . λ n . λ f . λ x . 4 2 (3 2 1)

Sau đó, chúng tôi xóa các khai báo biến, để lại cho chúng tôi: λ λ λ 4 2 (3 2 1)


Bây giờ, chúng tôi chuyển đổi nó để tính toán lambda nhị phân .

Các quy tắc là:

  • trở thành 00.
  • m n (nhóm) trở thành 01 m n.
  • số i trở thành 1 i lần + 0, ví dụ 4 trở thành 11110.

λ λ λ λ 4 2 (3 2 1)

≡ λ λ λ λ 11110 110( 1110 110 10)

Λ λ λ 11110 110 0101 111011010

Λ λ λ 0101 111101100101111011010

00 00 00 00 0101 111101100101 111011010

000000000101111101100101111011010


18
Tôi muốn xem tệp nguồn 4.125 byte mà bạn chuyển đến trình thông dịch / trình biên dịch.
Martin Ender

8
@MartinEnder Nói điều đó với mọi câu trả lời ở đây .
Rò rỉ Nun

5
Tôi muốn xem một giải pháp 0.875 byte xin vui lòng.
Ông Lister

3
Bằng sự đồng thuận meta , trừ khi bạn có thể lưu trữ chương trình dưới dạng tệp với số lượng byte nhỏ, bạn phải làm tròn số.
Pavel

24

Lisp thông thường, 15 byte

(+(read)(read))

2
Chào mừng bạn đến với Câu đố lập trình & Code Golf!
Dennis

Tôi tương đối xa lạ với CLisp, nhưng liệu có thể xóa các khoảng trắng không? (+(read)(read))
Mego

@Mego Bạn nói đúng, điều đó là có thể. Tôi không biết điều đó bởi vì tôi cũng mới biết đến Common Lisp, cảm ơn vì thông tin này! Tôi đã chỉnh sửa nguồn
Byeonggon Lee

3
Tôi đoán cả hai chúng tôi đã học được một cái gì đó ở đây! Chào mừng bạn đến với PPCG!
Mego

21

Mèo xếp chồng , 8 + 4 = 12 byte

]_:]_!<X

Chạy với -mncờ. Hãy thử trực tuyến!

Chơi gôn trong Stack Mèo rất phản trực giác, vì vậy chương trình này ở trên đã được tìm thấy với một vài ngày cưỡng bức. Để so sánh, một giải pháp bằng văn bản, trực quan hơn bằng cách sử dụng *(...)>mẫu dài hơn hai byte

*(>-_:[:)>

với các -lncờ thay thế (xem phần dưới của bài đăng này để được giải thích).

Giải trình

Đây là một mồi trên Stack Mèo:

  • Stack Mèo là một ngôn ngữ bí truyền có thể đảo ngược, trong đó gương của một đoạn trích làm mất tác dụng của đoạn trích gốc. Các chương trình cũng phải là hình ảnh phản chiếu của chính nó - nhất thiết, điều này có nghĩa là các chương trình có độ dài chẵn là các vòng lặp không có op hoặc vô hạn và tất cả các chương trình kết thúc không tầm thường đều có độ dài lẻ (và về cơ bản là sự kết hợp của toán tử trung tâm).
  • Vì một nửa chương trình luôn được ngụ ý, một nửa có thể bị bỏ lại với -mhoặc -lcờ. Ở đây -mcờ được sử dụng, vì vậy nửa chương trình trên thực sự mở rộng ra ]_:]_!<X>!_[:_[.
  • Như tên gọi của nó, Stack Mèo dựa trên ngăn xếp, với các ngăn xếp không có đáy với các số 0 (nghĩa là các thao tác trên một ngăn xếp trống khác trả về 0). Mèo xếp chồng thực sự sử dụng một cuộn băng ngăn xếp, ví dụ <>di chuyển một chồng sang trái và một chồng phải tương ứng.
  • Số không ở dưới cùng của ngăn xếp được nuốt / loại bỏ.
  • Tất cả đầu vào được đẩy đến ngăn xếp đầu vào ban đầu, với đầu vào đầu tiên ở trên cùng và thêm -1 dưới đầu vào cuối cùng. Đầu ra được thực hiện ở cuối, sử dụng nội dung của ngăn xếp hiện tại (với -1 tùy chọn ở dưới cùng bị bỏ qua). -nbiểu thị I / O số.

Và đây là một dấu vết của chương trình đầy đủ mở rộng , ]_:]_!<X>!_[:_[:

    Initial state (* denotes current stack):
      ... [] [-1 b a]* [] [] ...
]   Move one stack right, taking the top element with you
      ... [] [-1 b] [a]* [] ...
_   Reversible subtraction, performing [x y] -> [x x-y] (uses an implicit zero here)
      ... [] [-1 b] [-a]* [] ...
:   Swap top two
      ... [] [-1 b] [-a 0]* [] ...
]   Move one stack right, taking the top element with you
      ... [] [-1 b] [-a] []* ...
_   Reversible subtraction (0-0, so no-op here)
!   Bit flip top element, x -> -x-1
      ... [] [-1 b] [-a] [-1]* ...
<   Move one stack left
      ... [] [-1 b] [-a]* [-1] ...
X   Swap the stack to the left and right
      ... [] [-1] [-a]* [-1 b] ...
>   Move one stack right
      ... [] [-1] [-a] [-1 b]* ...
!   Bit flip
      ... [] [-1] [-a] [-1 -b-1]* ...
_   Reversible subtraction
      ... [] [-1] [-a] [-1 b]* ...
[   Move one stack left, taking the top element with you
      ... [] [-1] [-a b]* [-1] ...
:   Swap top two
      ... [] [-1] [b -a]* [-1] ...
_   Reversible subtraction
      ... [] [-1] [b a+b]* [-1] ...
[   Move one stack left, taking the top element with you
      ... [] [-1 a+b]* [b] [-1] ...

a+bsau đó được xuất ra, với cơ sở -1 bị bỏ qua. Lưu ý rằng phần khó nhất về giải pháp này là ngăn xếp đầu ra phải có -1đáy ở dưới cùng, nếu không, ngăn xếp đầu ra [-1]sẽ bỏ qua cơ sở -1 và ngăn xếp đầu ra [0]sẽ khiến cơ sở không bị nuốt (nhưng đầu ra [2]ví dụ như stack sẽ 2chỉ xuất ra tốt).


Để giải trí, đây là danh sách đầy đủ các giải pháp liên quan có cùng độ dài được tìm thấy (danh sách có thể không đầy đủ):

]_:]^!<X
]_:]_!<X
]_:]!^<X
]_:!]^<X
[_:[^!>X
[_:[_!>X
[_:[!^>X
[_:![^>X

Các *(>-_:[:)>giải pháp dài hơn, nhưng là trực quan hơn để viết vì nó sử dụng các *(...)>mẫu. Mẫu này mở rộng <(...)*(...)>khi được sử dụng với -lcờ, có nghĩa là:

<       Move one stack left
(...)   Loop - enter if the top is positive and exit when the top is next positive again
        Since the stack to the left is initially empty, this is a no-op (top is 0)
*       XOR with 1 - top of stack is now 1
(...)   Another loop, this time actually run
>       Move one stack right

Như vậy, *(...)>mẫu có nghĩa là vòng lặp đầu tiên bị bỏ qua nhưng vòng lặp thứ hai được thực thi. Điều này cho phép lập trình đơn giản hơn diễn ra, vì chúng ta không cần phải lo lắng về tác động của vòng lặp trong nửa kia của chương trình.

Trong trường hợp này, bên trong của vòng lặp là:

>       Move one stack right, to the input stack
-       Negate top, [-1 b a] -> [-1 b -a]
_       Reversible subtraction, [-1 b -a] -> [-1 b a+b]
:       Swap top two, [-1 b a+b] -> [-1 a+b b]
[       Move one stack left, taking top of stack with you (removing the top b)
:       Swap top two, putting the 1 on this stack on top again

Cuối cùng >trong mẫu sau đó di chuyển chúng ta trở lại ngăn xếp đầu vào, nơi a+bđược xuất ra.


19

Brain-flak , 6 byte

({}{})

Hãy thử trực tuyến!

Brain-flak là một ngôn ngữ thực sự thú vị với hai hạn chế chính đối với nó.

  1. Các ký tự hợp lệ duy nhất là dấu ngoặc, tức là bất kỳ ký tự nào trong số này:

    (){}[]<>
    
  2. Mỗi bộ dấu ngoặc đơn phải được khớp hoàn toàn, nếu không chương trình không hợp lệ.

Một tập hợp các dấu ngoặc không có gì giữa chúng được gọi là "nilad". Một nilad tạo ra một giá trị số nhất định và tất cả các nilad này nằm cạnh nhau được thêm vào. Một tập hợp các dấu ngoặc có một cái gì đó giữa chúng được gọi là "đơn nguyên". Một đơn vị là một hàm có một đối số số. Vì vậy, dấu ngoặc trong một đơn nguyên được đánh giá, và đó là đối số cho đơn nguyên. Dưới đây là một ví dụ cụ thể hơn.

Số () nilad bằng 1. Vì vậy, mã não sau đây:

()()()

Được ước tính là 3. Đơn () nguyên đẩy giá trị bên trong của nó trên ngăn xếp toàn cầu. Vì vậy, sau đây

(()()())

đẩy một 3. {}Nilad bật giá trị lên trên cùng của ngăn xếp. Vì các nilad liên tiếp luôn được thêm vào, một chuỗi {}tổng tất cả các phần tử hàng đầu trên ngăn xếp. Vì vậy, mã của tôi về cơ bản là:

push(pop() + pop())

15

Minecraft 1.10.x, 924 512 byte

Cảm ơn @ quat vì đã giảm blytecount 48 điểm và bytecount bằng 412.

Được rồi, vì vậy, tôi đã lấy một số ý tưởng từ câu trả lời này và tạo một phiên bản của riêng tôi, ngoại trừ cái này có khả năng chấp nhận đầu vào không âm. Một phiên bản có thể được tìm thấy ở đây trong định dạng khối cấu trúc.

nhóm

(phiên bản mới có vẻ tbh nhàm chán)

Các lệnh tương tự như câu trả lời khác:

scoreboard objectives add a dummy
execute @e[type=Pig] ~ ~ ~ scoreboard players add m a 1
execute @e[type=Cow] ~ ~ ~ scoreboard players add n a 1
scoreboard players operation n a += m a
tellraw @a {"score":{"name":"n","objective":"a"}}

Để nhập số, sinh sản ở một số bò và lợn. Bò sẽ đại diện cho giá trị "n" và lợn sẽ đại diện cho giá trị "m". Hệ thống khối lệnh sẽ dần dần giết chết bò và lợn và gán giá trị khi cần thiết.

Câu trả lời này giả định rằng bạn đang ở trong một thế giới không có bò hoặc lợn xuất hiện tự nhiên và các giá trị được lưu trữ trong "n" và "m" sẽ bị xóa trong mỗi lần chạy.


Đối với số nguyên âm, bạn có thể sử dụng 2 loại động vật khác làm "số âm" - ví dụ 5 con ngựa có thể đại diện cho -5.
Mego

@Mego Sau đó sẽ là bốn đầu vào, không phải 2.
Addison Crump

Nó vẫn sẽ là hai đầu vào - tương đương với việc sử dụng hai phần bù cho số âm. Định dạng hơi khác nhau, nhưng vẫn là một đầu vào. Ít nhất, đó là hai xu của tôi.
Mego

Có thể tiết kiệm khối bằng cách sử dụng execute @e[type=Pig] ~ ~ ~ scoreboard players add m a 1, vì vậy bạn không cần bất kỳ hình thức đồng hồ nào.
quat

@quat Ôi. Đẹp.
Addison Crump

14

Võng mạc , 42 byte

\d+
$*
T`1p`-_` |-1+
+`.\b.

^(-)?.*
$1$.&

Hãy thử trực tuyến!

Giải trình

Thêm số vào unary là điều dễ nhất trên thế giới, nhưng một khi bạn giới thiệu số âm, mọi thứ trở nên khó khăn ...

\d+
$*

Chúng tôi bắt đầu bằng cách chuyển đổi các số thành đơn nguyên. Điều này được thực hiện bằng cách khớp từng số với \d+và thay thế nó bằng $*. Đây là một tính năng thay thế cụ thể của Retina. Cú pháp đầy đủ là count$*charactervà chèn các countbản sao của character. Cả hai đều có thể được bỏ qua trong đó countmặc định $&(tức là chính trận đấu) và charactermặc định 1. Vì vậy, đối với mỗi đầu vào, nchúng ta có một đầu vào nvà chúng ta vẫn có các dấu trừ tiềm năng trong đó, cũng như dấu phân cách không gian. Ví dụ: đầu vào 8 -5cho:

11111111 -11111

Bây giờ để đối phó với các số âm, dễ nhất là sử dụng một -1chữ số riêng . Chúng tôi sẽ sử dụng -cho mục đích đó.

T`1p`-_` |-1+

Giai đoạn này làm hai việc. Nó được loại bỏ khoảng trống, các dấu trừ hàng đầu và biến 1s sau một dấu trừ thành -chính chúng. Điều này được thực hiện bằng cách khớp |-1+(tức là một khoảng trắng hoặc số âm) và thực hiện chuyển ngữ trên đó. Việc chuyển ngữ đi từ 1pđến -_, nhưng ở đây, pmở rộng ra tất cả các ký tự ASCII có thể in và _có nghĩa là xóa. Vì vậy, 1s trong các trận đấu đó được chuyển thành -s và minuses và khoảng trắng bị xóa. Ví dụ của chúng tôi bây giờ trông như thế này:

11111111-----
+`.\b.

Giai đoạn này xử lý trường hợp có một số dương và một số âm trong đầu vào. Nếu vậy, sẽ có 1s và -s trong chuỗi và chúng tôi muốn chúng hủy bỏ. Điều này được thực hiện bằng cách khớp hai ký tự có ranh giới từ giữa chúng (vì 1s được coi là một ký tự từ và -không) và thay thế từ khớp bằng không có gì. Các +hướng dẫn Retina làm điều này nhiều lần cho đến khi chuỗi ngừng thay đổi.

Bây giờ chúng tôi chỉ còn lại 1 s hoặc chỉ - s.

^(-)?.*
$1$.&

Để chuyển đổi này thành số thập phân, chúng tôi khớp toàn bộ đầu vào, nhưng nếu có thể, chúng tôi sẽ bắt một -nhóm 1. Chúng tôi viết lại nhóm 1(để thêm một -số âm) và sau đó chúng tôi viết lại độ dài của trận đấu với $.&(cũng là một tính năng thay thế dành riêng cho Retina).


2
Điều này rất thông minh.
Mego

Bây giờ nếu chỉ có một cách dễ dàng để thực hiện rangetrong Retina. Tôi đã thử một vài lần, nhưng những tiêu cực là một nỗi đau.
mbomb007

Phải mất hơn 40 byte để thêm hai số trong ngôn ngữ này ??
dkudriavtsev

2
@DmitryKudriavtsev tốt, Retina không có khái niệm về số ...
Martin Ender

@DmitryKudriavtsev, và đó chỉ là số nguyên ....
msh210

14

Đô-mi-nô , 38.000 byte hoặc 37 ô

Điều này được tạo ra trong Tabletop Simulator . Đây là một video và đây là tập tin . Nó là một nửa cộng chuẩn, bao gồm một andcổng cho 2^1giá trị địa điểm và một xorcổng cho 2^0giá trị địa điểm.

nhập mô tả hình ảnh ở đây

Chi tiết

  • Tôi / O
    • Bắt đầu - Điều này được bao gồm cho sự rõ ràng (không được tính vào tổng số) và là những gì 'gọi' hoặc 'thực thi' chức năng. Nên được 'nhấn' sau khi nhập liệu [Vàng] .
    • Đầu vào A - Điều này được bao gồm để rõ ràng (không được tính vào tổng số) và được 'nhấn' để chỉ ra a 1và không được nhấn cho 0 [Xanh] .
    • Đầu vào B - Điều này được bao gồm để rõ ràng (không được tính vào tổng số) và được 'nhấn' để chỉ ra a 1và không được nhấn cho 0 [Blue] .
    • Đầu ra - Điều này được tính vào tổng số. Những domino tuyên bố tổng. Bên trái là 2^1và bên phải là 2^0 [Đen] .
  • Nhấn
    • Để cung cấp đầu vào hoặc bắt đầu chuỗi, sinh ra đá cẩm thạch kim loại
    • Đặt cường độ nâng thành 100%
    • Nâng đá cẩm thạch lên trên domino mong muốn
    • Thả đá cẩm thạch

1
... làm thế nào?
dkudriavtsev

4
@Mendeleev Khi bạn có tất cả các cổng logic nhị phân , mọi thứ khác sẽ rơi vào vị trí xD.
Phi tuyến

10

Haskell, 3 byte

(+)

Các dấu ngoặc đơn ở đây vì nó cần phải là một hàm tiền tố. Điều này giống như lấy một phần của hàm +, nhưng không có đối số nào được áp dụng. Nó cũng hoạt động trên một loạt các loại, chẳng hạn như vectơ, ma trận, số phức, số nổi, số nhân đôi, số liệu và tất nhiên là số nguyên.

Bởi vì đây là Haskell, đây là cách thực hiện ở cấp độ loại. Điều này sẽ được thực hiện tại thời gian biên dịch thay vì thời gian chạy:

-- This *type* represents Zero
data Zero
-- This *type* represents any other number by saying what number it is a successor to.
-- For example: One is (Succ Zero) and Two is (Succ (Succ Zero))
data Succ a

-- a + b = c, if you have a and b, you can find c, and if you have a and c you can find b (This gives subtraction automatically!)
class Add a b c | a b -> c, a c -> b

-- 0 + n = n 
instance Add Zero n n
-- If (a + b = c) then ((a + 1) + b = (c + 1))
instance (Add a b c) => Add (Succ a) b (Succ c)

Mã được điều chỉnh từ Haskell Wiki


3
sự thật thú vị: đây là một polyglot với Cheddar: D
Downgoat

10

Toán học, 4 2 byte

Tr

Crossed out 4 vẫn là 4 thông thường ... Tr được áp dụng cho danh sách một chiều lấy tổng các phần tử của danh sách đã nói.


9

dc, 2 byte

+f

Thêm hai mục trên cùng vào ngăn xếp (được lấy trước đó stdin), sau đó bỏ nội dung của ngăn xếp vào stdout.

EDIT: Sau khi xem xét thêm, có vẻ như có một số cách có thể được thực hiện, tùy thuộc vào hành vi I / O mong muốn.

+        # adds top two items and pushes on stack
+n       # adds top two and prints it, no newline, popping it from stack
+dn      # ditto, except leaves result on stack
??+      # takes two inputs from stdin before adding, leaving sum on stack

Tôi cho rằng hình thức đầy đủ nhất cho tổng sẽ là:

??+p     # takes two inputs, adds, 'peeks'
         #  (prints top value with newline and leaves result on stack)

Chờ đợi! Hai số có thể được thực hiện trên cùng một dòng, cách nhau bởi một khoảng trắng! Điều này cho chúng ta:

?+p

Tôi không thể xem cách sử dụng ví dụ đầu tiên +f, dc -e "?+p"hoạt động tốt ở đây.
Jasen

1
@Jasen +fPhiên bản hoạt động nếu bạn đã đặt (chính xác hai) số trên ngăn xếp. Tôi thực sự không biết liệu dcI / O được cho là std(in|out)hay ngăn xếp. Nhìn lại, đó là lựa chọn ít hợp lý nhất để đặt ở đầu bài. : /
Joe

các quy tắc nói stack là OK theo như tôi có thể nói,
Jasen

9

Ngôn ngữ lập trình Shakespeare , 155 152 byte

.
Ajax,.
Ford,.
Act I:.
Scene I:.
[Enter Ajax and Ford]
Ajax:
Listen to thy heart
Ford:
Listen to THY heart!You is sum you and I.Open thy heart
[Exeunt]

Ung dung:

Summing Two Numbers in Verona.

Romeo, a numerical man.
Juliet, his lover and numerical counterpart.

Act I: In which Italian addition is performed.

Scene I: In which our two young lovers have a short chat.

[Enter Romeo and Juliet]

Romeo:
  Listen to thy heart.

Juliet:
  Listen to THY heart! Thou art the sum of thyself and I. Open thy heart.

[Exeunt]

Tôi đang sử dụng trình biên dịch SPL của drsam94 để biên dịch cái này. Để kiểm tra:

$ python splc.py sum.spl > sum.c
$ gcc sum.c -o sum.exe
$ echo -e "5\n16" | ./sum
21

8

Brachylog , 2 byte

+.

Yêu cầu một danh sách với hai số làm đầu vào

Ngoài ra, nếu bạn muốn câu trả lời cho STDOUT:

+w


7

PHP, 20 byte

Đáng ngạc nhiên là thời gian ngắn này:

<?=array_sum($argv);

Chạy từ dòng lệnh, như:

$ php sum.php 1 2

Kịch bản của bạn cũng chấp nhận php sum.php 1 2 3 4 5 6vì vậy tôi không chắc chắn 100% nếu điều đó ổn.
timmyRS

@timmyRS Việc gửi phải hoạt động cho một định dạng đầu vào cụ thể - hai số nguyên. Tôi không nghĩ rằng nó cũng nên xử lý các đầu vào khác.
insertusernamehere

Nếu tên tệp nguồn bắt đầu bằng một chữ số thì sao? :)
Alex Howansky

@AlexHowansky Psssssssst - đừng nói với ai. ;) Đây là cách giải quyết khi chạy từ tệp. Bạn vẫn có thể thực thi nó bằng -rcờ - sau đó nó không còn là vấn đề nữa.
insertusernamehere

7

Cheddar, 3 byte

(+)

Đây là một tính năng thú vị của Cheddar có tên là "toán tử có chức năng". Tín dụng cho ý tưởng này được gửi tới @ CᴏɴᴏʀO'Bʀɪᴇɴ.

Dưới đây là nhiều ví dụ về các toán tử có chức năng:

(+)(1,2) // 3
(/)(6,2) // 3
(-)(5)   // -5


6

Dash hình học - 15 đối tượng

Cuối cùng cũng xong.
15 đối tượng không nhiều, nhưng vẫn là một cơn ác mộng khi làm điều này (đặc biệt là vì các số âm).

nhập mô tả hình ảnh ở đây

Bởi vì tôi sẽ phải chèn 15 hình ảnh ở đây để làm thế nào để tái tạo nó, tôi chỉ cần tải lên cấp độ. ID cấp độ là 5216804. Mô tả cho bạn biết cách chạy nó và bạn có thể sao chép nó vì nó có thể sao chép.

Giải trình:

Trình kích hoạt trên cùng bên trái (Số đếm tức thời 2) đã kiểm tra nếu phần bổ sung đầu tiên là 0. Nếu đúng, thì nó sẽ kiểm tra xem phần bổ sung thứ hai là dương hay âm. Nếu nó là số dương, nó đã chuyển giá trị từ phần bổ sung thứ hai sang tổng (kiểu BF, sử dụng các vòng lặp) và nếu nó âm, nó sẽ làm điều tương tự.

Lý do tại sao chúng ta cần kiểm tra xem phần bổ sung thứ hai là dương hay âm là vì chúng ta sẽ cần phải trừ một phần bổ sung thứ hai và thêm một phần vào tổng hoặc thêm một phần vào phần bổ sung thứ hai và trừ một phần tương ứng.

Nếu phần bổ sung đầu tiên không bằng 0, nó sẽ kiểm tra xem nó là dương hay âm bằng cách sử dụng quy trình trên. Sau một lần lặp trong vòng lặp while, nó sẽ kiểm tra xem phần bổ sung đầu tiên có bằng không hay không và nếu có, nó thực hiện quy trình được mô tả ở đầu phần giải thích.

Vì Geometry Dash khá giống với BF, bạn có thể tạo ra giải pháp BF từ việc này.


5

MATL, 1 byte

s

Chấp nhận một mảng gồm hai số nguyên làm đầu vào và tính tổng chúng. Trong khi chương trình đơn giản +cũng hoạt động, điều đó đã được hiển thị cho các ngôn ngữ khác.

Dùng thử trực tuyến


5

Perl 5.10, 8 byte

Hai số cần thêm phải nằm trên 2 dòng riêng biệt để số này hoạt động:

say<>+<>

Hãy thử cái này ở đây.

Một với đầu vào trên cùng một dòng ( 14 + 1 byte cho cờ -a )

say$F[0]+$F[1]

Hãy thử nó ở đây!

Một với đầu vào trên cùng một dòng ( 19 + 1 byte cho cờ -a )

map{$s+=$_}@F;say$s

Hãy thử cái này ở đây.

Một số khác, bằng cách thay đổi dấu phân cách mặc định mảng ( 19 + 1 byte cho cờ -a )

$"="+";say eval"@F"

Hãy thử cái này ở đây!


2
Xin chào, một ví dụ điển hình khác (nếu điều này sẽ trở thành một thách thức danh mục) là phương pháp được Dennis nêu ra trong bài đăng này: codegolf.stackexchange.com/q/32884 (ab) bằng cách sử dụng -pcờ.
Dom Hastings

Thay vì say$F[0]+$F[1], say pop()+pophoạt động (được thử nghiệm trong Strawberry 5.20.2 với -E) và giúp bạn tiết kiệm một byte.
msh210

5

Fuzzy Octo Guacamole , 1 byte

a

Một hàm lấy đầu vào từ đầu ngăn xếp và đầu ra bằng cách đẩy lên ngăn xếp.

Ví dụ chạy trong REPL:

>>> 8 9 :
[8,9]
>>> a :
17


5

PowerShell v2 +, 17 byte

$args-join'+'|iex

Đưa đầu vào thành hai đối số dòng lệnh riêng biệt, được điền trước vào mảng đặc biệt $args. Chúng ta tạo thành một chuỗi với -jointoán tử bằng cách nối chúng với nhau +ở giữa, sau đó nối chuỗi đó thành Invoke-Expression(tương tự eval).


Cảm ơn @DarthTwon đã nhắc nhở tôi rằng khi xử lý các chương trình tối thiểu như vậy, có nhiều phương thức lấy tất cả đầu vào ở cùng một số byte.

$args[0]+$args[1]
param($a,$b)$a+$b

PowerShell không là gì nếu không linh hoạt.


1
Vâng, tôi chỉ đang theo dõi bạn ở đây: P Câu trả lời thay thế: $args[0]+$args[1]param($a,$b)$a+$b
ThePoShWolf

5

> <> , 7 6 3 byte

+n;

Phiên dịch trực tuyến

Hoặc thử nó trên TIO với cờ -v.

Dùng thử trực tuyến


Vì câu hỏi cho phép bạn xác định hàm, tôi tin rằng một đơn giản +là đủ: nó sẽ bật hai số từ ngăn xếp và đưa kết quả của phép cộng trở lại vào ngăn xếp. Chi phí -vcũng có thể tránh được, vì việc đọc các con số có thể đã được thực hiện trước khi gọi hàm.
Aaron

1
@Aaron: Đúng. Nhưng vì giải pháp đó đã được đăng cho một số ngôn ngữ khác nên tôi sẽ giữ nó như một chương trình đầy đủ.
Emigna

1
Tôi nghĩ cờ v sẽ có tối đa +1 byte nhưng bằng cách nào đó bạn có thể sử dụng trình thông dịch fishl Language.com và tổng số của bạn sẽ là 3 byte (không cần -v).
redstarcoder

@redstarcoder: Mọi người luôn chỉ định cờ là 3 byte cho cá (và 1 byte cho tất cả các ngôn ngữ khác có vẻ như). Không chắc tại sao nó khác nhưng tôi cho rằng đó là một lý do hợp lệ.
Emigna

Bất kể, bạn không cần cờ nếu bạn chỉ sử dụng trình thông dịch fishl Language.com. Bạn có một liên kết đến meta? Tôi chưa thấy chương trình nào> <> được thêm byte để sử dụng số nguyên trên ngăn xếp ban đầu (tôi cũng đã làm như vậy).
redstarcoder

5

C, 35 byte

s(x,y){return y?s(x^y,(x&y)<<1):x;}

Những gì tôi đã làm ở đây được xác định bổ sung mà không sử dụng các toán tử boolean hoặc số học. Điều này đệ quy làm cho x các bit tổng bằng 'xor' và y các bit mang theo 'và' cho đến khi không có carry. Đây là phiên bản chưa được chỉnh sửa:

int sum(int x,int y){
    if(y==0){
        //anything plus 0 is itself
        return x;
    }
    //if it makes you happier imagine there's an else here
    int sumBits=x^y;
    int carryBits=(x&y)<<1;
    return sum(sumBits,carryBits);
}

Tại sao bạn không thêm trực tiếp?
Trái cây Esolanging

Tôi thấy rằng để nhàm chán, phiên bản golf đầy đủ là tầm thường.
bijan

"Tất cả các câu trả lời sẽ cho thấy một số nỗ lực để đạt được điểm cao hơn. Chẳng hạn, các câu trả lời cho các thử thách chơi gôn nên cố gắng càng ngắn càng tốt (trong giới hạn của ngôn ngữ đã chọn)." (từ codegolf.meta.stackexchange.com/a/7073/61384 )
Trái cây Esolanging

2
Rõ ràng tôi đã nghĩ đến việc chỉ cần thêm các con số, và tôi đã nỗ lực để làm cho nó ngắn hơn, chỉ trong các hạn chế thay thế. Tôi nghĩ vì đây là một câu hỏi độc đáo, nó xứng đáng là một câu trả lời độc đáo. Theo từ quy tắc đó cho từ, sẽ không có lý do gì để đưa ra câu trả lời nếu ai đó đã đưa ra một câu ngắn hơn. Nếu bạn đưa ra giải pháp python 20 byte của mình và ai đó đã có phiên bản 4 byte trở lên thì bạn đang chứng minh rằng bạn không biết cách sao chép và dán. Mọi người đưa ra các giải pháp 20 byte, bởi vì chúng tôi coi trọng tính nguyên bản.
Bijan

1
Nó được ngụ ý rằng nó cạnh tranh trong ngôn ngữ bạn đang chọn. Tuy nhiên, sau khi đọc meta, có vẻ như tôi không thể khẳng định rằng câu trả lời của bạn không hợp lệ ("Câu trả lời có thể thực hiện bất kỳ thuật toán nào, ngay cả khi người chơi golf tồn tại"), vì vậy tôi đoán tôi sẽ bỏ nó.
Esolanging Fruit

4

MATLAB, 4 byte

Đã xóa 1 byte nhờ @LeakyNun

@sum

Đây là một hàm ẩn danh lấy một mảng và đưa ra tổng. Ví dụ sử dụng:

>> f = @sum
f = 
    @sum
>> f([3 4])
ans =
     7

Thế còn sum?
Rò rỉ Nun

@LeakyNun Cảm ơn, ý kiến ​​hay!
Luis Mendo

43 byte? xD BTW: Tôi nghĩ rằng chúng ta phải có chương trình đầy đủ hoặc một chức năng , vì vậy tôi chỉ nói @sumlà một câu trả lời hợp lệ. Hoặc có một sự đồng thuận meta khác?
flawr

@flawr Tôi nghĩ là có, vâng. Nhưng tôi không thể tìm thấy nó
Luis Mendo

4
Wooah, tôi đã giúp bạn giảm từ 43 xuống 4 byte XD
flawr

4

GoLScript , 1 byte (không cạnh tranh)

K

Thêm 2 số trên cùng vào ngăn xếp. Đó là nó.

Bây giờ làm thế nào để đẩy chúng vào stack, tôi không có manh mối. Tôi không nghĩ là có thể .. ho @ CᴏɴᴏʀO'Bʀɪᴇɴ ho


Explanation soon to be coming.- Riker ngày 3 tháng 7 '16
MD XF

+1 cho ngôn ngữ Trò chơi cuộc sống.
Đánh giá cao hoạt động

4

Ngôn ngữ lập trình Shakespeare (SPL), 137 135 byte

Hoàn thành chương trình, chơi gôn:

.
A.
B.
Act I
Scene I
[Enter A and B]
A: Listen to your heart!
B: Listen to your heart! You are the sum of me and you. Open your heart! 

Và một lời giải thích ngắn gọn:

----
.                                 <- Title, everything before the first 
                                     full stop is considered as the tittle and treated as a comment
----
A.                                <- Dramatis personae. Here are introduced the characters in the play.
                                     |Characters are treated as variables.   
B.                                <--
----
Act I                             <- Acts and scenes are used to divide a program into smaller
                                     chunks in order to be able to refer to them later.
                                     |
Scene I                           <--
----
[Enter A and B]                   <- Characters on stage in the current scene, which are the              
                                     variables the program will have access to.
----
A: Listen to your heart!          <- Line of code. All of them have the same structure
                                     Variable: code. In this case, the concrete sentence
                                    "Listen to your heart!" reads an input number and stores it
                                     on the character (variable) refered to.
B: Listen to your heart!          <- Same as above 
   You are the sum of me and you. <- Sum the values of itself and the caharacter (variable)
                                     refered to.
   Open your heart!               <- Output the value of the character (value) refered to.

Tôi không thực sự chắc chắn rằng đây là ngắn nhất nó có thể đi. Kiểm tra trang chính thức để biết thêm.

Chỉnh sửa 1: Đã xóa phần :sau Act IScene Idường như mọi thứ sau chữ số La Mã đều bị bỏ qua, do đó tiết kiệm được 2 byte.


5
Điều này không hợp lệ. Các nhân vật phải xuất phát từ các vở kịch của Shakespeare và: s phải có ở đó. Ngoài ra, bạn cần một dấu phẩy sau tên của mỗi ký tự cho một mô tả.
Oliver Ni

4

mã máy x86_32, 2 byte

08048540 <add7>:
 8048540:   01 c8                   add    %ecx,%eax

Giả sử hai giá trị đã có trong các thanh ghi ecx và eax, thực hiện lệnh add sẽ thêm các giá trị của hai thanh ghi và lưu kết quả vào thanh ghi đích.

Bạn có thể xem toàn bộ chương trình được viết bằng C và lắp ráp nội tuyến tại đây . Viết trình bao bọc trong C giúp cung cấp đầu vào và kiểm tra dễ dàng hơn, nhưng chức năng thêm thực tế có thể được giảm xuống hai byte này.


3
Đây không phải là một chức năng, chỉ là một đoạn. Bạn cần một rethướng dẫn là tốt (một byte). Và đó là giả sử một quy ước gọi tùy chỉnh trong đó eaxđược sử dụng như một thanh ghi chuyển tiếp. (Thư viện giảng dạy asm của Irvine32 thực hiện điều đó, nhưng không có quy ước gọi tiêu chuẩn nào cho x86-32 hoặc x86-64 làm điều đó, không giống như trên ARM nơi thanh ghi giá trị trả về r0cũng là thanh ghi chuyển đổi đối số đầu tiên.) Mặc dù chức năng asm, vì vậy bạn không cần thay đổi nó thành 3 byte lea (%ecx, %edx), %eax+ 1 byte retcho Microsoft __fastcallhoặc gcc-mregparm .
Peter Cordes

1
Đó là một thách thức thú vị cho một hội nghị gọi stack-args, mặc dù. popchỉ có 1 byte, nhưng espcác chế độ địa chỉ liên quan cần một byte SIB. Vì vậy, một quy ước gọi của người gọi có thể pop %ecx(địa chỉ trả về), pop %eax/ pop %edx/ add %edx, %eax(2 byte) / jmp *%ecx(2 byte) = tổng cộng 7 byte. so với mov 4(%esp), %eax(4B) / add 8(%esp), %eax(4B) / ret= 9 byte hoặc 11 byte cho phiên bản người gọi sử dụng ret imm16, nếu tôi làm đúng. Đó là thêm 1 byte cho SIB với ESP làm cơ sở và thêm 1 byte cho dist8 trong mỗi insn.
Peter Cordes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.