Cộng hoặc trừ đa âm!


14

Việc gửi của bạn phải có một danh sách các số (ở bất kỳ định dạng danh sách nào mà ngôn ngữ của bạn hỗ trợ hoặc sử dụng nhiều tham số dòng lệnh / hàm) hoặc một chuỗi các số được phân tách bằng bất kỳ ký tự nào không có 0123456789. Trong một ngôn ngữ, nó phải thêm tất cả chúng và xuất tổng. Trong một ngôn ngữ khác, nó phải xuất chúng trừ đi theo thứ tự. Thí dụ:

12
5
7
2

Trong một ngôn ngữ, nó phải xuất ra 26, và trong ngôn ngữ khác, nó phải xuất ra -2. Lưu ý rằng tất cả các số được nhập sẽ là số nguyên dương nhỏ hơn 100. Sẽ không bao giờ có nhiều hơn 20số được cung cấp, vì vậy bạn sẽ không bao giờ xuất ra lớn hơn 2000hoặc ít hơn -1899. Có câu hỏi nào không? Bình luận dưới đây!


Là khoảng trắng theo sau trong đầu ra được phép?
Mèo kinh doanh

Hai phiên bản khác nhau của cùng một ngôn ngữ được phép? Xem câu trả lời Python 2/3 của HyperNeutrino
Ông

@ Mr.Xcoder được phép.
lập trình

2
@BetaDecay bạn nghĩ đó là một vấn đề, hãy xem code-golf!
lập trình

1
@ lập trình5000 Ý bạn là [code-golf] -[polyglot]gì?
Erik the Outgolfer

Câu trả lời:


14

Jelly / 05AB1E , 3 byte

00000000: c6 71 53                                         .qS

Đây là một hexdump (xxd) của chương trình được gửi.

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

Thạch: Tổng

Jelly sử dụng trang mã Jelly , vì vậy nó nhìn thấy các ký tự sau.

İqS

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

Làm thế nào nó hoạt động

İqS  Main link. Argument: A (array)

İ    (ignored)
 q   Unrecognized token. This breaks the link; nothing to the left is executed.
  S  Take the sum of A.

05AB1E: Sự khác biệt

05AB1E sử dụng Windows-1252 , vì vậy nó nhìn thấy các ký tự sau.

ÆqS

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

Làm thế nào nó hoạt động

Æ     Take the difference of the input.
 q    Quit.
  S   (ignored)

22

Python 2/3, 52 byte

lambda l:sum(l[:1]+[x*int(1-(1/2)*4)for x in l[1:]])

int(1-(1/2)*4)trả về 1trong Python 2 vì 1/2đánh giá đầu tiên 0và sau đó 0 * 4 = 0.

int(1-(1/2)*4)trả về -1trong Python 3 vì 1/2đánh giá đầu tiên 0.5và sau đó int(0.5 * 4) = int(2.0) = 2.


1
Là sử dụng cùng một ngôn ngữ, với các phiên bản khác thậm chí được phép?
Ông Xcoder

3
@ Mr.Xcoder Tôi không hiểu tại sao không, tôi đã thấy các ngôn ngữ khác sử dụng các phiên bản khác nhau của C, Java, Python và Befunge. Tôi sẽ hỏi về meta mặc dù hoặc xem liệu tôi có thể tìm thấy một bài đăng meta liên quan hay không.
HyperNeutrino

Mặc dù sử dụng tốt các thủ thuật toán học do thay đổi phiên bản.
Ông Xcoder

1
@ Mr.Xcoder Cảm ơn! Tôi đã hỏi câu hỏi về meta ở đây ; Tôi hy vọng sẽ nhận được câu trả lời sớm.
HyperNeutrino

1
@ lập trình5000 Bộ phận nguyên.
HyperNeutrino

14

C và C ++ (cả hai từ GCC), 81 75 73 byte

int c;int f(int*a,int l){auto d=.5;c=*a++;for(;--l;a++)c+=*a-4*d**a;c=c;}

Đưa một con trỏ tới mảng và chiều dài.

Giải thích: vẫn sử dụng giải thích @Steadybox ': p Trong C,auto d=.5 khai báo một biến số nguyên với lớp lưu trữ tự động (là mặc định), sau đó được khởi tạo thành 0, trong khi trong C ++ 11, nó khai báo gấp đôi, được khởi tạo đến 0,5.

C - ngôn ngữ cộng: Hãy thử trực tuyến!

C ++ - ngôn ngữ trừ: Hãy thử trực tuyến!


11

05AB1E / Jelly , 5 byte

00000000: 4f71 7f5f 2f                             Oq._/

Hãy thử trực tuyến! (05AB1E)
Hãy thử trực tuyến! (Thạch)

05AB1E thấy :

Ôi? _ /
Giải trình:

Oq? _ / 1 đối số ngầm.
O Lấy tổng của mục đầu vào đầu tiên.
 q Thoát
  ?_/ Không thuộc chức năng, thẩm quyền.

Jelly thấy :

Ôi
_ /
Giải trình:

_ / Liên kết chính. Đối số: z
_ / Trừ các phần tử của z theo thứ tự.

Liên kết người trợ giúp Oq. Không thuộc chức năng, thẩm quyền.

Điều này có sử dụng bảng mã Jelly không?
lập trình

@ lập trình5000 Đây là một bytestream thô sử dụng CP-1252 cho 05AB1E và JELLY cho Jelly. Do đó 7f.
Erik the Outgolfer

Ồ, không nhận ra điều đó!
lập trình

8

Trên thực tế / Jelly , 4 byte

00000000: e4 81 5f 2f                                      .._/

Đây là một hexdump (xxd) của chương trình được gửi. Nó không thể được thử nghiệm ở dạng thô trực tuyến; TIO không hỗ trợ mã hóa CP437.

Thật ra: Tổng

Trên thực tế sử dụng CP 437 , vì vậy nó nhìn thấy các ký tự sau.

Σü_/

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

Làm thế nào nó hoạt động

Σ     Take the sum on the input.
 ü    Print and empty the stack.
  _   Natural logarithm. Ignored since the stack is empty.
   /  Float division. Ignored since the stack is empty.

Thạch: Sự khác biệt

Jelly sử dụng trang mã Jelly , vì vậy nó nhìn thấy các ký tự sau.

ỵ¹_/

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

Làm thế nào nó hoạt động

ỵ¹_/  Main link. Argument: A (array)

ỵ     Unrecognized token. Splits the link.
 ¹    Identity; yield A.
  _/  Reduce (/) A by subtraction (_).

Tôi đọc nó như actually, Jelly.:)
lập trình

Bạn đã lạm dụng thực tế là một nhân vật không xác định hành động như :)
Erik the Outgolfer

1
@EriktheOutgolfer Nhiều hơn hoặc ít hơn. Thành thật mà nói, tôi không chắc chắn những gì các token không được nhận dạng làm.
Dennis

Về ý nghĩ thứ hai, tôi nghĩ rằng bạn chỉ chọn Trên thực tế chỉ vì nó đã üđược gán cho chức năng hoàn hảo> _>
Erik the Outgolfer

@ lập trình5000 Đó là jelly, actually.
Arjun


7

CJam / Jelly , 6 byte

q~:-
S

Camam

q~    e# Read a list from input
:-    e# Reduce by subtraction
S     e# Push a space
      e# Implicit output

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

Thạch

(sử dụng UTF-8, không phải trang mã Jelly)

q~:-là liên kết trợ giúp. Vì nó không được gọi, nên nó thực sự không quan trọng. Stính tổng của một mảng.

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


5
Mứt và thạch. Làm cho ý nghĩa để sử dụng hai điều tương tự với nhau.
mbomb007

1
Điều này không hợp lệ. Jelly có 0x7f cho dòng mới, cái này có 0x0a cho dòng mới. Trong Jelly, điều này thực sự giống như q~:-½S. Thật không may, sửa lỗi ( q~:-e#\x7fS) là lớn hơn. Hãy thử trực tuyến! (CJam)thử trực tuyến! , mỗi người có mã hóa riêng để tự kiểm tra.
Erik the Outgolfer

2
Ngoài ra, bạn có thể sử dụng mã hóa UTF-8 cho Jelly, điều này làm cho nó hợp lệ như hiện tại, nhưng vui lòng chỉ định nó.
Erik the Outgolfer

5

JavaScript / Cubix, 36 byte

//.!v+u;$I^@O<.Iu
a=>eval(a.join`-`)

Thử nó!

Chức năng JavaScript có thể được kiểm tra bằng đoạn mã bên dưới, chương trình Cubix có thể được kiểm tra tại đây .

Cái này hoạt động ra sao?

JavaScript

Dòng đầu tiên là một nhận xét dòng cho JavaScript, vì nó bắt đầu bằng hai dấu gạch chéo, do đó JavaScript chỉ nhìn thấy dòng dưới cùng ( a=>eval(a.join`-`)), lấy một mảng làm đầu vào, nối nó với các dấu trừ ở giữa và sau đó chạy dưới dạng mã, dẫn đến phép trừ của tất cả các phần tử trong mảng.

let f=
//.!v+u;$I^@O<.Iu
a=>eval(a.join`-`)

console.log(f([1,2,3,4,5]))
console.log(f([3,1,4,1,5]))

Đàn con

Cubix nhìn thấy khối lập phương sau (chú ý rằng Cubix bỏ qua tất cả các khoảng trắng):

      / / .
      ! v +
      u ; $
I ^ @ O < . I u a = > e
v a l ( a . j o i n ` -
` ) . . . . . . . . . .
      . . .
      . . .
      . . .

Sự bắt đầu

IP bắt đầu trên dòng thứ ba, chỉ về phía đông. Nó nhấn 'I'lệnh, lấy một số từ đầu vào và đẩy nó vào ngăn xếp. Sau đó, nó được chuyển hướng bằng cách '^'vào vòng lặp tổng.

Vòng lặp tổng

Tôi đã xóa tất cả các ký tự không phải là một phần của vòng lặp tổng và thay thế chúng bằng no-ops ( '.'). IP ban đầu đến trên dòng thứ hai, chỉ về phía đông.

      . . .
      ! v +
      u ; $
. . . . . . I u . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

Đầu tiên, '!'lệnh kiểm tra phần tử trên cùng. Nếu đó là 0(tức là chúng ta đã đạt đến cuối của đầu vào), lệnh tiếp theo ( 'v') được thực thi, phản ánh IP ra khỏi vòng lặp. Nếu chúng ta chưa đạt đến cuối của đầu vào, chúng ta sẽ thêm hai mục trên cùng với nhau ( '+', mục thứ hai là tổng của điểm đó, mục trên cùng là đầu vào mới). Sau đó, IP kết thúc sang một mặt khác của khối, vào'u' ký tự, khiến IP thực hiện quay đầu và thực hiện 'I'lệnh (đọc một số nguyên đầu vào khác), trong khi chỉ về phía bắc. IP kết thúc trở lại mặt trên, bỏ qua ( '$') hướng dẫn xóa ( ';') và thực hiện lần lượt khác, quay lại điểm mà chúng tôi đã bắt đầu.

Kết thúc

Nếu IP được phản ánh ra khỏi vòng lặp, các ký tự sau sẽ được thực thi:

      . . .
      . v .
      . ; .
. . @ O < . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

Các hướng dẫn này xóa phần tử trên cùng (bằng 0), sau đó xuất phần tử trên cùng (tổng) thành số nguyên. Sau đó '@'lệnh được đạt tới, vì vậy chương trình kết thúc.


4

Python 2 và 3, 33 byte

lambda l,*r:l+sum(r)*(1/2>0 or-1)

Lấy đầu vào là các tham số riêng biệt.


Python 2.
Python 3.


lambda l,*r:l+sum(r)*(1/2-.5)*2cho 31 byte
ovs

@ovs Tôi cố tình tránh trả lại một cái phao. Nếu bạn được phép, thì *(1/2*4-1)một byte nhỏ hơn của bạn.
Veedrac

Tôi nghĩ rằng loại trả lại không thực sự quan trọng miễn là giá trị là chính xác
ovs

4

JS (ES6), CGL (Ngôn ngữ chơi gôn CGL) , 32 26 byte

 x=>eval(x.join`-`)
//-⨥

JS thực hiện phép trừ và CGL thực hiện phép cộng.

JS:

x=>eval(x.join`-`)

Một hàm ẩn danh trừ từng phần tử trong mảng bằng cách sử dụng Array#reduce.

//-⨥

Một lời bình luận.

CGL

 x=>eval(x.join`-`)

Những gì trông giống như một khoảng trắng trên dòng đầu tiên thực sự là một không gian không phá vỡ, một nhận xét trong CGL. Dòng đầu tiên được bỏ qua.

//-⨥

Các /s không làm gì cả. Việc -giảm con trỏ ngăn xếp hiện tại để nó trỏ đến đầu vào. thêm ngăn xếp hiện tại (đầu vào) lại với nhau, đẩy nó vào ngăn xếp tiếp theo và tăng ngăn xếp hiện tại. Nó được ngầm xuất ra.


1
Bạn có thể rút ngắn phiên bản JS bằng cách sử dụng x=>eval(x.join`-`), tiết kiệm 5B
Luke


@ Adám bạn nói đúng. Đã sửa.
lập trình

4

JavaScript (ES6) / QBasic, 84 83 byte

'';f=x=>eval(x.join`+`)/*
INPUT a
FOR i=1 TO 2
i=0
INPUT n
a=a-n
PRINT a
NEXT i
'*/

Một giải pháp khác với hack bình luận!

JavaScript tính tổng. Nó nhận trong một mảng chứa các số làm đầu vào. Đầu ra là hàm return. Bạn có thể gọi hàm như thế nào alert(f([10,20,30])).

QBasic tính toán sự khác biệt. Liên tục yêu cầu đầu vào. Ngay khi bạn nhập một giá trị, nó sẽ tạo ra sự khác biệt của tất cả các số bạn đã nhập cho đến khi nhấn Entervà một lần nữa yêu cầu nhập. Tiếp tục làm như vậy cho đến khi kết thúc mọi thứ.


Làm thế nào nó hoạt động?

Trong QBasic (một ngôn ngữ thuộc họ BASIC có cấu trúc; nó không yêu cầu số dòng), 'đánh dấu sự bắt đầu của một nhận xét kéo dài đến cuối dòng. Trong khi đó trong JavaScript, nó đánh dấu sự bắt đầu của một chuỗi. Vì vậy, toàn bộ dòng đầu tiên được đánh dấu là một nhận xét trong QBasic nhưng trong JavaScript, dòng này được thực thi (và dòng này chứa phần JavaScript có thêm các số cũng như một/* ở cuối bắt đầu một nhận xét để ẩn phần còn lại của mã QBasic từ trình thông dịch JavaScript.)

Mã từ dòng thứ hai đến dòng thứ hai chứa mã QBasic để tính toán sự khác biệt của tất cả các số đầu vào (mã rất tự giải thích).

Dòng cuối cùng chứa '*/. 'làm cho trình thông dịch QBasic diễn giải đoạn mã sau dưới dạng một nhận xét, trong khi đó trong JavaScript, nó không có bất kỳ tác dụng nào vì nó là một phần của một nhận xét (được bắt đầu ở cuối dòng đầu tiên). Đoạn mã sau ( */) khiến JavaScript kết thúc nhận xét được bắt đầu ở dòng đầu tiên, nhưng nó không được thực thi trong QBasic vì QBasic cho rằng đó là một phần của nhận xét.


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

JavaScript (thêm):

'';f=x=>eval(x.join`+`);/*
INPUT a
FOR i=1 TO 2
i=0
INPUT n
a=a-n
PRINT a
NEXT i
'*/
console.log(f([12,5,7,2]));

QBasic (trừ):

Tới trang web này . Sao chép dán đoạn mã sau vào trình soạn thảo văn bản của họ:

1 '';f=x=>eval(x.join`+`);/*
2 INPUT a
3 FOR i=1 TO 2
4 i=0
5 INPUT n
6 a=a-n
7 PRINT a
8 NEXT i
9 '*/

Lý do tại sao số dòng được yêu cầu là trang web tôi đã đề cập chỉ hỗ trợ các ngôn ngữ BASIC không có cấu trúc. Và trang web đó là trình thông dịch BASIC trực tuyến duy nhất tôi có thể tìm thấy. Tuy nhiên, việc chạy mã hiện diện ở đầu bài (mã không có số dòng) sẽ hoạt động tốt trong bất kỳ trình thông dịch QBasic tốt nào hỗ trợ BASIC có cấu trúc và 'như một trình khởi động bình luận (mặc dù vậy, hầu hết không làm như vậy).


Ghi chú

  • Đây là bài viết đầu tiên của tôi ! Tôi hy vọng nó là một trong những tốt!
  • Phần QBasic của mã không yêu cầu ENDvì trình thông dịch sẽ không bao giờ tiếp cận được! (Nó sẽ mãi mãi bị mắc kẹt trong vòng lặp vô hạn; luôn yêu cầu thêm đầu vào.)

3

Brain-Flak / Brain-Flueue , 20 byte

({}<([({{}})]){}>{})

Hãy thử trực tuyến! (Brain-Flak) (cộng)

Hãy thử trực tuyến! (Brain-Flueue) (trừ)

Giải trình

Sự khác biệt duy nhất giữa Brain-Flak và Brain-Flueue là Brain-Flueue thay thế hai ngăn xếp (lần cuối ra trước) được sử dụng trong Brain-Flak với hai hàng đợi (lần đầu tiên xuất hiện trước). Đương nhiên chương trình này sử dụng sự khác biệt này.

Mã chú thích

(                  ) Push the sum of...
 {}                   the first input,
   <            >     zero,
                 {}   the remaining sum (see below)
    ([      ])       Push the of below line
      ({{}})         Pop all the input sans first, push the sum
              {}     Pop (in Brain-Flak, this discards the negative sum,
                            in Brain-Flueue, the positive)
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.