Viết hàm [đã đóng]


15

Tôi thực sự không thể tin rằng thách thức này đã không tồn tại.

Các thách thức

Viết hàm.

Các chi tiết cụ thể

  • Chương trình của bạn phải xác định một số loại chức năng có thể gọi được. Điều này bao gồm mọi thứ thường được gọi là hàm, hàm lambda hoặc chương trình con. Tất cả các loại tên gọi này sẽ được gọi là "hàm" trong bài viết này.

    1. Đầu vào cho chức năng là tùy chọn và không bắt buộc.

    2. Giá trị trả về từ hàm cũng là tùy chọn và không bắt buộc nhưng điều khiển phải quay lại chương trình gọi.

  • Hàm phải được gán cho một số loại biến để có thể truy cập được sau đó. Điều này bao gồm gán gián tiếp (trong hầu hết các ngôn ngữ phổ biến trong đó việc khai báo một hàm được đặt tên sẽ tự động thêm tên vào phạm vi hiện tại) và gán trực tiếp (gán một hàm ẩn danh trực tiếp cho một biến).

  • Các chức năng không cần phải được đặt tên.

  • Hàm phải được tạo bởi bạn - bạn không thể chỉ định một hàm mặc định từ ngôn ngữ cho một biến.

  • Không có sơ hở tiêu chuẩn , xin vui lòng.

Đây là , vì vậy điểm số thấp nhất tính theo byte sẽ thắng.


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
DJMcMayhem

3
Tôi không hiểu tại sao điều này được mở lại khi không có lý do nào khiến nó bị đóng cửa ngay từ đầu đã được giải quyết, chỉ bị ẩn bởi các mod trong một cuộc trò chuyện
Jo King

2
Ngoài ra, từ khi nào bạn có thể bỏ phiếu để mở lại bài đăng của riêng bạn ??
Jo King

7
Bạn cần phải là một luật sư chứ không phải là một lập trình viên để cạnh tranh trong thử thách này.
anatolyg

2
Điều này chắc chắn không nên được mở lại ở trạng thái hiện tại của nó.
Mego

Câu trả lời:


30

mã máy x86 / x64, 1 byte

c3

Hội,, tổ hợp:

ret

Hãy thử trực tuyến! (căng thẳng)

¯ \ _ (ツ) _ /


2
Nhưng điều này không cung cấp cho hàm một tên hoặc lưu trữ một tham chiếu đến hàm trong một biến.
Tanner Swett

4
@TannerSwett Nó có thể được gọi theo địa chỉ.
âm bảy

7
Bạn có thể thêm một nhãn trong lắp ráp. Nó không làm tăng kích thước của mã được biên dịch và đặt tên cho hàm.
Daniil Tutubalin

21

Thạch , 0 byte

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

Một liên kết đơn âm trả về đối số của nó. Vì nó là chức năng đầu tiên xuất hiện trong tập lệnh, nên nó có thể được gọi bằng cách sử dụng 1Ŀ.

Cảm ơn @lirtosiast đã chỉ ra rằng một liên kết / hàm 0 byte sẽ hoạt động trong Jelly.

I E


3,4,5 1Ŀ

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


Câu trả lời 0 byte sẽ hoạt động.
lirtosiast

@KevinCruijssen có! Điểm tốt
Nick Kennedy

@NickKennedy Bạn có thể sử dụng <pre><code>...</code></pre>để duy trì khoảng trắng hàng đầu / dấu kiểm / dòng mới trong khối mã. Tôi đã chỉnh sửa câu trả lời của bạn cho phù hợp. :)
Kevin Cruijssen

@KevinCruijssen cảm ơn!
Nick Kennedy

Kiến thức về thạch của tôi khá mỏng nhưng bạn không cần một dòng mới để kết thúc liên kết? Nó dường như được sử dụng trong ví dụ.
Đăng Rock Garf Hunter

13

Javascript, 6 byte

f=_=>0

Bao gồm phân công biến. Không có gì nhiều để xem ở đây.


28
Để làm cho nó trông giống biểu tượng cảm xúc hơn:o=_=>o
Daniil Tutubalin

3
Một biểu tượng cảm xúc khácd=_=>b
tsh

3
@tsh, than ôi, bkhông được xác định trong trường hợp này.
Daniil Tutubalin

2
@DanielO: Người ta chắc chắn có thể tranh luận rằng. Nhưng theo tôi, người ta thậm chí có thể lập luận hiệu quả hơn rằng bạn không thể gọi nó, vì vậy nó không phải là một chức năng. Trong javascript, một lệnh gọi hàm được biểu diễn rõ ràng bằng dấu ngoặc đơn.
đệ quy

2
@DaniilTutubalin Nhưng điều này chỉ quan trọng nếu bạn gọi nó. Và không có yêu cầu như vậy về chức năng có nên chạy mà không ném ngoại lệ.
tsh


8

ZX Spectrum BASIC, 6 byte

DEF FN f()=PI

Đổ lục giác : CE 66 28 29 3D A7. CElà một từ khóa 1 byte cho DEF FN(bao gồm cả không gian theo dõi), trong khi đó A7là từ khóa 1 byte cho PI. Gọi bằng cách sử dụng FN f(). Chương trình ví dụ:

  10 PRINT FN f(): DEF FN f()=PI

Đầu ra:

3.1415927

8

Haskell , 3 byte

o=9

Mã này định nghĩa một hàm đa hình được gọi là otham số một kiểu và một tham số thể hiện kiểu chữ. Khi hàm này được gọi, nó sẽ lấy phiên bản typeclass đã cho, lấy fromIntegerthành viên của nó , gọi thành viên đó với Integergiá trị là 9 và trả về kết quả.

Cấp, những gì tôi vừa mô tả chỉ là hành vi của hàm Haskell 9và mã của tôi chỉ định nghĩa một hàm được gọi olà tương đương với 9.

Bây giờ câu hỏi duy nhất là, 9chức năng "do bạn tạo ra" hay là "một chức năng mặc định từ ngôn ngữ"?

Tôi nghĩ rằng đó là "do bạn tạo ra." Lý do của tôi để nói điều này là nếu bạn đọc đặc tả cho Haskell, bạn sẽ (tôi giả sử) không tìm thấy đề cập đến một 9chức năng ở bất cứ đâu. Thay vào đó, đặc tả nói rằng bạn có thể tạo một số bằng cách xâu chuỗi một hoặc nhiều chữ số với nhau. Do đó, bằng cách viết một chuỗi các chữ số, tôi đã viết một hàm số ngay cả khi tôi chỉ sử dụng một chữ số.


thông minh, chức năng cấp loại
Mega Man

8

R , 9 byte

body(t)=0

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

Tôi nghĩ rằng điều này tuân thủ các quy tắc. Các chức năng tkhông có đầu vào và đầu ra 0. Điều này hoạt động vì đã tồn tại một hàm gọi là t(hàm hoán vị) và nó định nghĩa lại phần thân của hàm; nó sẽ không hoạt độngbody(a)=0 (không có đối tượng được gọi a) hoặc body(F)=0( Flà logic, không phải là hàm). Tôi nghĩ rằng nó tuân thủ bởi vì nó vẫn do tôi tạo ra: Tôi không sử dụng lại những gì hàm được xác định trước làm, chỉ đơn giản là tên của nó.

Tôi không nghĩ rằng tôi đã từng thấy điều này được sử dụng bởi những người chơi golf R, nhưng có thể có những tình huống cho phép chúng tôi tiết kiệm một vài byte cho những thách thức mà chúng tôi cần một chức năng trợ giúp.

Một giải pháp chuẩn hơn sẽ là:

R , 13 byte

f=function()0

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

Chức năng không có đầu vào và đầu ra 0. Đây là ngắn hơn 1 byte so với chức năng không có đầu vào và đầu ra không có gì, sẽ là

f=function(){}

Nếu chúng ta cố gắng xác định một chức năng không có cơ thể (f=function() ), R sẽ hiểu đây là một lệnh không hoàn chỉnh (điều này có thể không đúng trong các phiên bản R cũ hơn).

Như OganM đã chỉ ra, chúng tôi giảm xuống còn 11 byte với

R , 11 byte

function()0

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

về mặt kỹ thuật tuân thủ yêu cầu thách thức rằng hàm được gán cho một loại biến nào đó, vì nó được gán cho (phù du) .Last.value.


1
function()0nên làm việc cho câu trả lời thứ hai của bạn vì chức năng không cần phải được đặt tên. Thủ thuật gọn gàng body<-, tôi đã thử sử dụng bodyvà muốn thực hiện một số thử thách kỳ lạ để gây rối với ngôn ngữ
Giuseppe

1
@Giuseppe "Hàm phải được gán cho một số loại biến", vì vậy tôi không nghĩ function()0tuân thủ các quy tắc của thử thách này. Tôi rất vui khi đưa tiền thưởng cho một câu trả lời sử dụng body()="mánh khóe thành công.
Robin Ryder

4
function()0sẽ được chỉ định .Last.value()mặc dù điều đó sẽ thúc đẩy nó
OganM

@OganM Điểm hay!
Robin Ryder

pryr::f(x)nếu chúng ta cho phép pryr.
qwr


6

C (gcc) , 5 byte

Xác định hàm fkhông có đối số và về mặt kỹ thuật trả về giá trị nguyên không xác định.

f(){}

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


1
"Không tranh luận" - nói dối tồi tệ. Đó là một trong những hiểu lầm phổ biến về C: danh sách đối số trống có nghĩa là số lượng đối số loại không xác định mà không có cách di động để truy cập chúng. Là một sidenote, đây cũng là sự không tương thích C / C ++.
val nói Phục hồi lại


6

[Ngôn ngữ Wolfram (Mathicala)], 1 byte

Điều này là một chút nghi vấn:

f

Các định nghĩa f, có thể được "gọi", ví dụ: f[]"trả về" biểu thứcf[]


1
Này, nó có thể được gọi và giá trị trả về là tùy chọn. Điều này được tính.
Trình kết nối

1
Nếu giải pháp này có thể chấp nhận được, thì câu trả lời không có byte cũng tốt như vậy: "định nghĩa" của fbạn không làm gì cả (ngoài việc ghi nhớ "Tôi đã thấy f") và có thể bị bỏ qua. Bạn có thể gọi f[]dù sao, vẫn trả lại vô giá trị f[]. Tuy nhiên, trong mọi trường hợp, bạn chủ yếu chơi các thủ thuật với trình thay thế mẫu và không hướng dẫn để đánh giá một chức năng.
La Mã

@Roman Tôi đã cân nhắc việc thêm phiên bản byte bằng 0, nhưng cuối cùng tôi cảm thấy như điều đó thậm chí còn đáng nghi hơn: điều này thực sự tạo ra biểu tượng Global`f, trong khi phiên bản trống không làm điều đó (bạn có thể tranh luận rằng nó Nullđược gán cho %1, nhưng Nulllà một "chức năng" tích hợp). Nhưng như tôi đã lưu ý trong câu trả lời, liệu giải pháp một byte có hợp lệ hay không cũng không hoàn toàn rõ ràng ...
Lukas Lang


5

Lua , 8 byte

f=load''

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

Xác định hàm (toàn cầu) f.

Điều này sử dụng loadhàm Lua để biên dịch chuỗi đã cho trong trường hợp trống (mã rỗng là mã hợp lệ) thành hàm thực hiện chính xác những gì chúng ta đã viết trong phần thân của nó: không có gì.

Đối với những người tự hỏi, giải pháp tiêu chuẩn sẽ là

function f()end

nhưng cái này dài hơn (15 byte).


5

POSIX sh, 6 byte

s()(1)

Sử dụng dấu ngoặc nhọn đòi hỏi thêm một ký tự.


5

Java, 10 byte

điều này phải phù hợp với các quy tắc của thách thức

void f(){}

1
Tôi khá chắc chắn f=a->a;là hợp lệ là tốt. :)
Kevin Cruijssen

@Kevin Cruijssen Tôi không phải là chuyên gia Java và tôi chưa bao giờ sử dụng ký hiệu mảng Java. Làm thế nào tôi có thể làm cho giải pháp của bạn được biên dịch? Ban đầu tôi đã "thử nghiệm" phương pháp của mình trong TIO này và sau đó nối thêm phương pháp của bạn vào đó. Bây giờ, trình biên dịch mong đợi một định danh. Bất kỳ lời giải thích hoặc sử dụng sai của tôi?
pixma140

2
Đây là một hàm lambda 8+. Vì vậy, một trong hai sẽ làm việc trong trường hợp này. Dưới đây là một lời giải thích sâu hơn về lambdas Java 8+ trong trường hợp bạn chưa quen với chúng.
Kevin Cruijssen


4

Kotlin , 8 byte

val f={}

Một hàm rỗng được lưu trữ trong một biến f.
Gọi nó bằng cách sử dụng f()hoặc f.invoke().



4

C (gcc) , 14 13 byte

(*f)()=L"Ã";

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

Điều này xác định một hàm ftrả về intvà chấp nhận một số lượng không xác định (và loại) của các tham số, mã máy được chứa trong chuỗi ký tự. Ký tự unicode Ã(được lưu trong bộ nhớ như 0xc3 0x00 0x00 0x00trên một máy endian nhỏ) tương ứng với lệnh x86 rettrả về từ hàm. Kiến trúc không x86 có thể yêu cầu (các) opcode khác nhau để trả về.

gcccó thể yêu cầu -zexecstackcờ để tránh một segfault.



3

Tcl , 6 5 11 byte

set f {_ ;}

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

Bao gồm việc gán cho biến f là một phần của bytecount để tuân thủ các quy tắc. Với thay đổi này, định nghĩa thông thường hơn dưới đây liên kết với định nghĩa trên cho bytecount:

proc f _ {}

Đây có phải là một chức năng được đặt tên? Hàm phải được gán cho một số loại biến để có thể truy cập được sau đó.
mbomb007

@ mbomb007 Tôi thấy quan điểm của bạn và đã sửa nó cho phù hợp
SmileAndNod

3

XSLT, 134 byte

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template name="a"></xsl:template></xsl:stylesheet>

A template is the closest thing this language has to a function. It can definitely be called; it takes zero arguments and "returns" the empty string.






2

AppleScript, 10

on a()
end

Explained, compiled, and including invocation:

on a()    -- declare event handler "a"
end a     -- end declaration

-- invoke it:
a()


2

SmileBASIC (>=3), 9 bytes

DEF A
END

Function is called by A.


Alternatively DEF A*END in SB4
12Me21

2

Wolfram Language (Mathematica), 2 bytes

#&

Try it online!

Unfortunately, just & does not work (an anonymous function that does nothing).


You need to save the function to a variable according to the rules, e.g. f=#&
Lukas Lang

@LukasLang it's automatically saved to %1 so there's no need for an explicit assignment to a variable like f.
Roman

Good point, that should be enough to fulfil the rules
Lukas Lang
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.