Écrire une fonction [fermé]

15

Honnêtement, je ne peux pas croire que ce défi n'existe pas déjà.

Le défi

Écrivez une fonction.

Les spécificités

  • Votre programme doit définir une sorte de fonction appelable. Cela inclut tout ce que l'on appelle communément une fonction, une fonction lambda ou un sous-programme. Tous ces types de callables seront appelés une "fonction" dans ce post.

    1. La saisie de la fonction est facultative et non requise.

    2. Une valeur de retour de la fonction est également facultative et non requise, mais le contrôle doit retourner au programme appelant.

  • La fonction doit être affectée à une sorte de variable afin qu'il soit possible d'y accéder ultérieurement. Cela comprend l'affectation indirecte (dans la plupart des langues courantes où la déclaration d'une fonction nommée ajoute automatiquement le nom dans la portée actuelle) et l'affectation directe (affectation directe d'une fonction anonyme à une variable).

  • La fonction n'a pas besoin d'être nommée.

  • La fonction doit être créée par vous - vous ne pouvez pas simplement assigner une fonction par défaut de la langue à une variable.

  • Aucune des échappatoires standard , s'il vous plaît.

C'est le , donc le score le plus bas en octets l'emporte.

Branchez votre chargeur
la source
Les commentaires ne sont pas pour une discussion approfondie; cette conversation a été déplacée vers le chat .
DJMcMayhem
3
Je ne comprends pas pourquoi cela a été rouvert alors qu'aucune des raisons pour lesquelles il a été fermé en premier lieu n'a été abordée, juste cachée par les mods dans un chat
Jo King
2
Aussi, depuis quand pouvez-vous voter pour rouvrir votre propre message ??
Jo King
7
Vous devez être un avocat plutôt qu'un programmeur pour participer à ce défi.
anatolyg
2
Cela n'aurait certainement pas dû être rouvert dans son état actuel.
Mego

Réponses:

30

Code machine x86 / x64, 1 octet

c3

Assemblée:

ret

Essayez-le en ligne! (nasm)

¯ \ _ (ツ) _ / ¯

sept négatif
la source
2
Mais cela ne donne pas de nom à la fonction ni ne stocke de référence à la fonction dans une variable.
Tanner Swett
4
@TannerSwett Il peut être appelé par adresse.
sept sept
7
Vous pouvez ajouter une étiquette dans l'assemblage. Il n'augmente pas la taille du code compilé et donne un nom à la fonction.
Daniil Tutubalin
21

Gelée , 0 octet

Essayez-le en ligne!

Un lien monadique qui renvoie son argument. Comme il s'agit de la première fonction à apparaître dans le script, elle peut être appelée à l'aide de1Ŀ .

Merci à @lirtosiast d'avoir souligné qu'un lien / fonction de 0 octet fonctionnerait dans Jelly.

C'est à dire


3,4,5 1Ŀ

Essayez-le en ligne!

Nick Kennedy
la source
La réponse 0 octet devrait fonctionner.
lirtosiast
@KevinCruijssen oui! Bon endroit
Nick Kennedy
@NickKennedy Vous pouvez utiliser <pre><code>...</code></pre>pour conserver les espaces de début / fin / les nouvelles lignes dans les blocs de code. J'ai modifié votre réponse en conséquence. :)
Kevin Cruijssen
@KevinCruijssen merci!
Nick Kennedy
Ma connaissance de la gelée est assez mince, mais n'avez-vous pas besoin d'une nouvelle ligne pour terminer le lien? Il semble être utilisé dans l'exemple.
Post Rock Garf Hunter
13

Javascript, 6 octets

f=_=>0

Comprend une affectation variable. Pas grand chose à voir ici.

récursif
la source
28
Pour le faire ressembler plus à un emoji:o=_=>o
Daniil Tutubalin
3
Un autre emojid=_=>b
tsh
3
@tsh, hélas, bn'est pas défini dans ce cas.
Daniil Tutubalin
2
@DanielO: On pourrait certainement contester cela. Mais à mon avis, on pourrait encore plus efficacement affirmer que vous ne pouvez pas l'appeler, donc ce n'est pas une fonction. En javascript, un appel de fonction est représenté sans ambiguïté par des parenthèses.
récursif
2
@DaniilTutubalin Mais cela n'a d'importance que si vous l'invoquez. Et il n'y a pas une telle exigence sur la fonction si elle doit s'exécuter sans lever d'exception.
tsh
8

ZX Spectrum BASIC, 6 octets

DEF FN f()=PI

Hexa: CE 66 28 29 3D A7. CEest un mot clé de 1 octet pour DEF FN(y compris l'espace de fin), tandis que A7est un mot clé de 1 octet pour PI. Appelez en utilisant FN f(). Exemple de programme:

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

Production:

3.1415927
Neil
la source
8

Haskell , 3 octets

o=9

Ce code définit une fonction polymorphe appelée oqui prend un paramètre de type et un paramètre d'instance de classe de types. Lorsque cette fonction est appelée, elle prend l'instance de classe de types donnée, obtient son fromIntegermembre, appelle ce membre avec la Integervaleur 9 et renvoie le résultat.

Certes, ce que je viens de décrire n'est que le comportement de la fonction Haskell 9, et mon code définit simplement une fonction appelée oqui est équivalente à 9.

Maintenant, la seule question est, est la 9 suivante: fonction est-elle «créée par vous» ou est-elle «une fonction par défaut de la langue»?

Je pense qu'il est "créé par vous". La raison pour laquelle je dis cela est que si vous lisez les spécifications de Haskell, vous (je suppose) ne trouverez nulle part une 9fonction. Au lieu de cela, la spécification indique que vous pouvez créer un littéral numérique en enchaînant un ou plusieurs chiffres. Par conséquent, en écrivant une chaîne de chiffres, j'ai écrit une fonction - même s'il se trouve que je n'ai utilisé qu'un seul chiffre.

Tanner Swett
la source
fonctions intelligentes de niveau type
Mega Man
8

R , 9 octets

body(t)=0

Essayez-le en ligne!

Je pense que cela est conforme aux règles. La fonction tne prend ni entrée ni sortie 0. Cela fonctionne parce qu'il existe déjà une fonction appelée t(la fonction de transposition) et qu'elle redéfinit le corps de la fonction; cela ne fonctionnerait pas avec say body(a)=0(aucun objet appelé a) ou body(F)=0( Fest une logique, pas une fonction). Je pense qu'il est conforme car il est toujours créé par moi: je ne réutilise pas ce que fait la fonction prédéfinie, simplement son nom.

Je ne pense pas avoir déjà vu cela utilisé par les golfeurs R, mais il peut y avoir des situations où cela nous permet d'économiser quelques octets sur des défis où nous avons besoin d'une fonction d'aide.

Une solution plus standard aurait été:

R , 13 octets

f=function()0

Essayez-le en ligne!

Fonction qui ne prend ni entrée ni sortie 0. Ceci est 1 octet plus court que la fonction qui ne prend aucune entrée et ne sort rien, ce qui serait

f=function(){}

Si nous essayons de définir une fonction sans corps (f=function() ), R l'interprète comme une commande incomplète (cela pourrait ne pas être vrai dans les anciennes versions de R).

Comme l'a souligné OganM, nous réduisons cela à 11 octets avec

R , 11 octets

function()0

Essayez-le en ligne!

qui est techniquement conforme à l'exigence de défi que la fonction soit affectée à une sorte de variable, car elle est (éphémère) assignée à .Last.value.

Robin Ryder
la source
1
function()0devrait fonctionner pour votre deuxième réponse puisque la fonction n'a pas besoin d'être nommée. Truc sympa body<-, j'ai essayé d'utiliser bodyet autres pour faire certains des défis étranges pour jouer avec la langue
Giuseppe
1
@Giuseppe "La fonction doit être assignée à une sorte de variable", donc je ne pense pas qu'elle soit function()0conforme aux règles de ce défi. Je serais heureux de donner une prime à une réponse qui utilise l' body()="astuce avec succès.
Robin Ryder
4
function()0serait affecté à .Last.value()ce qui le pousserait
OganM
@OganM Nice point!
Robin Ryder
pryr::f(x)si nous permettons au pryre.
qwr
6

Perl 6 , 5 octets

$!=!*

Essayez-le en ligne!

Crée un lambda Whats qui renvoie le booléen et non son paramètre, et l'affecte à la variable $!.

Jo King
la source
6

C (gcc) , 5 octets

Définit une fonction fqui ne prend aucun argument et renvoie techniquement une valeur entière non définie.

f(){}

Essayez-le en ligne!

ErikF
la source
1
"ne prend aucun argument" - ment mal. C'est l'un des malentendus courants à propos de C: une liste d'arguments vide signifie une quantité indéfinie d'arguments de type indéfinis sans moyen portable d'y accéder. En tant que sidenote, il s'agit également d'une incompatibilité C / C ++.
val dit Réintégrer Monica le
6

Espace , 7 octets


  

	

Crée un sous-programme qui renvoie le contrôle à l'appelant.

Expliqué dans le contexte:

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

Essayez-le en ligne!

une arachnide de pierre
la source
6

[Langue Wolfram (Mathematica)], 1 octet

Celui-ci est légèrement discutable:

f

Définit f, qui peut être "appelé" par exemple par f[], qui "renvoie" l'expressionf[]

Lukas Lang
la source
1
Hé, il peut être appelé et la valeur de retour est facultative. Cela compte.
connectyourcharger
1
Si cette solution est acceptable, la réponse à zéro octet est tout aussi bonne: votre "définition" de fne fait rien (à part se souvenir de "j'ai vu f") et peut être laissée de côté. Vous pouvez f[]néanmoins appeler , toujours en revenant sans évaluation f[]. Cependant, dans tous les cas, vous jouez principalement des tours avec le modèle-remplaçant et n'instruisez pas d'évaluer une fonction.
Roman
@Roman J'ai envisagé d'ajouter la version zéro octet, mais à la fin, je pensais que c'était encore plus discutable: cela crée en fait le symbole Global`f, tandis que la version vide ne fait pas cela (vous pourriez dire que cela Nullest assigné à %1, mais Nullest une "fonction" intégrée). Mais comme je l'ai noté dans la réponse, la validité de la solution à un octet n'est pas non plus tout à fait claire ...
Lukas Lang
5

Forth (gforth) , 5 octets

Il s'agit d'une fonction nommée fqui ne fait rien.

: f ;

Essayez-le en ligne

Dans le code TIO, j'ai ajouté un pied de page de see f, qui imprime la définition de la fonction.

mbomb007
la source
5

Lua , 8 octets

f=load''

Essayez-le en ligne!

Définit une fonction (globale) f .

Cela utilise Lua load fonction pour compiler une chaîne donnée qui se trouve être vide dans notre cas (le code vide est un code valide) dans une fonction qui fait exactement ce que nous avons écrit dans son corps: rien.

Pour ceux qui se demandent, la solution standard serait

function f()end

mais c'est plus long (15 octets).

val dit de réintégrer Monica
la source
5

POSIX sh, 6 octets

s()(1)

L'utilisation d'accolades frisées nécessite un caractère de plus.

kojiro
la source
5

Java, 10 octets

cela devrait correspondre aux règles du défi

void f(){}
pixma140
la source
1
Je suis sûr que f=a->a;c'est aussi valable. :)
Kevin Cruijssen
@Kevin Cruijssen Je ne suis pas un expert Java et je n'ai jamais utilisé la notation de tableau Java. Comment puis-je compiler votre solution? J'ai d'abord "testé" ma méthode dans ce TIO , puis j'y ai ajouté votre approche. Maintenant, le compilateur attend un identifiant. Une explication ou une mauvaise utilisation de ma part?
pixma140
2
C'est une fonction lambda Java 8+. Donc, l'un ou l'autre de ces deux fonctionnerait dans ce cas. Voici une explication plus approfondie des lambdas Java 8+ au cas où vous ne les connaissez pas encore.
Kevin Cruijssen
4

Kotlin , 8 octets

val f={}

Une fonction vide stockée dans une variable f.
Appelez-le en utilisant f()ou f.invoke().

Peïo THIBAULT
la source
4

shortC , 1 octet

A

Essayez-le en ligne!

Transpile dans ce C:

 int main(int argc, char **argv){;}
une arachnide de pierre
la source
4

C (gcc) , 14 13 octets

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

Essayez-le en ligne!

Ceci définit une fonction frenvoyant intet acceptant un nombre (et un type) de paramètres non spécifié, dont le code machine est contenu dans le littéral de chaîne. Le caractère unicode Ã(stocké en mémoire comme 0xc3 0x00 0x00 0x00sur une petite machine endian) correspond à l' retinstruction x86 qui revient de la fonction. Les architectures non x86 peuvent nécessiter différents opcode (s) pour retourner.

gccpeut nécessiter le -zexecstackdrapeau pour éviter une faute de segmentation.

plafond
la source
3

Tcl , 6 5 11 octets

set f {_ ;}

Essayez-le en ligne!

Inclusion de l'affectation à la variable f dans le cadre du bytecount pour respecter les règles. Avec ce changement, la définition plus conventionnelle ci-dessous est liée à celle ci-dessus pour le bytecount:

proc f _ {}
SmileAndNod
la source
Est-ce une fonction nommée? La fonction doit être affectée à une sorte de variable afin qu'il soit possible d'y accéder ultérieurement.
mbomb007
@ mbomb007 Je vois votre point, et je l'ai corrigé en conséquence
SmileAndNod
3

XSLT, 134 octets

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

Un modèle est la chose la plus proche de ce langage à une fonction. On peut certainement l'appeler; il ne prend aucun argument et "renvoie" la chaîne vide.

Silvio Mayolo
la source
3

Python 3 , 10 octets

f=lambda:0

Essayez-le en ligne!

U10-Forward
la source
Vous ne pouvez pas simplement faire def f():0pour enregistrer un octet?
EdgyNerd
@EdgyNerd Dat a répondu devant moi avec ce code, et je ne veux pas le copier
U10-Forward
Oh ok, tant
pis
3

Pascal 23 octets

procedure A;begin end;
rnso
la source
2

AppleScript, 10

on a()
end

Expliqué, compilé et incluant l'invocation:

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

-- invoke it:
a()
une arachnide de pierre
la source
2

Japt , 2 octets

_

Appelé comme $U ($.

_peut être remplacé par @,Ï ou È.

Essayez-le

Incarnation de l'ignorance
la source
2

SmileBASIC (> = 3), 9 octets

DEF A
END

La fonction est appelée par A.

escargot_
la source
Alternativement DEF A*ENDdans SB4
12Me21
2

Wolfram Language (Mathematica) , 2 octets

#&

Essayez-le en ligne!

Malheureusement, &cela ne fonctionne tout simplement pas (une fonction anonyme qui ne fait rien).

romain
la source
Vous devez enregistrer la fonction dans une variable selon les règles, par exemplef=#&
Lukas Lang
@LukasLang, il est automatiquement enregistré dans %1il n'y a donc pas besoin d'une affectation explicite à une variable comme f.
Roman
Bon point, cela devrait être suffisant pour respecter les règles
Lukas Lang