Scrivi una funzione [chiuso]


15

Onestamente non posso credere che questa sfida non esista già.

La sfida

Scrivi una funzione.

I dettagli

  • Il tuo programma deve definire una sorta di funzione richiamabile. Ciò include qualsiasi cosa comunemente nota come una funzione, una funzione lambda o una subroutine. Tutti questi tipi di callable saranno indicati come "funzioni" in questo post.

    1. L'ingresso alla funzione è facoltativo e non richiesto.

    2. Un valore restituito dalla funzione è anche facoltativo e non necessario ma il controllo deve tornare al programma chiamante.

  • La funzione deve essere assegnata a una sorta di variabile in modo che sia possibile accedervi in ​​un secondo momento. Ciò include l'assegnazione indiretta (nelle lingue più comuni in cui la dichiarazione di una funzione denominata aggiunge automaticamente il nome nell'ambito corrente) e l'assegnazione diretta (assegnazione diretta di una funzione anonima a una variabile).

  • Non è necessario assegnare un nome alla funzione.

  • La funzione deve essere creata da te : non puoi semplicemente assegnare una funzione predefinita dalla lingua a una variabile.

  • Nessuna delle scappatoie standard , per favore.

Questo è , quindi vince il punteggio più basso in byte.


I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
DJMcMayhem

3
Non capisco perché questo sia stato riaperto quando nessuno dei motivi per cui è stato chiuso in primo luogo è stato affrontato, appena nascosto dalle mod in una chat
Jo King

2
Inoltre, da quando puoi votare per riaprire il tuo post ??
Jo King,

7
Devi essere un avvocato piuttosto che un programmatore per competere in questa sfida.
Anatolyg

2
Questo non avrebbe dovuto assolutamente essere riaperto nel suo stato attuale.
Mego

Risposte:


30

codice macchina x86 / x64, 1 byte

c3

Montaggio:

ret

Provalo online! (Nasm)

¯ \ _ (ツ) _ / ¯


2
Ma questo non dà alla funzione un nome o memorizza un riferimento alla funzione in una variabile.
Tanner Swett,

4
@TannerSwett Può essere chiamato per indirizzo.
negativo 7

7
È possibile aggiungere un'etichetta nell'assieme. Non aumenta la dimensione del codice compilato e dà un nome alla funzione.
Daniil Tutubalin,

21

Gelatina , 0 byte

Provalo online!

Un collegamento monadico che restituisce il suo argomento. Poiché è la prima funzione ad apparire nello script, può essere chiamata usando 1Ŀ.

Grazie a @lirtosiast per aver sottolineato che un collegamento / funzione a 0 byte funzionerebbe in Jelly.

ie


3,4,5 1Ŀ

Provalo online!


La risposta a 0 byte dovrebbe funzionare.
Lirtosiast

@KevinCruijssen si! Buon posto
Nick Kennedy il

@NickKennedy È possibile utilizzare <pre><code>...</code></pre>per conservare spazi / righe iniziali / finali in blocchi di codice. Ho modificato la tua risposta di conseguenza. :)
Kevin Cruijssen il

@KevinCruijssen grazie!
Nick Kennedy,

La mia conoscenza della gelatina è piuttosto scarsa ma non hai bisogno di una nuova riga per terminare il collegamento? Sembra essere usato nell'esempio.
Post Rock Garf Hunter,

13

Javascript, 6 byte

f=_=>0

Include assegnazione variabile. Non c'è molto da vedere qui.


28
Per farlo sembrare più emoji:o=_=>o
Daniil Tutubalin,

3
Un altro emojid=_=>b
TSH

3
@tsh, ahimè, bnon è definito in questo caso.
Daniil Tutubalin,

2
@DanielO: Si potrebbe certamente discuterne. Ma a mio avviso, si potrebbe sostenere ancora più efficacemente che non si può chiamare, quindi non è una funzione. In javascript, una chiamata di funzione è rappresentata in modo inequivocabile tra parentesi.
ricorsivo il

2
@DaniilTutubalin Ma questo conta solo se lo invochi. E non esiste tale requisito per la funzione se deve essere eseguito senza generare un'eccezione.
TSH


8

ZX Spectrum BASIC, 6 byte

DEF FN f()=PI

Hex discarica: CE 66 28 29 3D A7. CEè una parola chiave a 1 byte per DEF FN(incluso lo spazio finale), mentre A7è una parola chiave a 1 byte per PI. Chiama usando FN f(). Esempio di programma:

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

Produzione:

3.1415927

8

Haskell , 3 byte

o=9

Questo codice definisce una funzione polimorfica chiamata oche accetta un parametro di tipo e un parametro di istanza di tipo typeclass. Quando viene chiamata questa funzione, prende l'istanza di typeclass fornita, ottiene il suo fromIntegermembro, chiama quel membro con ilInteger valore per 9 e restituisce il risultato.

Certo, quello che ho appena descritto è semplicemente il comportamento della funzione Haskell 9, e il mio codice definisce semplicemente una funzione chiamata oche è equivalente a9 .

Ora l'unica domanda è, è il 9 funzione "è stata creata da te" o è "una funzione predefinita dalla lingua"?

Penso che sia "creato da te". La mia ragione per dire questo è che se leggi le specifiche per Haskell, (suppongo) non troverai alcuna menzione di una 9funzione da nessuna parte. Invece, la specifica afferma che è possibile creare un numero letterale mettendo insieme una o più cifre. Pertanto, scrivendo una stringa di cifre, ho scritto una funzione, anche se per caso ho usato solo una cifra.


funzioni intelligenti a livello di tipo
Mega Man

8

R , 9 byte

body(t)=0

Provalo online!

Penso che questo sia conforme alle regole. La funzione tnon accetta input e output 0. Questo funziona perché esiste già una funzione chiamata t(la funzione di trasposizione) e ridefinisce il corpo della funzione; non funzionerebbe con say body(a)=0(nessun oggetto chiamato a) o body(F)=0( Fè una logica, non una funzione). Penso che sia conforme perché è ancora stato creato da me: non sto riutilizzando ciò che fa la funzione predefinita, semplicemente il suo nome.

Non credo di averlo mai visto usato dai giocatori di golf R, ma ci possono essere situazioni in cui ci consente di salvare qualche byte in sfide in cui abbiamo bisogno di una funzione di supporto.

Una soluzione più standard sarebbe stata:

R , 13 byte

f=function()0

Provalo online!

Funzione che non accetta input e output 0. Questo è 1 byte più corto della funzione che non accetta input e non emette nulla, il che sarebbe

f=function(){}

Se proviamo a definire una funzione senza body ( f=function()), R la interpreta come un comando incompleto (ciò potrebbe non essere vero nelle versioni precedenti di R).

Come sottolineato da OganM, prendiamo questo fino a 11 byte con

R , 11 byte

function()0

Provalo online!

che tecnicamente soddisfa il requisito di sfida a cui la funzione deve essere assegnata a una sorta di variabile, poiché è assegnata (in modo effimero) .Last.value.


1
function()0dovrebbe funzionare per la seconda risposta poiché non è necessario assegnare un nome alla funzione. Trucco accurato body<-, ho provato a usare bodye simili per fare alcune delle strane sfide per pasticciare con la lingua
Giuseppe

1
@Giuseppe "La funzione deve essere assegnata a una sorta di variabile", quindi non credo function()0sia conforme alle regole di questa sfida. Sarei felice di dare una taglia a una risposta che usa il body()="trucco con successo.
Robin Ryder,

4
function()0sarebbe stato assegnato a .Last.value()quello che lo avrebbe spinto
OganM

@OganM Bel punto!
Robin Ryder,

pryr::f(x)se permettiamo pryr.
qwr


6

C (gcc) , 5 byte

Definisce una funzione fche non accetta argomenti e restituisce tecnicamente un valore intero non definito.

f(){}

Provalo online!


1
"non prende argomenti" - giace male. Questo è uno dei malintesi comuni su C: lista di argomenti vuota significa quantità indefinita di argomenti di tipo indefinito senza un modo portatile per accedervi. Come sidenote, questa è anche incompatibilità C / C ++.
dice Val Reinstate Monica l'


6

[Wolfram Language (Mathematica)], 1 byte

Questo è leggermente discutibile:

f

Definisce f, che può essere "chiamato" ad esempio da f[], che "restituisce" l'espressionef[]


1
Ehi, può essere chiamato e il valore restituito è facoltativo. Questo conta.
connectyourcharger

1
Se questa soluzione è accettabile, la risposta a zero byte è altrettanto buona: la tua "definizione" di fnon fa nulla (a parte ricordare "Ho visto f") e può essere lasciata fuori. Puoi f[]comunque chiamare , tornando ancora non valutato f[]. Tuttavia, in ogni caso stai giocando principalmente trucchi con il pattern-replacer e non stai insegnando a valutare una funzione.
Roman

@Roman Ho preso in considerazione l'aggiunta della versione a zero byte, ma alla fine mi è sembrato che sia ancora più discutibile: questo in realtà crea il simbolo Global`f, mentre la versione vuota non lo fa (si potrebbe sostenere che Nullè assegnato a %1, ma Nullè una "funzione" incorporata). Ma come ho notato nella risposta, se la soluzione a un byte sia valida non è del tutto chiara ...
Lukas Lang


5

Lua , 8 byte

f=load''

Provalo online!

Definisce una funzione (globale) f.

Questo usa la loadfunzione Lua per compilare una data stringa che sembra essere vuota nel nostro caso (il codice vuoto è un codice valido) in una funzione che fa esattamente ciò che abbiamo scritto nel suo corpo: niente.

Per chi si chiede, sarebbe la soluzione standard

function f()end

ma questo è più lungo (15 byte).


5

POSIX sh, 6 byte

s()(1)

L'uso di parentesi graffe richiede un altro personaggio.


5

Java, 10 byte

questo dovrebbe corrispondere alle regole della sfida

void f(){}

1
Sono abbastanza sicuro che f=a->a;sia valido anche. :)
Kevin Cruijssen il

@Kevin Cruijssen Non sono un esperto Java e non ho mai usato la notazione dell'array Java. Come posso compilare la tua soluzione? Inizialmente ho "testato" il mio metodo in questo TIO e poi ho aggiunto il tuo approccio lì. Ora, il compilatore si aspetta un identificatore. Qualche spiegazione o uso sbagliato da parte mia?
pixma140,

2
È una funzione lambda Java 8+. Quindi uno di questi due funzionerebbe in questo caso. Ecco una spiegazione più approfondita di lambda Java 8+ nel caso in cui non si abbia ancora familiarità con essi.
Kevin Cruijssen,


4

Kotlin , 8 byte

val f={}

Una funzione vuota memorizzata in una variabile f.
Chiamalo usando f()o f.invoke().



4

C (gcc) , 14 13 byte

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

Provalo online!

Questo definisce una funzione che frestituisce inte accetta un numero (e tipo) di parametri non specificato, il cui codice macchina è contenuto nella stringa letterale. Il carattere unicode Ã(memorizzato come 0xc3 0x00 0x00 0x00su una piccola macchina endian) corrisponde a x86ret all'istruzione che ritorna dalla funzione. Le architetture non x86 potrebbero richiedere diversi codici operativi per la restituzione.

gccpuò richiedere la -zexecstackbandiera per evitare un segfault.



3

Tcl , 6 5 11 byte

set f {_ ;}

Provalo online!

Compreso l'assegnazione alla variabile f come parte del Bytecount per rispettare le regole. Con questa modifica, la definizione più convenzionale riportata di seguito lega quella precedente per bytecount:

proc f _ {}

Questa è una funzione con nome? La funzione deve essere assegnata a una sorta di variabile in modo che sia possibile accedervi in ​​un secondo momento.
mbomb007,

@ mbomb007 Vedo il tuo punto e risolto di conseguenza
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>

Un modello è la cosa più vicina che questa lingua ha a una funzione. Può sicuramente essere chiamato; accetta zero argomenti e "restituisce" la stringa vuota.





3

Pascal 23bytes

procedure A;begin end;

2

AppleScript, 10

on a()
end

Spiegazione, compilazione e inclusione inclusa:

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

-- invoke it:
a()


2

SmileBASIC (> = 3), 9 byte

DEF A
END

La funzione viene chiamata da A.


In alternativa DEF A*ENDin SB4
Me21,

2

Wolfram Language (Mathematica) , 2 byte

#&

Provalo online!

Sfortunatamente, semplicemente &non funziona (una funzione anonima che non fa nulla).


È necessario salvare la funzione in una variabile in base alle regole, ad esempiof=#&
Lukas Lang

@LukasLang viene automaticamente salvato in %1quindi non è necessario assegnare esplicitamente una variabile come f.
Roman

Buon punto, dovrebbe essere sufficiente per soddisfare le regole
Lukas Lang
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.