Napisz funkcję [zamknięte]

15

Nie mogę uwierzyć, że to wyzwanie już nie istnieje.

Wyzwanie

Napisz funkcję.

Specyfika

  • Twój program musi zdefiniować funkcję wywoływalną. Obejmuje to wszystko powszechnie znane jako funkcja, funkcja lambda lub podprogram. Wszystkie tego typu kallaby będą w tym poście określane jako „funkcja”.

    1. Wejście do funkcji jest opcjonalne i nie jest wymagane.

    2. Zwracana wartość z funkcji jest również opcjonalna i nie jest wymagana, ale sterowanie musi powrócić do programu wywołującego.

  • Funkcja musi być przypisana do jakiejś zmiennej, aby można było uzyskać do niej dostęp w późniejszym czasie. Obejmuje to pośrednie przypisanie (w większości popularnych języków, w których deklaracja nazwanej funkcji automatycznie dodaje nazwę do bieżącego zakresu) i bezpośrednie przypisanie (bezpośrednie przypisanie funkcji anonimowej do zmiennej).

  • Funkcja nie musi mieć nazwy.

  • Funkcja musi zostać utworzona przez Ciebie - nie można po prostu przypisać domyślnej funkcji z języka do zmiennej.

  • Poproszę o brak standardowych luk .

To jest , więc wygrywa najniższy wynik w bajtach.

podłącz ładowarkę
źródło
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
James
3
Nie rozumiem, dlaczego zostało to ponownie otwarte, gdy żaden z powodów, dla których został zamknięty, nie został rozwiązany, po prostu ukryty przez modów na czacie
Jo King
2
Ponadto, od kiedy możesz głosować, aby ponownie otworzyć własny post?
Jo King,
7
Aby wziąć udział w tym wyzwaniu, musisz być prawnikiem, a nie programistą.
anatolyg
2
To zdecydowanie nie powinno zostać ponownie otwarte w obecnym stanie.
Mego

Odpowiedzi:

30

Kod maszynowy x86 / x64, 1 bajt

c3

Montaż:

ret

Wypróbuj online! (nasm)

¯ \ _ (ツ) _ / ¯

ujemna siódemka
źródło
2
Ale to nie nadaje funkcji nazwy ani nie przechowuje odniesienia do funkcji w zmiennej.
Tanner Swett
4
@TannerSwett Można go wywołać według adresu.
minus siedem,
7
Możesz dodać etykietę w zespole. Nie zwiększa rozmiaru skompilowanego kodu i nadaje funkcji nazwę.
Daniil Tutubalin
21

Galaretka , 0 bajtów

Wypróbuj online!

Monadyczny link, który zwraca swój argument. Ponieważ jest to pierwsza funkcja pojawiająca się w skrypcie, można ją wywołać za pomocą 1Ŀ.

Dzięki @lirtosiast za zwrócenie uwagi, że link / funkcja 0 bajtów będzie działać w Jelly.

To znaczy


3,4,5 1Ŀ

Wypróbuj online!

Nick Kennedy
źródło
Odpowiedź 0 bajtów powinna działać.
lirtosiast
@KevinCruijssen yes! Dobre miejsce
Nick Kennedy
@NickKennedy Możesz użyć, <pre><code>...</code></pre>aby zachować wiodące / końcowe spacje / znaki nowej linii w blokach kodu. Odpowiednio zredagowałem twoją odpowiedź. :)
Kevin Cruijssen
@KevinCruijssen dzięki!
Nick Kennedy
Moja wiedza na temat galaretki jest dość cienka, ale czy nie potrzebujesz nowej linii, aby zakończyć link? Wydaje się, że został użyty w tym przykładzie.
Post Rock Garf Hunter,
13

JavaScript, 6 bajtów

f=_=>0

Obejmuje zmienne przypisanie. Nie ma tu wiele do zobaczenia.

rekurencyjny
źródło
28
Aby wyglądał bardziej jak emoji:o=_=>o
Daniil Tutubalin
3
Kolejne emojid=_=>b
tsh
3
@tsh, niestety, bnie jest zdefiniowane w tym przypadku.
Daniil Tutubalin
2
@DanielO: Z pewnością można to argumentować. Ale moim zdaniem można jeszcze skuteczniej argumentować, że nie można tego nazwać, więc nie jest to funkcja. W javascript wywołanie funkcji jest jednoznacznie reprezentowane w nawiasach.
rekurencyjny
2
@DaniilTutubalin Ale to ma znaczenie tylko wtedy, gdy ją wywołasz. I nie ma takiego wymogu dotyczącego funkcji, czy powinna działać bez zgłaszania wyjątku.
tsh
8

ZX Spectrum BASIC, 6 bajtów

DEF FN f()=PI

Hex Dump: CE 66 28 29 3D A7. CEjest 1-bajtowym słowem kluczowym dla DEF FN(w tym spacją końcową), natomiast A7jest 1-bajtowym słowem kluczowym dla PI. Zadzwoń za pomocą FN f(). Przykładowy program:

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

Wynik:

3.1415927
Neil
źródło
8

Haskell , 3 bajty

o=9

Ten kod definiuje wywoływaną funkcję polimorficzną, októra przyjmuje jeden parametr typu i jeden parametr instancji klasy. Gdy ta funkcja jest wywoływana, pobiera daną instancję klasy typu, pobiera jąfromInteger element członkowski, wywołuje ten element o Integerwartości 9 i zwraca wynik.

To prawda, że ​​właśnie opisałem tylko zachowanie funkcji Haskell 9, a mój kod po prostu definiuje wywoływaną funkcję, októra jest równoważna z9 .

Teraz jedynym pytaniem jest: 9 funkcja jest „tworzona przez ciebie”, czy też jest to „funkcja domyślna z języka”?

Myślę, że jest „stworzony przez ciebie”. Moim powodem jest to, że jeśli przeczytasz specyfikację dla Haskell, (zakładam) 9nigdzie nie znajdziesz żadnej wzmianki o funkcji. Zamiast tego w specyfikacji podano, że można utworzyć literał liczbowy, łącząc razem jedną lub więcej cyfr. Dlatego pisząc ciąg cyfr, napisałem funkcję - nawet jeśli akurat użyłem tylko jednej cyfry.

Tanner Swett
źródło
sprytne funkcje poziomu
Mega Man
8

R , 9 bajtów

body(t)=0

Wypróbuj online!

Myślę, że jest to zgodne z zasadami. Funkcja tnie pobiera danych wejściowych i wyjściowych 0. Działa to, ponieważ istnieje już funkcja o nazwie t(funkcja transpozycji) i redefiniuje jej treść; nie działałoby z poleceniem say body(a)=0(brak wywołanego obiektu a) lub body(F)=0( Fjest logiczną, a nie funkcją). Myślę, że jest zgodny, ponieważ wciąż jest tworzony przeze mnie: nie używam ponownie tego, co robi wstępnie zdefiniowana funkcja, tylko jej nazwa.

Nie sądzę, że kiedykolwiek widziałem to używane przez golfistów R., ale mogą zdarzyć się sytuacje, w których pozwala nam zaoszczędzić kilka bajtów na wyzwaniach, w których potrzebujemy funkcji pomocnika.

Bardziej standardowym rozwiązaniem byłoby:

R , 13 bajtów

f=function()0

Wypróbuj online!

Funkcja, która nie pobiera danych wejściowych i wyjściowych 0. Jest to 1 bajt krótszy niż funkcja, która nie pobiera danych wejściowych i niczego nie wyprowadza, co byłoby

f=function(){}

Jeśli spróbujemy zdefiniować funkcję bez body ( f=function()), R interpretuje to jako niekompletne polecenie (może nie być to prawdą w starszych wersjach R).

Jak zauważył OganM, zmniejszamy to do 11 bajtów

R 11 bajtów

function()0

Wypróbuj online!

który technicznie jest zgodny z wymaganiem wyzwania, aby funkcja została przypisana do jakiejś zmiennej, ponieważ jest (efemerycznie) przypisana do .Last.value.

Robin Ryder
źródło
1
function()0powinien działać na drugą odpowiedź, ponieważ funkcja nie musi być nazwana. Zgrabna sztuczka body<-, próbowałem użyć bodyi lubię robić niektóre z dziwnych wyzwań, aby zadzierać z językiem
Giuseppe
1
@Giuseppe „Funkcja musi być przypisana do jakiejś zmiennej”, więc nie sądzę, aby była function()0zgodna z regułami tego wyzwania. Z przyjemnością dam nagrodę za odpowiedź, która z body()="powodzeniem wykorzystuje tę sztuczkę.
Robin Ryder
4
function()0zostałby przydzielony do .Last.value()tego, co by to popychało
OganM,
@OganM Nice point!
Robin Ryder,
pryr::f(x)jeśli pozwolimy pryr.
qwr
6

Perl 6 , 5 bajtów

$!=!*

Wypróbuj online!

Tworzy dowolną lambda, która zwraca wartość logiczną nie swojego parametru i przypisuje ją do zmiennej $!.

Jo King
źródło
6

C (gcc) , 5 bajtów

Definiuje funkcję, fktóra nie przyjmuje argumentów i technicznie zwraca niezdefiniowaną wartość całkowitą.

f(){}

Wypróbuj online!

ErikF
źródło
1
„nie bierze argumentów” - kłamie źle. To jedno z powszechnych nieporozumień na temat C: pusta lista argumentów oznacza nieokreśloną liczbę argumentów nieokreślonego typu bez przenośnego sposobu dostępu do nich. Krótko mówiąc, jest to także niezgodność C / C ++.
val mówi Przywróć Monikę
6

Biała spacja , 7 bajtów


  

	

Tworzy podprogram, który zwraca kontrolę nad dzwoniącym.

Wyjaśnione w kontekście:

[N
S S N
_Create_Label][N
T   N
_Return]

Wypróbuj online!

kamienny pajęczak
źródło
6

[Wolfram Language (Mathematica)], 1 bajt

Ten jest nieco wątpliwy:

f

Definiuje f, które można „wywołać”, np. Przez f[], które „zwraca” wyrażenief[]

Lukas Lang
źródło
1
Hej, można go wywołać, a zwracana wartość jest opcjonalna. To się liczy.
connectyourcharger
1
Jeśli to rozwiązanie jest możliwe do zaakceptowania, odpowiedź zerowa jest równie dobra: twoja „definicja” fnic nie robi (oprócz pamiętania „widziałem f”) i może zostać pominięta. Możesz f[]jednak zadzwonić , wciąż wracając bez oceny f[]. W każdym razie jednak najczęściej grasz sztuczkami z zamiennikiem wzorów i nie instruujesz, aby oceniać funkcję.
Rzym.
@Roman Zastanawiałem się nad dodaniem wersji zero-bajtowej, ale w końcu czułem, że jest to jeszcze bardziej wątpliwe: to faktycznie tworzy symbol Global`f, podczas gdy pusta wersja tego nie robi (możesz argumentować, że Nulljest przypisany %1, ale Nulljest wbudowana „funkcja”). Ale jak zauważyłem w odpowiedzi, to, czy jedno bajtowe rozwiązanie jest poprawne, nie jest również całkowicie jasne ...
Lukas Lang
5

Dalej (gforth) , 5 bajtów

Jest to funkcja o nazwie f, która nic nie robi.

: f ;

Wypróbuj online

W kodzie TIO dodałem stopkę see f, która wypisuje definicję funkcji.

mbomb007
źródło
5

Lua , 8 bajtów

f=load''

Wypróbuj online!

Definiuje funkcję (globalną) f .

To używa Lua load funkcję do kompilacji podanego ciągu znaków, który w naszym przypadku jest pusty (pusty kod jest poprawnym kodem), do funkcji wykonującej dokładnie to, co napisaliśmy w jego ciele: nic.

Dla tych, którzy zastanawiają się, byłoby to standardowe rozwiązanie

function f()end

ale to jest dłuższe (15 bajtów).

val mówi Przywróć Monikę
źródło
5

POSIX sh, 6 bajtów

s()(1)

Korzystanie z nawiasów klamrowych wymaga jeszcze jednej postaci.

kojiro
źródło
5

Java, 10 bajtów

powinno to być zgodne z regułami wyzwania

void f(){}
pixma140
źródło
1
Jestem pewien, że f=a->a;jest również ważny. :)
Kevin Cruijssen
@Kevin Cruijssen Nie jestem ekspertem od Java i nigdy nie korzystałem z notacji tablic Java. Jak mogę zmusić kompilację Twojego rozwiązania? Początkowo „przetestowałem” moją metodę w tym TIO, a następnie dołączyłem tam twoje podejście. Teraz kompilator oczekuje identyfikatora. Wszelkie wyjaśnienia lub nieprawidłowe użycie przeze mnie?
pixma140,
2
Jest to funkcja lambda Java 8+. Więc jedno z tych dwóch działałoby w tym przypadku. Oto bardziej szczegółowe wyjaśnienie lambd Java 8+ na wypadek, gdybyś ich jeszcze nie znał.
Kevin Cruijssen
4

Kotlin , 8 bajtów

val f={}

Pusta funkcja przechowywana w zmiennej f.
Zadzwoń za pomocą f()lub f.invoke().

Peïo THIBAULT
źródło
4

shortC , 1 bajt

A

Wypróbuj online!

Transpozycje do tego C:

 int main(int argc, char **argv){;}
kamienny pajęczak
źródło
4

C (gcc) , 14 13 bajtów

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

Wypróbuj online!

Definiuje to funkcję fzwracającą inti przyjmującą nieokreśloną liczbę (i typ) parametrów, których kod maszynowy jest zawarty w literale ciągu. Znak Unicode Ã(przechowywany w pamięci jak 0xc3 0x00 0x00 0x00na małej maszynie Endian) odpowiada x86ret instrukcji która powraca z funkcji. Architektury inne niż x86 mogą wymagać różnych kodów operacyjnych do zwrócenia.

gccmoże wymagać -zexecstackflagi, aby uniknąć awarii.

sufitowy
źródło
3

Tcl , 6 5 11 bajtów

set f {_ ;}

Wypróbuj online!

Uwzględnienie przypisania do zmiennej f jako części bajtu w celu zachowania zgodności z regułami. Dzięki tej zmianie bardziej konwencjonalna definicja poniżej wiąże powyższą z liczbą bajtów:

proc f _ {}
SmileAndNod
źródło
Czy to funkcja o nazwie? Funkcja musi być przypisana do jakiejś zmiennej, aby można było uzyskać do niej dostęp w późniejszym czasie.
mbomb007
@ mbomb007 Rozumiem twój punkt i odpowiednio go naprawiłem
SmileAndNod
3

XSLT, 134 bajty

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

Szablon jest najbliższą funkcją tego języka. Można to zdecydowanie nazwać; pobiera zero argumentów i „zwraca” pusty ciąg.

Silvio Mayolo
źródło
3

Python 3 , 10 bajtów

f=lambda:0

Wypróbuj online!

U10 do przodu
źródło
Czy nie możesz po prostu def f():0zapisać bajtu?
EdgyNerd
@EdgyNerd Dat odpowiedział przede mną tym kodem i nie chcę go kopiować
U10-Forward
No dobrze, nieważne więc
EdgyNerd
3

Pascal 23 bajtów

procedure A;begin end;
rnso
źródło
2

AppleScript, 10

on a()
end

Wyjaśnione, skompilowane, w tym wywołanie:

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

-- invoke it:
a()
kamienny pajęczak
źródło
2

Japt , 2 bajty

_

Nazywany jako $U ($ .

_mogą być zastąpione @, ÏlubÈ .

Spróbuj

Embodiment of Ignorance
źródło
2

SmileBASIC (>=3), 9 bytes

DEF A
END

Function is called by A.

snail_
źródło
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).

Roman
źródło
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