เขียนฟังก์ชั่น [ปิด]


15

ฉันไม่อยากเชื่อเลยว่าความท้าทายนี้ไม่มีอยู่จริง

ความท้าทาย

เขียนฟังก์ชั่น

โดยเฉพาะ

  • โปรแกรมของคุณต้องกำหนดฟังก์ชั่น callable บางประเภท ซึ่งรวมถึงสิ่งที่รู้จักกันทั่วไปว่าเป็นฟังก์ชันฟังก์ชันแลมบ์ดาหรือรูทีนย่อย callables ประเภทนี้ทั้งหมดจะถูกเรียกว่า "ฟังก์ชั่น" ในโพสต์นี้

    1. อินพุตไปยังฟังก์ชันเป็นทางเลือกและไม่จำเป็น

    2. ค่าส่งคืนจากฟังก์ชั่นเป็นตัวเลือกและไม่จำเป็น แต่การควบคุมจะต้องกลับไปที่โปรแกรมการโทร

  • ต้องกำหนดฟังก์ชั่นให้กับตัวแปรบางประเภทเพื่อให้สามารถเข้าถึงได้ในภายหลัง ซึ่งรวมถึงการมอบหมายทางอ้อม (ในภาษาทั่วไปส่วนใหญ่ที่ประกาศฟังก์ชั่นที่มีชื่อเพิ่มชื่อในขอบเขตปัจจุบันโดยอัตโนมัติ) และการมอบหมายโดยตรง (การกำหนดฟังก์ชั่นที่ไม่ระบุชื่อให้ตัวแปรโดยตรง)

  • ไม่จำเป็นต้องตั้งชื่อฟังก์ชัน

  • ฟังก์ชั่นจะต้องสร้างขึ้นโดยคุณ - คุณก็ไม่สามารถกำหนดฟังก์ชั่นเริ่มต้นจากภาษาให้กับตัวแปร

  • ไม่มีช่องว่างมาตรฐานกรุณา

นี่คือดังนั้นคะแนนต่ำสุดในหน่วยไบต์ชนะ


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
DJMcMayhem

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

2
นอกจากนี้ตั้งแต่เมื่อคุณสามารถลงคะแนนเพื่อเปิดโพสต์ของคุณเองอีกครั้ง ??
Jo King

7
คุณต้องเป็นทนายความมากกว่าโปรแกรมเมอร์เพื่อแข่งขันในการท้าทายนี้
Anatolyg

2
สิ่งนี้ไม่ควรเปิดในสถานะปัจจุบันอย่างแน่นอน
Mego

คำตอบ:


30

รหัสเครื่อง x86 / x64 ขนาด 1 ไบต์

c3

สภา:

ret

ลองออนไลน์! (NASM)

¯ \ _ (ツ) _ / ¯


2
แต่สิ่งนี้ไม่ได้ทำให้ชื่อฟังก์ชั่นหรือเก็บการอ้างอิงถึงฟังก์ชั่นในตัวแปร
แทนเนอร์ Swett

4
@TannerSwett มันสามารถเรียกตามที่อยู่
ลบเจ็ด

7
คุณสามารถเพิ่มป้ายกำกับในการชุมนุม มันไม่เพิ่มขนาดของรหัสที่คอมไพล์แล้วและให้ชื่อฟังก์ชั่น
Daniil Tutubalin

21

เยลลี่ 0 ไบต์

ลองออนไลน์!

ลิงก์ monadic ที่ส่งคืนอาร์กิวเมนต์ เนื่องจากเป็นฟังก์ชันแรกที่ปรากฏในสคริปต์จึงสามารถเรียก1Ŀใช้ได้

ขอบคุณ @lirtosiast สำหรับการชี้ให้เห็นว่า 0 ไบต์ลิงก์ / ฟังก์ชั่นจะทำงานในเยลลี่

กล่าวคือ


3,4,5 1Ŀ

ลองออนไลน์!


คำตอบ 0 ไบต์ควรทำงาน
lirtosiast

@KevinCruijssen ใช่! จุดที่ดี
Nick Kennedy

@NickKennedy คุณสามารถใช้<pre><code>...</code></pre>เพื่อรักษาช่องว่างนำหน้า / ต่อท้าย / ขึ้นบรรทัดใหม่ในบล็อกโค้ด ฉันได้แก้ไขคำตอบของคุณแล้ว :)
Kevin Cruijssen

@KevinCruijssen ขอบคุณ!
Nick Kennedy

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

13

Javascript ขนาด 6 ไบต์

f=_=>0

รวมถึงการกำหนดตัวแปร ไม่มากที่จะเห็นที่นี่


28
วิธีทำให้มันดูคล้ายอิโมจิมากขึ้น:o=_=>o
Daniil Tutubalin

3
อีโมจิอื่นd=_=>b
tsh

3
@tsh อนิจจาbไม่ได้กำหนดไว้ในกรณีนี้
Daniil Tutubalin

2
@DanielO: ใครจะโต้แย้งได้อย่างแน่นอน แต่ในความคิดของฉันมีใครสามารถโต้แย้งได้อย่างมีประสิทธิภาพมากขึ้นว่าคุณไม่สามารถเรียกมันได้ ในจาวาสคริปต์การเรียกใช้ฟังก์ชันจะแสดงด้วยวงเล็บอย่างไม่น่าสงสัย
ซ้ำ

2
@DaniilTutubalin แต่ตอนนี้สำคัญถ้าคุณเรียกมัน และไม่มีข้อกำหนดดังกล่าวเกี่ยวกับฟังก์ชั่นว่าควรจะรันโดยไม่ส่งข้อยกเว้น
TSH


8

ZX Spectrum BASIC ขนาด 6 ไบต์

DEF FN f()=PI

การถ่ายโอนข้อมูล CE 66 28 29 3D A7Hex: CEเป็นคำหลัก 1 ไบต์สำหรับDEF FN(รวมถึงช่องว่างต่อท้าย) ในขณะที่A7เป็น 1 PIไบต์คำหลักสำหรับ FN f()เรียกใช้ โปรแกรมตัวอย่าง:

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

เอาท์พุท:

3.1415927

8

Haskellขนาด 3 ไบต์

o=9

รหัสนี้กำหนดฟังก์ชั่น polymorphic ที่เรียกว่า oใช้พารามิเตอร์ชนิดหนึ่งและพารามิเตอร์อินสแตนซ์ typeclass หนึ่ง เมื่อฟังก์ชันนี้ถูกเรียกมันจะใช้อินสแตนซ์ของคลาส typec ที่ได้รับมาfromIntegerสมาชิกเรียกสมาชิกนั้นด้วยIntegerค่า 9 และส่งคืนผลลัพธ์

ได้รับสิ่งที่ฉันเพิ่งอธิบายเป็นเพียงพฤติกรรมของฟังก์ชั่น Haskell 9และรหัสของฉันเพียงกำหนดฟังก์ชั่นที่เรียกว่าoซึ่งเทียบเท่ากับ9ซึ่งเทียบเท่ากับ

ตอนนี้คำถามเดียวก็คือ 9ฟังก์ชั่น "สร้างโดยคุณ" หรือ "ฟังก์ชั่นเริ่มต้นจากภาษา" หรือไม่?

ฉันคิดว่ามันเป็น "สร้างขึ้นโดยคุณ" เหตุผลของฉันในการพูดแบบนี้คือถ้าคุณอ่านสเปคของ Haskell คุณจะ (ฉันคิดว่า) ไม่ต้องพูดถึง9ฟังก์ชั่นใด ๆ แต่สเปคระบุว่าคุณสามารถสร้างตัวเลขตามตัวอักษรโดยการคบกันอย่างน้อยหนึ่งหลัก ดังนั้นโดยการเขียนสตริงตัวเลขฉันได้เขียนฟังก์ชั่นแม้ว่าฉันเพิ่งเกิดขึ้นที่จะใช้เพียงหนึ่งหลัก


ฟังก์ชั่นการพิมพ์ระดับฉลาด
Mega Man

8

R , 9 ไบต์

body(t)=0

ลองออนไลน์!

ฉันคิดว่านี่เป็นไปตามกฎ ฟังก์ชั่นใช้เวลาไม่อินพุตและเอาต์พุตt 0วิธีนี้ใช้งานได้เนื่องจากมีฟังก์ชั่นที่เรียกว่าt(ฟังก์ชั่นขนย้าย) อยู่แล้วและจะนิยามเนื้อหาของฟังก์ชันอีกครั้ง มันจะไม่ทำงานกับพูดbody(a)=0(ไม่มีวัตถุที่เรียกว่าa) หรือbody(F)=0( Fเป็นตรรกะไม่ใช่ฟังก์ชั่น) ฉันคิดว่ามันเป็นไปตามเพราะมันยังคงถูกสร้างโดยฉัน: ฉันไม่ได้ใช้ซ้ำในสิ่งที่ฟังก์ชั่นที่กำหนดไว้ล่วงหน้าทำเพียงแค่ชื่อ

ฉันไม่คิดว่าฉันเคยเห็นสิ่งนี้ที่นักกอล์ฟ R ใช้ แต่อาจมีสถานการณ์ที่ช่วยให้เราสามารถบันทึกความท้าทายที่เราต้องการฟังก์ชันผู้ช่วยได้

โซลูชันมาตรฐานที่มากขึ้นน่าจะเป็น:

R , 13 ไบต์

f=function()0

ลองออนไลน์!

0ฟังก์ชั่นที่ใช้เวลาไม่อินพุตและเอาต์พุต นี่คือ 1 ไบต์ที่สั้นกว่าฟังก์ชั่นที่ไม่มีการป้อนข้อมูลและเอาท์พุทอะไรซึ่งจะเป็น

f=function(){}

หากเราพยายามกำหนดฟังก์ชั่นที่ไม่มีเนื้อความ ( f=function()) ฟังก์ชันR จะตีความว่านี่เป็นคำสั่งที่ไม่สมบูรณ์ (ซึ่งอาจไม่เป็นจริงในเวอร์ชันเก่ากว่าของ R)

ดังที่ OganM ชี้ให้เห็นเราลดขนาดลงเหลือ 11 ไบต์ด้วย

R , 11 ไบต์

function()0

ลองออนไลน์!

ซึ่งในทางเทคนิคสอดคล้องกับความต้องการความท้าทายที่ฟังก์ชั่นได้รับมอบหมายให้จัดเรียงของตัวแปรบางอย่างเพราะมันเป็น (ephemerally) .Last.valueที่กำหนดให้


1
function()0ควรใช้สำหรับคำตอบที่สองของคุณเนื่องจากไม่จำเป็นต้องตั้งชื่อฟังก์ชัน เคล็ดลับเรียบร้อยbody<-ฉันพยายามใช้bodyและชอบที่จะทำสิ่งที่ท้าทายแปลก ๆ ให้ยุ่งกับภาษา
จูเซปเป้

1
@Giuseppe "ฟังก์ชั่นจะต้องถูกกำหนดให้กับตัวแปรบางประเภท" ดังนั้นฉันไม่คิดว่าfunction()0จะเป็นไปตามกฎของความท้าทายนี้ ฉันยินดีที่จะให้รางวัลกับคำตอบที่ใช้body()="เคล็ดลับเรียบร้อยแล้ว
Robin Ryder

4
function()0จะได้รับมอบหมาย.Last.value()แม้ว่าจะมีการผลักดันมัน
OganM

@OganM จุดดี!
Robin Ryder

pryr::f(x)ถ้าเราอนุญาตให้ pryr
qwr


6

C (gcc) 5 ไบต์

กำหนดฟังก์ชั่นfที่ไม่รับอาร์กิวเมนต์และส่งคืนค่าจำนวนเต็มที่ไม่ได้กำหนดทางเทคนิค

f(){}

ลองออนไลน์!


1
"ไม่มีข้อโต้แย้ง" - โกหกไม่ดี นั่นเป็นหนึ่งในความเข้าใจผิดทั่วไปเกี่ยวกับ C: รายการอาร์กิวเมนต์ว่างหมายถึงจำนวนอาร์กิวเมนต์ชนิดที่ไม่ได้กำหนดซึ่งไม่ได้กำหนดโดยไม่ต้องมีวิธีพกพาในการเข้าถึง ในฐานะ sidenote นี่เป็นความเข้ากันไม่ได้ของ C / C ++
พูดว่า Reinstate Monica


6

[Wolfram Language (Mathematica)], 1 ไบต์

อันนี้น่าสงสัยเล็กน้อย:

f

กำหนดfซึ่งสามารถ "เรียกว่า" เช่นโดยf[]ที่ "ส่งคืน" การแสดงออกf[]


1
เฮ้มันสามารถเรียกได้และค่าตอบแทนจะเป็นตัวเลือก สิ่งนี้นับ
connectyourcharger

1
หากวิธีนี้เป็นที่ยอมรับคำตอบแบบ zero-byte ก็ดีเช่นกัน: "คำจำกัดความ" ของคุณfไม่ได้ทำอะไรเลย (นอกเหนือจากการจดจำ "ฉันเคยเห็นf") แล้วก็จะถูกทิ้งไว้ คุณสามารถโทรถึงf[]กระนั้นยังคงกลับมาประเมินค่าf[]ไม่ได้ อย่างไรก็ตามในกรณีใด ๆ คุณส่วนใหญ่เล่นเทคนิคกับ pattern-replacer และไม่แนะนำให้ประเมินฟังก์ชั่น
Roman

@ Roman ฉันได้พิจารณาการเพิ่มรุ่นศูนย์ไบต์ แต่ท้ายที่สุดฉันรู้สึกว่าเป็นคำถามที่น่าสงสัยมากขึ้น: นี่เป็นการสร้างสัญลักษณ์Global`fในขณะที่เวอร์ชันว่างไม่ได้ทำเช่นนั้น (คุณสามารถโต้แย้งว่าNullได้รับมอบหมาย%1แต่Nullเป็น "ฟังก์ชั่น" ในตัว)) แต่อย่างที่ฉันได้กล่าวไว้ในคำตอบว่าโซลูชั่นหนึ่งไบต์นั้นถูกต้องหรือไม่ก็ไม่ชัดเจนเลย ...
Lukas Lang


5

Luaขนาด 8 ไบต์

f=load''

ลองออนไลน์!

กำหนดฟังก์ชั่น (ทั่วโลก) fฟังก์ชั่น

สิ่งนี้ใช้ Lua loadฟังก์ชันเพื่อรวบรวมสตริงที่กำหนดซึ่งเกิดขึ้นเป็นค่าว่างในกรณีของเรา (โค้ดที่ว่างเปล่าเป็นรหัสที่ถูกต้อง) ในฟังก์ชันที่ทำสิ่งที่เราเขียนไว้ในเนื้อหาของมัน: ไม่มีอะไร

สำหรับคนที่สงสัยวิธีแก้ปัญหามาตรฐานจะเป็น

function f()end

แต่จะยาวกว่า (15 ไบต์)


5

POSIX sh, 6 ไบต์

s()(1)

การใช้เครื่องหมายปีกกาต้องใช้อักขระมากกว่าหนึ่งตัว


5

Java, 10 ไบต์

สิ่งนี้ควรตรงกับกฎของการท้าทาย

void f(){}

1
ฉันค่อนข้างแน่ใจว่าf=a->a;ถูกต้องเช่นกัน :)
Kevin Cruijssen

@Kevin Cruijssen ฉันไม่ใช่ผู้เชี่ยวชาญด้าน Java และฉันไม่เคยใช้สัญลักษณ์อาร์เรย์ของ Java ฉันจะทำให้วิธีการรวบรวมข้อมูลของคุณได้อย่างไร ฉันเริ่ม "ทดสอบ" วิธีการของฉันในTIOนี้แล้วต่อท้ายวิธีการของคุณที่นั่น ตอนนี้คอมไพเลอร์ต้องการตัวระบุ คำอธิบายใด ๆ หรือการใช้งานผิดโดยฉัน?
pixma140

2
มันเป็นฟังก์ชั่น Java 8+ แลมบ์ดา ดังนั้นทั้งสองจะทำงานในกรณีนี้ นี่คือคำอธิบายเชิงลึกเพิ่มเติมของ Java 8+ lambdasในกรณีที่คุณยังไม่คุ้นเคย
Kevin Cruijssen




4

C (gcc) , 14 13 ไบต์

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

ลองออนไลน์!

สิ่งนี้จะกำหนดฟังก์ชั่นที่fส่งคืนintและยอมรับหมายเลขที่ไม่ได้ระบุ (และประเภท) ของพารามิเตอร์รหัสเครื่องซึ่งมีอยู่ภายในตัวอักษรสตริง อักขระ unicode Ã(เก็บไว้ในหน่วยความจำเช่นเดียว0xc3 0x00 0x00 0x00กับเครื่อง endian เล็ก ๆ ) ที่สอดคล้องกับ x86retคำสั่งที่ส่งคืนจากฟังก์ชัน สถาปัตยกรรมที่ไม่ใช่ x86 อาจต้องการ opcode ที่แตกต่างกันเพื่อส่งคืน

gccอาจต้องการ-zexecstackแฟล็กเพื่อหลีกเลี่ยง segfault



3

Tcl , 6 5 11 ไบต์

set f {_ ;}

ลองออนไลน์!

รวมถึงการมอบหมายให้ตัวแปร f ซึ่งเป็นส่วนหนึ่งของ bytecount เพื่อให้สอดคล้องกับกฎ ด้วยการเปลี่ยนแปลงนี้นิยามดั้งเดิมที่ด้านล่างจะเชื่อมโยงกับค่าด้านบนสำหรับ bytecount:

proc f _ {}

นี่เป็นฟังก์ชั่นที่ตั้งชื่อหรือไม่? ต้องกำหนดฟังก์ชั่นให้กับตัวแปรบางประเภทเพื่อให้สามารถเข้าถึงได้ในภายหลัง
mbomb007

@ mbomb007 ฉันเห็นจุดของคุณและแก้ไขตามนั้น
SmileAndNod

3

XSLT, 134 ไบต์

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

เทมเพลตเป็นสิ่งที่ใกล้เคียงที่สุดที่ภาษานี้มีต่อฟังก์ชั่น มันสามารถเรียกได้อย่างแน่นอน มันใช้เวลาเป็นศูนย์ข้อโต้แย้งและ "ส่งกลับ" สตริงที่ว่างเปล่า






2

AppleScript, 10

on a()
end

อธิบายรวบรวมและรวมถึงการเรียก:

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

-- invoke it:
a()



2

ภาษา Wolfram (Mathematica) 2 ไบต์

#&

ลองออนไลน์!

น่าเสียดายที่&มันใช้งานไม่ได้ (ฟังก์ชั่นไม่ระบุชื่อที่ไม่ทำอะไรเลย)


คุณต้องบันทึกฟังก์ชันเป็นตัวแปรตามกฎเช่นf=#&
Lukas Lang

@LukasLang มีการบันทึกไว้โดยอัตโนมัติเพื่อให้มีความจำเป็นในการที่ได้รับมอบหมายอย่างชัดเจนให้กับตัวแปรเหมือนไม่มี%1 f
Roman

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